alchemy_cms 3.0.0.rc5 → 3.0.0.rc6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -5
  3. data/README.md +32 -5
  4. data/alchemy_cms.gemspec +1 -1
  5. data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +3 -3
  6. data/app/assets/javascripts/alchemy/alchemy.char_counter.js.coffee +19 -0
  7. data/app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee +5 -0
  8. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +3 -2
  9. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +2 -0
  10. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +1 -1
  11. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +2 -26
  12. data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +1 -1
  13. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +2 -0
  14. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +12 -7
  15. data/app/assets/javascripts/alchemy/alchemy.js +1 -1
  16. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +33 -4
  17. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +1 -1
  18. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +2 -13
  19. data/app/assets/javascripts/alchemy/{alchemy.tinymce.js.coffee.erb → alchemy.tinymce.js.coffee} +1 -25
  20. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +63 -105
  21. data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +3 -3
  22. data/app/assets/stylesheets/alchemy/_extends.scss +2 -8
  23. data/app/assets/stylesheets/alchemy/_mixins.scss +4 -9
  24. data/app/assets/stylesheets/alchemy/base.scss +6 -6
  25. data/app/assets/stylesheets/alchemy/buttons.scss +56 -29
  26. data/app/assets/stylesheets/alchemy/elements.scss +66 -14
  27. data/app/assets/stylesheets/alchemy/form_fields.scss +39 -6
  28. data/app/assets/stylesheets/alchemy/forms.scss +32 -0
  29. data/app/assets/stylesheets/alchemy/frame.scss +44 -44
  30. data/app/assets/stylesheets/alchemy/icons.scss +2 -2
  31. data/app/assets/stylesheets/alchemy/jquery-ui.scss +2 -0
  32. data/app/assets/stylesheets/alchemy/notices.scss +6 -0
  33. data/app/assets/stylesheets/alchemy/selects.scss +10 -0
  34. data/app/assets/stylesheets/alchemy/sitemap.scss +8 -10
  35. data/app/assets/stylesheets/alchemy/toolbar.scss +40 -31
  36. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +11 -22
  37. data/app/controllers/alchemy/admin/base_controller.rb +14 -1
  38. data/app/controllers/alchemy/admin/elements_controller.rb +4 -2
  39. data/app/controllers/alchemy/admin/layoutpages_controller.rb +5 -0
  40. data/app/controllers/alchemy/admin/legacy_page_urls_controller.rb +39 -0
  41. data/app/controllers/alchemy/admin/pages_controller.rb +0 -3
  42. data/app/controllers/alchemy/base_controller.rb +7 -4
  43. data/app/helpers/alchemy/admin/base_helper.rb +33 -3
  44. data/app/helpers/alchemy/pages_helper.rb +1 -1
  45. data/app/models/alchemy/element.rb +6 -4
  46. data/app/models/alchemy/legacy_page_url.rb +5 -1
  47. data/app/models/alchemy/message.rb +2 -2
  48. data/app/models/alchemy/page.rb +8 -9
  49. data/app/models/alchemy/page/{cells.rb → page_cells.rb} +1 -1
  50. data/app/models/alchemy/page/{elements.rb → page_elements.rb} +1 -1
  51. data/app/models/alchemy/page/{naming.rb → page_naming.rb} +33 -18
  52. data/app/models/alchemy/page/{natures.rb → page_natures.rb} +1 -1
  53. data/app/models/alchemy/page/{scopes.rb → page_scopes.rb} +1 -1
  54. data/app/models/alchemy/page/{users.rb → page_users.rb} +13 -1
  55. data/app/views/alchemy/admin/elements/_add_element_button.html.erb +18 -0
  56. data/app/views/alchemy/admin/elements/_add_picture.html.erb +1 -1
  57. data/app/views/alchemy/admin/elements/_element.html.erb +12 -11
  58. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +3 -0
  59. data/app/views/alchemy/admin/elements/create.js.erb +3 -3
  60. data/app/views/alchemy/admin/elements/index.html.erb +19 -4
  61. data/app/views/alchemy/admin/elements/new.html.erb +3 -0
  62. data/app/views/alchemy/admin/elements/trash.js.erb +16 -12
  63. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +1 -1
  64. data/app/views/alchemy/admin/layoutpages/edit.html.erb +11 -0
  65. data/app/views/alchemy/admin/layoutpages/index.html.erb +4 -16
  66. data/app/views/alchemy/admin/legacy_page_urls/_form.html.erb +5 -0
  67. data/app/views/alchemy/admin/legacy_page_urls/_label.html.erb +1 -0
  68. data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +13 -0
  69. data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +20 -0
  70. data/app/views/alchemy/admin/legacy_page_urls/create.js.erb +10 -0
  71. data/app/views/alchemy/admin/legacy_page_urls/destroy.js.erb +6 -0
  72. data/app/views/alchemy/admin/legacy_page_urls/update.js.erb +2 -0
  73. data/app/views/alchemy/admin/pages/_form.html.erb +58 -0
  74. data/app/views/alchemy/admin/pages/_internal_link.html.erb +9 -4
  75. data/app/views/alchemy/admin/pages/_legacy_urls.html.erb +23 -0
  76. data/app/views/alchemy/admin/pages/_locked_page.html.erb +21 -0
  77. data/app/views/alchemy/admin/pages/_page.html.erb +2 -2
  78. data/app/views/alchemy/admin/pages/_page_status.html.erb +11 -9
  79. data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +13 -0
  80. data/app/views/alchemy/admin/pages/configure.html.erb +16 -57
  81. data/app/views/alchemy/admin/pages/edit.html.erb +64 -66
  82. data/app/views/alchemy/admin/pages/index.html.erb +9 -19
  83. data/app/views/alchemy/admin/pages/update.js.erb +1 -1
  84. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +7 -12
  85. data/app/views/alchemy/admin/partials/_routes.html.erb +25 -0
  86. data/app/views/alchemy/admin/partials/_search_form.html.erb +10 -12
  87. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +53 -47
  88. data/app/views/alchemy/admin/pictures/index.html.erb +34 -29
  89. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +1 -1
  90. data/app/views/alchemy/navigation/_link.html.erb +9 -9
  91. data/app/views/alchemy/pages/show.rss.builder +2 -2
  92. data/app/views/layouts/alchemy/admin.html.erb +20 -9
  93. data/bin/alchemy +1 -1
  94. data/config/alchemy/config.yml +1 -0
  95. data/config/locales/alchemy.de.yml +15 -1
  96. data/config/locales/alchemy.en.yml +29 -19
  97. data/config/locales/alchemy.nl.yml +11 -1
  98. data/config/routes.rb +2 -1
  99. data/lib/alchemy/errors.rb +2 -2
  100. data/lib/alchemy/permissions.rb +2 -0
  101. data/lib/alchemy/resource.rb +22 -9
  102. data/lib/alchemy/tinymce.rb +13 -7
  103. data/lib/alchemy/version.rb +1 -1
  104. data/spec/controllers/admin/base_controller_spec.rb +39 -0
  105. data/spec/controllers/admin/elements_controller_spec.rb +17 -14
  106. data/spec/controllers/admin/pages_controller_spec.rb +1 -2
  107. data/spec/controllers/pages_controller_spec.rb +7 -3
  108. data/spec/dummy/app/models/dummy_user.rb +12 -2
  109. data/spec/features/admin/dashboard_spec.rb +45 -0
  110. data/spec/features/admin/legacy_page_url_management_spec.rb +62 -0
  111. data/spec/features/admin/page_editing_feature_spec.rb +66 -6
  112. data/spec/features/page_feature_spec.rb +13 -0
  113. data/spec/helpers/admin/base_helper_spec.rb +36 -0
  114. data/spec/libraries/resource_spec.rb +168 -84
  115. data/spec/libraries/tinymce_spec.rb +10 -0
  116. data/spec/models/element_spec.rb +16 -0
  117. data/spec/models/legacy_page_url_spec.rb +21 -0
  118. data/spec/models/message_spec.rb +23 -7
  119. data/spec/models/page_spec.rb +89 -12
  120. data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.min.js +1 -0
  121. data/vendor/assets/javascripts/tinymce/plugins/hr/plugin.min.js +1 -0
  122. metadata +96 -75
  123. data/app/assets/javascripts/alchemy/alchemy.routes.js.erb +0 -38
  124. data/spec/models/resource_spec.rb +0 -159
