alchemy_cms 3.0.4 → 3.1.0.beta1

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.
Files changed (210) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -6
  3. data/Gemfile +4 -7
  4. data/README.md +207 -115
  5. data/alchemy_cms.gemspec +10 -9
  6. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +2 -2
  7. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js.coffee +2 -2
  8. data/app/assets/javascripts/alchemy/alchemy.js +6 -7
  9. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +1 -43
  10. data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +1 -1
  11. data/app/assets/stylesheets/alchemy/_mixins.scss +2 -1
  12. data/app/assets/stylesheets/alchemy/buttons.scss +0 -5
  13. data/app/assets/stylesheets/alchemy/dialogs.scss +1 -0
  14. data/app/assets/stylesheets/alchemy/frame.scss +9 -12
  15. data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +11 -2
  16. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +9 -1
  17. data/app/controllers/alchemy/admin/attachments_controller.rb +2 -4
  18. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +34 -38
  19. data/app/controllers/alchemy/api/base_controller.rb +19 -0
  20. data/app/controllers/alchemy/api/contents_controller.rb +35 -0
  21. data/app/controllers/alchemy/api/elements_controller.rb +29 -0
  22. data/app/controllers/alchemy/api/pages_controller.rb +32 -0
  23. data/app/controllers/alchemy/contents_controller.rb +1 -0
  24. data/app/controllers/alchemy/elements_controller.rb +5 -2
  25. data/app/controllers/alchemy/pages_controller.rb +4 -1
  26. data/app/controllers/alchemy/pictures_controller.rb +4 -36
  27. data/app/helpers/alchemy/admin/essences_helper.rb +5 -2
  28. data/app/helpers/alchemy/essences_helper.rb +14 -1
  29. data/app/models/alchemy/content.rb +32 -4
  30. data/app/models/alchemy/element.rb +2 -16
  31. data/app/models/alchemy/element/presenters.rb +2 -2
  32. data/app/models/alchemy/essence_file.rb +5 -0
  33. data/app/models/alchemy/essence_picture.rb +12 -8
  34. data/app/models/alchemy/picture.rb +1 -74
  35. data/app/models/alchemy/picture/transformations.rb +249 -0
  36. data/app/serializers/alchemy/content_serializer.rb +3 -10
  37. data/app/serializers/alchemy/element_serializer.rb +6 -3
  38. data/app/serializers/alchemy/legacy_element_serializer.rb +17 -0
  39. data/app/views/alchemy/admin/dashboard/_sites.html.erb +14 -4
  40. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +8 -5
  41. data/app/views/alchemy/admin/pages/edit.html.erb +9 -9
  42. data/app/views/alchemy/admin/pictures/info.html.erb +2 -3
  43. data/app/views/alchemy/admin/tags/edit.html.erb +1 -1
  44. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +8 -7
  45. data/app/views/alchemy/essences/_essence_boolean_view.html.erb +3 -3
  46. data/app/views/alchemy/essences/_essence_date_editor.html.erb +8 -2
  47. data/app/views/alchemy/essences/_essence_date_view.html.erb +10 -8
  48. data/app/views/alchemy/essences/_essence_file_editor.html.erb +48 -53
  49. data/app/views/alchemy/essences/_essence_file_view.html.erb +5 -5
  50. data/app/views/alchemy/essences/_essence_html_editor.html.erb +5 -4
  51. data/app/views/alchemy/essences/_essence_link_editor.html.erb +17 -15
  52. data/app/views/alchemy/essences/_essence_link_view.html.erb +11 -7
  53. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +4 -2
  54. data/app/views/alchemy/essences/_essence_picture_view.html.erb +4 -2
  55. data/app/views/alchemy/essences/_essence_richtext_view.html.erb +5 -4
  56. data/app/views/alchemy/essences/_essence_select_editor.html.erb +22 -32
  57. data/app/views/alchemy/essences/_essence_text_view.html.erb +7 -6
  58. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +1 -1
  59. data/app/views/layouts/alchemy/admin.html.erb +5 -3
  60. data/config/initializers/inflections.rb +3 -0
  61. data/config/initializers/simple_form.rb +1 -1
  62. data/config/locales/alchemy.en.yml +0 -1
  63. data/config/routes.rb +14 -0
  64. data/lib/alchemy/capistrano.rb +71 -0
  65. data/lib/alchemy/engine.rb +0 -3
  66. data/lib/alchemy/essence.rb +1 -1
  67. data/lib/alchemy/permissions.rb +19 -5
  68. data/lib/alchemy/picture_attributes.rb +1 -1
  69. data/lib/alchemy/test_support/auth_helpers.rb +1 -1
  70. data/lib/alchemy/test_support/essence_shared_examples.rb +37 -22
  71. data/lib/alchemy/test_support/integration_helpers.rb +1 -1
  72. data/lib/alchemy/tinymce.rb +21 -4
  73. data/lib/alchemy/upgrader/three_point_one.rb +43 -0
  74. data/lib/alchemy/upgrader/three_point_zero.rb +13 -0
  75. data/lib/alchemy/version.rb +2 -1
  76. data/lib/rails/generators/alchemy/module/module_generator.rb +30 -0
  77. data/lib/rails/generators/alchemy/module/templates/ability.rb.tt +11 -0
  78. data/lib/rails/generators/alchemy/module/templates/controller.rb.tt +2 -0
  79. data/lib/rails/generators/alchemy/module/templates/module_config.rb.tt +15 -0
  80. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +0 -1
  81. data/lib/rails/templates/alchemy.rb +2 -2
  82. data/lib/tasks/alchemy/db.rake +7 -1
  83. data/spec/controllers/admin/attachments_controller_spec.rb +38 -38
  84. data/spec/controllers/admin/base_controller_spec.rb +18 -18
  85. data/spec/controllers/admin/clipboard_controller_spec.rb +23 -18
  86. data/spec/controllers/admin/contents_controller_spec.rb +33 -27
  87. data/spec/controllers/admin/dashboard_controller_spec.rb +14 -14
  88. data/spec/controllers/admin/elements_controller_spec.rb +125 -105
  89. data/spec/controllers/admin/essence_files_controller_spec.rb +6 -7
  90. data/spec/controllers/admin/essence_pictures_controller_spec.rb +52 -42
  91. data/spec/controllers/admin/languages_controller_spec.rb +3 -3
  92. data/spec/controllers/admin/pages_controller_spec.rb +81 -71
  93. data/spec/controllers/admin/pictures_controller_spec.rb +69 -72
  94. data/spec/controllers/admin/resources_controller_spec.rb +5 -5
  95. data/spec/controllers/admin/trash_controller_spec.rb +15 -12
  96. data/spec/controllers/alchemy/admin/tags_controller_spec.rb +8 -8
  97. data/spec/controllers/alchemy/api/contents_controller_spec.rb +73 -0
  98. data/spec/controllers/alchemy/api/elements_controller_spec.rb +69 -0
  99. data/spec/controllers/alchemy/api/pages_controller_spec.rb +86 -0
  100. data/spec/controllers/attachments_controller_spec.rb +8 -8
  101. data/spec/controllers/contents_controller_spec.rb +22 -0
  102. data/spec/controllers/elements_controller_spec.rb +10 -4
  103. data/spec/controllers/messages_controller_spec.rb +35 -34
  104. data/spec/controllers/pages_controller_spec.rb +37 -28
  105. data/spec/controllers/pictures_controller_spec.rb +90 -23
  106. data/spec/dummy/app/models/dummy_user.rb +0 -4
  107. data/spec/dummy/app/views/alchemy/elements/_all_you_can_eat_editor.html.erb +11 -0
  108. data/spec/dummy/config/alchemy/elements.yml +22 -1
  109. data/spec/dummy/config/alchemy/page_layouts.yml +4 -0
  110. data/spec/dummy/config/application.rb +2 -1
  111. data/spec/dummy/config/environments/test.rb +3 -1
  112. data/spec/features/admin/dashboard_spec.rb +41 -6
  113. data/spec/features/admin/language_tree_feature_spec.rb +3 -3
  114. data/spec/features/admin/legacy_page_url_management_spec.rb +1 -1
  115. data/spec/features/admin/link_overlay_spec.rb +7 -7
  116. data/spec/features/admin/locale_select_feature_spec.rb +5 -2
  117. data/spec/features/admin/modules_integration_spec.rb +1 -1
  118. data/spec/features/admin/page_creation_feature_spec.rb +3 -2
  119. data/spec/features/admin/page_editing_feature_spec.rb +66 -79
  120. data/spec/features/admin/picture_library_integration_spec.rb +8 -8
  121. data/spec/features/admin/resources_integration_spec.rb +21 -21
  122. data/spec/features/admin/tinymce_feature_spec.rb +36 -0
  123. data/spec/features/navigation_spec.rb +1 -1
  124. data/spec/features/page_feature_spec.rb +34 -34
  125. data/spec/features/picture_security_spec.rb +4 -4
  126. data/spec/features/security_spec.rb +1 -1
  127. data/spec/features/translation_integration_spec.rb +7 -7
  128. data/spec/helpers/admin/base_helper_spec.rb +51 -49
  129. data/spec/helpers/admin/contents_helper_spec.rb +11 -11
  130. data/spec/helpers/admin/elements_helper_spec.rb +20 -17
  131. data/spec/helpers/admin/essences_helper_spec.rb +42 -11
  132. data/spec/helpers/admin/navigation_helper_spec.rb +64 -54
  133. data/spec/helpers/admin/pages_helper_spec.rb +10 -10
  134. data/spec/helpers/admin/tags_helper_spec.rb +16 -16
  135. data/spec/helpers/base_helper_spec.rb +11 -11
  136. data/spec/helpers/elements_block_helper_spec.rb +24 -24
  137. data/spec/helpers/elements_helper_spec.rb +46 -46
  138. data/spec/helpers/essences_helper_spec.rb +90 -17
  139. data/spec/helpers/pages_helper_spec.rb +53 -53
  140. data/spec/helpers/picture_url_helpers_spec.rb +6 -6
  141. data/spec/helpers/url_helper_spec.rb +32 -32
  142. data/spec/libraries/config_spec.rb +9 -9
  143. data/spec/libraries/controller_actions_spec.rb +14 -14
  144. data/spec/libraries/i18n_spec.rb +6 -6
  145. data/spec/libraries/kaminari/scoped_pagination_url_helper_spec.rb +4 -4
  146. data/spec/libraries/modules_spec.rb +4 -4
  147. data/spec/libraries/mount_point_spec.rb +13 -13
  148. data/spec/libraries/page_layout_spec.rb +24 -24
  149. data/spec/libraries/permissions_spec.rb +97 -80
  150. data/spec/libraries/resource_spec.rb +37 -37
  151. data/spec/libraries/resources_helper_spec.rb +19 -19
  152. data/spec/libraries/shell_spec.rb +17 -17
  153. data/spec/libraries/template_tracker_spec.rb +14 -14
  154. data/spec/libraries/tinymce_spec.rb +8 -8
  155. data/spec/libraries/userstamp_spec.rb +2 -2
  156. data/spec/mailers/messages_spec.rb +4 -4
  157. data/spec/models/attachment_spec.rb +86 -30
  158. data/spec/models/cell_spec.rb +10 -10
  159. data/spec/models/content_spec.rb +106 -46
  160. data/spec/models/element_spec.rb +94 -115
  161. data/spec/models/essence_date_spec.rb +1 -1
  162. data/spec/models/essence_file_spec.rb +4 -4
  163. data/spec/models/essence_picture_spec.rb +56 -25
  164. data/spec/models/essence_richtext_spec.rb +1 -1
  165. data/spec/models/essence_text_spec.rb +7 -7
  166. data/spec/models/language_spec.rb +12 -12
  167. data/spec/models/legacy_page_url_spec.rb +2 -2
  168. data/spec/models/message_spec.rb +12 -5
  169. data/spec/models/page_spec.rb +259 -235
  170. data/spec/models/picture_spec.rb +72 -166
  171. data/spec/models/site_spec.rb +41 -41
  172. data/spec/models/tag_spec.rb +7 -7
  173. data/spec/routing/api_routing_spec.rb +150 -0
  174. data/spec/routing/routing_spec.rb +28 -28
  175. data/spec/spec_helper.rb +6 -5
  176. data/spec/support/hint_examples.rb +5 -5
  177. data/spec/support/transformation_examples.rb +173 -0
  178. data/spec/tasks/helpers_spec.rb +29 -29
  179. data/spec/views/essences/essence_boolean_editor_spec.rb +32 -0
  180. data/spec/views/essences/essence_boolean_view_spec.rb +2 -2
  181. data/spec/views/essences/essence_date_view_spec.rb +1 -1
  182. data/spec/views/essences/essence_link_view_spec.rb +11 -0
  183. data/spec/views/essences/essence_picture_view_spec.rb +56 -11
  184. data/spec/views/essences/essence_richtext_view_spec.rb +12 -0
  185. data/spec/views/essences/essence_text_view_spec.rb +12 -0
  186. data/vendor/assets/javascripts/tinymce/langs/de.js +20 -2
  187. data/vendor/assets/javascripts/tinymce/langs/fr.js +14 -1
  188. data/vendor/assets/javascripts/tinymce/langs/nl.js +22 -4
  189. data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.min.js +1 -1
  190. data/vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.min.js +1 -1
  191. data/vendor/assets/javascripts/tinymce/plugins/charmap/plugin.min.js +1 -1
  192. data/vendor/assets/javascripts/tinymce/plugins/code/plugin.min.js +1 -1
  193. data/vendor/assets/javascripts/tinymce/plugins/directionality/plugin.min.js +1 -1
  194. data/vendor/assets/javascripts/tinymce/plugins/fullscreen/plugin.min.js +1 -1
  195. data/vendor/assets/javascripts/tinymce/plugins/hr/plugin.min.js +1 -1
  196. data/vendor/assets/javascripts/tinymce/plugins/link/plugin.min.js +1 -1
  197. data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.min.js +1 -1
  198. data/vendor/assets/javascripts/tinymce/plugins/tabfocus/plugin.min.js +1 -1
  199. data/vendor/assets/javascripts/tinymce/plugins/table/plugin.min.js +1 -1
  200. data/vendor/assets/javascripts/tinymce/themes/modern/theme.min.js +1 -1
  201. data/vendor/assets/javascripts/tinymce/tinymce.min.js +11 -10
  202. metadata +72 -42
  203. data/app/views/alchemy/messages/contact_form_mail.es.text.erb +0 -12
  204. data/config/locales/alchemy.es.yml +0 -958
  205. data/config/locales/alchemy.ru.yml +0 -837
  206. data/config/locales/simple_form.es.yml +0 -6
  207. data/config/locales/simple_form.ru.yml +0 -25
  208. data/lib/rails/generators/alchemy/scaffold/files/alchemy.es.yml +0 -31
  209. data/vendor/assets/javascripts/tinymce/langs/es.js +0 -197
  210. data/vendor/assets/javascripts/tinymce/langs/ru.js +0 -197
