refinerycms-pages 3.0.3 → 3.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4933d54bda49d54b6458ba369411b14d07c4296d
4
- data.tar.gz: 7d9b0ffdaa544522cd7e58c2aa262795ba722ae2
3
+ metadata.gz: f8308e3073c942d0214a2decd15f895cb59337a2
4
+ data.tar.gz: 7bdadb6128ddc13e5bc6d82417bd6aa8218f22fe
5
5
  SHA512:
6
- metadata.gz: 7930a05fc308a3d86bfb85e606bcdd8e672c6c44aed78ba99ca47aff029421cde7031fa766a3d0f23c8941944f20c49adc5eada1dd797b37f57bc566e1890104
7
- data.tar.gz: 3e26bcbe3eb57580e81276f6e1750081b1c72f07fde92387692094d8aefe59cd212eb1768c0ffd5476cb427a104efbb0319e8208fe5b222363826bde76bbccbd
6
+ metadata.gz: ab53d5bb3c0f277efae545eb8ad0fe8baf2d2f7ef6c5d2839647c6bae25b9835bf6b8fe7c98553614051b9b75b0f6546fd6f5bc7250554cd1496d8e723eda8cd
7
+ data.tar.gz: 78d2d2482e752f92ec9c5ba6288e7c5d90986b363075fd1e8992d520f8c182dddf8959366f94c7e4b8400cb1f1f58ce3f31286fa035922faa741a6ae89b10d82
checksums.yaml.gz.sig ADDED
Binary file
@@ -108,7 +108,7 @@ module Refinery
108
108
  nested_url = page.nested_url
109
109
  {
110
110
  new_refinery_edit_page_path: refinery.admin_edit_page_path(nested_url),
111
- new_refinery_page_path: refinery.admin_page_path(nested_url),
111
+ new_refinery_page_path: refinery.admin_update_page_path(nested_url),
112
112
  new_page_path: refinery.pages_admin_preview_page_path(nested_url)
113
113
  }
114
114
  end
@@ -10,8 +10,6 @@ module Refinery
10
10
 
11
11
  skip_before_action :error_404, :set_canonical
12
12
 
13
- layout :layout
14
-
15
13
  def show
16
14
  render_with_templates?
17
15
  end
@@ -33,16 +31,18 @@ module Refinery
33
31
  end
34
32
  alias_method :page, :find_page
35
33
 
36
- def layout
37
- 'application'
34
+ def page_params
35
+ params.require(:page).permit(permitted_page_params)
38
36
  end
39
37
 
40
- def page_params
41
- params.require(:page).permit(
38
+ private
39
+
40
+ def permitted_page_params
41
+ [
42
42
  :browser_title, :draft, :link_url, :menu_title, :meta_description,
43
43
  :parent_id, :skip_to_first_child, :show_in_menu, :title, :view_template,
44
- :layout_template, parts_attributes: [:id, :title, :body, :position]
45
- )
44
+ :layout_template, :custom_slug, parts_attributes: [:id, :title, :slug, :body, :position]
45
+ ]
46
46
  end
47
47
  end
48
48
  end
@@ -68,12 +68,7 @@ module Refinery
68
68
  end
69
69
 
70
70
  def find_page(fallback_to_404 = true)
71
- @page ||= case action_name
72
- when "home"
73
- Refinery::Page.find_by(link_url: '/')
74
- when "show"
75
- Refinery::Page.friendly.find_by_path_or_id(params[:path], params[:id])
76
- end
71
+ @page ||= action_page_finder.call(params) if action_has_page_finder?
77
72
  @page || (error_404 if fallback_to_404)
78
73
  end
79
74
 
@@ -89,5 +84,28 @@ module Refinery
89
84
  cache_page(response.body, File.join('', 'refinery', 'cache', 'pages', request.path).to_s)
90
85
  end
91
86
  end
87
+
88
+ private
89
+ def action_has_page_finder?
90
+ Finders.const_defined? action_name.classify
91
+ end
92
+
93
+ def action_page_finder
94
+ Finders.const_get action_name.classify
95
+ end
96
+
97
+ module Finders
98
+ class Home
99
+ def self.call(_params)
100
+ Refinery::Page.find_by link_url: "/"
101
+ end
102
+ end
103
+
104
+ class Show
105
+ def self.call(params)
106
+ Refinery::Page.friendly.find_by_path_or_id params[:path], params[:id]
107
+ end
108
+ end
109
+ end
92
110
  end