@@ -50,6 +50,16 @@ module Alchemy
50
50
  should eq([])
51
51
  end
52
52
  end
53
+
54
+ context 'with a page given' do
55
+ let(:page) { mock_model('Page') }
56
+ subject { Tinymce.custom_config_contents(page) }
57
+
58
+ it "only returns custom tinymce config for elements of that page" do
59
+ expect(page).to receive(:element_definitions).and_return([element_definition])
60
+ should include({'element' => element_definition['name']}.merge(content_definition))
61
+ end
62
+ end
53
63
  end
54
64
  end
55
65
 
@@ -367,6 +367,22 @@ module Alchemy
367
367
  it "should return the content for rss descdefinitionription" do
368
368
  element.content_for_rss_description.should == element.contents.find_by_name('body')
369
369
  end
370
+
371
+ context 'if no content is defined as rss title' do
372
+ before { element.stub(content_descriptions: []) }
373
+
374
+ it "should return nil" do
375
+ element.content_for_rss_title.should be_nil
376
+ end
377
+ end
378
+
379
+ context 'if no content is defined as rss description' do
380
+ before { element.stub(content_descriptions: []) }
381
+
382
+ it "should return nil" do
383
+ element.content_for_rss_description.should be_nil
384
+ end
385
+ end
370
386
  end
371
387
 
372
388
  describe '#update_contents' do
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Alchemy::LegacyPageUrl do
4
+ let(:page) { build_stubbed(:page) }
5
+
6
+ let(:page_url_with_parameters) do
7
+ Alchemy::LegacyPageUrl.new(urlname: 'index.php?id=2', page: page)
8
+ end
9
+
10
+ let(:valid_page_url) do
11
+ Alchemy::LegacyPageUrl.new(urlname: 'my/0-work+is-nice_stuff', page: page)
12
+ end
13
+
14
+ it 'is only valid with correct urlname format' do
15
+ valid_page_url.should be_valid
16
+ end
17
+
18
+ it 'is also valid with get parameters in urlname' do
19
+ page_url_with_parameters.should be_valid
20
+ end
21
+ end
@@ -1,6 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Alchemy
4
+ Config.get(:mailer)['fields'].push('email_of_my_boss')
5
+ Config.get(:mailer)['validate_fields'].push('email_of_my_boss')
6
+
4
7
  describe Message do
5
8
  let(:message) { Message.new }
6
9
 
@@ -18,15 +21,28 @@ module Alchemy
18
21
  end
19
22
  end
20
23
 
21
- it "validates attributes defined in mailer config" do
22
- Config.get(:mailer)['validate_fields'].each do |field|
23
- expect(message).to have(1).error_on(field)
24
+ context "validation of" do
25
+ context "all fields defined in mailer config" do
26
+ it "adds errors on that fields" do
27
+ Config.get(:mailer)['validate_fields'].each do |field|
28
+ expect(message).to have(1).error_on(field)
29
+ end
30
+ end
24
31
  end
25
- end
26
32
 
27
- it "validates email format" do
28
- message.email = 'wrong email format'
29
- expect(message.errors_on(:email)).to include("is invalid")
33
+ context 'field containing email in its name' do
34
+ context "when field has a value" do
35
+ it "adds error notice (is invalid) to the field" do
36
+ message.email_of_my_boss = 'wrong email format'
37
+ expect(message.errors_on(:email_of_my_boss)).to include("is invalid")
38
+ end
39
+ end
40
+ context "when field is blank" do
41
+ it "adds error notice (can't be blank) to the field" do
42
+ expect(message.errors_on(:email_of_my_boss)).to include("can't be blank")
43
+ end
44
+ end
45
+ end
30
46
  end
