spree_power_reviews 3.0.0

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 (38) hide show
  1. data/.gitignore +14 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +7 -0
  4. data/LICENSE +26 -0
  5. data/README.md +46 -0
  6. data/Rakefile +21 -0
  7. data/app/assets/javascripts/spree/backend/spree_power_reviews.js +2 -0
  8. data/app/assets/javascripts/spree/frontend/spree_power_reviews.js +2 -0
  9. data/app/assets/stylesheets/spree/backend/spree_power_reviews.css +4 -0
  10. data/app/assets/stylesheets/spree/frontend/spree_power_reviews.css +4 -0
  11. data/app/controllers/spree/products_controller_decorator.rb +17 -0
  12. data/app/db/migrate/20150618105326_create_review_set.spree_power_reviews.rb +19 -0
  13. data/app/db/seeds.rb +2 -0
  14. data/app/models/spree/power_reviews_configuration.rb +12 -0
  15. data/app/models/spree/review_set.rb +4 -0
  16. data/app/overrides/add_power_reviews_js_to_product.rb +4 -0
  17. data/app/overrides/add_power_reviews_snippet_to_product.rb +4 -0
  18. data/app/overrides/add_power_reviews_to_product.rb +4 -0
  19. data/app/overrides/add_qa_to_product.rb +4 -0
  20. data/app/views/spree/products/question.html.erb +58 -0
  21. data/app/views/spree/products/review.html.erb +46 -0
  22. data/app/views/spree/shared/_powerreviews_engine_js.html.erb +14 -0
  23. data/app/views/spree/shared/_powerreviews_product_qas.html.erb +19 -0
  24. data/app/views/spree/shared/_powerreviews_product_qasnippet.html.erb +6 -0
  25. data/app/views/spree/shared/_powerreviews_product_reviews.html.erb +36 -0
  26. data/app/views/spree/shared/_powerreviews_product_snippet.html.erb +15 -0
  27. data/bin/rails +7 -0
  28. data/config/locales/en.yml +5 -0
  29. data/config/power_reviews.yml +26 -0
  30. data/config/routes.rb +10 -0
  31. data/lib/generators/spree_power_reviews/install/install_generator.rb +31 -0
  32. data/lib/spree_power_reviews.rb +2 -0
  33. data/lib/spree_power_reviews/engine.rb +20 -0
  34. data/lib/spree_power_reviews/factories.rb +6 -0
  35. data/lib/tasks/power_reviews_extension_tasks.rake +203 -0
  36. data/spec/spec_helper.rb +87 -0
  37. data/spree_power_reviews.gemspec +33 -0
  38. metadata +279 -0