93
111
  end
@@ -40,6 +40,14 @@ module Refinery
40
40
  ::I18n.t('hidden', :scope => 'refinery.admin.pages.page')
41
41
  end unless page.show_in_menu?
42
42
 
43
+ meta_information << content_tag(:span, :class => 'label') do
44
+ ::I18n.t('skip_to_first_child', :scope => 'refinery.admin.pages.page')
45
+ end if page.skip_to_first_child?
46
+
47
+ meta_information << content_tag(:span, :class => 'label') do
48
+ ::I18n.t('redirected', :scope => 'refinery.admin.pages.page')
49
+ end if page.link_url?
50
+
43
51
  meta_information << content_tag(:span, :class => 'label notice') do
44
52
  ::I18n.t('draft', :scope => 'refinery.admin.pages.page')
45
53
  end if page.draft?
@@ -1,3 +1,5 @@
1
+ require 'diffy'
2
+
1
3
  module Refinery
2
4
  module Pages
3
5
  # Knows how to build the html for a section. A section is part of the visible html, that has
@@ -48,7 +50,7 @@ module Refinery
48
50
  "no_#{id}"
49
51
  end
50
52
 
51
- protected
53
+ protected
52
54
 
53
55
  def content_html(can_use_fallback)
54
56
  override_html.presence || html_from_fallback(can_use_fallback)
@@ -58,17 +60,49 @@ module Refinery
58
60
  fallback_html.presence if can_use_fallback
59
61
  end
60
62
 
61
- private
63
+ private
62
64
 
63
65
  attr_writer :id, :fallback_html, :hidden
64
66
 
65
67
  def wrap_content_in_tag(content)
66
- content = sanitize(content,
67
- tags: Refinery::Pages::whitelist_elements,
68
- attributes: Refinery::Pages::whitelist_attributes
69
- )
70
- content_tag(:section, content_tag(:div, content, :class => 'inner'), :id => id)
68
+ content_tag(:section, content_tag(:div, sanitize_content(content), :class => 'inner'), :id => id)
69
+ end
70
+
71
+ def sanitize_content(input)
72
+ output = sanitize(input, scrubber: CustomScrubber.new(Refinery::Pages::whitelist_elements,
73
+ Refinery::Pages::whitelist_attributes))
74
+
75
+ if input != output
76
+ warning = "\n-- SANITIZED CONTENT WARNING --\n"
77
+ warning << "Refinery::Pages::SectionPresenter#wrap_content_in_tag\n"
78
+ warning << "HTML attributes and/or elements content has been sanitized\n"
79
+ warning << "#{::Diffy::Diff.new(input, output).to_s(:color)}\n"
80
+ warn warning
81
+ end
82
+
83
+ return output
84
+ end
85
+ end
86
+
87
+ class CustomScrubber < Rails::Html::PermitScrubber
88
+ def initialize(tags, attributes)
89
+ @direction = :bottom_up
90
+ @tags = tags
91
+ @attributes = attributes
92
+ end
93
+
94
+ def allowed_node?(node)
95
+ tags.include?(node.name)
96
+ end
97
+
98
+ def skip_node?(node)
99
+ node.text?
100
+ end
101
+
102
+ def scrub_attribute?(name)
103
+ attributes.exclude?(name) && name !~ /\Adata-[\w-]+\z/
71
104
  end
105
+
72
106
  end
73
107
  end
74
108
  end
@@ -4,7 +4,7 @@
4
4
  delete_url = refinery.admin_delete_page_path(page.nested_url)
5
5
  delete_options = {
6
6
  class: "cancel confirm-delete",
7
- data: {confirm: t('message', scope: 'refinery.admin.delete', title: page_title_with_translations(page))}
7
+ data: {confirm: t('message', scope: 'refinery.admin.delete', title: translated_field(page, :title))}
8
8
  }
9
9
  %>
10
10
 
@@ -11,7 +11,7 @@
11
11
  :rel => page_link.title,