31
47
  end
32
48
  end
@@ -33,13 +33,13 @@ module Alchemy
33
33
 
34
34
  it "should validate the page_layout" do
35
35
  contentpage.page_layout = nil
36
- contentpage.save
36
+ contentpage.should_not be_valid
37
37
  contentpage.should have(1).error_on(:page_layout)
38
38
  end
39
39
 
40
40
  it "should validate the parent_id" do
41
41
  contentpage.parent_id = nil
42
- contentpage.save
42
+ contentpage.should_not be_valid
43
43
  contentpage.should have(1).error_on(:parent_id)
44
44
  end
45
45
 
@@ -74,25 +74,41 @@ module Alchemy
74
74
  end
75
75
 
76
76
  context "creating the rootpage without parent_id and page_layout" do
77
+ let(:rootpage) { build(:page, parent_id: nil, page_layout: nil, name: 'Rootpage') }
78
+
77
79
  before do
78
80
  Page.delete_all
79
- @rootpage = FactoryGirl.build(:page, :parent_id => nil, :page_layout => nil, :name => 'Rootpage')
80
81
  end
81
82
 
82
83
  it "should be valid" do
83
- @rootpage.save
84
- @rootpage.should be_valid
84
+ rootpage.should be_valid
85
85
  end
86
86
  end
87
87
 
88
88
  context "saving a systempage" do
89
- before do
90
- @systempage = FactoryGirl.build(:systempage)
91
- end
89
+ let(:systempage) { build(:systempage) }
92
90
 
93
91
  it "should not validate the page_layout" do
94
- @systempage.save
95
- @systempage.should be_valid
92
+ systempage.should be_valid
93
+ end
94
+ end
95
+
96
+ context 'saving an external page' do
97
+ let(:external_page) { build(:page, page_layout: 'external') }
98
+
99
+ it "does not pass with invalid url given" do
100
+ external_page.urlname = 'not, a valid page url'
101
+ expect(external_page).to_not be_valid
102
+ end
103
+
104
+ it "only be valid with correct url given" do
105
+ external_page.urlname = 'www.google.com&utf_src=alchemy;page_id=%20'
106
+ expect(external_page).to be_valid
107
+ end
108
+
109
+ it "only be valid with urlname given" do
110
+ external_page.urlname = ''
111
+ expect(external_page).to_not be_valid
96
112
  end
97
113
  end
98
114
  end
@@ -155,6 +171,27 @@ module Alchemy
155
171
  end
156
172
  end
157
173
 
174
+ context 'after_move' do
175
+ let(:parent_1) { FactoryGirl.create(:page, name: 'Parent 1', visible: true) }
176
+ let(:parent_2) { FactoryGirl.create(:page, name: 'Parent 2', visible: true) }
177
+ let(:page) { FactoryGirl.create(:page, parent_id: parent_1.id, name: 'Page', visible: true) }
178
+
179
+ it "updates the urlname" do
180
+ page.urlname.should == 'parent-1/page'
181
+ page.move_to_child_of parent_2
182
+ page.urlname.should == 'parent-2/page'
183
+ end
184
+
185
+ context 'of an external page' do
186
+ let(:external) { FactoryGirl.create(:page, parent_id: parent_1.id, name: 'external', page_layout: 'external', urlname: 'http://google.com') }
187
+
188
+ it "the urlname does not get updated" do
189
+ external.move_to_child_of parent_2
190
+ external.urlname.should == 'http://google.com'
191
+ end
192
+ end
193
+ end
194
+
158
195
  context "a normal page" do
159
196
  before do
160
197
  @page = FactoryGirl.build(:page, :language_code => nil, :language => klingonian, :do_not_autogenerate => false)
@@ -998,6 +1035,7 @@ module Alchemy
998
1035
  describe '#previous' do
999
1036
  it "should return the previous page on the same level" do
1000
1037
  center_page.previous.should == public_page
1038
+ next_page.previous.should == center_page
1001
1039
  end
1002
1040
 
1003
1041
  context "no previous page on same level present" do
@@ -1159,6 +1197,7 @@ module Alchemy
1159
1197
  let(:page) { FactoryGirl.create(:page, parent_id: parent.id, name: 'page', visible: true) }
1160
1198
  let(:invisible) { FactoryGirl.create(:page, parent_id: page.id, name: 'invisible', visible: false) }
1161
1199
  let(:contact) { FactoryGirl.create(:page, parent_id: invisible.id, name: 'contact', visible: true) }
1200
+ let(:external) { FactoryGirl.create(:page, parent_id: parent.id, name: 'external', page_layout: 'external', urlname: 'http://google.com') }
1162
1201
 
1163
1202
  context "with activated url_nesting" do
1164
1203
  before { Config.stub(:get).and_return(true) }
@@ -1179,8 +1218,8 @@ module Alchemy
1179
1218
  contact.urlname.should_not =~ /invisible/
1180
1219
  end
1181
1220
 
1182
- context "after changing my urlname" do
1183
- it "should update urlnames of descendants" do
1221
+ context "after changing page's urlname" do
1222
+ it "updates urlnames of descendants" do
1184
1223
  page
1185
1224
  parentparent.urlname = 'new-urlname'
1186
1225
  parentparent.save!
@@ -1188,6 +1227,16 @@ module Alchemy
1188
1227
  page.urlname.should == 'new-urlname/parent/page'
1189
1228
  end
1190
1229
 
1230
+ context 'with descendants that are redirecting to external' do
1231
+ it "it skips this page" do
1232
+ external
1233
+ parent.urlname = 'new-urlname'
1234
+ parent.save!
1235
+ external.reload
1236
+ external.urlname.should == 'http://google.com'
1237
+ end
1238
+ end
1239
+
1191
1240
  it "should create a legacy url" do
1192
1241
  page.stub(:slug).and_return('foo')