@@ -54,23 +54,23 @@ module Alchemy
54
54
 
55
55
  before :each do
56
56
  # stubbing an ActiveRecord::ModelSchema...
57
- Party.stub(:columns).and_return columns
57
+ allow(Party).to receive(:columns).and_return columns
58
58
  end
59
59
 
60
60
  describe "#initialize" do
61
61
  it "sets the standard database attributes (rails defaults) to be skipped" do
62
62
  resource = Resource.new("admin/parties")
63
- resource.skipped_attributes.should == %w(id updated_at created_at creator_id updater_id)
63
+ expect(resource.skipped_attributes).to eq(%w(id updated_at created_at creator_id updater_id))
64
64
  end
65
65
 
66
66
  it "sets an instance variable that holds the controller path" do
67
67
  resource = Resource.new("admin/parties")
68
- resource.instance_variable_get(:@controller_path).should == "admin/parties"
68
+ expect(resource.instance_variable_get(:@controller_path)).to eq("admin/parties")
69
69
  end
70
70
 
71
71
  context "when initialized with a module definition" do
72
72
  it "sets an instance variable that holds the module definition" do
73
- resource.instance_variable_get(:@module_definition).should == module_definition
73
+ expect(resource.instance_variable_get(:@module_definition)).to eq(module_definition)
74
74
  end