12
12
  :class => 'page_link'
13
13
  }.merge(link_args) do %>
14
- <%= page_title_with_translations page_link %>
14
+ <%= translated_field(page_link, :title) %>
15
15
  <%= page_meta_information page_link %>
16
16
  <% end %>
17
17
  </li>
@@ -37,9 +37,11 @@ en:
37
37
  new: Add a new child page
38
38
  expand_collapse: Expand or collapse sub pages
39
39
  page:
40
- view_live_html: View this page live <br/><em>(opens in a new window)</em>
41
- hidden: hidden
42
40
  draft: draft
41
+ hidden: hidden
42
+ redirected: Redirected
43
+ skip_to_first_child: Skip to first child
44
+ view_live_html: View this page live <br/><em>(opens in a new window)</em>
43
45
  form:
44
46
  preview: Preview
45
47
  preview_changes: Preview your changes before making them live
@@ -3,7 +3,6 @@ ru:
3
3
  plugins:
4
4
  refinery_pages:
5
5
  title: Страницы
6
- article: feminine
7
6
  description: Управление страницами с содержимым
8
7
  admin:
9
8
  pages_dialogs:
@@ -38,14 +37,17 @@ ru:
38
37
  new: Добавить новую подстраницу
39
38
  expand_collapse: Развернуть или свернуть подстраницу
40
39
  page:
41
- view_live_html: Показать эту страницу вживую <br/><em>(откроется в новом окне)</em>
42
- hidden: скрытая
43
40
  draft: черновик
41
+ hidden: скрытая
42
+ redirected: Перенаправлена
43
+ skip_to_first_child: Пропуск страницы верхнего уровня
44
+ view_live_html: Показать эту страницу вживую <br/><em>(откроется в новом окне)</em>
44
45
  form:
45
46
  preview: Посмотреть
46
47
  preview_changes: Посмотреть свои изменения перед сохранением
47
48
  form_new_page_parts:
48
49
  title: Заголовок
50
+ slug: Slug
49
51
  form_page_parts:
50
52
  create_content_section: Добавить колонку
51
53
  delete_content_section: Удалить колонку
@@ -66,7 +66,13 @@ Refinery::Pages.configure do |config|
66
66
 
67
67
  # config.show_title_in_body = <%= Refinery::Pages.show_title_in_body.inspect %>
68
68
 
69
+ # You can add new HTML elements not already supported by Loofah::HTML5::WhiteList::ALLOWED_ELEMENTS
70
+ # For more information on whitelist see ALLOWED_ELEMENTS
71
+ # (https://github.com/flavorjones/loofah/blob/v2.0.3/lib/loofah/html5/whitelist.rb#L151)
69
72
  # config.add_whitelist_elements = <%= Refinery::Pages.add_whitelist_elements.inspect %>
70
-
73
+
74
+ # You can add new HTML attributes not already supported by Loofah::HTML5::WhiteList::ALLOWED_ATTRIBUTES
75
+ # For more information on whitelist see ALLOWED_ATTRIBUTES
76
+ # (https://github.com/flavorjones/loofah/blob/v2.0.3/lib/loofah/html5/whitelist.rb#L152)
71
77
  # config.add_whitelist_attributes = <%= Refinery::Pages.add_whitelist_attributes.inspect %>
72
78
  end
@@ -23,6 +23,7 @@ module Refinery
23
23
  self.cache_pages_full = false
24
24
  self.layout_template_whitelist = ["application"]
25
25
  self.add_whitelist_elements = %w[ source track ]
26
+ # Note: "data-" attributes are whitelisted by default. See https://github.com/refinery/refinerycms/pull/3187
26
27
  self.add_whitelist_attributes = %w[ kind srclang placeholder controls ]
27
28
 
28
29
 
@@ -26,6 +26,12 @@ Gem::Specification.new do |s|
26
26
  s.add_dependency 'refinerycms-core', version
27
27
  s.add_dependency 'babosa', '!= 0.3.6'
28
28
  s.add_dependency 'speakingurl-rails', '~> 8.0.0'
29
+ s.add_dependency 'diffy', '~> 3.1.0'
29
30
 
30
31
  s.required_ruby_version = Refinery::Version.required_ruby_version