1193
1242
  page.update_urlname!
@@ -1242,6 +1291,34 @@ module Alchemy
1242
1291
  end
1243
1292
  end
1244
1293
 
1294
+ describe '#external_urlname' do
1295
+ let(:external_page) { build(:page, page_layout: 'external') }
1296
+
1297
+ context 'with missing protocol' do
1298
+ before { external_page.urlname = 'google.com'}
1299
+
1300
+ it "returns an urlname prefixed with http://" do
1301
+ expect(external_page.external_urlname).to eq 'http://google.com'
1302
+ end
1303
+ end
1304
+
1305
+ context 'with protocol present' do
1306
+ before { external_page.urlname = 'ftp://google.com'}
1307
+
1308
+ it "returns the urlname" do
1309
+ expect(external_page.external_urlname).to eq 'ftp://google.com'
1310
+ end
1311
+ end
1312
+
1313
+ context 'beginngin with a slash' do
1314
+ before { external_page.urlname = '/internal-url'}
1315
+
1316
+ it "returns the urlname" do
1317
+ expect(external_page.external_urlname).to eq '/internal-url'
1318
+ end
1319
+ end
1320
+ end
1321
+
1245
1322
  context 'page status methods' do
1246
1323
  let(:page) { FactoryGirl.build(:page, public: true, visible: true, restricted: false, locked: false)}
1247
1324
 
@@ -0,0 +1 @@
1
+ tinymce.PluginManager.add("anchor",function(n){function e(){var e=n.selection.getNode();n.windowManager.open({title:"Anchor",body:{type:"textbox",name:"name",size:40,label:"Name",value:e.name||e.id},onsubmit:function(e){n.execCommand("mceInsertContent",!1,n.dom.createHTML("a",{id:e.data.name}))}})}n.addButton("anchor",{icon:"anchor",tooltip:"Anchor",onclick:e,stateSelector:"a:not([href])"}),n.addMenuItem("anchor",{icon:"anchor",text:"Anchor",context:"insert",onclick:e})});
@@ -0,0 +1 @@
1
+ tinymce.PluginManager.add("hr",function(n){n.addCommand("InsertHorizontalRule",function(){n.execCommand("mceInsertContent",!1,"<hr />")}),n.addButton("hr",{icon:"hr",tooltip:"Horizontal line",cmd:"InsertHorizontalRule"}),n.addMenuItem("hr",{icon:"hr",text:"Horizontal line",cmd:"InsertHorizontalRule",context:"insert"})});
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.0.0.rc5
4
+ version: 3.0.0.rc6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas von Deyen
@@ -12,376 +12,376 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2014-03-27 00:00:00.000000000 Z
15
+ date: 2014-06-03 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rails
19
19
  requirement: !ruby/object:Gem::Requirement
20
20
  requirements:
21
- - - '>='
21
+ - - ">="
22
22
  - !ruby/object:Gem::Version
23
23
  version: '4.0'
24
- - - <
24
+ - - "<"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '5.0'
27
27
  type: :runtime
28
28
  prerelease: false
29
29
  version_requirements: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '4.0'
34
- - - <
34
+ - - "<"
35
35
  - !ruby/object:Gem::Version
36
36
  version: '5.0'
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: actionpack-page_caching
39
39
  requirement: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - ~>
41
+ - - "~>"
42
42
  - !ruby/object:Gem::Version
43
43
  version: 1.0.0
44
44
  type: :runtime
45
45
  prerelease: false
46
46
  version_requirements: !ruby/object:Gem::Requirement
47
47
  requirements:
48
- - - ~>
48
+ - - "~>"
49
49
  - !ruby/object:Gem::Version
50
50
  version: 1.0.0
51
51
  - !ruby/object:Gem::Dependency
52
52
  name: awesome_nested_set
53
53
  requirement: !ruby/object:Gem::Requirement
54
54
  requirements:
55
- - - ~>
55
+ - - "~>"
56
56
  - !ruby/object:Gem::Version
57
57
  version: 3.0.0.rc.2
58
58
  type: :runtime
59
59
  prerelease: false
60
60
  version_requirements: !ruby/object:Gem::Requirement
61
61
  requirements:
62
- - - ~>
62
+ - - "~>"
63
63
  - !ruby/object:Gem::Version
64
64
  version: 3.0.0.rc.2
65
65
  - !ruby/object:Gem::Dependency
66
66
  name: acts-as-taggable-on
67
67
  requirement: !ruby/object:Gem::Requirement
68
68
  requirements:
69
- - - ~>
69
+ - - "~>"
70
70
  - !ruby/object:Gem::Version
71
71
  version: 3.0.0
72
72
  type: :runtime
73
73
  prerelease: false
74
74
  version_requirements: !ruby/object:Gem::Requirement
75
75
  requirements:
76
- - - ~>
76
+ - - "~>"
77
77
  - !ruby/object:Gem::Version
78
78
  version: 3.0.0
79
79
  - !ruby/object:Gem::Dependency
80
80
  name: cancan
81
81
  requirement: !ruby/object:Gem::Requirement
82
82
  requirements:
83
- - - ~>
83
+ - - "~>"
84
84
  - !ruby/object:Gem::Version
85
85
  version: 1.6.10
86
86
  type: :runtime
87
87
  prerelease: false
88
88
  version_requirements: !ruby/object:Gem::Requirement
89
89
  requirements:
90
- - - ~>
90
+ - - "~>"
91
91
  - !ruby/object:Gem::Version
92
92
  version: 1.6.10
93
93
  - !ruby/object:Gem::Dependency
94
94
  name: dragonfly
95
95
  requirement: !ruby/object:Gem::Requirement
96
96
  requirements:
97
- - - ~>
97
+ - - "~>"
98
98
  - !ruby/object:Gem::Version
99
99
  version: 1.0.1
100
100
  type: :runtime
101
101
  prerelease: false
102
102
  version_requirements: !ruby/object:Gem::Requirement
