spree_pages 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +25 -0
  3. data/.gitignore +21 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +31 -0
  6. data/.travis.yml +38 -0
  7. data/Appraisals +23 -0
  8. data/CONTRIBUTING.md +25 -0
  9. data/Gemfile +16 -0
  10. data/LICENSE +26 -0
  11. data/README.md +83 -0
  12. data/Rakefile +21 -0
  13. data/app/assets/javascripts/spree/backend/spree_pages.js +2 -0
  14. data/app/assets/javascripts/spree/frontend/spree_pages.js +2 -0
  15. data/app/assets/stylesheets/spree/backend/spree_pages.css +4 -0
  16. data/app/assets/stylesheets/spree/frontend/spree_pages.css +4 -0
  17. data/app/controllers/spree/admin/pages_controller.rb +11 -0
  18. data/app/controllers/spree/pages_controller.rb +14 -0
  19. data/app/models/spree/page.rb +25 -0
  20. data/app/overrides/spree/admin/menu/add_pages_to_admin_sidebar.rb +6 -0
  21. data/app/views/spree/admin/pages/_form.html.erb +51 -0
  22. data/app/views/spree/admin/pages/edit.html.erb +5 -0
  23. data/app/views/spree/admin/pages/index.html.erb +39 -0
  24. data/app/views/spree/admin/pages/new.html.erb +5 -0
  25. data/app/views/spree/admin/shared/_pages_menu_item.html.erb +5 -0
  26. data/app/views/spree/pages/_og_meta_tags.html.erb +13 -0
  27. data/app/views/spree/pages/show.html.erb +9 -0
  28. data/bin/rails +8 -0
  29. data/config/locales/en.yml +10 -0
  30. data/config/routes.rb +8 -0
  31. data/db/migrate/20180319090554_create_pages.rb +13 -0
  32. data/db/migrate/20180321105816_add_meta_fields_to_pages.rb +7 -0
  33. data/db/migrate/20180321122609_add_live_to_spree_pages.rb +5 -0
  34. data/gemfiles/.bundle/config +2 -0
  35. data/gemfiles/spree_3_1.gemfile +12 -0
  36. data/gemfiles/spree_3_2.gemfile +11 -0
  37. data/gemfiles/spree_3_3.gemfile +11 -0
  38. data/gemfiles/spree_3_4.gemfile +11 -0
  39. data/gemfiles/spree_master.gemfile +11 -0
  40. data/lib/generators/spree_pages/install/install_generator.rb +30 -0
  41. data/lib/spree_pages/engine.rb +20 -0
  42. data/lib/spree_pages/routes_contstraints.rb +14 -0
  43. data/lib/spree_pages/version.rb +17 -0
  44. data/lib/spree_pages.rb +5 -0
  45. data/spec/.rubocop.yml +12 -0
  46. data/spec/controllers/spree/pages_controller_spec.rb +40 -0
  47. data/spec/factories/pages.rb +8 -0
  48. data/spec/features/visit_pages_spec.rb +23 -0
  49. data/spec/models/spree/page_spec.rb +18 -0
  50. data/spec/spec_helper.rb +59 -0
  51. data/spec/support/capybara.rb +2 -0
  52. data/spec/support/database_cleaner.rb +25 -0
  53. data/spec/support/factory_bot.rb +7 -0
  54. data/spec/support/simplecov.rb +8 -0
  55. data/spree_pages.gemspec +42 -0
  56. metadata +68 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 77c37eb137bd84f58380063dfbdbb87a113931e6
4
- data.tar.gz: 13cb0d6307e61cf0187f5802140b88b4985cf620
3
+ metadata.gz: be5106f5472ee19e3046f5efbe402465c4a0ff8d
4
+ data.tar.gz: 2854db9fbac114800340062cd7bd7874b55f010e
5
5
  SHA512:
6
- metadata.gz: 90d61ba59d549682613e8af0820835f533e0e90b9520cba80b4638a1c01bfb8a1a1ef544baf7cf215c9486dd952cf9dd7c9e83b4088492f769a9105c15355df3
7
- data.tar.gz: 18df509795b11654e2a2db7e3551d5450c8aefe332b889aa1275783c5db977f380a547ec63b8c918c5125f8ae8b86cc6f5968827e1aab47d01148b78b4ae43b2
6
+ metadata.gz: 06ee4a8872f42e0c6670fd9fece3f9deb31af9902f6d0d44acc073f45b9007cf394a9546ec47a3ee7fcdca8952c0a7c51e838287924bb9925b8d17cfa6b43b02
7
+ data.tar.gz: 1b08b4f3643c888d45935253767b7f3c7ea49b8c68e07282da1e2b23840939d9f5e873bae86c3814f1fa3302cfafff5198b2fb45fd311080f846bf62e53f22b8
data/.codeclimate.yml ADDED
@@ -0,0 +1,25 @@
1
+ version: '2'
2
+ plugins:
3
+ # common
4
+ fixme:
5
+ enabled: true
6
+ git-legal:
7
+ enabled: true
8
+ markdownlint:
9
+ enabled: true
10
+ # ruby/rails
11
+ brakeman:
12
+ enabled: true
13
+ flog:
14
+ enabled: true
15
+ rubocop:
16
+ enabled: true
17
+ channel: rubocop-0-54 # https://github.com/codeclimate/codeclimate-rubocop/branches/all?utf8=%E2%9C%93&query=channel%2Frubocop
18
+ # css
19
+ csslint:
20
+ enabled: true
21
+ scss-lint:
22
+ enabled: true
23
+
24
+ exclude_patterns:
25
+ - 'db/'
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ \#*
2
+ *~
3
+ .#*
4
+ .DS_Store
5
+ .idea
6
+ .localeapp/locales
7
+ .project
8
+ coverage
9
+ default
10
+ Gemfile.lock
11
+ tmp
12
+ nbproject
13
+ pkg
14
+ *.sw?
15
+ spec/dummy
16
+ .rvmrc
17
+ .sass-cache
18
+ public/spree
19
+ .ruby-version
20
+ .ruby-gemset
21
+ gemfiles/*.gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ -r spec_helper
3
+ -f documentation
data/.rubocop.yml ADDED
@@ -0,0 +1,31 @@
1
+ AllCops:
2
+ DisplayCopNames: true
3
+ TargetRubyVersion: 2.4
4
+ Include:
5
+ - '**/Gemfile'
6
+ - '**/Rakefile'
7
+ - '**/Appraisals'
8
+ Exclude:
9
+ - 'spec/dummy/**/*'
10
+ - 'lib/generators/**/*'
11
+
12
+ Rails:
13
+ Enabled: true
14
+
15
+ Gemspec/RequiredRubyVersion:
16
+ Enabled: false
17
+
18
+ Metrics/LineLength:
19
+ Max: 150
20
+
21
+ Metrics/BlockLength:
22
+ Exclude:
23
+ - 'spree_pages.gemspec'
24
+
25
+ # DISABLED
26
+
27
+ Style/Documentation:
28
+ Enabled: false
29
+
30
+ Style/FrozenStringLiteralComment:
31
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,38 @@
1
+ sudo: required
2
+ dist: trusty
3
+
4
+ language: ruby
5
+
6
+ env:
7
+ - DB=postgres
8
+ - DB=mysql
9
+
10
+ gemfile:
11
+ - gemfiles/spree_master.gemfile
12
+ - gemfiles/spree_3_2.gemfile
13
+ - gemfiles/spree_3_3.gemfile
14
+ - gemfiles/spree_3_4.gemfile
15
+
16
+ script:
17
+ - bundle exec rake test_app
18
+ - bundle exec rake spec
19
+
20
+ rvm:
21
+ - 2.5
22
+ - 2.4
23
+ - 2.3
24
+
25
+ matrix:
26
+ allow_failures:
27
+ - gemfile: gemfiles/spree_master.gemfile
28
+
29
+ before_install:
30
+ - mysql -u root -e "GRANT ALL ON *.* TO 'travis'@'%';"
31
+
32
+ before_script:
33
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
34
+ - chmod +x ./cc-test-reporter
35
+ - ./cc-test-reporter before-build
36
+
37
+ after_script:
38
+ - ./cc-test-reporter after-build --coverage-input-type simplecov --exit-code $TRAVIS_TEST_RESULT
data/Appraisals ADDED
@@ -0,0 +1,23 @@
1
+ appraise 'spree-3-2' do
2
+ gem 'spree', '~> 3.2.0'
3
+ gem 'spree_auth_devise', '~> 3.2.0'
4
+ gem 'rails-controller-testing'
5
+ end
6
+
7
+ appraise 'spree-3-3' do
8
+ gem 'spree', '~> 3.3.0'
9
+ gem 'spree_auth_devise', '~> 3.3.0'
10
+ gem 'rails-controller-testing'
11
+ end
12
+
13
+ appraise 'spree-3-4' do
14
+ gem 'spree', '~> 3.4.0'
15
+ gem 'spree_auth_devise', '~> 3.3.0'
16
+ gem 'rails-controller-testing'
17
+ end
18
+
19
+ appraise 'spree-master' do
20
+ gem 'spree', github: 'spree/spree', branch: 'master'
21
+ gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'master'
22
+ gem 'rails-controller-testing'
23
+ end
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,25 @@
1
+ # Contributing
2
+
3
+ Here are some ways *you* can contribute:
4
+
5
+ * by using prerelease versions
6
+ * by reporting [bugs][1]
7
+ * by suggesting new features
8
+ * by writing or editing documentation
9
+ * by writing specifications
10
+ * by writing code (*no patch is too small*: fix typos, add comments, clean up inconsistent whitespace)
11
+ * by refactoring code
12
+ * by resolving [issues][1]
13
+ * by reviewing patches
14
+
15
+ Starting point:
16
+
17
+ * Fork the repo
18
+ * Clone your repo
19
+ * Run `bundle install`
20
+ * Run `bundle exec rake test_app` to create the test application in `spec/dummy`
21
+ * Make your changes
22
+ * Ensure specs pass by running `bundle exec rake`
23
+ * Submit your pull request
24
+
25
+ [1]: https://github.com/public-market/spree_pages/issues
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source 'https://rubygems.org'
2
+
3
+ git_source(:github) do |repo_name|
4
+ repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?('/')
5
+ "https://github.com/#{repo_name}.git"
6
+ end
7
+
8
+ gem 'spree', github: 'spree/spree', branch: 'master'
9
+ # Provides basic authentication functionality for testing parts of your engine
10
+ gem 'rails-controller-testing'
11
+ gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'master'
12
+
13
+ gem 'rubocop', require: false
14
+ gem 'rubocop-rspec', require: false
15
+
16
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2018 Abundance Labs, Inc.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name Spree nor the names of its contributors may be used to
13
+ endorse or promote products derived from this software without specific
14
+ prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,83 @@
1
+ <!-- markdownlint-disable MD041 -->
2
+ [![Build Status](https://travis-ci.org/public-market/spree_pages.svg?branch=master)](https://travis-ci.org/public-market/spree_pages)
3
+ [![Maintainability](https://api.codeclimate.com/v1/badges/5af5e44f4cf49e9f6f9b/maintainability)](https://codeclimate.com/github/public-market/spree_pages/maintainability)
4
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/5af5e44f4cf49e9f6f9b/test_coverage)](https://codeclimate.com/github/public-market/spree_pages/test_coverage)
5
+ <!-- markdownlint-enable MD041 -->
6
+
7
+ # Spree Pages
8
+
9
+ Simplified version of `spree_static_pages` without localisation overhead
10
+
11
+ ## Installation
12
+
13
+ 1. Add this extension to your Gemfile with this line:
14
+
15
+ ```ruby
16
+ gem 'spree_pages', github: 'public-market/spree_pages'
17
+ ```
18
+
19
+ 1. Install the gem using Bundler:
20
+
21
+ ```ruby
22
+ bundle install
23
+ ```
24
+
25
+ 1. Copy & run migrations
26
+
27
+ ```ruby
28
+ bundle exec rails g spree_pages:install
29
+ ```
30
+
31
+ 1. Restart your server
32
+
33
+ If your server was running, restart it so that it can find the assets properly.
34
+
35
+ ## Adding WYSIWYG (example: ckeditor)
36
+
37
+ 1. Install ckeditor:
38
+
39
+ https://github.com/galetahub/ckeditor#installation
40
+
41
+ 1. Add ckeditor to js:
42
+
43
+ In our case it's `vendor/assets/javascripts/spree/backend/all.js`
44
+
45
+ Add this line before `//= require_tree .`
46
+
47
+ ```javascript
48
+ //= require ckeditor/init
49
+ ```
50
+
51
+ 1. Add ckeditor to necessary fields in forms:
52
+
53
+ Create new js file `ckeditorInit.js` in `vendor/assets/javascripts/spree/backend`
54
+
55
+ ```javascript
56
+ $(function() {
57
+ var editableIds = ['page_content']
58
+ editableIds.forEach(function(id) {
59
+ if ($("#" + id).length) {
60
+ CKEDITOR.replace(id);
61
+ }
62
+ })
63
+ });
64
+ ```
65
+
66
+ This script will add ckeditor to all fields with ids from `editableIds` array. In this case it's `page_content`
67
+
68
+ ## Testing
69
+
70
+ First bundle your dependencies, then run `rake`. `rake` will default to building the dummy app if it does not exist, then it will run specs. The dummy app can be regenerated by using `rake test_app`.
71
+
72
+ ```shell
73
+ bundle
74
+ bundle exec rake
75
+ ```
76
+
77
+ ## Contributing
78
+
79
+ If you'd like to contribute, please take a look at the
80
+ [instructions](CONTRIBUTING.md) for installing dependencies and crafting a good
81
+ pull request.
82
+
83
+ Copyright (c) 2018 Abundance Labs, Inc., released under the New BSD License
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ require 'spree/testing_support/extension_rake'
6
+
7
+ RSpec::Core::RakeTask.new
8
+
9
+ task :default do
10
+ if Dir['spec/dummy'].empty?
11
+ Rake::Task[:test_app].invoke
12
+ Dir.chdir('../../')
13
+ end
14
+ Rake::Task[:spec].invoke
15
+ end
16
+
17
+ desc 'Generates a dummy app for testing'
18
+ task :test_app do
19
+ ENV['LIB_NAME'] = 'spree_pages'
20
+ Rake::Task['extension:test_app'].invoke
21
+ end
@@ -0,0 +1,2 @@
1
+ // Placeholder manifest file.
2
+ // the installer will append this file to the app vendored assets here: vendor/assets/javascripts/spree/backend/all.js'
@@ -0,0 +1,2 @@
1
+ // Placeholder manifest file.
2
+ // the installer will append this file to the app vendored assets here: vendor/assets/javascripts/spree/frontend/all.js'
@@ -0,0 +1,4 @@
1
+ /*
2
+ Placeholder manifest file.
3
+ the installer will append this file to the app vendored assets here: 'vendor/assets/stylesheets/spree/backend/all.css'
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Placeholder manifest file.
3
+ the installer will append this file to the app vendored assets here: 'vendor/assets/stylesheets/spree/frontend/all.css'
4
+ */
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Admin
3
+ class PagesController < ResourceController
4
+ private
5
+
6
+ def permitted_resource_params
7
+ params.require(:page).permit(%i[id title content slug meta_title meta_description meta_image live])
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ module Spree
2
+ class PagesController < StoreController
3
+ def show
4
+ @page =
5
+ if try_spree_current_user&.respond_to?(:has_spree_role?) && try_spree_current_user&.has_spree_role?(:admin)
6
+ Spree::Page.find_by(slug: request.path[1..-1])
7
+ else
8
+ Spree::Page.live.find_by!(slug: request.path[1..-1])
9
+ end
10
+
11
+ @title = @page.title
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ module Spree
2
+ class Page < ApplicationRecord
3
+ has_attached_file :meta_image, styles: ->(i) { i.instance.class.meta_image_sizes }
4
+ validates_attachment_content_type :meta_image, content_type: %r{\Aimage\/.*\z}
5
+
6
+ validates :title, :slug, :content, presence: true
7
+ validates :slug, uniqueness: true
8
+
9
+ scope :live, -> { where(live: true) }
10
+
11
+ before_save :remove_leading_slash_from_slug
12
+
13
+ def remove_leading_slash_from_slug
14
+ self.slug = slug[1..-1] if slug.start_with?('/') # ensure that slugs don't start with a slash
15
+ end
16
+
17
+ def self.meta_image_sizes
18
+ { large: '1200x630>', medium: '600x315>', small: '200x200>' }
19
+ end
20
+
21
+ def self.meta_image_sizes_tags
22
+ meta_image_sizes.map { |style, sizes| [style, { width: sizes.split('x')[0], height: sizes.split('x')[1].tr('>', '') }] }.to_h
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,6 @@
1
+ Deface::Override.new(
2
+ virtual_path: 'spree/layouts/admin',
3
+ name: 'pages_admin_sidebar_menu',
4
+ insert_bottom: '#main-sidebar',
5
+ partial: 'spree/admin/shared/pages_menu_item'
6
+ )
@@ -0,0 +1,51 @@
1
+ <%= render partial: 'spree/shared/error_messages', locals: { target: resource } %>
2
+
3
+ <%= form_for [:admin, resource] do |f| %>
4
+ <div class="row" data-hook="admin_page_form_fields">
5
+ <div class="col-md-6">
6
+ <div class="form-group">
7
+ <%= f.label :title %> <span class="required">*</span>
8
+ <%= f.text_field :title, class: 'form-control' %>
9
+ </div>
10
+
11
+ <div class="form-group">
12
+ <%= f.label :slug %> <span class="required">*</span>
13
+ <%= f.text_field :slug, class: 'form-control' %>
14
+ </div>
15
+ </div>
16
+
17
+ <div class="col-md-12">
18
+ <div class="form-group">
19
+ <%= f.label :content %> <span class="required">*</span>
20
+ <%= f.text_area :content, rows: 12, class: 'form-control' %>
21
+ </div>
22
+ </div>
23
+
24
+ <div class="col-md-6">
25
+ <div class="form-group">
26
+ <%= f.label :meta_title %>
27
+ <%= f.text_field :meta_title, class: 'form-control' %>
28
+ </div>
29
+
30
+ <div class="form-group">
31
+ <%= f.label :meta_description %>
32
+ <%= f.text_field :meta_description, class: 'form-control' %>
33
+ </div>
34
+
35
+ <div class="form-group">
36
+ <%= f.label :meta_image %>
37
+ <%= f.file_field :meta_image %>
38
+ <% if resource.meta_image.exists? %>
39
+ <%= image_tag resource.meta_image.url(:small) %>
40
+ <% end %>
41
+ </div>
42
+
43
+ <div class="form-group">
44
+ <%= f.label :live %>
45
+ <%= f.check_box :live %>
46
+ </div>
47
+ </div>
48
+ </div>
49
+
50
+ <%= render "spree/admin/shared/#{resource.new_record? ? 'new' : 'edit'}_resource_links" %>
51
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <% content_for :page_title do %>
2
+ <%= Spree.t(:editing_resource, resource: Spree::Page.model_name.human) %>
3
+ <% end %>
4
+
5
+ <%= render 'form', resource: @page %>
@@ -0,0 +1,39 @@
1
+ <% content_for :page_title do %>
2
+ <%= plural_resource_name(Spree::Page) %>
3
+ <% end %>
4
+
5
+ <% content_for :page_actions do %>
6
+ <%= button_link_to Spree.t(:new_page), new_object_url, icon: 'plus', class: 'btn-primary', id: 'admin_new_page' %>
7
+ <% end %>
8
+
9
+ <% if @pages.any? %>
10
+ <table class="table" id="listing_pages" data-hook>
11
+ <colgroup>
12
+ <col style="width: 60%">
13
+ <col style="width: 40%">
14
+ </colgroup>
15
+ <thead>
16
+ <tr data-hook="admin_pages_index_headers">
17
+ <th><%= Spree::Page.human_attribute_name(:title) %></th>
18
+ <th data-hook="admin_pages_index_header_actions" class="actions"></th>
19
+ </tr>
20
+ </thead>
21
+ <tbody>
22
+ <% @pages.each do |page| %>
23
+ <tr data-hook="admin_pages_index_rows" class="<%= cycle('odd', 'even') %>" id="<%= dom_id page %>">
24
+ <td><%= page.title %></td>
25
+ <td class="actions text-right" data-hook="admin_pages_index_row_actions">
26
+ <%= link_to 'Show in app', page_url(page.slug), target: '_blank' %>
27
+ <%= link_to_edit page, no_text: true %>
28
+ <%= link_to_delete page, no_text: true %>
29
+ </td>
30
+ </tr>
31
+ <% end %>
32
+ </tbody>
33
+ </table>
34
+ <% else %>
35
+ <div class="alert alert-warning no-objects-found">
36
+ <%= Spree.t(:no_resource_found, resource: Spree::Page.model_name.human) %>,
37
+ <%= link_to Spree.t(:add_one), spree.new_admin_page_path %>!
38
+ </div>
39
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <% content_for :page_title do %>
2
+ <%= Spree.t(:new_page) %>
3
+ <% end %>
4
+
5
+ <%= render 'form', resource: @page %>
@@ -0,0 +1,5 @@
1
+ <% if can?(:admin, Spree::Page) %>
2
+ <ul class='nav nav-sidebar'>
3
+ <%= tab Spree::Page, url: spree.admin_pages_url, icon: 'font', label: plural_resource_name(Spree::Page) %>
4
+ </ul>
5
+ <% end %>
@@ -0,0 +1,13 @@
1
+ <% content_for(:head) do %>
2
+ <% page_meta_title = page.meta_title.presence || @title %>
3
+ <meta name="title" content="<%= page_meta_title %>">
4
+ <meta property="og:title" content="<%= page_meta_title %>">
5
+ <meta property="og:description" content="<%= page.meta_description || meta_data[:description] %>">
6
+ <% if page.meta_image.exists? %>
7
+ <% Spree::Page.meta_image_sizes.keys.each do |style| %>
8
+ <meta property="og:image" content="<%= page.meta_image.url(style) %>">
9
+ <meta property="og:image:width" content="<%= Spree::Page.meta_image_sizes_tags[style][:width] %>">
10
+ <meta property="og:image:height" content="<%= Spree::Page.meta_image_sizes_tags[style][:height] %>">
11
+ <% end %>
12
+ <% end %>
13
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <%= render partial: 'og_meta_tags', locals: { page: @page } %>
2
+
3
+ <% cache([:v3, @page]) do %>
4
+ <center><h2><%= @page.title %></h2></center>
5
+ <br>
6
+ <div id='page_content'>
7
+ <%= raw @page.content %>
8
+ </div>
9
+ <% end %>
data/bin/rails ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" from the root of your extension
3
+
4
+ ENGINE_ROOT = File.expand_path('..', __dir__)
5
+ ENGINE_PATH = File.expand_path('../lib/spree_pages/engine', __dir__)
6
+
7
+ require 'rails/all'
8
+ require 'rails/engine/commands'
@@ -0,0 +1,10 @@
1
+ en:
2
+ activerecord:
3
+ models:
4
+ spree/page:
5
+ one: Page
6
+ other: Pages
7
+ spree:
8
+ pages: Page
9
+ new_page: New page
10
+
data/config/routes.rb ADDED
@@ -0,0 +1,8 @@
1
+ Spree::Core::Engine.add_routes do
2
+ namespace :admin, path: Spree.admin_path do
3
+ resources :pages
4
+ end
5
+ constraints(Spree::SpreePages::RoutesConstraints) do
6
+ get '/(*path)', to: 'pages#show', as: 'page'
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ class CreatePages < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :spree_pages do |t|
4
+ t.string :title, null: false
5
+ t.string :slug, null: false
6
+ t.text :content, null: false
7
+
8
+ t.timestamps
9
+ end
10
+
11
+ add_index :spree_pages, :slug, unique: true
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ class AddMetaFieldsToPages < ActiveRecord::Migration[5.0]
2
+ def change
3
+ add_column :spree_pages, :meta_title, :string
4
+ add_column :spree_pages, :meta_description, :string
5
+ add_attachment :spree_pages, :meta_image
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ class AddLiveToSpreePages < ActiveRecord::Migration[5.0]
2
+ def change
3
+ add_column :spree_pages, :live, :boolean, default: true
4
+ end
5
+ end
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_RETRY: "1"
@@ -0,0 +1,12 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'rails-controller-testing'
6
+ gem 'rails_test_params_backport', group: :test
7
+ gem 'rubocop', require: false
8
+ gem 'rubocop-rspec', require: false
9
+ gem 'spree', '~> 3.1.0'
10
+ gem 'spree_auth_devise', '~> 3.1.0'
11
+
12
+ gemspec path: '../'
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'rails-controller-testing'
6
+ gem 'rubocop', require: false
7
+ gem 'rubocop-rspec', require: false
8
+ gem 'spree', '~> 3.2.0'
9
+ gem 'spree_auth_devise', '~> 3.2.0'
10
+
11
+ gemspec path: '../'
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'rails-controller-testing'
6
+ gem 'rubocop', require: false
7
+ gem 'rubocop-rspec', require: false
8
+ gem 'spree', '~> 3.3.0'
9
+ gem 'spree_auth_devise', '~> 3.3.0'
10
+
11
+ gemspec path: '../'
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'rails-controller-testing'
6
+ gem 'rubocop', require: false
7
+ gem 'rubocop-rspec', require: false
8
+ gem 'spree', '~> 3.4.0'
9
+ gem 'spree_auth_devise', '~> 3.3.0'
10
+
11
+ gemspec path: '../'
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'rails-controller-testing'
6
+ gem 'rubocop', require: false
7
+ gem 'rubocop-rspec', require: false
8
+ gem 'spree', branch: 'master', git: 'https://github.com/spree/spree.git'
9
+ gem 'spree_auth_devise', branch: 'master', git: 'https://github.com/spree/spree_auth_devise.git'
10
+
11
+ gemspec path: '../'
@@ -0,0 +1,30 @@
1
+ module SpreePages
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ class_option :auto_run_migrations, type: :boolean, default: false
5
+
6
+ def add_javascripts
7
+ append_file 'vendor/assets/javascripts/spree/frontend/all.js', "//= require spree/frontend/spree_pages\n"
8
+ append_file 'vendor/assets/javascripts/spree/backend/all.js', "//= require spree/backend/spree_pages\n"
9
+ end
10
+
11
+ def add_stylesheets
12
+ inject_into_file 'vendor/assets/stylesheets/spree/frontend/all.css', " *= require spree/frontend/spree_pages\n", before: %r{\*\/}, verbose: true
13
+ inject_into_file 'vendor/assets/stylesheets/spree/backend/all.css', " *= require spree/backend/spree_pages\n", before: %r{\*\/}, verbose: true
14
+ end
15
+
16
+ def add_migrations
17
+ run 'bundle exec rake railties:install:migrations FROM=spree_pages'
18
+ end
19
+
20
+ def run_migrations
21
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]'))
22
+ if run_migrations
23
+ run 'bundle exec rake db:migrate'
24
+ else
25
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ module SpreePages
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'spree_pages'
6
+
7
+ # use rspec for tests
8
+ config.generators do |g|
9
+ g.test_framework :rspec
10
+ end
11
+
12
+ def self.activate
13
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
14
+ Rails.configuration.cache_classes ? require(c) : load(c)
15
+ end
16
+ end
17
+
18
+ config.to_prepare(&method(:activate).to_proc)
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ module Spree
2
+ module SpreePages
3
+ class RoutesConstraints
4
+ # rubocop:disable Metrics/LineLength
5
+ def self.matches?(request)
6
+ return false if request.path == '/' ||
7
+ request.path.starts_with?(Spree.admin_path) ||
8
+ request.path =~ %r{\A\/+(account|cart|checkout|content|login|pg\/|orders|products|s\/|session|signup|shipments|states|t\/|tax_categories|user)+}
9
+ Spree::Page.find_by(slug: request.path[1..-1]).present?
10
+ end
11
+ # rubocop:enable Metrics/LineLength
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ module SpreePages
2
+ module_function
3
+
4
+ # Returns the version of the currently loaded SpreePages as a
5
+ # <tt>Gem::Version</tt>.
6
+ def version
7
+ Gem::Version.new(VERSION::STRING)
8
+ end
9
+
10
+ module VERSION
11
+ MAJOR = 1
12
+ MINOR = 0
13
+ TINY = 2
14
+
15
+ STRING = [MAJOR, MINOR, TINY].compact.join('.')
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ require 'spree_core'
2
+ require 'spree_extension'
3
+ require 'spree_pages/engine'
4
+ require 'spree_pages/version'
5
+ require 'spree_pages/routes_contstraints'
data/spec/.rubocop.yml ADDED
@@ -0,0 +1,12 @@
1
+ require: rubocop-rspec
2
+
3
+ inherit_from: ../.rubocop.yml
4
+
5
+ Metrics/BlockLength:
6
+ Enabled: false
7
+
8
+ Style/BlockDelimiters:
9
+ Enabled: false
10
+
11
+ RSpec/NestedGroups:
12
+ Max: 5
@@ -0,0 +1,40 @@
1
+ RSpec.describe Spree::PagesController, type: :controller do
2
+ before do
3
+ allow(controller).to receive(:spree_current_user).and_return(nil)
4
+ allow(controller).to receive(:current_store).and_return(build_stubbed(:store))
5
+ end
6
+
7
+ describe '#show' do
8
+ subject(:get_page) { get :show, params: { path: path } }
9
+
10
+ let(:page) { create(:page) }
11
+ let(:path) { page.slug }
12
+
13
+ context 'with page slug' do
14
+ it { is_expected.to be_success }
15
+
16
+ it 'loads page' do
17
+ get_page
18
+ expect(assigns(:page)).to eq page
19
+ end
20
+ end
21
+
22
+ context 'when page is not live' do
23
+ let(:page) { create(:page, live: false) }
24
+
25
+ context 'when user is not admin' do
26
+ it { expect { get_page }.to raise_exception(ActiveRecord::RecordNotFound) }
27
+ end
28
+
29
+ context 'when user is admin' do
30
+ before do
31
+ user = build_stubbed(:user)
32
+ allow(user).to receive(:has_spree_role?).with(:admin) { true }
33
+ allow(controller).to receive(:spree_current_user).and_return(user)
34
+ end
35
+
36
+ it { expect { get_page }.not_to raise_exception }
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,8 @@
1
+ FactoryBot.define do
2
+ factory :page, class: Spree::Page do
3
+ title { generate(:random_string) }
4
+ content { generate(:random_description) }
5
+
6
+ sequence(:slug) { |n| "page#{n}" }
7
+ end
8
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'Visits page', type: :feature do
4
+ before { create(:store, default: true) }
5
+
6
+ it 'correctly loads page' do
7
+ spree_page = create(:page, slug: 'page')
8
+ visit '/page'
9
+ expect(page).to have_text spree_page.title
10
+ end
11
+
12
+ it 'can have slug with multiple /' do
13
+ spree_page = create(:page, slug: 'page/with/slashes')
14
+ visit '/page/with/slashes'
15
+ expect(page).to have_text spree_page.title
16
+ end
17
+
18
+ it 'do not effect the rendering of the rest of the site' do
19
+ product = create(:product)
20
+ visit spree.product_path(product)
21
+ expect(page).to have_text product.name
22
+ end
23
+ end
@@ -0,0 +1,18 @@
1
+ RSpec.describe Spree::Page, type: :model do
2
+ let!(:page) { build_stubbed(:page) }
3
+
4
+ describe 'factory' do
5
+ it 'is valid' do
6
+ expect(page).to be_valid
7
+ end
8
+ end
9
+
10
+ describe '#remove_leading_slash_from_slug' do
11
+ let(:page) { build(:page, slug: '/slash') }
12
+
13
+ it 'adds slash to all slugs' do
14
+ page.save
15
+ expect(page.slug).to eq 'slash'
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,59 @@
1
+ require_relative './support/simplecov'
2
+
3
+ # Configure Rails Environment
4
+ ENV['RAILS_ENV'] = 'test'
5
+
6
+ require File.expand_path('dummy/config/environment.rb', __dir__)
7
+
8
+ require 'rspec/rails'
9
+ require 'ffaker'
10
+
11
+ # Requires supporting ruby files with custom matchers and macros, etc,
12
+ # in spec/support/ and its subdirectories.
13
+ Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
14
+
15
+ # Requires factories and other useful helpers defined in spree_core.
16
+ require 'spree/testing_support/authorization_helpers'
17
+ require 'spree/testing_support/controller_requests'
18
+ require 'spree/testing_support/factories'
19
+ require 'spree/testing_support/url_helpers'
20
+
21
+ RSpec.configure do |config|
22
+ # Infer an example group's spec type from the file location.
23
+ config.infer_spec_type_from_file_location!
24
+
25
+ # == URL Helpers
26
+ #
27
+ # Allows access to Spree's routes in specs:
28
+ #
29
+ # visit spree.admin_path
30
+ # current_path.should eql(spree.products_path)
31
+ config.include Spree::TestingSupport::UrlHelpers
32
+
33
+ # == Requests support
34
+ #
35
+ # Adds convenient methods to request Spree's controllers
36
+ # spree_get :index
37
+ config.include Spree::TestingSupport::ControllerRequests, type: :controller
38
+
39
+ # == Mock Framework
40
+ #
41
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
42
+ #
43
+ # config.mock_with :mocha
44
+ # config.mock_with :flexmock
45
+ # config.mock_with :rr
46
+ config.mock_with :rspec
47
+ config.color = true
48
+
49
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
50
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
51
+
52
+ # Capybara javascript drivers require transactional fixtures set to false, and we use DatabaseCleaner
53
+ # to cleanup after each test instead. Without transactional fixtures set to false the records created
54
+ # to setup a test will be unavailable to the browser, which runs under a separate server instance.
55
+ config.use_transactional_fixtures = false
56
+
57
+ config.fail_fast = ENV['FAIL_FAST'] || false
58
+ config.order = 'random'
59
+ end
@@ -0,0 +1,2 @@
1
+ require 'capybara/rails'
2
+ require 'capybara/rspec'
@@ -0,0 +1,25 @@
1
+ require 'database_cleaner'
2
+
3
+ RSpec.configure do |config|
4
+ config.before(:suite) do
5
+ DatabaseCleaner.clean_with :truncation
6
+ end
7
+
8
+ config.before do
9
+ DatabaseCleaner.strategy = :transaction
10
+ end
11
+
12
+ # Before each spec check if it is a Javascript test and switch between using database transactions or not where necessary.
13
+ config.before(:each, :js) do
14
+ DatabaseCleaner.strategy = :truncation
15
+ end
16
+
17
+ config.before do
18
+ DatabaseCleaner.start
19
+ end
20
+
21
+ # After each spec clean the database.
22
+ config.after do
23
+ DatabaseCleaner.clean
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ require 'factory_bot'
2
+
3
+ FactoryBot.find_definitions
4
+
5
+ RSpec.configure do |config|
6
+ config.include FactoryBot::Syntax::Methods
7
+ end
@@ -0,0 +1,8 @@
1
+ require 'simplecov'
2
+
3
+ SimpleCov.start(:rails) do
4
+ add_filter('spec/dummy')
5
+ add_filter('lib/generators')
6
+ add_filter('lib/spree_pages/engine')
7
+ add_filter('lib/spree_pages/version')
8
+ end
@@ -0,0 +1,42 @@
1
+
2
+ lib = File.expand_path('lib', __dir__)
3
+ $LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
4
+
5
+ require 'spree_pages/version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.platform = Gem::Platform::RUBY
9
+ s.name = 'spree_pages'
10
+ s.version = SpreePages.version
11
+ s.summary = 'Simple static pages for spree'
12
+ s.required_ruby_version = '>= 2.2.7'
13
+
14
+ s.author = 'Kozaev Artem'
15
+ s.email = 'artem@publicmarket.io'
16
+ s.homepage = 'https://github.com/public-market'
17
+ s.license = 'BSD-3-Clause'
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- spec/*`.split("\n")
21
+ s.require_path = 'lib'
22
+ s.requirements << 'none'
23
+
24
+ s.add_dependency 'paperclip'
25
+
26
+ spree_version = '>= 3.1.0', '< 4.0'
27
+ s.add_dependency 'spree_backend', spree_version
28
+ s.add_dependency 'spree_core', spree_version
29
+ s.add_dependency 'spree_extension'
30
+
31
+ s.add_development_dependency 'appraisal'
32
+ s.add_development_dependency 'capybara'
33
+ s.add_development_dependency 'coffee-rails'
34
+ s.add_development_dependency 'database_cleaner'
35
+ s.add_development_dependency 'factory_bot'
36
+ s.add_development_dependency 'ffaker'
37
+ s.add_development_dependency 'mysql2', '0.4.10'
38
+ s.add_development_dependency 'pg', '~> 0.18'
39
+ s.add_development_dependency 'rspec-rails'
40
+ s.add_development_dependency 'simplecov'
41
+ s.add_development_dependency 'sqlite3'
42
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_pages
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kozaev Artem
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-16 00:00:00.000000000 Z
11
+ date: 2018-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: paperclip
@@ -237,7 +237,61 @@ email: artem@publicmarket.io
237
237
  executables: []
238
238
  extensions: []
239
239
  extra_rdoc_files: []
240
- files: []
240
+ files:
241
+ - ".codeclimate.yml"
242
+ - ".gitignore"
243
+ - ".rspec"
244
+ - ".rubocop.yml"
245
+ - ".travis.yml"
246
+ - Appraisals
247
+ - CONTRIBUTING.md
248
+ - Gemfile
249
+ - LICENSE
250
+ - README.md
251
+ - Rakefile
252
+ - app/assets/javascripts/spree/backend/spree_pages.js
253
+ - app/assets/javascripts/spree/frontend/spree_pages.js
254
+ - app/assets/stylesheets/spree/backend/spree_pages.css
255
+ - app/assets/stylesheets/spree/frontend/spree_pages.css
256
+ - app/controllers/spree/admin/pages_controller.rb
257
+ - app/controllers/spree/pages_controller.rb
258
+ - app/models/spree/page.rb
259
+ - app/overrides/spree/admin/menu/add_pages_to_admin_sidebar.rb
260
+ - app/views/spree/admin/pages/_form.html.erb
261
+ - app/views/spree/admin/pages/edit.html.erb
262
+ - app/views/spree/admin/pages/index.html.erb
263
+ - app/views/spree/admin/pages/new.html.erb
264
+ - app/views/spree/admin/shared/_pages_menu_item.html.erb
265
+ - app/views/spree/pages/_og_meta_tags.html.erb
266
+ - app/views/spree/pages/show.html.erb
267
+ - bin/rails
268
+ - config/locales/en.yml
269
+ - config/routes.rb
270
+ - db/migrate/20180319090554_create_pages.rb
271
+ - db/migrate/20180321105816_add_meta_fields_to_pages.rb
272
+ - db/migrate/20180321122609_add_live_to_spree_pages.rb
273
+ - gemfiles/.bundle/config
274
+ - gemfiles/spree_3_1.gemfile
275
+ - gemfiles/spree_3_2.gemfile
276
+ - gemfiles/spree_3_3.gemfile
277
+ - gemfiles/spree_3_4.gemfile
278
+ - gemfiles/spree_master.gemfile
279
+ - lib/generators/spree_pages/install/install_generator.rb
280
+ - lib/spree_pages.rb
281
+ - lib/spree_pages/engine.rb
282
+ - lib/spree_pages/routes_contstraints.rb
283
+ - lib/spree_pages/version.rb
284
+ - spec/.rubocop.yml
285
+ - spec/controllers/spree/pages_controller_spec.rb
286
+ - spec/factories/pages.rb
287
+ - spec/features/visit_pages_spec.rb
288
+ - spec/models/spree/page_spec.rb
289
+ - spec/spec_helper.rb
290
+ - spec/support/capybara.rb
291
+ - spec/support/database_cleaner.rb
292
+ - spec/support/factory_bot.rb
293
+ - spec/support/simplecov.rb
294
+ - spree_pages.gemspec
241
295
  homepage: https://github.com/public-market
242
296
  licenses:
243
297
  - BSD-3-Clause
@@ -259,8 +313,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
259
313
  requirements:
260
314
  - none
261
315
  rubyforge_project:
262
- rubygems_version: 2.6.11
316
+ rubygems_version: 2.6.10
263
317
  signing_key:
264
318
  specification_version: 4
265
319
  summary: Simple static pages for spree
266
- test_files: []
320
+ test_files:
321
+ - spec/controllers/spree/pages_controller_spec.rb
322
+ - spec/factories/pages.rb
323
+ - spec/features/visit_pages_spec.rb
324
+ - spec/models/spree/page_spec.rb
325
+ - spec/spec_helper.rb
326
+ - spec/support/capybara.rb
327
+ - spec/support/database_cleaner.rb
328
+ - spec/support/factory_bot.rb
329
+ - spec/support/simplecov.rb