75
75
  end
76
76
 
@@ -78,14 +78,14 @@ module Alchemy
78
78
  it "sets @model to custom model" do
79
79
  CustomParty = Class.new
80
80
  resource = Resource.new("admin/parties", nil, CustomParty)
81
- resource.instance_variable_get(:@model).should == CustomParty
81
+ expect(resource.instance_variable_get(:@model)).to eq(CustomParty)
82
82
  end
83
83
  end
84
84
 
85
85
  context "when initialized without custom model" do
86
86
  it "guesses the model by the controller_path" do
87
87
  resource = Resource.new("admin/parties", nil, nil)
88
- resource.instance_variable_get(:@model).should == Party
88
+ expect(resource.instance_variable_get(:@model)).to eq(Party)
89
89
  end
90
90
  end
91
91
 
@@ -100,7 +100,7 @@ module Alchemy
100
100
 
101
101
  context ", but not an ActiveRecord association" do
102
102
  before do
103
- Party.stub(:respond_to?).and_return do |arg|
103
+ allow(Party).to receive(:respond_to?) do |arg|
104
104
  case arg
105
105
  when :reflect_on_all_associations
106
106
  then false
@@ -128,84 +128,84 @@ module Alchemy
128
128
  describe "#resource_array" do
129
129
  it "splits the controller_path and returns it as array." do