103
103
  requirements:
104
- - - ~>
104
+ - - "~>"
105
105
  - !ruby/object:Gem::Version
106
106
  version: 1.0.1
107
107
  - !ruby/object:Gem::Dependency
108
108
  name: kaminari
109
109
  requirement: !ruby/object:Gem::Requirement
110
110
  requirements:
111
- - - ~>
111
+ - - "~>"
112
112
  - !ruby/object:Gem::Version
113
113
  version: 0.15.0
114
114
  type: :runtime
115
115
  prerelease: false
116
116
  version_requirements: !ruby/object:Gem::Requirement
117
117
  requirements:
118
- - - ~>
118
+ - - "~>"
119
119
  - !ruby/object:Gem::Version
120
120
  version: 0.15.0
121
121
  - !ruby/object:Gem::Dependency
122
122
  name: acts_as_list
123
123
  requirement: !ruby/object:Gem::Requirement
124
124
  requirements:
125
- - - ~>
125
+ - - "~>"
126
126
  - !ruby/object:Gem::Version
127
127
  version: 0.3.0
128
128
  type: :runtime
129
129
  prerelease: false
130
130
  version_requirements: !ruby/object:Gem::Requirement
131
131
  requirements:
132
- - - ~>
132
+ - - "~>"
133
133
  - !ruby/object:Gem::Version
134
134
  version: 0.3.0
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: magiclabs-userstamp
137
137
  requirement: !ruby/object:Gem::Requirement
138
138
  requirements:
139
- - - ~>
139
+ - - "~>"
140
140
  - !ruby/object:Gem::Version
141
141
  version: 2.1.0
142
142
  type: :runtime
143
143
  prerelease: false
144
144
  version_requirements: !ruby/object:Gem::Requirement
145
145
  requirements:
146
- - - ~>
146
+ - - "~>"
147
147
  - !ruby/object:Gem::Version
148
148
  version: 2.1.0
149
149
  - !ruby/object:Gem::Dependency
150
150
  name: simple_form
151
151
  requirement: !ruby/object:Gem::Requirement
152
152
  requirements:
153
- - - ~>
153
+ - - "~>"
154
154
  - !ruby/object:Gem::Version
155
155
  version: 3.0.1
156
156
  type: :runtime
157
157
  prerelease: false
158
158
  version_requirements: !ruby/object:Gem::Requirement
159
159
  requirements:
160
- - - ~>
160
+ - - "~>"
161
161
  - !ruby/object:Gem::Version
162
162
  version: 3.0.1
163
163
  - !ruby/object:Gem::Dependency
164
164
  name: jquery-rails
165
165
  requirement: !ruby/object:Gem::Requirement
166
166
  requirements:
167
- - - ~>
167
+ - - "~>"
168
168
  - !ruby/object:Gem::Version
169
169
  version: 3.1.0
170
170
  type: :runtime
171
171
  prerelease: false
172
172
  version_requirements: !ruby/object:Gem::Requirement
173
173
  requirements:
174
- - - ~>
174
+ - - "~>"
175
175
  - !ruby/object:Gem::Version
176
176
  version: 3.1.0
177
177
  - !ruby/object:Gem::Dependency
178
178
  name: jquery-ui-rails
179
179
  requirement: !ruby/object:Gem::Requirement
180
180
  requirements:
181
- - - ~>
181
+ - - "~>"
182
182
  - !ruby/object:Gem::Version
183
183
  version: 4.1.1
184
184
  type: :runtime
185
185
  prerelease: false
186
186
  version_requirements: !ruby/object:Gem::Requirement
187
187
  requirements:
188
- - - ~>
188
+ - - "~>"
189
189
  - !ruby/object:Gem::Version
190
190
  version: 4.1.1
191
191
  - !ruby/object:Gem::Dependency
192
192
  name: sass-rails
193
193
  requirement: !ruby/object:Gem::Requirement
194
194
  requirements:
195
- - - ~>
195
+ - - "~>"
196
196
  - !ruby/object:Gem::Version
197
197
  version: 4.0.2
198
198
  type: :runtime
199
199
  prerelease: false
200
200
  version_requirements: !ruby/object:Gem::Requirement
201
201
  requirements:
202
- - - ~>
202
+ - - "~>"
203
203
  - !ruby/object:Gem::Version
204
204
  version: 4.0.2
205
205
  - !ruby/object:Gem::Dependency
206
206
  name: uglifier
207
207
  requirement: !ruby/object:Gem::Requirement
208
208
  requirements:
209
- - - '>='
209
+ - - ">="
210
210
  - !ruby/object:Gem::Version
211
211
  version: 1.3.0
212
212
  type: :runtime
213
213
  prerelease: false
214
214
  version_requirements: !ruby/object:Gem::Requirement
215
215
  requirements:
216
- - - '>='
216
+ - - ">="
217
217
  - !ruby/object:Gem::Version
218
218
  version: 1.3.0
219
219
  - !ruby/object:Gem::Dependency
220
220
  name: coffee-rails
221
221
  requirement: !ruby/object:Gem::Requirement
222
222
  requirements:
223
- - - ~>
223
+ - - "~>"
224
224
  - !ruby/object:Gem::Version
225
225
  version: 4.0.0
226
226
  type: :runtime
227
227
  prerelease: false
228
228
  version_requirements: !ruby/object:Gem::Requirement
229
229
  requirements:
230
- - - ~>
230
+ - - "~>"
231
231
  - !ruby/object:Gem::Version
232
232
  version: 4.0.0
233
233
  - !ruby/object:Gem::Dependency
234
234
  name: compass-rails
235
235
  requirement: !ruby/object:Gem::Requirement
236
236
  requirements:
237
- - - ~>
237
+ - - "~>"
238
238
  - !ruby/object:Gem::Version
239
239
  version: 1.1.2
240
240
  type: :runtime
241
241
  prerelease: false
242
242
  version_requirements: !ruby/object:Gem::Requirement
243
243
  requirements:
244
- - - ~>
244
+ - - "~>"
245
245
  - !ruby/object:Gem::Version
246
246
  version: 1.1.2
247
247
  - !ruby/object:Gem::Dependency
248
248
  name: sassy-buttons
249
249
  requirement: !ruby/object:Gem::Requirement
250
250
  requirements:
251
- - - ~>
251
+ - - "~>"
252
252
  - !ruby/object:Gem::Version
253
253
  version: 0.2.6
254
254
  type: :runtime
255
255
  prerelease: false
256
256
  version_requirements: !ruby/object:Gem::Requirement
257
257
  requirements:
258
- - - ~>
258
+ - - "~>"
259
259
  - !ruby/object:Gem::Version
260
260
  version: 0.2.6
261
261
  - !ruby/object:Gem::Dependency
262
262
  name: select2-rails
263
263
  requirement: !ruby/object:Gem::Requirement
264
264
  requirements:
265
- - - ~>
265
+ - - "~>"
266
266
  - !ruby/object:Gem::Version
267
267
  version: '3.4'
268
268
  type: :runtime
269
269
  prerelease: false
270
270
  version_requirements: !ruby/object:Gem::Requirement
271
271
  requirements:
272
- - - ~>
272
+ - - "~>"
273
273
  - !ruby/object:Gem::Version
274
274
  version: '3.4'
275
275
  - !ruby/object:Gem::Dependency
276
276
  name: tvdeyen-handles_sortable_columns
277
277
  requirement: !ruby/object:Gem::Requirement
278
278
  requirements:
279
- - - ~>
279
+ - - "~>"
280
280
  - !ruby/object:Gem::Version
281
281
  version: 0.1.5
282
282
  type: :runtime
283
283
  prerelease: false
284
284
  version_requirements: !ruby/object:Gem::Requirement
285
285
  requirements:
286
- - - ~>
286
+ - - "~>"
287
287
  - !ruby/object:Gem::Version
288
288
  version: 0.1.5
289
289
  - !ruby/object:Gem::Dependency
290
290
  name: spinner.rb
291
291
  requirement: !ruby/object:Gem::Requirement
292
292
  requirements:
293
- - - '>='
293
+ - - ">="
294
294
  - !ruby/object:Gem::Version
295
295
  version: '0'
296
296
  type: :runtime
297
297
  prerelease: false
298
298
  version_requirements: !ruby/object:Gem::Requirement
299
299
  requirements:
300
- - - '>='
300
+ - - ">="
301
301
  - !ruby/object:Gem::Version
302
302
  version: '0'
303
303
  - !ruby/object:Gem::Dependency
304
304
  name: turbolinks
305
305
  requirement: !ruby/object:Gem::Requirement
306
306
  requirements:
307
- - - ~>
307
+ - - "~>"
308
308
  - !ruby/object:Gem::Version
309
309
  version: '2.0'
310
310
  type: :runtime
311
311
  prerelease: false
312
312
  version_requirements: !ruby/object:Gem::Requirement
313
313
  requirements:
314
- - - ~>
314
+ - - "~>"
315
315
  - !ruby/object:Gem::Version
316
316
  version: '2.0'
317
317
  - !ruby/object:Gem::Dependency
318
318
  name: non-stupid-digest-assets
319
319
  requirement: !ruby/object:Gem::Requirement
320
320
  requirements:
321
- - - ~>
321
+ - - "~>"
322
322
  - !ruby/object:Gem::Version
323
323
  version: 1.0.3
324
324
  type: :runtime
325
325
  prerelease: false
326
326
  version_requirements: !ruby/object:Gem::Requirement
327
327
  requirements:
328
- - - ~>
328
+ - - "~>"
329
329
  - !ruby/object:Gem::Version
330
330
  version: 1.0.3
331
331
  - !ruby/object:Gem::Dependency
332
332
  name: active_model_serializers
333
333
  requirement: !ruby/object:Gem::Requirement
334
334
  requirements:
335
- - - ~>
335
+ - - "~>"
336
336
  - !ruby/object:Gem::Version
337
337
  version: 0.8.1
338
338
  type: :runtime
339
339
  prerelease: false
340
340
  version_requirements: !ruby/object:Gem::Requirement
341
341
  requirements:
342
- - - ~>
342
+ - - "~>"
343
343
  - !ruby/object:Gem::Version
344
344
  version: 0.8.1
345
345
  - !ruby/object:Gem::Dependency
346
346
  name: rspec-rails
347
347
  requirement: !ruby/object:Gem::Requirement
348
348
  requirements:
349
- - - '>='
349
+ - - "~>"
350
350
  - !ruby/object:Gem::Version
351
- version: '0'
351
+ version: '2.0'
352
352
  type: :development
353
353
  prerelease: false
354
354
  version_requirements: !ruby/object:Gem::Requirement
355
355
  requirements:
356
- - - '>='
356
+ - - "~>"
357
357
  - !ruby/object:Gem::Version
358
- version: '0'
358
+ version: '2.0'
359
359
  - !ruby/object:Gem::Dependency
360
360
  name: capybara
361
361
  requirement: !ruby/object:Gem::Requirement
362
362
  requirements:
363
- - - '>='
363
+ - - ">="
364
364
  - !ruby/object:Gem::Version
365
365
  version: '0'
366
366
  type: :development
367
367
  prerelease: false
368
368
  version_requirements: !ruby/object:Gem::Requirement
369
369
  requirements:
370
- - - '>='
370
+ - - ">="
371
371
  - !ruby/object:Gem::Version
372
372
  version: '0'
373
373
  - !ruby/object:Gem::Dependency
374
374
  name: factory_girl_rails
375
375
  requirement: !ruby/object:Gem::Requirement
376
376
  requirements:
377
- - - '>='
377
+ - - ">="
378
378
  - !ruby/object:Gem::Version
379
379
  version: '0'
380
380
  type: :development
381
381
  prerelease: false
382
382
  version_requirements: !ruby/object:Gem::Requirement