32
+
33
+ s.cert_chain = [File.expand_path("../../certs/parndt.pem", __FILE__)]
34
+ if $0 =~ /gem\z/ && ARGV.include?("build") && ARGV.include?(__FILE__)
35
+ s.signing_key = File.expand_path("~/.ssh/gem-private_key.pem")
36
+ end
31
37
  end
@@ -193,16 +193,19 @@ module Refinery
193
193
  end
194
194
 
195
195
  describe "edit/update" do
196
- before do
197
- Page.create :title => "Update me"
196
+ let(:updateable_page_parent) { Page.create title: "Parent page" }
197
+ let!(:updateable_page) {
198
+ updateable_page_parent.children.create title: "Update me"
199
+ }
198
200
 
201
+ before do
199
202
  visit refinery.admin_pages_path
200
203
  expect(page).to have_content("Update me")
201
204
  end
202
205
 
203
206
  context 'when saving and returning to index' do
204
- it "updates page", js:true do
205
- find('a[tooltip="Edit this page"]').trigger(:click)
207
+ it "updates page", js: true do
208
+ find("a[href$='#{updateable_page.slug}/edit']").trigger(:click)
206
209
 
207
210
  fill_in "Title", :with => "Updated"
208
211
  find("#submit_button").click
@@ -211,25 +214,33 @@ module Refinery
211
214
  end
212
215
  end
213
216
 
214
- context 'when saving and continuing to edit' do
217
+ context 'when saving and continuing to edit', js: true do
215
218
  before :each do
216
- expect(page).to have_selector('a[tooltip^=Edit]', visible: true)
217
- find('a[tooltip^=Edit]').click
219
+ expect(page).to have_selector("a[href$='#{updateable_page.slug}/edit']", visible: true)
220
+ find("a[href$='#{updateable_page.slug}/edit']").click
218
221
 
219
- fill_in "Title", :with => "Updated"
222
+ fill_in "Title", :with => "Updated you"
220
223
  find("#submit_continue_button").click
221
224
  find('#flash').visible?
222
225
  end
223
226
 
224
- it "updates page", js: true do
225
- expect(page).to have_content("'Updated' was successfully updated.")
227
+ it "updates page" do
228
+ expect(page).to have_content("'Updated you' was successfully updated.")
229
+ end
230
+
231
+ # Regression test for https://github.com/refinery/refinerycms/issues/3179
232
+ # We expect this to end with /updated-you rather than /updated%2Fyou
233
+ it "doesn't have an encoded URL" do
234
+ updateable_page.reload # the slug will be different now
235
+ expect(page).not_to have_selector("form[action$='%2F#{updateable_page.slug}']")
236
+ expect(page).to have_selector("form[action$='/#{updateable_page.slug}']")
226
237
  end
227
238
 
228
239
  # Regression test for https://github.com/refinery/refinerycms/issues/1892
229
240
  context 'when saving to exit (a second time)' do
230
- it 'updates page', js: true do
241
+ it 'updates page' do
231
242
  find("#submit_button").click
232
- expect(page).to have_content("'Updated' was successfully updated.")
243
+ expect(page).to have_content("'Updated you' was successfully updated.")
233
244
  end
234
245
  end
235
246
  end
@@ -332,6 +332,7 @@ module Refinery
332
332
 
333
333
  within ".active * > .selected a" do
334
334
  expect(page).to have_content(child_page.title)
335
+ expect(page).to_not have_content(::I18n.t('skip_to_first_child', scope: 'refinery.skip_to_first_child_page_message'))
335
336
  end
336
337
  end
337
338
  end
@@ -63,6 +63,26 @@ module Refinery
63
63
  end
64
64
  end
65
65
 
