spree_pages 1.0.1 → 1.0.2

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 (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