130
130
  resource = Resource.new("namespace1/namespace2/parties")
131
- resource.resource_array.should eql(%w(namespace1 namespace2 parties))
131
+ expect(resource.resource_array).to eql(%w(namespace1 namespace2 parties))
132
132
  end
133
133
 
134
134
  it "deletes 'admin' if found hence our model isn't in the admin-namespace by convention" do
135
- resource.resource_array.should eql(%w(parties))
135
+ expect(resource.resource_array).to eql(%w(parties))
136
136
  end
137
137
  end
138
138
 
139
139
  describe "#model" do
140
140
  it "returns the @model instance variable" do
141
- resource.model.should == resource.instance_variable_get(:@model)
141
+ expect(resource.model).to eq(resource.instance_variable_get(:@model))
142
142
  end
143
143
  end
144
144
 
145
145
  describe "#resources_name" do
146
146
  it "returns plural name (like parties for model Party)" do
147
- resource.resources_name.should == "parties"
147
+ expect(resource.resources_name).to eq("parties")
148
148
  end
149
149
  end
150
150
 
151
151
  describe "#resource_name" do
152
152
  it "returns the resources name as singular" do
153
- resource.resource_name.should == "party"
153
+ expect(resource.resource_name).to eq("party")
154
154
  end
155
155
  end