383
383
  requirements:
384
- - - '>='
384
+ - - ">="
385
385
  - !ruby/object:Gem::Version
386
386
  version: '0'
387
387
  description: Alchemy is a powerful, userfriendly and flexible Rails 4 CMS.
@@ -392,10 +392,10 @@ executables:
392
392
  extensions: []
393
393
  extra_rdoc_files: []
394
394
  files:
395
- - .gitignore
396
- - .rspec
397
- - .travis.yml
398
- - .yardopts
395
+ - ".gitignore"
396
+ - ".rspec"
397
+ - ".travis.yml"
398
+ - ".yardopts"
399
399
  - CONTRIBUTING.md
400
400
  - Gemfile
401
401
  - LICENSE
@@ -417,6 +417,7 @@ files:
417
417
  - app/assets/javascripts/alchemy/alchemy.base.js.coffee
418
418
  - app/assets/javascripts/alchemy/alchemy.browser.js.coffee
419
419
  - app/assets/javascripts/alchemy/alchemy.buttons.js.coffee
420
+ - app/assets/javascripts/alchemy/alchemy.char_counter.js.coffee
420
421
  - app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee
421
422
  - app/assets/javascripts/alchemy/alchemy.custom.js
422
423
  - app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee
@@ -440,11 +441,10 @@ files:
440
441
  - app/assets/javascripts/alchemy/alchemy.page_sorter.js
441
442
  - app/assets/javascripts/alchemy/alchemy.preview.js.coffee
442
443
  - app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee
443
- - app/assets/javascripts/alchemy/alchemy.routes.js.erb
444
444
  - app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee
445
445
  - app/assets/javascripts/alchemy/alchemy.spinner.js.coffee
446
446
  - app/assets/javascripts/alchemy/alchemy.string_extension.js.coffee
447
- - app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee.erb
447
+ - app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee
448
448
  - app/assets/javascripts/alchemy/alchemy.translations.js.coffee
449
449
  - app/assets/javascripts/alchemy/alchemy.uploader.js.coffee
450
450
  - app/assets/javascripts/alchemy/alchemy.windows.js.coffee
@@ -509,6 +509,7 @@ files:
509
509
  - app/controllers/alchemy/admin/essence_pictures_controller.rb
510
510
  - app/controllers/alchemy/admin/languages_controller.rb
511
511
  - app/controllers/alchemy/admin/layoutpages_controller.rb
512
+ - app/controllers/alchemy/admin/legacy_page_urls_controller.rb
512
513
  - app/controllers/alchemy/admin/pages_controller.rb
513
514
  - app/controllers/alchemy/admin/pictures_controller.rb
514
515
  - app/controllers/alchemy/admin/resources_controller.rb
@@ -563,12 +564,12 @@ files:
563
564
  - app/models/alchemy/legacy_page_url.rb
564
565
  - app/models/alchemy/message.rb
565
566
  - app/models/alchemy/page.rb
566
- - app/models/alchemy/page/cells.rb
567
- - app/models/alchemy/page/elements.rb
568
- - app/models/alchemy/page/naming.rb
569
- - app/models/alchemy/page/natures.rb
570
- - app/models/alchemy/page/scopes.rb
571
- - app/models/alchemy/page/users.rb
567
+ - app/models/alchemy/page/page_cells.rb
568
+ - app/models/alchemy/page/page_elements.rb
569
+ - app/models/alchemy/page/page_naming.rb
570
+ - app/models/alchemy/page/page_natures.rb
571
+ - app/models/alchemy/page/page_scopes.rb
572
+ - app/models/alchemy/page/page_users.rb
572
573
  - app/models/alchemy/picture.rb
573
574
  - app/models/alchemy/picture/sweeping.rb
574
575
  - app/models/alchemy/site.rb
@@ -619,6 +620,7 @@ files:
619
620
  - app/views/alchemy/admin/dashboard/help.html.erb
620
621
  - app/views/alchemy/admin/dashboard/index.html.erb
621
622
  - app/views/alchemy/admin/dashboard/info.html.erb
623
+ - app/views/alchemy/admin/elements/_add_element_button.html.erb
622
624
  - app/views/alchemy/admin/elements/_add_picture.html.erb
623
625
  - app/views/alchemy/admin/elements/_element.html.erb
624
626
  - app/views/alchemy/admin/elements/_element_foot.html.erb
@@ -647,16 +649,28 @@ files:
647
649
  - app/views/alchemy/admin/languages/_table.html.erb
648
650
  - app/views/alchemy/admin/languages/index.html.erb
649
651
  - app/views/alchemy/admin/layoutpages/_layoutpage.html.erb
652
+ - app/views/alchemy/admin/layoutpages/edit.html.erb
650
653
  - app/views/alchemy/admin/layoutpages/index.html.erb
654
+ - app/views/alchemy/admin/legacy_page_urls/_form.html.erb
655
+ - app/views/alchemy/admin/legacy_page_urls/_label.html.erb
656
+ - app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb
657
+ - app/views/alchemy/admin/legacy_page_urls/_new.html.erb
658
+ - app/views/alchemy/admin/legacy_page_urls/create.js.erb
659
+ - app/views/alchemy/admin/legacy_page_urls/destroy.js.erb
660
+ - app/views/alchemy/admin/legacy_page_urls/update.js.erb
651
661
  - app/views/alchemy/admin/pages/_create_language_form.html.erb
652
662
  - app/views/alchemy/admin/pages/_external_link.html.erb
653
663
  - app/views/alchemy/admin/pages/_file_link.html.erb
664
+ - app/views/alchemy/admin/pages/_form.html.erb
654
665
  - app/views/alchemy/admin/pages/_internal_link.html.erb
666
+ - app/views/alchemy/admin/pages/_legacy_urls.html.erb
667
+ - app/views/alchemy/admin/pages/_locked_page.html.erb
655
668
  - app/views/alchemy/admin/pages/_new_page_form.html.erb
