spree_minicart 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.bundle/config ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_DISABLE_SHARED_GEMS: '1'
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ \#*
2
+ *~
3
+ .#*
4
+ .DS_Store
5
+ .idea
6
+ .project
7
+ tmp
8
+ nbproject
9
+ *.swp
10
+ spec/dummy
11
+ Gemfile.lock
12
+ .rvmrc
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/Gemfile ADDED
@@ -0,0 +1,22 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'mysql2'
4
+ group :test do
5
+ gem 'ffaker'
6
+ gem 'rspec-rails'
7
+ gem 'capybara'
8
+ gem 'launchy', '2.0.5'
9
+ end
10
+
11
+ if RUBY_VERSION < "1.9"
12
+ gem "ruby-debug"
13
+ else
14
+ gem "ruby-debug19"
15
+ end
16
+
17
+ group :assets do
18
+ gem 'sass-rails', '~> 3.1.5'
19
+ gem 'uglifier', '>= 1.0.3'
20
+ end
21
+
22
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2012 [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.
data/README.md ADDED
@@ -0,0 +1,87 @@
1
+ SpreeMinicart
2
+ =============
3
+
4
+ Minicart feature extracted from [http://www.501kfactory.com](http://www.501kfactory.com).
5
+
6
+ Your shopping cart is an incredibly important part of your e-commerce website.
7
+
8
+ Minicart allows customer to add/remove an item from their cart without ever leaving the page they're on.
9
+ Let your customers preview their cart before they start the checkout process.
10
+
11
+ Installation
12
+ ------------
13
+
14
+ To install Spree Minicart, just add the following to your Gemfile:
15
+
16
+ ```ruby
17
+ gem 'spree_minicart', '0.0.1'
18
+ ```
19
+
20
+ Now, bundle up with:
21
+
22
+ ```ruby
23
+ bundle
24
+ ```
25
+
26
+ And finally run the install generator to automatically insert 'require store/spree_minicart' in your asset file.
27
+
28
+ ```ruby
29
+ rails g spree_minicart:install
30
+ ```
31
+
32
+ Make sure manifest is inserted correctly, it should look like :
33
+ - app/assets/stylesheets/store/all.css :
34
+
35
+ ```css
36
+ /*
37
+ *= require store/spree_core
38
+ *= require store/spree_auth
39
+ *= require store/spree_api
40
+ *= require store/spree_promo
41
+
42
+ *= require store/spree_minicart
43
+ */
44
+ ```
45
+
46
+ - app/assets/javascripts/store/all.js :
47
+
48
+ ```javascript
49
+ //= require store/spree_core
50
+ //= require store/spree_auth
51
+ //= require store/spree_api
52
+ //= require store/spree_promo
53
+ //= require store/spree_minicart
54
+ ```
55
+
56
+ Example
57
+ -------
58
+
59
+ ![Spree Minicart](http://i41.tinypic.com/2n8zszs.png)
60
+
61
+ Todo
62
+ -------
63
+
64
+ - Better html markup and HTML test for customization
65
+ - Better css design
66
+ - Can update minicart's item quantity
67
+
68
+ Testing
69
+ -------
70
+
71
+ Be sure to bundle your dependencies and then create a dummy test app for the specs to run against.
72
+
73
+ $ bundle
74
+ $ bundle exec rake test app
75
+ $ bundle exec rspec spec
76
+
77
+ Compatibility
78
+ ------------
79
+
80
+ Tested under Spree 1.0.0
81
+
82
+ Contribute
83
+ ----------
84
+
85
+ Pull requests for features and bug fix with tests are welcome.
86
+
87
+ Copyright (c) 2012 [Stéphane Bounmy], released under the New BSD License
data/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/packagetask'
4
+ require 'rubygems/package_task'
5
+ require 'rspec/core/rake_task'
6
+ require 'spree/core/testing_support/common_rake'
7
+
8
+ RSpec::Core::RakeTask.new
9
+
10
+ task :default => [:spec]
11
+
12
+ spec = eval(File.read('spree_minicart.gemspec'))
13
+
14
+ Gem::PackageTask.new(spec) do |p|
15
+ p.gem_spec = spec
16
+ end
17
+
18
+ desc "Release to gemcutter"
19
+ task :release => :package do
20
+ require 'rake/gemcutter'
21
+ Rake::Gemcutter::Tasks.new(spec).define
22
+ Rake::Task['gem:push'].invoke
23
+ end
24
+
25
+ desc "Generates a dummy app for testing"
26
+ task :test_app do
27
+ ENV['LIB_NAME'] = 'spree_minicart'
28
+ Rake::Task['common:test_app'].invoke
29
+ end
data/Versionfile ADDED
@@ -0,0 +1,9 @@
1
+ # This file is used to designate compatibilty with different versions of Spree
2
+ # Please see http://spreecommerce.com/documentation/extensions.html#versionfile for details
3
+
4
+ # Examples
5
+ #
6
+ # "0.70.x" => { :branch => "master"}
7
+ # "0.60.x" => { :branch => "0-60-stable" }
8
+ # "0.40.x" => { :tag => "v1.0.0", :version => "1.0.0" }
9
+
@@ -0,0 +1 @@
1
+ //= require admin/spree_core
@@ -0,0 +1,55 @@
1
+ //= require store/spree_core
2
+ //= require store/jquery.hoverintent
3
+
4
+ (function($){
5
+ $(document).ready(function(){
6
+ var config = {
7
+ over: function(){
8
+ $("#minicart").slideDown();
9
+ },
10
+ timeout: 250, // number = milliseconds delay before onMouseOut
11
+ out: function(){
12
+ $("#minicart").slideUp();
13
+ }
14
+ };
15
+
16
+ $("#link-to-cart").hoverIntent( config )
17
+
18
+ // hoverintent items created by js http://rndnext.blogspot.com/2009/02/jquery-live-and-plugins.html
19
+ $("ul#minicart-items li").live('mouseover', function(e)
20
+ {
21
+ if (!$(this).data('init'))
22
+ {
23
+ $(this).data('init', true);
24
+ $(this).hoverIntent
25
+ ({
26
+ over: function(){
27
+ $(this).find("[data-hook='cart_item_description']").hide()
28
+ $(this).find("[data-hook='cart_item_actions']").show()
29
+ },
30
+ timeout: 100, // number = milliseconds delay before onMouseOut
31
+ out: function(){
32
+ $(this).find("[data-hook='cart_item_description']").show()
33
+ $(this).find("[data-hook='cart_item_actions']").hide()
34
+ }
35
+ });
36
+ $(this).trigger(e);
37
+ }
38
+ });
39
+
40
+
41
+ $('form#update-minicart a.delete').live('click', function(e){
42
+ $(this).parent().siblings('div[data-hook="cart_item_quantity"]').find("input.line_item_quantity").val(0);
43
+ $(this).parents('form').first().submit();
44
+ e.preventDefault();
45
+ });
46
+
47
+ $("form[data-remote]").live("ajax:beforeSend", function(){
48
+ $("#progress").slideDown();
49
+ })
50
+
51
+ $("form[data-remote]").live("ajax:complete", function(){
52
+ $("#progress").slideUp();
53
+ })
54
+ });
55
+ })(jQuery);
@@ -0,0 +1,3 @@
1
+ /*
2
+ *= require admin/spree_core
3
+ */
@@ -0,0 +1,67 @@
1
+ /*
2
+ *= require store/spree_core
3
+ */
4
+
5
+ #progress {
6
+ display:none;
7
+ z-index: 99;
8
+ top: 0px;
9
+ text-align: center;
10
+ background: #00ADEE;
11
+ padding: 4px 10px;
12
+ color: white;
13
+ margin: 0 auto;
14
+ position: fixed;
15
+ left:50%;
16
+ }
17
+
18
+ nav #main-nav-bar li#link-to-cart #minicart a{
19
+ font-size: 12px
20
+ }
21
+
22
+ nav #main-nav-bar li#link-to-cart #minicart a.button{
23
+ font-size: 12px;
24
+ color: white !important;
25
+ }
26
+
27
+ ul#minicart-items {
28
+ margin: 0 10px;
29
+ }
30
+
31
+
32
+ ul#minicart-items li{
33
+ width: 90px;
34
+ position: relative;
35
+ float: left;
36
+ min-height: 180px;
37
+ padding: 5px 10px 0;
38
+ text-align: center;
39
+ text-transform: none;
40
+ }
41
+
42
+ #minicart {
43
+ background-color:aliceBlue;
44
+ z-index: 100;
45
+ position: absolute;
46
+ right: 16px;
47
+ padding: 10px;
48
+ border: 1px solid #DEDEDE;
49
+ float:right;
50
+ display: none;
51
+ width: 300px;
52
+ }
53
+ ul#minicart-items li img{
54
+ display: block;
55
+ margin-left: 20px;
56
+ }
57
+
58
+ #minicart div#minicart-details a.button.checkout{
59
+ float:right;
60
+ }
61
+
62
+ #link-to-cart span.amount {
63
+ display: none;
64
+ }
65
+ #minicart .minicart-actions {
66
+ display: none;
67
+ }
@@ -0,0 +1,5 @@
1
+ module Spree
2
+ OrdersController.class_eval do
3
+ respond_to :js, :only => [:populate, :update]
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ # insert loading message
2
+ Deface::Override.new(:virtual_path => 'spree/layouts/spree_application',
3
+ :name => 'append_loading_message',
4
+ :insert_top => "#wrapper",
5
+ :text => %q{<div id="progress"><%= image_tag 'admin/progress.gif' %> <%= t(:loading) %>...</div>})
@@ -0,0 +1,11 @@
1
+ Deface::Override.new(:virtual_path => 'spree/shared/_store_menu',
2
+ :name => 'add_mini_cart',
3
+ :insert_bottom => "#link-to-cart",
4
+ :partial => "spree/shared/minicart")
5
+
6
+ Deface::Override.new(:virtual_path => 'spree/products/_cart_form',
7
+ :name => 'set_remote_to_true_to_add_to_cart',
8
+ :replace => "code[erb-loud]:contains('form_for :order, :url => populate_orders_url do |f|')",
9
+ :text => "<%= form_for :order, :url => populate_orders_url, :remote => true do |f| %>",
10
+ :original => "<%= form_for :order, :url => populate_orders_url do |f| %>")
11
+
@@ -0,0 +1,14 @@
1
+ // Refresh minicart count
2
+ $("#link-to-cart a").replaceWith('<%= escape_javascript link_to_cart %>')
3
+
4
+ // Refresh minicart line items
5
+ $("#minicart").replaceWith('<%= escape_javascript render("spree/shared/minicart") %>')
6
+
7
+ // Sliding down minicart
8
+ $("#link-to-cart #minicart").slideDown()
9
+
10
+ // Sliding up minicart
11
+ setTimeout(function () {
12
+ $("#link-to-cart #minicart").slideUp()
13
+ },
14
+ 5000);
@@ -0,0 +1,7 @@
1
+ // Refresh minicart count
2
+ $("#link-to-cart a").replaceWith('<%= escape_javascript link_to_cart %>')
3
+
4
+ // Refresh minicart line items
5
+ $("#minicart").replaceWith('<%= escape_javascript render("spree/shared/minicart") %>')
6
+
7
+ $("#progress").slideUp();
@@ -0,0 +1,39 @@
1
+ <% @order ||= current_order(true) %>
2
+ <div id="minicart">
3
+ <% @body_id = 'cart' %>
4
+
5
+ <% if @order.line_items.empty? %>
6
+
7
+ <div data-hook="empty_cart">
8
+ <p><%= t(:your_cart_is_empty) %></p>
9
+ <p><%= link_to t(:continue_shopping), products_path, :class => 'button continue' %></p>
10
+ </div>
11
+
12
+ <% else %>
13
+ <div data-hook="outside_cart_form">
14
+ <div id="minicart-details" data-hook="minicart_details" class="clearfix">
15
+ <p>
16
+ <span><%= t(:subtotal) %>: <span class="order-total"><%= order_subtotal(@order) %></span></span>
17
+ <%= link_to t(:checkout), checkout_path, :class => 'button checkout primary', :id => 'checkout-link' %>
18
+ </p>
19
+ </div>
20
+ <%= form_for @order, :url => update_cart_path, :html => {:id => 'update-minicart'}, :remote => true do |order_form| %>
21
+ <div data-hook="inside_cart_form">
22
+
23
+ <div data-hook="cart_items" class="clearfix">
24
+ <%= render :partial => 'spree/shared/error_messages', :locals => { :target => @order } %>
25
+ <ul id='minicart-items' class="clearfix">
26
+ <%= order_form.fields_for :line_items do |item_form| %>
27
+ <%= render :partial => 'spree/shared/minicart_line_items', :locals => { :variant => item_form.object.variant, :line_item => item_form.object, :item_form => item_form } %>
28
+ <% end %>
29
+ </ul>
30
+ </div>
31
+ <div id="minicart-footer" data-hook="minicart_footer">
32
+ <p><%= link_to t("view_shopping_cart"), cart_path, :class => 'button cart' %></p>
33
+ </div>
34
+ </div>
35
+ <% end %>
36
+ </div>
37
+ <% end %>
38
+
39
+ </div>
@@ -0,0 +1,32 @@
1
+ <li class="<%= cycle('', 'alt') %>">
2
+ <div data-hook="minicart_item_image">
3
+ <% if variant.images.length == 0 %>
4
+ <%= link_to mini_image(variant.product), variant.product %>
5
+ <% else %>
6
+ <%= link_to image_tag(variant.images.first.attachment.url(:mini)), variant.product %>
7
+ <% end %>
8
+ </div>
9
+ <div data-hook="cart_item_description">
10
+ <div data-hook="cart_item_name">
11
+ <span><%= link_to variant.product.name, product_path(variant.product) %></span>
12
+ <span><%= "x#{line_item.quantity}" -%></span>
13
+ <%= variant.options_text %>
14
+ <% if @order.insufficient_stock_lines.include? line_item %>
15
+ <span class="out-of-stock">
16
+ <%= variant.in_stock? ? t(:insufficient_stock, :on_hand => variant.on_hand) : t(:out_of_stock) %><br />
17
+ </span>
18
+ <% end %>
19
+ </div>
20
+ <div data-hook="cart_item_total">
21
+ <%= number_to_currency(line_item.price * line_item.quantity) unless line_item.quantity.nil? %>
22
+ </div>
23
+ </div>
24
+ <div class='minicart-actions' data-hook="cart_item_actions">
25
+ <div data-hook="cart_item_quantity">
26
+ <%= item_form.hidden_field :quantity, :min => 0, :class => "line_item_quantity" %>
27
+ </div>
28
+ <div data-hook="cart_item_delete">
29
+ <%= link_to t("delete"), '#', :class => 'delete', :id => "delete_#{dom_id(line_item)}" %>
30
+ </div>
31
+ </div>
32
+ </li>
@@ -0,0 +1,6 @@
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"
6
+ view_shopping_cart: "See Cart"
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ Spree::Core::Engine.routes.draw do
2
+ # Add your extension routes here
3
+ end
@@ -0,0 +1,70 @@
1
+ /**
2
+ * hoverIntent r6 // 2011.02.26 // jQuery 1.5.1+
3
+ * <http://cherne.net/brian/resources/jquery.hoverIntent.html>
4
+ *
5
+ * @param f onMouseOver function || An object with configuration options
6
+ * @param g onMouseOut function || Nothing (use configuration options object)
7
+ * @author Brian Cherne brian(at)cherne(dot)net
8
+ */
9
+ (function ($) {
10
+ $.fn.hoverIntent = function (f, g) {
11
+ var cfg = {
12
+ sensitivity: 7,
13
+ interval: 100,
14
+ timeout: 0
15
+ };
16
+ cfg = $.extend(cfg, g ? {
17
+ over: f,
18
+ out: g
19
+ } : f);
20
+ var cX, cY, pX, pY;
21
+ var track = function (ev) {
22
+ cX = ev.pageX;
23
+ cY = ev.pageY
24
+ };
25
+ var compare = function (ev, ob) {
26
+ ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
27
+ if ((Math.abs(pX - cX) + Math.abs(pY - cY)) < cfg.sensitivity) {
28
+ $(ob).unbind("mousemove", track);
29
+ ob.hoverIntent_s = 1;
30
+ return cfg.over.apply(ob, [ev])
31
+ } else {
32
+ pX = cX;
33
+ pY = cY;
34
+ ob.hoverIntent_t = setTimeout(function () {
35
+ compare(ev, ob)
36
+ }, cfg.interval)
37
+ }
38
+ };
39
+ var delay = function (ev, ob) {
40
+ ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
41
+ ob.hoverIntent_s = 0;
42
+ return cfg.out.apply(ob, [ev])
43
+ };
44
+ var handleHover = function (e) {
45
+ var ev = jQuery.extend({}, e);
46
+ var ob = this;
47
+ if (ob.hoverIntent_t) {
48
+ ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t)
49
+ }
50
+ if (e.type == "mouseenter") {
51
+ pX = ev.pageX;
52
+ pY = ev.pageY;
53
+ $(ob).bind("mousemove", track);
54
+ if (ob.hoverIntent_s != 1) {
55
+ ob.hoverIntent_t = setTimeout(function () {
56
+ compare(ev, ob)
57
+ }, cfg.interval)
58
+ }
59
+ } else {
60
+ $(ob).unbind("mousemove", track);
61
+ if (ob.hoverIntent_s == 1) {
62
+ ob.hoverIntent_t = setTimeout(function () {
63
+ delay(ev, ob)
64
+ }, cfg.timeout)
65
+ }
66
+ }
67
+ };
68
+ return this.bind('mouseenter', handleHover).bind('mouseleave', handleHover)
69
+ }
70
+ })(jQuery);
@@ -0,0 +1,14 @@
1
+ module SpreeMinicart
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+
5
+ def add_javascripts
6
+ append_file "app/assets/javascripts/store/all.js", "//= require store/spree_minicart\n"
7
+ end
8
+
9
+ def add_stylesheets
10
+ inject_into_file "app/assets/stylesheets/store/all.css", " *= require store/spree_minicart\n", :before => /\*\//, :verbose => true
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ module SpreeMinicart
2
+ class Engine < Rails::Engine
3
+ engine_name 'spree_minicart'
4
+
5
+ config.autoload_paths += %W(#{config.root}/lib)
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,2 @@
1
+ require 'spree_core'
2
+ require 'spree_minicart/engine'
data/script/rails ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ ENGINE_PATH = File.expand_path('../..', __FILE__)
5
+ load File.expand_path('../../spec/dummy/script/rails', __FILE__)
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ feature "minicart", :js => true do
4
+ background { @product = Factory(:product, :name => "ror mug", :price => 30) }
5
+
6
+ scenario "customer should be able to add and delete a product in the minicart" do
7
+ visit spree.products_path
8
+ click_link("ror mug")
9
+ click_button "Add To Cart"
10
+
11
+ within("#link-to-cart a") do
12
+ page.should have_content("(1)")
13
+ end
14
+
15
+ within("#minicart") do
16
+ page.should have_content("ror mug")
17
+ page.should have_content("$30")
18
+ end
19
+
20
+ page.execute_script '$("#minicart-items li").trigger("mouseenter")'
21
+ within "li div.minicart-actions" do
22
+ page.should have_content("Delete")
23
+ # manually sliding down the minicart actions, dont know why its not working
24
+ page.execute_script '$("#minicart-items li div.minicart-actions").slideDown()'
25
+ click_link "Delete"
26
+ end
27
+
28
+ URI.parse(current_url).path.should =~ /products/
29
+
30
+ within("#minicart") do
31
+ page.should_not have_content("ror mug")
32
+ page.should_not have_content("$30")
33
+ end
34
+
35
+ end
36
+
37
+ scenario 'minicart should not freak out standard cart', :js => false do
38
+ visit spree.products_path
39
+ click_link("ror mug")
40
+ click_button "Add To Cart"
41
+ URI.parse(current_url).path.should == "/cart"
42
+ end
43
+ end
@@ -0,0 +1,33 @@
1
+ # Configure Rails Environment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
+
6
+ require 'rspec/rails'
7
+
8
+ # Requires supporting ruby files with custom matchers and macros, etc,
9
+ # in spec/support/ and its subdirectories.
10
+ Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each {|f| require f }
11
+
12
+ # Requires factories defined in spree_core
13
+ require 'spree/core/testing_support/factories'
14
+
15
+ RSpec.configure do |config|
16
+ # == Mock Framework
17
+ #
18
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
19
+ #
20
+ # config.mock_with :mocha
21
+ # config.mock_with :flexmock
22
+ # config.mock_with :rr
23
+ config.mock_with :rspec
24
+
25
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
26
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
27
+
28
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
29
+ # examples within a transaction, remove the following line or assign false
30
+ # instead of true.
31
+ config.use_transactional_fixtures = true
32
+ config.include Spree::UrlHelpers
33
+ end
@@ -0,0 +1,12 @@
1
+ class ActiveRecord::Base
2
+ mattr_accessor :shared_connection
3
+ @@shared_connection = nil
4
+
5
+ def self.connection
6
+ @@shared_connection || retrieve_connection
7
+ end
8
+ end
9
+
10
+ # Forces all threads to share the same connection. This works on
11
+ # Capybara because it starts the web server in a thread.
12
+ ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
@@ -0,0 +1,7 @@
1
+ module Spree
2
+ module UrlHelpers
3
+ def spree
4
+ Spree::Core::Engine.routes.url_helpers
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: UTF-8
2
+ Gem::Specification.new do |s|
3
+ s.platform = Gem::Platform::RUBY
4
+ s.name = 'spree_minicart'
5
+ s.version = '0.0.1'
6
+ s.summary = 'Spree Minicart displays a minicart in your spree store'
7
+ s.description = "Spree Minicart allows customer to add/remove an item from their cart without ever leaving the page they're on.Let your customers preview their cart before they start the checkout process."
8
+ s.required_ruby_version = '>= 1.8.7'
9
+
10
+ s.author = 'Stéphane Bounmy'
11
+ s.email = 'stephanebounmy@gmail.com'
12
+ s.homepage = 'https://github.com/sbounmy/spree_minicart'
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
+ s.add_dependency 'spree_core', '~> 1.0.0'
20
+ s.add_dependency 'spree_sample'
21
+ s.add_development_dependency 'capybara', '1.0.1'
22
+ s.add_development_dependency 'factory_girl'
23
+ s.add_development_dependency 'ffaker'
24
+ s.add_development_dependency 'rspec-rails', '~> 2.7'
25
+ s.add_development_dependency 'sqlite3'
26
+
27
+ end
metadata ADDED
@@ -0,0 +1,160 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spree_minicart
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Stéphane Bounmy
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: spree_core
16
+ requirement: &2156547640 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2156547640
25
+ - !ruby/object:Gem::Dependency
26
+ name: spree_sample
27
+ requirement: &2156547120 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *2156547120
36
+ - !ruby/object:Gem::Dependency
37
+ name: capybara
38
+ requirement: &2156546320 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - =
42
+ - !ruby/object:Gem::Version
43
+ version: 1.0.1
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2156546320
47
+ - !ruby/object:Gem::Dependency
48
+ name: factory_girl
49
+ requirement: &2156544440 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *2156544440
58
+ - !ruby/object:Gem::Dependency
59
+ name: ffaker
60
+ requirement: &2156543720 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *2156543720
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-rails
71
+ requirement: &2156542560 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: '2.7'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *2156542560
80
+ - !ruby/object:Gem::Dependency
81
+ name: sqlite3
82
+ requirement: &2156541820 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *2156541820
91
+ description: Spree Minicart allows customer to add/remove an item from their cart
92
+ without ever leaving the page they're on.Let your customers preview their cart before
93
+ they start the checkout process.
94
+ email: stephanebounmy@gmail.com
95
+ executables: []
96
+ extensions: []
97
+ extra_rdoc_files: []
98
+ files:
99
+ - .bundle/config
100
+ - .gitignore
101
+ - .rspec
102
+ - .sass-cache/7039e9d658d15c788901d448e30f792de6523f14/screen.css.scssc
103
+ - Gemfile
104
+ - LICENSE
105
+ - README.md
106
+ - Rakefile
107
+ - Versionfile
108
+ - app/assets/javascripts/admin/spree_minicart.js
109
+ - app/assets/javascripts/store/spree_minicart.js
110
+ - app/assets/stylesheets/admin/spree_minicart.css
111
+ - app/assets/stylesheets/store/spree_minicart.css
112
+ - app/controllers/orders_controller_decorator.rb
113
+ - app/overrides/layout.rb
114
+ - app/overrides/minicart.rb
115
+ - app/views/spree/orders/populate.js.erb
116
+ - app/views/spree/orders/update.js.erb
117
+ - app/views/spree/shared/_minicart.html.erb
118
+ - app/views/spree/shared/_minicart_line_items.html.erb
119
+ - config/locales/en.yml
120
+ - config/routes.rb
121
+ - lib/assets/javascripts/store/jquery.hoverintent.js
122
+ - lib/generators/spree_minicart/install/install_generator.rb
123
+ - lib/spree_minicart.rb
124
+ - lib/spree_minicart/engine.rb
125
+ - script/rails
126
+ - spec/requests/minicart_spec.rb
127
+ - spec/spec_helper.rb
128
+ - spec/support/shared_connection.rb
129
+ - spec/support/url_helpers.rb
130
+ - spree_minicart.gemspec
131
+ homepage: https://github.com/sbounmy/spree_minicart
132
+ licenses: []
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: 1.8.7
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ none: false
145
+ requirements:
146
+ - - ! '>='
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ requirements:
150
+ - none
151
+ rubyforge_project:
152
+ rubygems_version: 1.8.17
153
+ signing_key:
154
+ specification_version: 3
155
+ summary: Spree Minicart displays a minicart in your spree store
156
+ test_files:
157
+ - spec/requests/minicart_spec.rb
158
+ - spec/spec_helper.rb
159
+ - spec/support/shared_connection.rb
160
+ - spec/support/url_helpers.rb