156
156
 
157
157
  describe "#namespaced_resource_name" do
158
158
  it "returns resource_name with namespace (namespace_party for Namespace::Party), i.e. for use in forms" do
159
159
  namespaced_resource = Resource.new("admin/namespace/parties")
160
- namespaced_resource.namespaced_resource_name.should == 'namespace_party'
160
+ expect(namespaced_resource.namespaced_resource_name).to eq('namespace_party')
161
161
  end
162
162
 
163
163
  it "equals resource_name if resource not namespaced" do
164
164
  namespaced_resource = Resource.new("admin/parties")
165
- namespaced_resource.namespaced_resource_name.should == 'party'
165
+ expect(namespaced_resource.namespaced_resource_name).to eq('party')
166
166
  end
167
167
 
168
168
  it "doesn't include the engine's name" do
169
169
  namespaced_resource = Resource.new("admin/party_engine/namespace/parties", module_definition)
170
- namespaced_resource.namespaced_resource_name.should == 'namespace_party'
170
+ expect(namespaced_resource.namespaced_resource_name).to eq('namespace_party')
171
171
  end
172
172
  end
173
173
 
174
174
  describe "#engine_name" do
175
175
  it "should return the engine name of the module" do
176
176
  resource = Resource.new("admin/party_engine/namespace/parties", module_definition)
177
- resource.engine_name.should == "party_engine"
177
+ expect(resource.engine_name).to eq("party_engine")
178
178
  end
179
179
  end
180
180
 
181
181
  describe "#namespace_for_scope" do
182
182
  it "returns a scope for use in url_for based path helpers" do
183
- resource.namespace_for_scope.should == %w(admin)
183
+ expect(resource.namespace_for_scope).to eq(%w(admin))
184
184
  end
185
185
  end
186
186
 
187
187
  describe "#attributes" do
188
188
  it "parses and returns the resource model's attributes from ActiveRecord::ModelSchema" do
189
- resource.attributes.should == [
189
+ expect(resource.attributes).to eq([
190
190
  {:name => "name", :type => :string},
191
191
  {:name => "hidden_value", :type => :string},
192
192
  {:name => "description", :type => :string},
193
193
  {:name => "starts_at", :type => :datetime},
194
194
  {:name => "location_id", :type => :integer},
195
195
  {:name => "organizer_id", :type => :integer},
196
- ]
196
+ ])
197
197
  end
198
198
 
199
199
  it "skips attributes returned by skipped_alchemy_resource_attributes" do
200
200
  # attr_accessor, hence skipped_alchemy_resource_attributes= works
201
201
  resource.skipped_attributes = %w(hidden_value)
202
- resource.attributes.should include({:name => "id", :type => :integer})
203
- resource.attributes.should_not include({:name => "hidden_value", :type => :string})
202
+ expect(resource.attributes).to include({:name => "id", :type => :integer})
203
+ expect(resource.attributes).not_to include({:name => "hidden_value", :type => :string})
204
204
  end
205
205
 
206
206
  context "when resource_relations are not defined" do
207
207
  it "includes the attribute" do
208
- resource.attributes.detect { |a| a[:name] == "location_id" }.should == {:name => "location_id", :type => :integer}
208
+ expect(resource.attributes.detect { |a| a[:name] == "location_id" }).to eq({:name => "location_id", :type => :integer})
209
209
  end
210
210
  end
211
211
  end
@@ -221,8 +221,8 @@ module Alchemy
221
221
 
222
222
  describe '#attributes' do
223
223
  it "does not return the attributes returned by that method" do
224
- resource.attributes.detect { |a| a[:name] == 'hidden_name' }.should be_nil
225
- resource.attributes.detect { |a| a[:name] == 'name' }.should_not be_nil
224
+ expect(resource.attributes.detect { |a| a[:name] == 'hidden_name' }).to be_nil
225
+ expect(resource.attributes.detect { |a| a[:name] == 'name' }).not_to be_nil
226
226
  end
227
227
  end
228
228
 
@@ -248,11 +248,11 @@ module Alchemy
248
248
  before { resource.skipped_attributes = [] }
249
249
 
250
250
  it "returns all attributes of type string" do
251
- should == [
251
+ is_expected.to eq([
252
252
  {:name => "name", :type => :string},
253
253
  {:name => "hidden_value", :type => :string},
254
254
  {:name => "description", :type => :string}
255
- ]
255
+ ])
256
256
  end
257
257
 
258
258
  context "with an array attribute" do
@@ -264,7 +264,7 @@ module Alchemy
264
264
  end
265
265
 
266
266
  it "does not include this column" do
267
- should == [{name: "name", type: :string}]
267
+ is_expected.to eq([{name: "name", type: :string}])
268
268
  end