656
669
  - app/views/alchemy/admin/pages/_page.html.erb
657
670
  - app/views/alchemy/admin/pages/_page_for_links.html.erb
658
671
  - app/views/alchemy/admin/pages/_page_status.html.erb
659
672
  - app/views/alchemy/admin/pages/_sitemap.html.erb
673
+ - app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb
660
674
  - app/views/alchemy/admin/pages/configure.html.erb
661
675
  - app/views/alchemy/admin/pages/configure_external.html.erb
662
676
  - app/views/alchemy/admin/pages/destroy.js.erb
@@ -678,6 +692,7 @@ files:
678
692
  - app/views/alchemy/admin/partials/_language_tree_select.html.erb
679
693
  - app/views/alchemy/admin/partials/_main_navigation_entry.html.erb
680
694
  - app/views/alchemy/admin/partials/_remote_search_form.html.erb
695
+ - app/views/alchemy/admin/partials/_routes.html.erb
681
696
  - app/views/alchemy/admin/partials/_search_form.html.erb
682
697
  - app/views/alchemy/admin/partials/_sub_navigation.html.erb
683
698
  - app/views/alchemy/admin/partials/_toolbar_button.html.erb
@@ -940,7 +955,9 @@ files:
940
955
  - spec/dummy/public/422.html
941
956
  - spec/dummy/public/500.html
942
957
  - spec/dummy/public/favicon.ico
958
+ - spec/features/admin/dashboard_spec.rb
943
959
  - spec/features/admin/language_tree_feature_spec.rb
960
+ - spec/features/admin/legacy_page_url_management_spec.rb
944
961
  - spec/features/admin/link_overlay_spec.rb
945
962
  - spec/features/admin/modules_integration_spec.rb
946
963
  - spec/features/admin/page_creation_feature_spec.rb
@@ -1011,10 +1028,10 @@ files:
1011
1028
  - spec/models/essence_select_spec.rb
1012
1029
  - spec/models/essence_text_spec.rb
1013
1030
  - spec/models/language_spec.rb
1031
+ - spec/models/legacy_page_url_spec.rb
1014
1032
  - spec/models/message_spec.rb
1015
1033
  - spec/models/page_spec.rb
1016
1034
  - spec/models/picture_spec.rb
1017
- - spec/models/resource_spec.rb
1018
1035
  - spec/models/site_spec.rb
1019
1036
  - spec/models/tag_spec.rb
1020
1037
  - spec/routing/routing_spec.rb
@@ -1048,11 +1065,13 @@ files:
1048
1065
  - vendor/assets/javascripts/tinymce/langs/de.js
1049
1066
  - vendor/assets/javascripts/tinymce/langs/nl.js
1050
1067
  - vendor/assets/javascripts/tinymce/license.txt
1068
+ - vendor/assets/javascripts/tinymce/plugins/anchor/plugin.min.js
1051
1069
  - vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.min.js
1052
1070
  - vendor/assets/javascripts/tinymce/plugins/charmap/plugin.min.js
1053
1071
  - vendor/assets/javascripts/tinymce/plugins/code/plugin.min.js
1054
1072
  - vendor/assets/javascripts/tinymce/plugins/directionality/plugin.min.js
1055
1073
  - vendor/assets/javascripts/tinymce/plugins/fullscreen/plugin.min.js
1074
+ - vendor/assets/javascripts/tinymce/plugins/hr/plugin.min.js
1056
1075
  - vendor/assets/javascripts/tinymce/plugins/link/plugin.min.js
1057
1076
  - vendor/assets/javascripts/tinymce/plugins/paste/plugin.min.js
1058
1077
  - vendor/assets/javascripts/tinymce/plugins/tabfocus/plugin.min.js
@@ -1083,18 +1102,18 @@ require_paths:
1083
1102
  - lib
1084
1103
  required_ruby_version: !ruby/object:Gem::Requirement
1085
1104
  requirements:
1086
- - - '>='
1105
+ - - ">="
1087
1106
  - !ruby/object:Gem::Version
1088
1107
  version: 1.9.3
1089
1108
  required_rubygems_version: !ruby/object:Gem::Requirement
1090
1109
  requirements:
1091
- - - '>'
1110
+ - - ">"
1092
1111
  - !ruby/object:Gem::Version
1093
1112
  version: 1.3.1
1094
1113
  requirements:
1095
1114
  - ImageMagick (libmagick), v6.6 or greater.
1096
1115
  rubyforge_project:
1097
- rubygems_version: 2.1.11
1116
+ rubygems_version: 2.2.2
1098
1117
  signing_key:
1099
1118
  specification_version: 4
1100
1119
  summary: A powerful, userfriendly and flexible CMS for Rails 4
@@ -1176,7 +1195,9 @@ test_files:
1176
1195
  - spec/dummy/public/422.html
1177
1196
  - spec/dummy/public/500.html
1178
1197
  - spec/dummy/public/favicon.ico
1198
+ - spec/features/admin/dashboard_spec.rb
1179
1199
  - spec/features/admin/language_tree_feature_spec.rb
1200
+ - spec/features/admin/legacy_page_url_management_spec.rb
1180
1201
  - spec/features/admin/link_overlay_spec.rb
1181
1202
  - spec/features/admin/modules_integration_spec.rb
1182
1203
  - spec/features/admin/page_creation_feature_spec.rb
@@ -1247,10 +1268,10 @@ test_files:
1247
1268
  - spec/models/essence_select_spec.rb
1248
1269
  - spec/models/essence_text_spec.rb
1249
1270
  - spec/models/language_spec.rb
1271
+ - spec/models/legacy_page_url_spec.rb
1250
1272
  - spec/models/message_spec.rb
1251
1273
  - spec/models/page_spec.rb
1252
1274
  - spec/models/picture_spec.rb
1253
- - spec/models/resource_spec.rb
1254
1275
  - spec/models/site_spec.rb
1255
1276
  - spec/models/tag_spec.rb
1256
1277
  - spec/routing/routing_spec.rb