@@ -0,0 +1,14 @@
1
+ \#*
2
+ *~
3
+ .#*
4
+ .DS_Store
5
+ .idea
6
+ .project
7
+ .sass-cache
8
+ coverage
9
+ Gemfile.lock
10
+ tmp
11
+ nbproject
12
+ pkg
13
+ *.swp
14
+ spec/dummy
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'spree', github: 'spree/spree', branch: '3-0-stable'
4
+ # Provides basic authentication functionality for testing parts of your engine
5
+ gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: '3-0-stable'
6
+
7
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2014 [name of plugin creator]
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.
@@ -0,0 +1,46 @@
1
+ SpreePowerReviews
2
+ =================
3
+
4
+ Integrate with power reviews into spree, download review source and show reviews on product page.
5
+ It also adds the questions and answer into product page.
6
+
7
+ You need run the rake task to update your reviews from powerreviews.com server.
8
+
9
+ You are welcome to inform me any bugs or issues.
10
+
11
+ Installation
12
+ ------------
13
+
14
+ Add spree_power_reviews to your Gemfile:
15
+
16
+ ```ruby
17
+ gem 'spree_power_reviews'
18
+ ```
19
+
20
+ Bundle your dependencies and run the installation generator:
21
+
22
+ ```shell
23
+ bundle
24
+ bundle exec rails g spree_power_reviews:install
25
+ ```
26
+
27
+ Testing
28
+ -------
29
+
30
+ 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`.
31
+
32
+ ```shell
33
+ bundle
34
+ bundle exec rake
35
+ ```
36
+
37
+ When testing your applications integration with this extension you may use it's factories.
38
+ Simply add this require statement to your spec_helper:
39
+
40
+ ```ruby
41
+ require 'spree_power_reviews/factories'
42
+ ```
43
+
44
+ Contact albertliu at naturalwellbieng.com for bugs, issues.
45
+
46
+ Copyright (c) 2014 naturalwellbeing.com, released under the New BSD License
@@ -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_power_reviews'
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,17 @@
1
+ Spree::ProductsController.class_eval do
2
+
3
+ before_action :load_product, only: [:review, :question, :answer]
4
+
5
+ def review
6
+
7
+ end
8
+
9
+ def question
10
+
11
+ end
12
+
13
+ def answer
14
+ render "spree/products/review"
15
+ end
16
+
17
+ end
@@ -0,0 +1,19 @@
1
+ class CreateSpreeReviewSet < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :spree_review_sets do |t|
4
+ t.column :inline_path, :string
5
+ t.column :full_review_count, :int
6
+ t.column :average_rating, :decimal
7
+ t.column :bottom_line_yes_votes, :int
8
+ t.column :bottom_line_no_votes, :int
9
+ t.column :qa_inline_path, :string
10
+ end
11
+ change_table :spree_products do |t|
12
+ t.references :review_set
13
+ end
14
+ end
15
+
16
+ def self.down
17
+ drop_table :product_power_reviews
18
+ end
19
+ end
@@ -0,0 +1,2 @@
1
+ # Use this file to load your own seed data from extensions.
2
+ # See the db/seeds.rb file in the Spree core for some ideas on what you can do here.
@@ -0,0 +1,12 @@
1
+ module Spree
2
+ class PowerReviewsConfiguration
3
+
4
+ def self.account
5
+ power_reviews_yml=File.join(Rails.root,'config/power_reviews.yml')
6
+ if File.exist? power_reviews_yml
7
+ power_reviews_yml=File.join(Rails.root,'config/power_reviews.yml')
8
+ YAML.load(File.read(power_reviews_yml))
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,4 @@
1
+ module Spree
2
+ class ReviewSet < Spree::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ Deface::Override.new(:virtual_path => 'spree/products/show',
2
+ :name => 'add_power_reviews_js_to_product',
3
+ :insert_after => "div[data-hook='product_subtitle_main']",
4
+ :partial => "spree/shared/powerreviews_engine_js")
@@ -0,0 +1,4 @@
1
+ Deface::Override.new(:virtual_path => 'spree/products/show',
2
+ :name => 'add_power_reviews_snippet_to_product',
3
+ :insert_after => "div[data-hook='product_subtitle_main']",
4
+ :partial => "spree/shared/powerreviews_product_snippet")
@@ -0,0 +1,4 @@
1
+ Deface::Override.new(:virtual_path => 'spree/products/show',
2
+ :name => 'add_power_reviews_to_product',
3
+ :insert_before => "div[data-hook='description']",
4
+ :partial => "spree/shared/powerreviews_product_reviews")
@@ -0,0 +1,4 @@
1
+ Deface::Override.new(:virtual_path => 'spree/products/show',
2
+ :name => 'add_qa_to_product',
3
+ :insert_before => "div[data-hook='description']",
4
+ :partial => "spree/shared/powerreviews_product_qas")
@@ -0,0 +1,58 @@
1
+ <% content_for :head do -%>
2
+ <%= canonical_tag %>
3
+ <% end -%>
4
+ <% content_for :breadcrumbs do %>
5
+ <%#= render "shared/pwb_banner" %>
6
+ <%= breadcrumbs(@taxon, @product) %>
7
+ <% end
8
+ additional = nil
9
+ email = nil
10
+ user_id = nil
11
+
12
+ prefix = current_store
13
+
14
+ unless params[ :number ].nil?
15
+ additional = { :order_number => params[ :number ] }
16
+ end
17
+ unless params[ :email ].nil?
18
+ email = params[ :email ]
19
+ end
20
+ unless params[ :uid ].nil?
21
+ user_id = params[ :uid ]
22
+ end
23
+ %>
24
+
25
+ <% if params[:appName]=='askQuestion'%>
26
+ <div class="product_description" style="padding-top:0px">
27
+ <h2><%= @product.name %></h2>
28
+ </br>
29
+
30
+ </div>
31
+
32
+ <%end%>
33
+
34
+
35
+ <script type="text/javascript">
36
+ //<![CDATA[
37
+ var pr_locale = 'en_US';
38
+ var pr_page_id = <%= @product.id.to_s%>;
39
+ var pr_style_sheet = '/powerreviews.css';
40
+ var pr_merchant_group_id = <%= Spree::PowerReviewsConfiguration.account[current_store.code]["merchant_group_id"] %>;
41
+ var pr_promo_code = <%= Spree::PowerReviewsConfiguration.account[current_store.code]["pr_promo_code"] %>
42
+ var pr_site_id = <%= Spree::PowerReviewsConfiguration.account[current_store.code]["site_id"] %>;
43
+ //]]>
44
+ </script><script src="/pwr/engine/js/appLaunch.js" type="text/javascript"></script>
45
+
46
+ <script type="text/javascript">
47
+
48
+ jQuery(document).ready(function(){
49
+ $("#submitReviewIframe").load(function(){
50
+ location.href='#';
51
+ $('#submitReviewIframe').css('height','800px');
52
+ return false;
53
+ });
54
+ });
55
+ </script>
56
+
57
+
58
+
@@ -0,0 +1,46 @@
1
+ <% content_for :head do -%>
2
+ <%= canonical_tag %>
3
+ <% end -%>
4
+ <% content_for :breadcrumbs do %>
5
+ <%#= render "shared/pwb_banner" %>
6
+ <%= breadcrumbs(@taxon, @product) %>
7
+ <% end %>
8
+
9
+
10
+ <div class="product_description" style="padding-top:0px">
11
+ <h2><%= @product.name %></h2>
12
+ </div>
13
+
14
+
15
+ <%
16
+ #for the products sharing reviews
17
+ review_product=@product
18
+
19
+ %>
20
+
21
+ <script type="text/javascript">
22
+ //<![CDATA[
23
+ var pr_locale = 'en_US';
24
+ var pr_page_id = <%= @product.id.to_s%>;
25
+ var pr_style_sheet = '/powerreviews.css';
26
+ var pr_merchant_group_id = <%= Spree::PowerReviewsConfiguration.account[current_store.code]["merchant_group_id"] %>;
27
+ var pr_promo_code = <%= Spree::PowerReviewsConfiguration.account[current_store.code]["pr_promo_code"] %>
28
+ var pr_site_id = <%= Spree::PowerReviewsConfiguration.account[current_store.code]["site_id"] %>;
29
+ //]]>
30
+ </script>
31
+ <script src="/pwr/engine/js/appLaunch.js" type="text/javascript"></script>
32
+
33
+
34
+ <script type="text/javascript">
35
+
36
+ jQuery(document).ready(function(){
37
+ $("#submitReviewIframe").load(function(){
38
+ location.href='#';
39
+ $('#submitReviewIframe').css('height','2800px');
40
+ return false;
41
+ });
42
+ });
43
+ </script>
44
+
45
+
46
+
@@ -0,0 +1,14 @@
1
+ <%
2
+ content_for :head do %>
3
+ <link href="/pwr/engine/pr_styles_review.css?1418029260" media="screen" rel="stylesheet" type="text/css" />
4
+ <script src="/pwr/engine/js/full.js" type="text/javascript"></script>
5
+ <script type="text/javascript">
6
+ //<![CDATA[
7
+ var pr_style_sheet = '/';
8
+ var pr_locale = 'en_US';
9
+ var pr_zip_location = '/';
10
+ var pr_site_id = '2';
11
+ //]]>
12
+ </script>
13
+
14
+ <% end -%>
@@ -0,0 +1,19 @@
1
+
2
+ <div class="pr_review_summary" id="qa_summary_<%=@product.id.to_s%>">
3
+ <% #if ( pwr_config( :enterprise, product ) && product.review_set && !product.review_set_qa_inline_path.blank? && File.exists?( product.review_set_qa_inline_path ) )%>
4
+ <%#= File.read( product.review_set_qa_inline_path )%>
5
+ <%# end %>
6
+ </div>
7
+ <script>
8
+ var q<%=@product.id.to_s%>=$("#qa_summary_<%=@product.id.to_s%>")
9
+ q<%=@product.id.to_s%>.write=function(d){q<%=@product.id.to_s%>.html(d)}
10
+ </script>
11
+ <script type="text/javascript">
12
+ POWERREVIEWS.display.productAnswers(q<%= @product.id.to_s %>, {
13
+ 'pr_page_id': "<%= @product.id.to_s %>",
14
+ 'pr_ask_question':"/products/<%=@product.slug%>/question?appName=askQuestion",
15
+ 'pr_answer_question':'/products/<%=@product.slug%>/answer?appName=answerQuestion&questionId=@@@QUESTION_ID@@@',
16
+ 'pr_style_sheet':'/'
17
+ }
18
+ );
19
+ </script>
@@ -0,0 +1,6 @@
1
+ <%= render :partial => 'shared/powerreviews_engine_js', :locals=>{:product => product}%>
2
+ <%if product.show_powerreviews%>
3
+ <div class="rating"><div class="pr_snippet_category"><%=
4
+ link_to "Ask a Question",'#qa'
5
+ %></div></div>
6
+ <% end %>
@@ -0,0 +1,36 @@
1
+ <%
2
+ content_for :head do %>
3
+ <link href="/pwr/engine/pr_styles_review.css?1418029260" media="screen" rel="stylesheet" type="text/css" />
4
+ <script src="/pwr/engine/js/full.js" type="text/javascript"></script>
5
+ <script type="text/javascript">
6
+ //<![CDATA[
7
+ var pr_style_sheet = '/';
8
+ var pr_locale = 'en_US';
9
+ var pr_zip_location = '/';
10
+ var pr_site_id = '2';
11
+ //]]>
12
+ </script>
13
+
14
+ <% end -%>
15
+
16
+
17
+ <div itemprop="aggregateRating" class="forschema" style="display:none;"
18
+ itemscope itemtype="http://schema.org/AggregateRating">
19
+ Rated <span itemprop="ratingValue">4</span>/5
20
+ based on <span itemprop="reviewCount">2000</span> customer reviews
21
+ </div>
22
+ <div class="pr_review_summary" id="review_<%=@product.id.to_s%>">
23
+ <%#= File.read( product.review_set_inline_path ) if (product.review_set && !product.review_set_inline_path.blank? && File.exists?( product.review_set_inline_path ) )%>
24
+ </div>
25
+ <script>
26
+ var r<%=@product.id.to_s%>=$("#review_<%=@product.id.to_s%>")
27
+ r<%=@product.id.to_s%>.html('')
28
+ r<%=@product.id.to_s%>.write=function(d){r<%=@product.id.to_s%>.html(d)}
29
+ </script>
30
+
31
+ <script type="text/javascript">
32
+ //<![CDATA[
33
+ POWERREVIEWS.display.engine(r<%=@product.id.to_s%>, {"pr_snippet_min_reviews":1,"pr_write_review":"/products/<%=@product.slug%>/review","pr_style_sheet":"/","pr_page_id":"<%=@product.id.to_s%>"});
34
+ //]]>
35
+ </script>
36
+
@@ -0,0 +1,15 @@
1
+ <div class="pr_review_summary" id="review_summary_<%=@product.id.to_s%>">
2
+ <%#= File.read( product.review_set_inline_path ) if (product.review_set && !product.review_set_inline_path.blank? && File.exists?( product.review_set_inline_path ) )%>
3
+ </div>
4
+ <script>
5
+ var rs<%=@product.id.to_s%>=$("#review_summary_<%=@product.id.to_s%>")
6
+ rs<%=@product.id.to_s%>.html('')
7
+ rs<%=@product.id.to_s%>.write=function(d){rs<%=@product.id.to_s%>.html(d)}
8
+ </script>
9
+
10
+ <script type="text/javascript">
11
+ //<![CDATA[
12
+ POWERREVIEWS.display.snippet( rs<%=@product.id.to_s%>, {"pr_snippet_min_reviews":1,"pr_read_review":"<%=@product.slug%>h#reviews","pr_write_review":"<%=@product.slug%>/review","pr_style_sheet":"http://www.naturalwellbeing.com","pr_page_id":"<%=@product.id.to_s%>"});
13
+ //]]>
14
+ </script>
15
+
@@ -0,0 +1,7 @@
1
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
2
+
3
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
4
+ ENGINE_PATH = File.expand_path('../../lib/spree_power_reviews/engine', __FILE__)
5
+
6
+ require 'rails/all'
7
+ require 'rails/engine/commands'
@@ -0,0 +1,5 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ hello: "Hello world"
@@ -0,0 +1,26 @@
1
+ # Be sure to restart your server when you modify this file.
2
+ # your real file should be at your_app/config folder
3
+
4
+ # power review account info
5
+
6
+ default: &default
7
+ delete: 1
8
+ delete_file: done.txt
9
+ file: zipfilename.zip
10
+ ftp_host: partners.powerreviews.com
11
+ ftp_pass: you_pass
12
+ ftp_passive: 1
13
+ ftp_user: your_user_name
14
+ review_content_names: cotent names
15
+ appLaunch_js_url : /pwr/engine/js/appLaunch.js
16
+ custom_style_url :
17
+ engine_base : /pwr/engine/js
18
+ engine_js_url : /pwr/engine/js/full.js
19
+ enterprise : 1
20
+ locale : en_US
21
+ merchant_group_id : your_merchant_group_id
22
+ review_style_url :
23
+ site_id : your_site_id
24
+ write_style_url : /stylesheets/powerreviews.css
25
+ zip_location_url : /
26
+ pr_promo_code : promotion_coupon
@@ -0,0 +1,10 @@
1
+ Spree::Core::Engine.add_routes do
2
+ # Add your extension routes here
3
+ resources :products do
4
+ member do
5
+ get 'review'
6
+ get 'question'
7
+ get 'answer'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,31 @@
1
+ module SpreePowerReviews
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+
5
+ class_option :auto_run_migrations, :type => :boolean, :default => false
6
+
7
+ def add_javascripts
8
+ append_file 'vendor/assets/javascripts/spree/frontend/all.js', "//= require spree/frontend/spree_power_reviews\n"
9
+ append_file 'vendor/assets/javascripts/spree/backend/all.js', "//= require spree/backend/spree_power_reviews\n"
10
+ end
11
+
12
+ def add_stylesheets
13
+ inject_into_file 'vendor/assets/stylesheets/spree/frontend/all.css', " *= require spree/frontend/spree_power_reviews\n", :before => /\*\//, :verbose => true
14
+ inject_into_file 'vendor/assets/stylesheets/spree/backend/all.css', " *= require spree/backend/spree_power_reviews\n", :before => /\*\//, :verbose => true
15
+ end
16
+
17
+ def add_migrations
18
+ run 'bundle exec rake railties:install:migrations FROM=spree_power_reviews'
19
+ end
20
+
21
+ def run_migrations
22
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
23
+ if run_migrations
24
+ run 'bundle exec rake db:migrate'
25
+ else
26
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,2 @@
1
+ require 'spree_core'
2
+ require 'spree_power_reviews/engine'
@@ -0,0 +1,20 @@
1
+ module SpreePowerReviews
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'spree_power_reviews'
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,6 @@
1
+ FactoryGirl.define do
2
+ # Define your Spree extensions Factories within this file to enable applications, and other extensions to use and override them.
3
+ #
4
+ # Example adding this to your spec_helper will load these Factories for use:
5
+ # require 'spree_power_reviews/factories'
6
+ end
@@ -0,0 +1,203 @@
1
+ require 'pp'
2
+ require 'net/ftp'
3
+ require 'tempfile'
4
+ require 'nokogiri'
5
+ require 'rubygems'
6
+ require 'zip/zip'
7
+
8
+
9
+ desc "Set the environment variable RAILS_ENV='staging'."
10
+ task :staging do
11
+ ENV["RAILS_ENV"] = 'staging'
12
+ Rake::Task[:environment].invoke
13
+ end
14
+
15
+ namespace :spree do
16
+ namespace :extensions do
17
+ namespace :power_reviews do
18
+ desc "Fetch Review Data"
19
+
20
+ task :load_data => :environment do |t|
21
+ start_time = Time.now
22
+ report_str = [ "Loading Power Review Data: #{start_time.strftime( "%Y-%m-%d %H:%M:%S" )}"]
23
+ success = true
24
+ report_str << "Loading Data"
25
+ complete, report = load_data( start_time )
26
+ report_str << report
27
+ end_time = Time.now
28
+ report_str << "Finished Loading Power Reviews Data: #{start_time.strftime( "%Y-%m-%d %H:%M:%S" )}"
29
+ report_str << "Elapsed time: #{(end_time - start_time) rescue 'unknown'} seconds"
30
+ puts report_str
31
+ end
32
+
33
+ def load_data timestamp
34
+ loaded, extracted, report = get_new_data( timestamp )
35
+ pr_dir = File.join( Rails.root, "tmp", "powerreviews" )
36
+ current = File.join( pr_dir, "pwr" )
37
+ link_source = File.join( extracted, "pwr" )
38
+ the_directories = ["content", "engine"]
39
+ result = true
40
+ case loaded
41
+ when :complete
42
+ is_linked = true
43
+ load_reviews = true
44
+
45
+ if File.exist?( current ) && !File.symlink?( current )
46
+ report << "#{current} exists and is not a symlink, deleting"
47
+ remove_entry_secure(current, true)
48
+ elsif File.exist?( current ) && File.symlink?( current )
49
+ report << "Unlinking #{current}"
50
+ File.unlink( current )
51
+ end
52
+ report << "Linking #{link_source} to #{current}"
53
+ File.symlink( link_source, current )
54
+
55
+ if load_reviews
56
+ # Find the review data
57
+ rds = Dir.glob( File.join( extracted,"**/review_data_summary.xml" ) )
58
+ prods = []
59
+ summary_doc = Nokogiri::XML( open(rds.first) )
60
+ summary_doc.css( "product" ).each do | prod |
61
+ page_id = prod.css( "pageid" ).inner_text
62
+ if Product.exists?( page_id )
63
+ product = Product.find( page_id )
64
+ unless product.review_set
65
+ product.create_review_set
66
+ product.save
67
+ product.reload
68
+ end
69
+ review_set = product.review_set
70
+ thefile =prod.css( 'inlinefile[reviewpage="1"]' ).inner_text || ''
71
+ review_set.inline_path = "/data/nwbsite/current/tmp/powerreviews/" + thefile unless thefile.blank?
72
+
73
+ thefile =prod.css( 'inlinefile[questionpage="1"]' ).inner_text || ''
74
+ review_set.qa_inline_path = "/data/nwbsite/current/tmp/powerreviews/" + thefile unless thefile.blank?
75
+ review_set.full_review_count = prod.css( "fullreviews" ).inner_text.to_i
76
+ review_set.average_rating = prod.css( "average_rating_decimal" ).inner_text.to_f
77
+ review_set.bottom_line_yes_votes = prod.css( "bottom_line_yes_votes" ).inner_text.to_i
78
+ review_set.bottom_line_no_votes = prod.css( "bottom_line_no_votes" ).inner_text.to_i
79
+ review_set.save
80
+ prods << { :store => product.store.code, :permalink => product.permalink}
81
+ report << "Updating reviews for #{product.sku} (#{review_set.full_review_count} reviews)"
82
+ end
83
+ end
84
+ expire_cache( prods )
85
+
86
+ # clean up old directories
87
+ excludes = [ ".", "..", 'pwr', File.basename(extracted) ]
88
+ Dir.entries( File.expand_path( File.dirname( extracted ) ) ).reject{ |dir|
89
+ excludes.include?( dir )
90
+ }.each{ |dir|
91
+ report << "Deleting #{File.join( pr_dir, dir)}"
92
+ remove_entry_secure File.join( pr_dir, dir)
93
+ }
94
+ end
95
+ when :error
96
+ result = false
97
+ end
98
+ [result, report]
99
+ end
100
+
101
+ def expire_cache prods
102
+ return unless File.exist?(File.join(Rails.root, "public", "cache"))
103
+ controller = ProductsController.new
104
+ prods.each do |prod|
105
+ Dir.entries(File.join(Rails.root, "public", "cache")).each do |path|
106
+ next if [".", ".."].include?(path)
107
+ begin
108
+ controller.expire_page( "/cache/#{path}/products/#{prod[:permalink]}" )
109
+ rescue Exception => e
110
+ # submerge errors since its possible that the page isn't cached.
111
+ end
112
+
113
+ end
114
+ end
115
+ end
116
+
117
+ def get_new_data timestamp
118
+
119
+ report = []
120
+ pr_dir = File.join( Rails.root, "tmp", "powerreviews")
121
+ dest = File.join( pr_dir, timestamp.strftime( "%Y%m%d%H%M%S" ))
122
+ success = :unknown
123
+ begin
124
+ ftp = Net::FTP.new( Spree::PowerReviewsConfiguration.account["default"]["ftp_host"])
125
+ ftp.passive = Spree::PowerReviewsConfiguration.account["default"]["ftp_passive"]
126
+ ftp.login( Spree::PowerReviewsConfiguration.account["default"]["ftp_user"], Spree::PowerReviewsConfiguration.account["default"]["ftp_pass"])
127
+
128
+ # we are going to process the
129
+ if ftp.nlst.include?( Spree::PowerReviewsConfiguration.account["default"]["delete_file"]) || !Spree::PowerReviewsConfiguration.account["default"]["delete"]
130
+ report << "Downloading zipfile #{Spree::PowerReviewsConfiguration.account["default"]["file"] } and extracting to #{dest}"
131
+ tmpzip = Tempfile.new( 'zip' )
132
+ file_count = 0
133
+ ftp.getbinaryfile( Spree::PowerReviewsConfiguration.account["default"]["file"], tmpzip.path)
134
+ Zip::ZipFile.open( tmpzip.path ) { |zip_file|
135
+ zip_file.each { |f|
136
+ file_count +=1
137
+ f_path=File.join(dest, f.name)
138
+ FileUtils.mkdir_p(File.dirname(f_path))
139
+ zip_file.extract(f, f_path) unless File.exist?(f_path)
140
+ }
141
+ }
142
+ report << "Extracted #{file_count} files to #{dest}"
143
+ # verify contents
144
+ if ["content", "engine", "**/review_data_summary.xml" ].inject(true){ |result, the_dir| result && ( Dir.glob( File.join( dest, "pwr", the_dir ) ).count > 0 ) }
145
+ success = :complete
146
+ if Spree::PowerReviewsConfiguration.account["default"]["delete"]
147
+ report << "Deleting #{Spree::PowerReviewsConfiguration.account["default"]["delete_file"]}"
148
+ ftp.delete(Spree::PowerReviewsConfiguration.account["default"]["delete_file"])
149
+ end
150
+ else
151
+ success = :error
152
+ report << "Zip does not include required files."
153
+ end
154
+ else
155
+ success = :nochange
156
+ end
157
+ rescue Exception => e
158
+ report << e
159
+ success = :error
160
+ ensure
161
+ tmpzip.close if tmpzip
162
+ ftp.close if ftp
163
+ end
164
+ [success,dest,report]
165
+ end
166
+
167
+ desc "Get the directories setup"
168
+ task :directories => :environment do
169
+
170
+ pr_dir = File.join( Rails.root, "tmp", 'powerreviews' )
171
+ pub = File.join( Rails.root, "public", 'pwr' )
172
+ dst = File.join( pr_dir, 'pwr' )
173
+
174
+ unless File.exists?( dst )
175
+ boot = File.join( pr_dir, "bootstrap", "pwr" )
176
+ mkdir_p boot
177
+ File.symlink( boot, dst )
178
+ end
179
+
180
+ raise "#{pub} exists and is not a symlink" if File.exist?( pub ) && !File.symlink?( pub )
181
+
182
+ if File.exist?( pub ) && File.symlink?( pub )
183
+ File.unlink( pub )
184
+ end
185
+ File.symlink( dst, pub )
186
+
187
+ end
188
+
189
+ desc "Copies public assets of the Power Reviews to the instance public/ directory."
190
+ task :update => :environment do
191
+ is_svn_git_or_dir = proc {|path| path =~ /\.svn/ || path =~ /\.git/ || File.directory?(path) }
192
+ Dir[PowerReviewsExtension.root + "/public/**/*"].reject(&is_svn_git_or_dir).each do |file|
193
+ path = file.sub(PowerReviewsExtension.root, '')
194
+ directory = File.dirname(path)
195
+ puts "Copying #{path}..."
196
+ mkdir_p Rails.root + directory
197
+ cp file, Rails.root + path
198
+ end
199
+ # todo create RSA crypto keys.
200
+ end
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,87 @@
1
+ # Run Coverage report
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter 'spec/dummy'
5
+ add_group 'Controllers', 'app/controllers'
6
+ add_group 'Helpers', 'app/helpers'
7
+ add_group 'Mailers', 'app/mailers'
8
+ add_group 'Models', 'app/models'
9
+ add_group 'Views', 'app/views'
10
+ add_group 'Libraries', 'lib'
11
+ end
12
+
13
+ # Configure Rails Environment
14
+ ENV['RAILS_ENV'] = 'test'
15
+
16
+ require File.expand_path('../dummy/config/environment.rb', __FILE__)
17
+
18
+ require 'rspec/rails'
19
+ require 'database_cleaner'
20
+ require 'ffaker'
21
+
22
+ # Requires supporting ruby files with custom matchers and macros, etc,
23
+ # in spec/support/ and its subdirectories.
24
+ Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
25
+
26
+ # Requires factories and other useful helpers defined in spree_core.
27
+ require 'spree/testing_support/authorization_helpers'
28
+ require 'spree/testing_support/capybara_ext'
29
+ require 'spree/testing_support/controller_requests'
30
+ require 'spree/testing_support/factories'
31
+ require 'spree/testing_support/url_helpers'
32
+
33
+ # Requires factories defined in lib/spree_power_reviews/factories.rb
34
+ require 'spree_power_reviews/factories'
35
+
36
+ RSpec.configure do |config|
37
+ config.include FactoryGirl::Syntax::Methods
38
+
39
+ # Infer an example group's spec type from the file location.
40
+ config.infer_spec_type_from_file_location!
41
+
42
+ # == URL Helpers
43
+ #
44
+ # Allows access to Spree's routes in specs:
45
+ #
46
+ # visit spree.admin_path
47
+ # current_path.should eql(spree.products_path)
48
+ config.include Spree::TestingSupport::UrlHelpers
49
+
50
+ # == Mock Framework
51
+ #
52
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
53
+ #
54
+ # config.mock_with :mocha
55
+ # config.mock_with :flexmock
56
+ # config.mock_with :rr
57
+ config.mock_with :rspec
58
+ config.color = true
59
+
60
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
61
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
62
+
63
+ # Capybara javascript drivers require transactional fixtures set to false, and we use DatabaseCleaner
64
+ # to cleanup after each test instead. Without transactional fixtures set to false the records created
65
+ # to setup a test will be unavailable to the browser, which runs under a separate server instance.
66
+ config.use_transactional_fixtures = false
67
+
68
+ # Ensure Suite is set to use transactions for speed.
69
+ config.before :suite do
70
+ DatabaseCleaner.strategy = :transaction
71
+ DatabaseCleaner.clean_with :truncation
72
+ end
73
+
74
+ # Before each spec check if it is a Javascript test and switch between using database transactions or not where necessary.
75
+ config.before :each do
76
+ DatabaseCleaner.strategy = RSpec.current_example.metadata[:js] ? :truncation : :transaction
77
+ DatabaseCleaner.start
78
+ end
79
+
80
+ # After each spec clean the database.
81
+ config.after :each do
82
+ DatabaseCleaner.clean
83
+ end
84
+
85
+ config.fail_fast = ENV['FAIL_FAST'] || false
86
+ config.order = "random"
87
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: UTF-8
2
+ Gem::Specification.new do |s|
3
+ s.platform = Gem::Platform::RUBY
4
+ s.name = 'spree_power_reviews'
5
+ s.version = '3.0.0'
6
+ s.summary = 'integrate with power reviews into spree, download review source and show reviews on product page'
7
+ s.description = 'integrate with power reviews into spree, download review source and show reviews on product page'
8
+ s.required_ruby_version = '>= 1.9.3'
9
+
10
+ s.author = 'Albert Liu'
11
+ s.email = 'albertliu@naturalwellbeing.com'
12
+ s.homepage = 'http://www.naturalwellbeing.com'
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.require_path = 'lib'
17
+ s.requirements << 'none'
18
+
19
+ version = '3.0.0'
20
+ s.add_dependency 'spree_core', version
21
+ s.add_dependency 'zip-zip'
22
+
23
+ s.add_development_dependency 'capybara', '~> 2.4'
24
+ s.add_development_dependency 'coffee-rails'
25
+ s.add_development_dependency 'database_cleaner'
26
+ s.add_development_dependency 'factory_girl', '~> 4.4'
27
+ s.add_development_dependency 'ffaker'
28
+ s.add_development_dependency 'rspec-rails', '~> 3.1'
29
+ s.add_development_dependency 'sass-rails', '~> 4.0.2'
30
+ s.add_development_dependency 'selenium-webdriver'
31
+ s.add_development_dependency 'simplecov'
32
+ s.add_development_dependency 'sqlite3'
33
+ end
metadata ADDED
@@ -0,0 +1,279 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spree_power_reviews
3
+ version: !ruby/object:Gem::Version
4
+ hash: 7
5
+ prerelease:
6
+ segments:
7
+ - 3
8
+ - 0
9
+ - 0
10
+ version: 3.0.0
11
+ platform: ruby
12
+ authors:
13
+ - Albert Liu
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2015-06-22 00:00:00 -07:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: spree_core
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - "="
28
+ - !ruby/object:Gem::Version
29
+ hash: 7
30
+ segments:
31
+ - 3
32
+ - 0
33
+ - 0
34
+ version: 3.0.0
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: zip-zip
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 0
48
+ version: "0"
49
+ type: :runtime
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: capybara
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ~>
58
+ - !ruby/object:Gem::Version
59
+ hash: 11
60
+ segments:
61
+ - 2
62
+ - 4
63
+ version: "2.4"
64
+ type: :development
65
+ version_requirements: *id003
66
+ - !ruby/object:Gem::Dependency
67
+ name: coffee-rails
68
+ prerelease: false
69
+ requirement: &id004 !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ hash: 3
75
+ segments:
76
+ - 0
77
+ version: "0"
78
+ type: :development
79
+ version_requirements: *id004
80
+ - !ruby/object:Gem::Dependency
81
+ name: database_cleaner
82
+ prerelease: false
83
+ requirement: &id005 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ hash: 3
89
+ segments:
90
+ - 0
91
+ version: "0"
92
+ type: :development
93
+ version_requirements: *id005
94
+ - !ruby/object:Gem::Dependency
95
+ name: factory_girl
96
+ prerelease: false
97
+ requirement: &id006 !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ~>
101
+ - !ruby/object:Gem::Version
102
+ hash: 19
103
+ segments:
104
+ - 4
105
+ - 4
106
+ version: "4.4"
107
+ type: :development
108
+ version_requirements: *id006
109
+ - !ruby/object:Gem::Dependency
110
+ name: ffaker
111
+ prerelease: false
112
+ requirement: &id007 !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ hash: 3
118
+ segments:
119
+ - 0
120
+ version: "0"
121
+ type: :development
122
+ version_requirements: *id007
123
+ - !ruby/object:Gem::Dependency
124
+ name: rspec-rails
125
+ prerelease: false
126
+ requirement: &id008 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ hash: 5
132
+ segments:
133
+ - 3
134
+ - 1
135
+ version: "3.1"
136
+ type: :development
137
+ version_requirements: *id008
138
+ - !ruby/object:Gem::Dependency
139
+ name: sass-rails
140
+ prerelease: false
141
+ requirement: &id009 !ruby/object:Gem::Requirement
142
+ none: false
143
+ requirements:
144
+ - - ~>
145
+ - !ruby/object:Gem::Version
146
+ hash: 59
147
+ segments:
148
+ - 4
149
+ - 0
150
+ - 2
151
+ version: 4.0.2
152
+ type: :development
153
+ version_requirements: *id009
154
+ - !ruby/object:Gem::Dependency
155
+ name: selenium-webdriver
156
+ prerelease: false
157
+ requirement: &id010 !ruby/object:Gem::Requirement
158
+ none: false
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ hash: 3
163
+ segments:
164
+ - 0
165
+ version: "0"
166
+ type: :development
167
+ version_requirements: *id010
168
+ - !ruby/object:Gem::Dependency
169
+ name: simplecov
170
+ prerelease: false
171
+ requirement: &id011 !ruby/object:Gem::Requirement
172
+ none: false
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ hash: 3
177
+ segments:
178
+ - 0
179
+ version: "0"
180
+ type: :development
181
+ version_requirements: *id011
182
+ - !ruby/object:Gem::Dependency
183
+ name: sqlite3
184
+ prerelease: false
185
+ requirement: &id012 !ruby/object:Gem::Requirement
186
+ none: false
187
+ requirements:
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ hash: 3
191
+ segments:
192
+ - 0
193
+ version: "0"
194
+ type: :development
195
+ version_requirements: *id012
196
+ description: integrate with power reviews into spree, download review source and show reviews on product page
197
+ email: albertliu@naturalwellbeing.com
198
+ executables: []
199
+
200
+ extensions: []
201
+
202
+ extra_rdoc_files: []
203
+
204
+ files:
205
+ - .gitignore
206
+ - .rspec
207
+ - Gemfile
208
+ - LICENSE
209
+ - README.md
210
+ - Rakefile
211
+ - app/assets/javascripts/spree/backend/spree_power_reviews.js
212
+ - app/assets/javascripts/spree/frontend/spree_power_reviews.js
213
+ - app/assets/stylesheets/spree/backend/spree_power_reviews.css
214
+ - app/assets/stylesheets/spree/frontend/spree_power_reviews.css
215
+ - app/controllers/spree/products_controller_decorator.rb
216
+ - app/db/migrate/20150618105326_create_review_set.spree_power_reviews.rb
217
+ - app/db/seeds.rb
218
+ - app/models/spree/power_reviews_configuration.rb
219
+ - app/models/spree/review_set.rb
220
+ - app/overrides/add_power_reviews_js_to_product.rb
221
+ - app/overrides/add_power_reviews_snippet_to_product.rb
222
+ - app/overrides/add_power_reviews_to_product.rb
223
+ - app/overrides/add_qa_to_product.rb
224
+ - app/views/spree/products/question.html.erb
225
+ - app/views/spree/products/review.html.erb
226
+ - app/views/spree/shared/_powerreviews_engine_js.html.erb
227
+ - app/views/spree/shared/_powerreviews_product_qas.html.erb
228
+ - app/views/spree/shared/_powerreviews_product_qasnippet.html.erb
229
+ - app/views/spree/shared/_powerreviews_product_reviews.html.erb
230
+ - app/views/spree/shared/_powerreviews_product_snippet.html.erb
231
+ - bin/rails
232
+ - config/locales/en.yml
233
+ - config/power_reviews.yml
234
+ - config/routes.rb
235
+ - lib/generators/spree_power_reviews/install/install_generator.rb
236
+ - lib/spree_power_reviews.rb
237
+ - lib/spree_power_reviews/engine.rb
238
+ - lib/spree_power_reviews/factories.rb
239
+ - lib/tasks/power_reviews_extension_tasks.rake
240
+ - spec/spec_helper.rb
241
+ - spree_power_reviews.gemspec
242
+ has_rdoc: true
243
+ homepage: http://www.naturalwellbeing.com
244
+ licenses: []
245
+
246
+ post_install_message:
247
+ rdoc_options: []
248
+
249
+ require_paths:
250
+ - lib
251
+ required_ruby_version: !ruby/object:Gem::Requirement
252
+ none: false
253
+ requirements:
254
+ - - ">="
255
+ - !ruby/object:Gem::Version
256
+ hash: 53
257
+ segments:
258
+ - 1
259
+ - 9
260
+ - 3
261
+ version: 1.9.3
262
+ required_rubygems_version: !ruby/object:Gem::Requirement
263
+ none: false
264
+ requirements:
265
+ - - ">="
266
+ - !ruby/object:Gem::Version
267
+ hash: 3
268
+ segments:
269
+ - 0
270
+ version: "0"
271
+ requirements:
272
+ - none
273
+ rubyforge_project:
274
+ rubygems_version: 1.5.2
275
+ signing_key:
276
+ specification_version: 3
277
+ summary: integrate with power reviews into spree, download review source and show reviews on product page
278
+ test_files:
279
+ - spec/spec_helper.rb