269
269
  end
270
270
  end
@@ -285,34 +285,34 @@ module Alchemy
285
285
  describe '#resource_relations' do
286
286
  it "should contain model_association from ActiveRecord::Reflections" do
287
287
  relation = resource.resource_relations[:location_id]
288
- relation.keys.should include(:model_association)
289
- relation[:model_association].class.should be(ActiveRecord::Reflection::AssociationReflection)
288
+ expect(relation.keys).to include(:model_association)
289
+ expect(relation[:model_association].class).to be(ActiveRecord::Reflection::AssociationReflection)
290
290
  end
291
291
 
292
292
  it "adds '_id' to relation key" do
293
- resource.resource_relations[:location_id].should_not be_nil
293
+ expect(resource.resource_relations[:location_id]).not_to be_nil
294
294
  end
295
295
 
296
296
  it "stores the relation name" do
297
297
  relation = resource.resource_relations[:location_id]
298
- relation.keys.should include(:name)
299
- relation[:name].should == 'location'
298
+ expect(relation.keys).to include(:name)
299
+ expect(relation[:name]).to eq('location')
300
300
  end
301
301
  end
302
302
 
303
303
  describe '#model_associations' do
304
304
  it "skip default alchemy model associations" do
305
- resource.model_associations.collect(&:name).should_not include(*resource.class.const_get(:DEFAULT_SKIPPED_ASSOCIATIONS).map(&:to_sym))
305
+ expect(resource.model_associations.collect(&:name)).not_to include(*resource.class.const_get(:DEFAULT_SKIPPED_ASSOCIATIONS).map(&:to_sym))
306
306
  end
307
307
  end
308
308
 
309
309
  describe '#attributes' do
310
310
  it "contains the attribute of the related model" do
311
- resource.attributes.detect { |a| a[:name] == 'location_id' }.keys.should include(:relation)
311
+ expect(resource.attributes.detect { |a| a[:name] == 'location_id' }.keys).to include(:relation)
312
312
  end
313
313
 
314
314
  it "contains the related model's column type as type" do
315
- resource.attributes.detect { |a| a[:name] == "location_id" }[:type].should == :string
315
+ expect(resource.attributes.detect { |a| a[:name] == "location_id" }[:type]).to eq(:string)
316
316
  end
317
317
  end
318
318
 
@@ -327,13 +327,13 @@ module Alchemy
327
327
 
328
328
  describe "#engine_name" do
329
329
  it "should return the engine name of the module" do
330
- resource.engine_name.should == "party_engine"
330
+ expect(resource.engine_name).to eq("party_engine")
331
331
  end
332
332
  end
333
333
 
334
334
  describe "#in_engine?" do
335
335
  it "should return true if the module is shipped within an engine" do
336
- resource.in_engine?.should == true
336
+ expect(resource.in_engine?).to eq(true)
337
337
  end
338
338
  end
339
339
 
@@ -31,7 +31,7 @@ describe Alchemy::ResourcesHelper do
31
31
  let(:resource_item) { double('resource-item') }
32
32
 
33
33
  before {
34
- controller.stub(:main_app).and_return 'main_app_proxy'
34
+ allow(controller).to receive(:main_app).and_return 'main_app_proxy'
35
35
  controller.instance_variable_set('@my_resource', resource_item)
36
36
  controller.instance_variable_set('@my_resources', [resource_item])
37
37
  }
@@ -39,48 +39,48 @@ describe Alchemy::ResourcesHelper do
39
39
  describe "path-helpers" do
40
40
  describe "#resource_url_proxy" do
41
41
  it "returns the current proxy for url-helper-methods" do
42
- controller.resource_url_proxy.should == 'main_app_proxy'
42
+ expect(controller.resource_url_proxy).to eq('main_app_proxy')
43
43
  end
44
44
 
45
45
  context "when resource is in engine" do
46
46
  let(:controller_for_engine) { ResourcesControllerForEngine.new }
47
- before { controller_for_engine.stub('my_engine').and_return('my_engine_proxy') }
47
+ before { allow(controller_for_engine).to receive('my_engine').and_return('my_engine_proxy') }
48
48
 
49
49
  it "returns the engine's proxy" do
50
- controller_for_engine.resource_url_proxy.should == 'my_engine_proxy'
50
+ expect(controller_for_engine.resource_url_proxy).to eq('my_engine_proxy')
51
51
  end
52
52
  end
53
53
  end
54
54
 
55
55
  describe "#resource_scope" do
56
56
  it "returns an array containing a proxy and namespaces for url_for-based helper-methods" do
57
- controller.resource_scope.should == %W[main_app_proxy admin]
57
+ expect(controller.resource_scope).to eq(%W[main_app_proxy admin])
58
58
  end
59
59
  end