66
+ context "when skip_to_first_child is true" do
67
+ it "adds 'skip to first child' label" do
68
+ page.skip_to_first_child = true
69
+
70
+ expect(helper.page_meta_information(page)).to eq(
71
+ %Q{<span class="label">#{::I18n.t('refinery.admin.pages.page.skip_to_first_child')}</span>}
72
+ )
73
+ end
74
+ end
75
+
76
+ context "when link_url is present" do
77
+ it "adds 'redirected' label" do
78
+ page.link_url = '/redirect'
79
+
80
+ expect(helper.page_meta_information(page)).to eq(
81
+ %Q{<span class="label">#{::I18n.t('refinery.admin.pages.page.redirected')}</span>}
82
+ )
83
+ end
84
+ end
85
+
66
86
  context "when draft is true" do
67
87
  it "adds 'draft' label" do
68
88
  page.draft = true
@@ -2,8 +2,6 @@ require "spec_helper"
2
2
 
3
3
  module Refinery
4
4
  module Pages
5
-
6
-
7
5
  describe SectionPresenter do
8
6
  it "can build a css class for when it is not present based on id" do
9
7
  section = SectionPresenter.new(:fallback_html => 'foobar', :id => 'mynode')
@@ -28,6 +26,14 @@ module Refinery
28
26
  end
29
27
 
30
28
  describe "when building html for a section" do
29
+ before do
30
+ @errors = StringIO.new
31
+ @old_err = $stderr
32
+ $stderr = @errors
33
+ end
34
+
35
+ after(:each) { $stderr = @old_err }
36
+
31
37
  it "wont show a hidden section" do
32
38
  section = SectionPresenter.new(:fallback_html => 'foobar', :hidden => true)
33
39
  expect(section.has_content?(true)).to be_falsey
@@ -47,7 +53,6 @@ module Refinery
47
53
  expect(section.wrapped_html(true)).to xml_eq('<section id="mynode"><div class="inner">foobar</div></section>')
48
54
  end
49
55
 
50
-
51
56
  # Regression tests for https://github.com/refinery/refinerycms-inquiries/issues/168
52
57
  describe "#whitelist_elements" do
53
58
  context "when an element is not in a whitelist" do
@@ -95,6 +100,28 @@ module Refinery
95
100
  )
96
101
  end
97
102
  end
103
+
104
+ context 'data attributes' do
105
+ it 'all data attributes passed thru' do
106
+ section = SectionPresenter.new
107
+ section.override_html = %Q{<a data-foo-bar="value"></a>}
108
+ expect(section.wrapped_html(true)).to xml_eq(
109
+ %Q{<section><div class="inner"><a data-foo-bar="value"></a></div></section>}
110
+ )
111
+ end
112
+ end
113
+ end
114
+
115
+ describe "#sanitize_content" do
116
+ it "shows a sanitized content warning" do
117
+ section = SectionPresenter.new
118
+ section.override_html = %Q{<dummy></dummy>}
119
+ section.wrapped_html(true)
120
+ @errors.rewind
121
+ expect(@errors.read).to eq(
122
+ %Q{\n-- SANITIZED CONTENT WARNING --\nRefinery::Pages::SectionPresenter#wrap_content_in_tag\nHTML attributes and/or elements content has been sanitized\n\e[31m-<dummy></dummy>\e[0m\n\\n\n}
123
+ )
124
+ end
98
125
  end
99
126
 
100
127
  describe "if allowed to use fallback html" do
data.tar.gz.sig ADDED
@@ -0,0 +1,2 @@
1
+ O ��������w�]�!3|�e�umğ�3�C�w�c6�^����<�F��n#�5�2ě�̎��K��!�*6��{:Rn�ބ~���_����i��K����Q.�y���fC�|�;��T'F+i����GY���%�;|�yŬ���� 
2
+ xU�ꭙc�3����\��$��u&���+Pե#i�ua��g�GL��F�Z�� V��S���r)�Sb�n��[��!�3W.oɸ�m��"��9�x
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: refinerycms-pages
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.3
4
+ version: 3.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Philip Arndt
@@ -9,8 +9,30 @@ authors:
9
9
  - Rob Yurkowski
10
10
  autorequire:
11
11
  bindir: bin
12
- cert_chain: []
13
- date: 2016-04-27 00:00:00.000000000 Z
12
+ cert_chain:
13
+ - |
14
+ -----BEGIN CERTIFICATE-----
15
+ MIIDhjCCAm6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBNMQ0wCwYDVQQDDARnZW1z
16
+ MREwDwYKCZImiZPyLGQBGRYBcDEVMBMGCgmSJomT8ixkARkWBWFybmR0MRIwEAYK
17
+ CZImiZPyLGQBGRYCaW8wHhcNMTYwNjEwMDMwNjQyWhcNMTcwNjEwMDMwNjQyWjBN
18
+ MQ0wCwYDVQQDDARnZW1zMREwDwYKCZImiZPyLGQBGRYBcDEVMBMGCgmSJomT8ixk
19
+ ARkWBWFybmR0MRIwEAYKCZImiZPyLGQBGRYCaW8wggEiMA0GCSqGSIb3DQEBAQUA
20
+ A4IBDwAwggEKAoIBAQDMLLiiRX/NrRDQxcNO/bPNe51IhKeyACDjTTx0VGCG696t
21
+ qdD23FjUrAYuQTW5P7Auh9qdcCnvPHJSwf31m+EGTshy/hcNYz2k/mrbwAfdytv3
22
+ GAR+sFnMYtWvVQNeHBWXIaYMiSDP0WtbT6QqQx3SuA6ZpXNXD1dbm64MzHgMHqXP
23
+ uHnLf2s0VCnTLorPH2J6CO5Y+Sx+IBqJi9/nO2oEEIXQCQRLgRevHk+TovDisW5V
24
+ OMEPX7fo29R5J2T7mjkNLGJ5Ae1KiU9A60LsMco37HMWE8DM90pg1ues5tg6MfJT
25
+ yuX4N0rJWdIC5ciHDsyJ4pi21s8fdUulk0YmJALDAgMBAAGjcTBvMAkGA1UdEwQC
26
+ MAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBSqXg48+kmcdOxIrkZhhgSV1flD1jAa
27
+ BgNVHREEEzARgQ9nZW1zQHAuYXJuZHQuaW8wGgYDVR0SBBMwEYEPZ2Vtc0BwLmFy
28
+ bmR0LmlvMA0GCSqGSIb3DQEBBQUAA4IBAQBSSS4nOXpPPMdAK4ApGHxbzS+/u77p
29
+ V8gLBJX4hKMpbMNmdI+n6YsqvG6kMljgYBamucfrAkKdmHWn9ydST3o8RQAcYxS8
30
+ bz49gD3c4Nm4P6eEVKFmebO9/MoiM7rMb0lk/xH1drtey/9ulohrg8Dz+BoQJ+9T
31
+ m2lJzojOU7w461lPVZtKlDlseu68KvEQ2AdUBBa1b6w3S/EFkcdhErOT7dyQpePI
32
+ +wsbjPvdIWsjWQMn6MasZYIVTnenwP2jg+z9HSNxW0NL2vZx8VabpsWGWfrb+koj
33
+ rE1h12GTgwaC3r9FOkdnSpClgPYAzTTCJ8kD74qO2zC9pGegrUXdWFM6
34
+ -----END CERTIFICATE-----
35
+ date: 2016-07-18 00:00:00.000000000 Z
14
36
  dependencies:
15
37
  - !ruby/object:Gem::Dependency
16
38
  name: friendly_id
@@ -86,14 +108,14 @@ dependencies:
86
108
  requirements:
87
109
  - - '='
88
110
  - !ruby/object:Gem::Version
89
- version: 3.0.3
111
+ version: 3.0.4
90
112
  type: :runtime
91
113
  prerelease: false
92
114
  version_requirements: !ruby/object:Gem::Requirement
93
115
  requirements:
94
116
  - - '='
95
117
  - !ruby/object:Gem::Version
96
- version: 3.0.3
118
+ version: 3.0.4
97
119
  - !ruby/object:Gem::Dependency
98
120
  name: babosa
99
121
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +144,20 @@ dependencies:
122
144
  - - "~>"
123
145
  - !ruby/object:Gem::Version
124
146
  version: 8.0.0
147
+ - !ruby/object:Gem::Dependency
148
+ name: diffy
149
+ requirement: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: 3.1.0
154
+ type: :runtime
155
+ prerelease: false
156
+ version_requirements: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: 3.1.0
125
161
  description: The default content extension of Refinery CMS. This extension handles
126
162
  the administration and display of user-editable pages.
127
163
  email: refinerycms@p.arndt.io
metadata.gz.sig ADDED
Binary file