60
60
 
61
61
  describe "#resource_path" do
62
62
  it "invokes polymorphic-path with correct scope and object" do
63
63
  my_resource_item = double
64
- controller.should_receive(:polymorphic_path).with(["main_app_proxy", "admin", my_resource_item], {})
64
+ expect(controller).to receive(:polymorphic_path).with(["main_app_proxy", "admin", my_resource_item], {})
65
65
  controller.resource_path(my_resource_item)
66
66
  end
67
67
 
68
68
  it "uses resource_name when no object is given" do
69
- controller.should_receive(:polymorphic_path).with(["main_app_proxy", "admin", "my_resource"], {})
69
+ expect(controller).to receive(:polymorphic_path).with(["main_app_proxy", "admin", "my_resource"], {})
70
70
  controller.resource_path
71
71
  end
72
72
  end
73
73
 
74
74
  describe "#resources_path" do
75
75
  it "invokes polymorphic-path with correct scope and resources_name" do
76
- controller.should_receive(:polymorphic_path).with(["main_app_proxy", "admin", "my_resources"], {})
76
+ expect(controller).to receive(:polymorphic_path).with(["main_app_proxy", "admin", "my_resources"], {})
77
77
  controller.resources_path
78
78
  end
79
79
  end
80
80
 
81
81
  describe "#new_resource_path" do
82
82
  it "invokes new_polymorphic_path with correct scope and resource_name" do
83
- controller.should_receive(:new_polymorphic_path).with(["main_app_proxy", "admin", "my_resource"], {})
83
+ expect(controller).to receive(:new_polymorphic_path).with(["main_app_proxy", "admin", "my_resource"], {})
84
84
  controller.new_resource_path
85
85
  end
86
86
  end
@@ -88,7 +88,7 @@ describe Alchemy::ResourcesHelper do
88
88
  describe "#edit_resource_path" do
89
89
  it "invokes edit_polymorphic_path with correct scope and resource_name" do
90
90
  my_resource_item = double
91
- controller.should_receive(:edit_polymorphic_path).with(["main_app_proxy", "admin", my_resource_item], {})
91
+ expect(controller).to receive(:edit_polymorphic_path).with(["main_app_proxy", "admin", my_resource_item], {})
92
92
  controller.edit_resource_path(my_resource_item)
93
93
  end
94
94
  end
@@ -96,27 +96,27 @@ describe Alchemy::ResourcesHelper do
96
96
 
97
97
  describe "#resource_instance_variable" do
98
98
  it "returns the resource_item" do
99
- controller.resource_instance_variable.should == resource_item
99
+ expect(controller.resource_instance_variable).to eq(resource_item)
100
100
  end
101
101
  end
102
102
 
103
103
  describe "#resources_instance_variable" do
104
104
  it "returns a collection of resource_items" do
105
- controller.resources_instance_variable.should == [resource_item]
105
+ expect(controller.resources_instance_variable).to eq([resource_item])
106
106
  end
107
107
  end
108
108
 
109
109
  describe "#resource_window_size" do
110
110
  it "returns overlay size string depending on resource attributes length" do
111
- controller.stub_chain(:resource_handler, :attributes, :length).and_return(4)
112
- controller.resource_window_size.should == "420x260"
111
+ allow(controller).to receive(:resource_handler).and_return double(attributes: double(length: 4))
112
+ expect(controller.resource_window_size).to eq("420x260")
113
113
  end
114
114
  end
115
115
 
116
116
  describe "#render_attribute" do
117
117
  it "should return the value from resource attribute" do
118
- resource_item.stub(:name).and_return('my-name')
119
- controller.render_attribute(resource_item, {name: 'name'}).should == 'my-name'
118
+ allow(resource_item).to receive(:name).and_return('my-name')
119
+ expect(controller.render_attribute(resource_item, {name: 'name'})).to eq('my-name')
120
120
  end
121
121
 
122
122
  context "resource having a relation" do
@@ -130,15 +130,15 @@ describe Alchemy::ResourcesHelper do
130
130
  }
131
131
 
132
132
  it "should return the value from the related object attribute" do
133
- resource_item.stub(:name).and_return('my-name')
134
- controller.render_attribute(resource_item, {name: 'name', relation: relation}).should == 'Title of related object'
133
+ allow(resource_item).to receive(:name).and_return('my-name')
134
+ expect(controller.render_attribute(resource_item, {name: 'name', relation: relation})).to eq('Title of related object')
135
135
  end
136
136
  end
137
137
  end
138
138
 
139
139
  describe "#resource_name" do
140
140
  it "returns resource_handler.resource_name" do
141
- controller.resource_name.should == "my_resource"
141
+ expect(controller.resource_name).to eq("my_resource")
142
142
  end
143
143
  end
144
144
  end
@@ -10,11 +10,11 @@ module Alchemy
10
10
 
11
11
  describe Shell do
12
12
 
13
- before { MyToDoList.stub(:puts) }
13
+ before { allow(MyToDoList).to receive(:puts) }
14
14
 
15
15
  describe '.todo' do
16
16
  it "should add given string as a todo by delegating to .add_todo" do
17
- MyToDoList.should_receive(:add_todo).with(["", "new todo"])
17
+ expect(MyToDoList).to receive(:add_todo).with(["", "new todo"])
18
18
  MyToDoList.todo("new todo")
19
19
  end
20
20
  end
@@ -36,27 +36,27 @@ module Alchemy
36
36
  describe '.display_todos' do
37
37
  context 'if there are todos in the list' do
38
38
  before do
39
- MyToDoList.stub(:todos).and_return(['My first todo', 'My second todo'])
39
+ allow(MyToDoList).to receive(:todos).and_return(['My first todo', 'My second todo'])
40
40
  end
41
41
 
42
42
  it "should log them" do
43
- MyToDoList.should_receive(:log).at_least(1).times
43
+ expect(MyToDoList).to receive(:log).at_least(1).times
44
44
  MyToDoList.display_todos
45
45
  end
46
46
 
47
47
  it "should iterate through the todos with an index" do
48
- MyToDoList.todos.should_receive(:each_with_index)
48
+ expect(MyToDoList.todos).to receive(:each_with_index)
49
49
  MyToDoList.display_todos
50
50
  end
51
51
  end
52
52
 
53
53
  context 'if there are todos in the list' do
54
54
  before do
55
- MyToDoList.stub(:todos).and_return([])
55
+ allow(MyToDoList).to receive(:todos).and_return([])
56
56
  end
57
57
 
58
58
  it "should not log anything" do
59
- MyToDoList.should_not_receive(:log)
59
+ expect(MyToDoList).not_to receive(:log)
60
60
  MyToDoList.display_todos
61
61
  end
62
62
  end
@@ -65,31 +65,31 @@ module Alchemy
65
65
  describe '.log' do
66
66
  context 'if the message type is "skip"' do
67
67
  it "the output color should be yellow and cleared again" do
68
- MyToDoList.should_receive(:color).with(:yellow)
69
- MyToDoList.should_receive(:color).with(:clear)
68
+ expect(MyToDoList).to receive(:color).with(:yellow)
69
+ expect(MyToDoList).to receive(:color).with(:clear)
70
70
  MyToDoList.log('in yellow, please', :skip)
71
71
  end
72
72
  end
73
73
 
74
74
  context 'if the message type is "error"' do
75
75
  it "the output color should be yellow and cleared again" do
76
- MyToDoList.should_receive(:color).with(:red)
77
- MyToDoList.should_receive(:color).with(:clear)
76
+ expect(MyToDoList).to receive(:color).with(:red)
77
+ expect(MyToDoList).to receive(:color).with(:clear)
78
78
  MyToDoList.log('in red, please', :error)
79
79
  end
80
80
  end
81
81
 
82
82
  context 'if the message type is "message"' do
83
83
  it "the output color should just be cleared" do
84
- MyToDoList.should_receive(:color).with(:clear)
84
+ expect(MyToDoList).to receive(:color).with(:clear)
85
85
  MyToDoList.log('cleared, please', :message)
86
86
  end
87
87
  end
88
88
 
89
89
  context 'if no message type is given' do
90
90
  it "the output color should be green" do
91
- MyToDoList.should_receive(:color).with(:green)
92
- MyToDoList.should_receive(:color).with(:clear)
91
+ expect(MyToDoList).to receive(:color).with(:green)
92
+ expect(MyToDoList).to receive(:color).with(:clear)
93
93
  MyToDoList.log('in green, please')
94
94
  end
95
95
  end
@@ -99,18 +99,18 @@ module Alchemy
99
99
 
100
100
  context 'if given name is a constant of Thor::Shell::Color' do
101
101
  before do
102
- Thor::Shell::Color.stub(:const_defined?).and_return(true)
102
+ allow(Thor::Shell::Color).to receive(:const_defined?).and_return(true)
103
103
  end
104
104
 
105
105
  it "should call the constant" do
106
- String.any_instance.should_receive(:constantize).and_return('')
106
+ expect_any_instance_of(String).to receive(:constantize).and_return('')
107
107
  MyToDoList.send(:color, :red)
108
108
  end
109
109
  end
110
110
 
111
111
  context 'if given name is not a defined constant of Thor::Shell::Color' do
112
112
  before do
113
- Thor::Shell::Color.stub(:const_defined?).and_return(false)
113
+ allow(Thor::Shell::Color).to receive(:const_defined?).and_return(false)
114
114
  end
115
115
 
116
116
  it "should return en empty string" do