1 Commits
Author SHA1 Message Date
Michael Bianco 40bb298bc8 Updating documentation. Adding nginx send_file info 2012-11-06 11:35:30 -05:00
42 changed files with 240 additions and 412 deletions
+4 -4
View File
@@ -4,11 +4,11 @@
.DS_Store .DS_Store
.idea .idea
.project .project
.sass-cache
coverage
Gemfile.lock
tmp tmp
nbproject nbproject
pkg
*.swp *.swp
spec/dummy spec/dummy
*.tmproj
Gemfile.lock
Guardfile
+1 -1
View File
@@ -1 +1 @@
--color --colour
-1
View File
@@ -1 +0,0 @@
1.9.3@digital2
+7 -12
View File
@@ -1,17 +1,12 @@
source 'https://rubygems.org' source 'http://rubygems.org'
# Provides basic authentication functionality for testing parts of your engine
gem 'spree_auth_devise', :github => "spree/spree_auth_devise", :branch => '2-0-stable'
gemspec gemspec
group :test do group :test do
gem "shoulda-matchers" if RUBY_PLATFORM.downcase.include? "darwin"
gem 'guard-rspec'
gem 'rb-fsevent'
gem 'growl'
end
end end
# `rspec-rails` needs to be in the development group so that Rails generators work. gem 'spree', '~> 1.1.3'
group :development, :test do
gem "rspec-rails", "~> 2.12"
end
gem 'therubyracer'
+18 -23
View File
@@ -1,26 +1,21 @@
Copyright (c) 2013 [name of plugin creator] The MIT License
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, Copyright (c) 2011 funkensturm.
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, Permission is hereby granted, free of charge, to any person obtaining a copy
this list of conditions and the following disclaimer. of this software and associated documentation files (the "Software"), to deal
* Redistributions in binary form must reproduce the above copyright notice, in the Software without restriction, including without limitation the rights
this list of conditions and the following disclaimer in the documentation to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
and/or other materials provided with the distribution. copies of the Software, and to permit persons to whom the Software is
* Neither the name Spree nor the names of its contributors may be used to furnished to do so, subject to the following conditions:
endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS The above copyright notice and this permission notice shall be included in
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT all copies or substantial portions of the Software.
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS THE SOFTWARE.
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-40
View File
@@ -1,40 +0,0 @@
SpreeDigital
============
Introduction goes here.
Installation
------------
Add spree_digital to your Gemfile:
```ruby
gem 'spree_digital'
```
Bundle your dependencies and run the installation generator:
```shell
bundle
bundle exec rails g spree_digital:install
```
Testing
-------
Be sure to bundle your dependencies and then create a dummy test app for the specs to run against.
```shell
bundle
bundle exec rake test_app
bundle exec rspec spec
```
When testing your applications integration with this extension you may use it's factories.
Simply add this require statement to your spec_helper:
```ruby
require 'spree_digital/factories'
```
Copyright (c) 2013 [name of extension creator], released under the New BSD License
+20 -6
View File
@@ -1,14 +1,28 @@
require 'bundler' require 'rake'
Bundler::GemHelper.install_tasks require 'rake/testtask'
require 'rake/packagetask'
require 'rubygems/package_task'
require 'rspec/core/rake_task' require 'rspec/core/rake_task'
require 'spree/testing_support/extension_rake' require 'spree/core/testing_support/common_rake'
RSpec::Core::RakeTask.new RSpec::Core::RakeTask.new
task :default => [:spec] task :default => [:spec]
desc 'Generates a dummy app for testing' spec = eval(File.read('spree_digital.gemspec'))
Gem::PackageTask.new(spec) do |p|
p.gem_spec = spec
end
desc "Release to gemcutter"
task :release => :package do
require 'rake/gemcutter'
Rake::Gemcutter::Tasks.new(spec).define
Rake::Task['gem:push'].invoke
end
desc "Regenerates a rails 3 app for testing"
task :test_app do task :test_app do
ENV['LIB_NAME'] = 'spree_digital' ENV['LIB_NAME'] = 'spree_digital'
@@ -21,5 +35,5 @@ task :test_app do
end end
end end
Rake::Task['extension:test_app'].invoke Rake::Task['common:test_app'].invoke
end end
+4 -11
View File
@@ -1,11 +1,4 @@
# This file is used to designate compatibilty with different versions of Spree "0.7.x" => { :ref => "eddaea63959586d123007cbca3be5bf9c5edb1a7" }
# Please see http://spreecommerce.com/documentation/extensions.html#versionfile for details "1.0.x" => { :ref => "a8c27750ef1cf9d0ad1a2a6ebe33307da900a5c1" }
"1.1.x" => { :branch => "1-1-stable" }
# Examples "1.2.x" => { :branch => "master" }
#
# '1.2.x' => { :branch => 'master' }
# '1.1.x' => { :branch => '1-1-stable' }
# '1.0.x' => { :branch => '1-0-stable' }
# '0.70.x' => { :branch => '0-70-stable' }
# '0.40.x' => { :tag => 'v1.0.0', :version => '1.0.0' }
@@ -1 +0,0 @@
//= require admin/spree_backend
@@ -1 +0,0 @@
//= require store/spree_frontend
@@ -1,3 +0,0 @@
/*
*= require admin/spree_backend
*/
@@ -1,3 +0,0 @@
/*
*= require store/spree_frontend
*/
@@ -1,6 +1,6 @@
module Spree module Spree
class Admin::DigitalsController < Spree::Admin::ResourceController class Admin::DigitalsController < Spree::Admin::ResourceController
belongs_to "spree/product", :find_by => :permalink belongs_to "spree/product", find_by: :permalink
protected protected
def location_after_save def location_after_save
@@ -1,7 +0,0 @@
Spree::Admin::OrdersController.class_eval do
def reset_digitals
@order.reset_digital_links!
flash[:notice] = t(:downloads_reset)
redirect_to admin_order_url(@order)
end
end
+1 -1
View File
@@ -1,5 +1,5 @@
module Spree module Spree
class DigitalsController < Spree::StoreController class DigitalsController < Spree::BaseController
ssl_required :show ssl_required :show
def show def show
@@ -4,7 +4,7 @@ require_dependency 'spree/calculator'
module Spree module Spree
class Calculator::DigitalDelivery < Calculator::FlatRate class Calculator::DigitalDelivery < Calculator::FlatRate
def self.description def self.description
Spree.t(:digital_delivery) I18n.t(:digital_delivery)
end end
def compute(object=nil) def compute(object=nil)
+1 -1
View File
@@ -9,7 +9,7 @@ Spree::LineItem.class_eval do
private private
# TODO there is no reason to create the digital links until the order is complete # Create the download link for this item if it is digital.
def create_digital_links def create_digital_links
digital_links.delete_all digital_links.delete_all
+1 -7
View File
@@ -10,14 +10,8 @@ Spree::Order.class_eval do
false false
end end
def reset_digital_links! # UPGRADE_CHECK this works as of spree 1.1.1; make sure to check the original function on upgrade
line_items.select(&:digital?).map(&:digital_links).flatten.each do |digital_link|
digital_link.update_column :access_counter, 0
digital_link.update_column :created_at, Time.now
end
end
# UPGRADE_CHECK this works as of spree 1.2.0. check function for changes on upgrade
def available_shipping_methods(display_on = nil) def available_shipping_methods(display_on = nil)
return [] unless ship_address return [] unless ship_address
all_methods = Spree::ShippingMethod.all_available(self, display_on) all_methods = Spree::ShippingMethod.all_available(self, display_on)
@@ -2,11 +2,11 @@ Deface::Override.new(:virtual_path => "spree/shared/_order_details",
:name => "add_digital_downloads_to_invoice", :name => "add_digital_downloads_to_invoice",
:insert_bottom => "td[data-hook='order_item_description']", :insert_bottom => "td[data-hook='order_item_description']",
:text => %q{ :text => %q{
<% if order.payment_state == 'paid' and item.variant.digital? %> <% if order.state == 'complete' and item.variant.digital? %>
<%= content_tag(:p, :class => 'download_links') do %> <%= content_tag(:p, :class => 'download_links') do %>
<% item.digital_links.each do |digital_link| %> <% item.digital_links.each do |digital_link| %>
<% format = File.extname(digital_link.digital.attachment.path).downcase %> <% format = File.extname(digital_link.digital.attachment.path).downcase %>
<%= link_to Spree.t(:digital_download, :type => Spree.t("digital_format#{format}")), digital_url(:host => Spree::Config.get(:site_url), :secret => digital_link.secret), :class => "btn #{format}" %> <%= link_to t(:digital_download, :type => t("digital_format#{format}")), digital_url(:host => Spree::Config.get(:site_url), :secret => digital_link.secret), :class => "btn #{format}" %>
<% end %> <% end %>
<% end %> <% end %>
<% end %> <% end %>
@@ -2,7 +2,7 @@ Deface::Override.new(:virtual_path => "spree/admin/shared/_product_tabs",
:name => "add_digital_versions_to_admin_product_tabs", :name => "add_digital_versions_to_admin_product_tabs",
:insert_bottom => "[data-hook='admin_product_tabs'], #admin_product_tabs[data-hook]", :insert_bottom => "[data-hook='admin_product_tabs'], #admin_product_tabs[data-hook]",
:text => " <li<%== ' class=\"active\"' if current == \"Digital Versions\" %>> :text => " <li<%== ' class=\"active\"' if current == \"Digital Versions\" %>>
<%= link_to_with_icon 'icon-tasks', Spree.t(:digital_versions), admin_product_digitals_path(@product) %> <%= link_to t(\"digital_versions\"), admin_product_digitals_path(@product) %>
</li> </li>
", ",
:disabled => false) :disabled => false)
@@ -1,7 +0,0 @@
Deface::Override.new(:virtual_path => "spree/admin/shared/_order_tabs",
:name => "add_reset_digitals_to_admin_orders",
:insert_after => ".sidebar",
:text => %q{
<%= content_tag(:p, button_link_to(Spree.t(:reset_downloads), reset_digitals_admin_order_url(@order)), class: 'clear') if @order.digital? or true %>
},
:disabled => false)
@@ -1,5 +1,5 @@
<% if digital.attachment_file_name.present? %> <% if digital.attachment_file_name.present? %>
<%= digital.attachment_file_name %> (<%= number_to_human_size(digital.attachment_file_size) %>) <%= digital.attachment_file_name %> (<%= number_to_human_size(digital.attachment_file_size) %>)
<% else %> <% else %>
<%=Spree.t 'broken_file' %> <%=t 'broken_file' %>
<% end %> <% end %>
@@ -1,33 +1,34 @@
<div> <div>
<div>
<%= form_for(:digital, :url => admin_product_digitals_path(@product), :method => :create, :multipart => true ) do |f| %> <%= form_for(:digital, :url => admin_product_digitals_path(@product), :method => :create, :multipart => true ) do |f| %>
<fieldset> <fieldset>
<legend><%= Spree::Variant.model_name.human %> "<%= variant.options_text %>"</legend> <legend><%= Spree::Variant.model_name.human %> "<%= variant.options_text %>"</legend>
<%= f.field_container :current_file do %> <%= f.field_container :current_file do %>
<strong><%=Spree.t 'files' %>:</strong> <strong><%=t 'files' %>:</strong>
<% if variant.digital? %> <% if variant.digital? %>
<ul> <ul>
<% variant.digitals.each do |digital| %> <% variant.digitals.each do |digital| %>
<li> <li>
<%= render digital %>&nbsp;&nbsp; <%= render digital %>&nbsp;&nbsp;
<%= link_to Spree.t(:delete_file), admin_product_digital_url(@product, digital), :confirm => Spree.t(:delete_file_cofirmation, :filename => digital.attachment_file_name), :method => :delete %> <%= link_to t("delete_file"), admin_product_digital_url(@product, digital), :confirm => t('delete_file_cofirmation', :filename => digital.attachment_file_name), :method => :delete %>
</li> </li>
<% end %> <% end %>
</ul> </ul>
<% else %> <% else %>
<%=Spree.t 'none' %> <%=t 'none' %>
<% end %> <% end %>
<% end %> <% end %>
<p class="form-buttons"> <p class="form-buttons">
<%= f.field_container :file do %> <%= f.field_container :file do %>
<%= f.label :file, Spree.t("new_file") %> <span class="required">*</span><br/> <%= f.label :file, t("new_file") %> <span class="required">*</span><br/>
<%= f.file_field :attachment %> <%= f.file_field :attachment %>
<% end %> <% end %>
<%= hidden_field_tag 'digital[variant_id]', variant.id %> <%= hidden_field_tag 'digital[variant_id]', variant.id %>
<%= button Spree.t('spree_digital.upload') %> <%= button t('spree_digital.upload') %>
</p> </p>
</fieldset> </fieldset>
@@ -8,10 +8,10 @@
<% end %> <% end %>
<% else %> <% else %>
<%= Spree.t :product_without_variants %> This product has no variants.
<% if @product.master.digital? %> <% if @product.master.digital? %>
<%= Spree.t :digital_exists %> A digital version of this product currently exists:
<%= render @product.master.digitals %> <%= render @product.master.digitals %>
<% end %> <% end %>
+1 -1
View File
@@ -1,5 +1,5 @@
<% if digital.attachment_file_name.present? %> <% if digital.attachment_file_name.present? %>
<%= digital.attachment_file_name %> (<%= number_to_human_size(digital.attachment_file_size) %>) <%= digital.attachment_file_name %> (<%= number_to_human_size(digital.attachment_file_size) %>)
<% else %> <% else %>
<%=Spree.t 'broken_file' %> <%=t 'broken_file' %>
<% end %> <% end %>
@@ -1,9 +0,0 @@
<% if defined?(SpreeFancy) %>
<% content_for :subheader do %>
<h1><%= t('.unauthorized') %></h1>
<% end %>
<% else %>
<h1><%= t('.unauthorized') %></h1>
<% end %>
<%= t('.explained') %>
+16 -27
View File
@@ -1,28 +1,17 @@
en: en:
spree: digital_versions: Digital Versions
broken_file: Warning! this file is broken current_file: Current File
current_file: Current File new_file: New File
delete_file: Delete this file delete_file: Delete this file
delete_file_cofirmation: Are you sure you want to delete the file %{filename}? broken_file: Warning! this file is broken
digital_delivery: Digital Delivery delete_file_cofirmation: Are you sure you want to delete the file %{filename}?
digital_download: Download %{type} ↓ digital_delivery: Digital Delivery
digital_download_links: Digital Download Links digital_download: Download %{type} ↓
digital_format: digital_download_links: Digital Download Links
mp3: Audio MP3 digital_format:
mobi: Kindle eBook mp3: Audio MP3
epub: ePub eBook mobi: Kindle eBook
pdf: pdf eBook epub: ePub eBook
gz: Archive pdf: pdf eBook
digital_versions: Digital Versions spree_digital:
downloads_reset: Digital Downloads Reset upload: Upload
new_file: New File
reset_downloads: Reset Digital Downloads
spree:
digitals:
unauthorized:
explained: This download link has expired.
unauthorized: Unauthorized
spree_digital:
upload: Upload
product_without_variants: This product has no variants.
digital_exists: 'A digital version of this product currently exists:'
+17 -22
View File
@@ -1,23 +1,18 @@
it: it:
spree: digital_versions: Versioni Digitali
broken_file: Attenzione! questo file sembra essere rotto current_file: File Corrente
current_file: File Corrente new_file: Nuovo File
delete_file: Elimina questo file delete_file: Elimina questo file
delete_file_cofirmation: Sei sicuro di voler eliminare il file %{filename}? broken_file: Attenzione! questo file sembra essere rotto
digital_delivery: Consegna Digitale delete_file_cofirmation: Sei sicuro di voler eliminare il file %{filename}?
digital_download: Download %{type} ↓ digital_delivery: Consegna Digitale
digital_download_links: Link al Download Digitale digital_download: Download %{type} ↓
digital_format: digital_download_links: Link al Download Digitale
mp3: Audio MP3 digital_format:
mobi: Kindle eBook mp3: Audio MP3
epub: ePub eBook mobi: Kindle eBook
pdf: pdf eBook epub: ePub eBook
digital_versions: Versioni Digitali pdf: pdf eBook
new_file: Nuovo File spree_digital:
spree: upload: Upload
digitals:
unauthorized:
explained: This download link has expired.
unauthorized: Unauthorized
spree_digital:
upload: Upload
+11 -14
View File
@@ -1,15 +1,12 @@
ja: ja:
spree: digital_versions: デジタル版
broken_file: 注意! このファイルが壊れている!
current_file: 現在のバージョン current_file: 現在のバージョン
delete_file: このファイルを削除 new_file: 新しいファイル
delete_file_cofirmation: 本当に「%{filename}」を削除しても宜しいですか? upload: アップロード
digital_shipping: ダウンロードリンクを<strong>%{email}</strong>に送ります delete_file: このファイルを削除
digital_versions: デジタル版 broken_file: 注意! このファイルが壊れている!
new_file: 新しいファイル delete_file_cofirmation: 本当に「%{filename}」を削除しても宜しいですか?
spree:
digitals: digital_shipping: ダウンロードリンクを<strong>%{email}</strong>に送ります
unauthorized:
explained: This download link has expired.
unauthorized: Unauthorized
upload: アップロード
+1 -6
View File
@@ -3,13 +3,8 @@ Spree::Core::Engine.routes.draw do
resources :products do resources :products do
resources :digitals resources :digitals
end end
resources :orders do
member do
get :reset_digitals
end
end
end end
get '/digital/:secret', :to => 'digitals#show', :via => :get, :as => 'digital', :constraints => { :secret => /[a-zA-Z0-9]{30}/ } get '/digital/:secret', :to => 'digitals#show', :via => :get, :as => 'digital', :constraints => { :secret => /[a-zA-Z0-9]{30}/ }
end end
@@ -2,28 +2,28 @@ module SpreeDigital
module Generators module Generators
class InstallGenerator < Rails::Generators::Base class InstallGenerator < Rails::Generators::Base
class_option :auto_run_migrations, :type => :boolean, :default => false # def add_javascripts
# append_file "app/assets/javascripts/store/all.js", "//= require store/spree_digital\n"
# append_file "app/assets/javascripts/admin/all.js", "//= require admin/spree_digital\n"
# end
def add_javascripts # def add_stylesheets
append_file 'app/assets/javascripts/store/all.js', "//= require store/spree_digital\n" # inject_into_file "app/assets/stylesheets/store/all.css", " *= require store/spree_digital\n",
append_file 'app/assets/javascripts/admin/all.js', "//= require admin/spree_digital\n" # :before => /\*\//, :verbose => true
end # inject_into_file "app/assets/stylesheets/admin/all.css", " *= require admin/spree_digital\n",
# :before => /\*\//, :verbose => true
def add_stylesheets # end
inject_into_file 'app/assets/stylesheets/store/all.css', " *= require store/spree_digital\n", :before => /\*\//, :verbose => true
inject_into_file 'app/assets/stylesheets/admin/all.css', " *= require admin/spree_digital\n", :before => /\*\//, :verbose => true
end
def add_migrations def add_migrations
run 'bundle exec rake railties:install:migrations FROM=spree_digital' run 'bundle exec rake railties:install:migrations FROM=spree_digital'
end end
def run_migrations def run_migrations
run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]') res = ask "Would you like to run the migrations now? [Y/n]"
if run_migrations if res == "" || res.downcase == "y"
run 'bundle exec rake db:migrate' run 'bundle exec rake db:migrate'
else else
puts 'Skipping rake db:migrate, don\'t forget to run it!' puts "Skipping rake db:migrate, don't forget to run it!"
end end
end end
end end
+2 -9
View File
@@ -1,16 +1,9 @@
module SpreeDigital module SpreeDigital
class Engine < Rails::Engine class Engine < Rails::Engine
require 'spree/core'
isolate_namespace Spree
engine_name 'spree_digital' engine_name 'spree_digital'
config.autoload_paths += %W(#{config.root}/lib) config.autoload_paths += %W(#{config.root}/lib)
# use rspec for tests
config.generators do |g|
g.test_framework :rspec
end
initializer "spree.spree_digital.preferences", :after => "spree.environment" do |app| initializer "spree.spree_digital.preferences", :after => "spree.environment" do |app|
Spree::DigitalConfiguration = Spree::SpreeDigitalConfiguration.new Spree::DigitalConfiguration = Spree::SpreeDigitalConfiguration.new
end end
@@ -20,8 +13,8 @@ module SpreeDigital
end end
def self.activate def self.activate
Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c| Dir.glob(File.join(File.dirname(__FILE__), "../../app/**/*_decorator*.rb")) do |c|
Rails.configuration.cache_classes ? require(c) : load(c) Rails.application.config.cache_classes ? require(c) : load(c)
end end
end end
-28
View File
@@ -1,28 +0,0 @@
FactoryGirl.define do
# Define your Spree extensions Factories within this file to enable applications, and other extensions to use and override them.
#
# Example adding this to your spec_helper will load these Factories for use:
# require 'spree_digital/factories'
factory :digital, :class => Spree::Digital do |f|
# TODO good to assign variant association if no association is manually defined
# f.variant { |p| p.association(:variant) }
attachment_content_type 'application/octet-stream'
attachment_file_name 'a_great_book.epub'
end
factory :digital_link, :class => Spree::DigitalLink do |f|
f.digital { |p| p.association(:digital) }
f.line_item { |p| p.association(:line_item) }
end
factory :digital_shipping_calculator, class: Spree::Calculator::DigitalDelivery do |c|
after(:create) { |c| c.set_preference(:amount, 0) }
end
factory :digital_shipping_method, parent: :shipping_method do |f|
name "Digital Delivery"
calculator { FactoryGirl.build :digital_shipping_calculator }
end
end
+10 -11
View File
@@ -17,20 +17,20 @@ The idea is simple. You attach a file to a Product (or a Variant of this Product
* The file `views/order_mailer/confirm_email.text.erb` is the only thing that should need customization. If you are looking for HTML emails, [this branch of spree-html-email](http://github.com/iloveitaly/spree-html-email) supports spree_digital * The file `views/order_mailer/confirm_email.text.erb` is the only thing that should need customization. If you are looking for HTML emails, [this branch of spree-html-email](http://github.com/iloveitaly/spree-html-email) supports spree_digital
* A purchased product can be downloaded even if you disable the product immediately. You would have to remove the attached file in your admin section to prevent people from downloading purchased products. * A purchased product can be downloaded even if you disable the product immediately. You would have to remove the attached file in your admin section to prevent people from downloading purchased products.
* File are uploaded to `rails_root/private`. Make sure it's symlinked in case you're using Capistrano. If you want to change the upload path, [check out this gist](https://gist.github.com/3187793#file_spree_digital_path_change_decorator.rb) * File are uploaded to `rails_root/private`. Make sure it's symlinked in case you're using Capistrano. If you want to change the upload path, [check out this gist](https://gist.github.com/3187793#file_spree_digital_path_change_decorator.rb)
* You must add a `views/spree/digitals/unauthorized.html.erb` file to customize an error message to the user if they exceed the download / days limit * You must add a `views/spree/digitals/unauthorized.html.erb` file to present an error message to the user if they exceed the download / days limit
* We use send_file to send the files on download. See below for instructions on how to push file downloading off to nginx. * We use send_file to send the files on download. See below for instructions on how to push file downloading off to nginx.
## Installation ## Installation
Add this line to your gemfile: Add this line to your gemfile:
```shell ```
gem 'spree_digital', :git => 'git://github.com/dlage/spree_digital.git', :branch => 'master' gem 'spree_digital', :git => 'git://github.com/halo/spree_digital.git', :branch => 'master'
``` ```
The following terminal commands will copy the migration files to the corresponding directory in your Rails application and apply the migrations to your database. The following terminal commands will copy the migration files to the corresponding directory in your Rails application and apply the migrations to your database.
```shell ```
bundle exec rails g spree_digital:install bundle exec rails g spree_digital:install
bundle exec rake db:migrate bundle exec rake db:migrate
``` ```
@@ -104,14 +104,14 @@ References:
Get the spree framework and spree_digital extension for it: Get the spree framework and spree_digital extension for it:
```shell ```
git clone git://github.com/spree/spree.git git clone git://github.com/spree/spree.git
git clone git://github.com/dlage/spree_digital.git git clone git://github.com/halo/spree_digital.git
``` ```
Go into the spree directory and run the bundle command: Go into the spree directory and run the bundle command:
```shell ```
cd spree cd spree
bundle install bundle install
``` ```
@@ -120,25 +120,24 @@ Go into the spree_digital directory and do the same:
NOTE: At this point you may need to uncomment the stuff in the `Gemfile` before you can start developing and testing! NOTE: At this point you may need to uncomment the stuff in the `Gemfile` before you can start developing and testing!
```shell ```
cd spree_digital cd spree_digital
bundle install bundle install
``` ```
Bring up the test application (you only need to do this whenever you fiddle around with the migrations) and then you can run the tests as you please. Bring up the test application (you only need to do this whenever you fiddle around with the migrations) and then you can run the tests as you please.
```shell ```
rake test_app rake test_app
rake spec rake spec
``` ```
This link may be very helpful to you: [http://github.com/spree/spree](http://github.com/spree/spree) This link may be very helpful to you: "http://github.com/spree/spree":http://github.com/spree/spree
### Authors ### Authors
* [iloveitaly](http://github.com/iloveitaly/) * [iloveitaly](http://github.com/iloveitaly/)
* [halo](http://github.com/halo) * [halo](http://github.com/halo)
* [dlage](http://github.com/dlage)
### License ### License
-7
View File
@@ -1,7 +0,0 @@
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
ENGINE_ROOT = File.expand_path('../..', __FILE__)
ENGINE_PATH = File.expand_path('../../lib/spree_digital/engine', __FILE__)
require 'rails/all'
require 'rails/engine/commands'
+6
View File
@@ -0,0 +1,6 @@
FactoryGirl.define do
factory :digital, :class => Spree::Digital do |f|
# TODO good to assign variant association if no association is manually defined
# f.variant { |p| p.association(:variant) }
end
end
+6
View File
@@ -0,0 +1,6 @@
FactoryGirl.define do
factory :digital_link, :class => Spree::DigitalLink do |f|
f.digital { |p| p.association(:digital) }
f.line_item { |p| p.association(:line_item) }
end
end
@@ -0,0 +1,12 @@
FactoryGirl.define do
# https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#modifying-factories
factory :digital_shipping_calculator, class: Spree::Calculator::DigitalDelivery do |c|
after_create { |c| c.set_preference(:amount, 0) }
end
factory :digital_shipping_method, parent: :shipping_method do |f|
name "Digital Delivery"
calculator { FactoryGirl.build :digital_shipping_calculator }
end
end
+15 -16
View File
@@ -4,9 +4,9 @@ describe Spree::Order do
context "#add_variant" do context "#add_variant" do
it "should add digital Variants of quantity 1 to an order" do it "should add digital Variants of quantity 1 to an order" do
order = FactoryGirl.create(:order) order = FactoryGirl.create(:order)
order.contents.add variant1 = FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)]), 1 order.add_variant variant1 = FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)])
order.contents.add variant2 = FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)]), 1 order.add_variant variant2 = FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)])
order.contents.add variant3 = FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)]), 1 order.add_variant variant3 = FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)])
order.line_items.first.variant.should == variant1 order.line_items.first.variant.should == variant1
order.line_items.second.variant.should == variant2 order.line_items.second.variant.should == variant2
order.line_items.third.variant.should == variant3 order.line_items.third.variant.should == variant3
@@ -15,9 +15,9 @@ describe Spree::Order do
it "should handle quantity higher than 1 when adding one specific digital Variant" do it "should handle quantity higher than 1 when adding one specific digital Variant" do
order = FactoryGirl.create(:order) order = FactoryGirl.create(:order)
digital_variant = FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)]) digital_variant = FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)])
order.contents.add digital_variant, 3 order.add_variant digital_variant, 3
order.line_items.first.quantity.should == 3 order.line_items.first.quantity.should == 3
order.contents.add digital_variant, 2 order.add_variant digital_variant, 2
order.line_items.first.quantity.should == 5 order.line_items.first.quantity.should == 5
end end
end end
@@ -26,21 +26,21 @@ describe Spree::Order do
it "should understand that all products are digital" do it "should understand that all products are digital" do
order = FactoryGirl.create(:order) order = FactoryGirl.create(:order)
3.times do 3.times do
order.contents.add FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)]), 1 order.add_variant FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)])
end end
order.digital?.should be_true order.digital?.should be_true
order.contents.add FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)]), 4 order.add_variant FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)]), 4
order.digital?.should be_true order.digital?.should be_true
end end
it "should understand that not all products are digital" do it "should understand that not all products are digital" do
order = FactoryGirl.create(:order) order = FactoryGirl.create(:order)
3.times do 3.times do
order.contents.add FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)]), 1 order.add_variant FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)])
end end
order.contents.add FactoryGirl.create(:variant), 1 # this is the analog product order.add_variant FactoryGirl.create(:variant) # this is the analog product
order.digital?.should be_false order.digital?.should be_false
order.contents.add FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)]), 4 order.add_variant FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)]), 4
order.digital?.should be_false order.digital?.should be_false
end end
end end
@@ -53,7 +53,7 @@ describe Spree::Order do
@order.bill_address = FactoryGirl.create :address @order.bill_address = FactoryGirl.create :address
@order.save! @order.save!
3.times { @order.contents.add FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)]), 1 } 3.times { @order.add_variant FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)]) }
FactoryGirl.create :digital_shipping_method FactoryGirl.create :digital_shipping_method
s = FactoryGirl.create :shipping_method s = FactoryGirl.create :shipping_method
@@ -64,15 +64,14 @@ describe Spree::Order do
it "should only offer digital shipping if all items are digital" do it "should only offer digital shipping if all items are digital" do
order.digital?.should be_true order.digital?.should be_true
shipments = order.create_proposed_shipments order.rate_hash.count.should == 1
shipments.count.should == 1 order.rate_hash.first.shipping_method.calculator.class.should == Spree::Calculator::DigitalDelivery
shipments.first.shipping_method.calculator.class.should == Spree::Calculator::DigitalDelivery order.rate_hash.first.cost.should == 0.0
shipments.first.cost.should == 0.0
end end
it "should not offer digital shipping if only some items are digital" do it "should not offer digital shipping if only some items are digital" do
order.digital?.should be_true order.digital?.should be_true
order.contents.add FactoryGirl.create(:variant), 1 # this is the analog product order.add_variant FactoryGirl.create(:variant) # this is the analog product
order.digital?.should be_false order.digital?.should be_false
order.rate_hash.count.should == 1 order.rate_hash.count.should == 1
+21 -63
View File
@@ -1,19 +1,5 @@
# Run Coverage report ENV["RAILS_ENV"] = "test"
require 'simplecov' require File.expand_path("../dummy/config/environment.rb", __FILE__)
SimpleCov.start do
add_group 'Controllers', 'app/controllers'
add_group 'Helpers', 'app/helpers'
add_group 'Mailers', 'app/mailers'
add_group 'Models', 'app/models'
add_group 'Views', 'app/views'
add_group 'Libraries', 'lib'
end
# Configure Rails Environment
ENV['RAILS_ENV'] = 'test'
require File.expand_path('../dummy/config/environment.rb', __FILE__)
require 'rspec/rails' require 'rspec/rails'
require 'database_cleaner' require 'database_cleaner'
require 'ffaker' require 'ffaker'
@@ -21,65 +7,37 @@ require 'shoulda-matchers'
# Requires supporting ruby files with custom matchers and macros, etc, # Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories. # in spec/support/ and its subdirectories.
Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f } Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each {|f| require f }
# Requires factories defined in spree_core require 'spree/core/testing_support/factories'
require 'spree/testing_support/factories' require 'spree/core/testing_support/env'
require 'spree/testing_support/controller_requests' require 'spree/core/testing_support/controller_requests'
require 'spree/testing_support/authorization_helpers' require 'spree/core/url_helpers'
require 'spree/testing_support/url_helpers'
# Requires factories defined in lib/spree_digital/factories.rb Dir[File.join(File.dirname(__FILE__), "factories/*.rb")].each {|f| require f }
require 'spree_digital/factories'
RSpec.configure do |config| RSpec.configure do |config|
config.include FactoryGirl::Syntax::Methods
# == URL Helpers
#
# Allows access to Spree's routes in specs:
#
# visit spree.admin_path
# current_path.should eql(spree.products_path)
config.include Spree::TestingSupport::UrlHelpers
config.include Spree::TestingSupport::ControllerRequests, :type => :controller
config.include Spree::TestingSupport::AuthorizationHelpers
config.include Devise::TestHelpers, :type => :controller
# == Mock Framework
#
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
#
# config.mock_with :mocha
# config.mock_with :flexmock
# config.mock_with :rr
config.mock_with :rspec config.mock_with :rspec
config.color = true config.include FactoryGirl::Syntax::Methods
config.include Spree::Core::UrlHelpers
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures config.include Spree::Core::TestingSupport::ControllerRequests
config.fixture_path = "#{::Rails.root}/spec/fixtures" config.include Devise::TestHelpers, :type => :controller
# Capybara javascript drivers require transactional fixtures set to false, and we use DatabaseCleaner
# to cleanup after each test instead. Without transactional fixtures set to false the records created
# to setup a test will be unavailable to the browser, which runs under a seperate server instance.
config.use_transactional_fixtures = false config.use_transactional_fixtures = false
# Ensure Suite is set to use transactions for speed. config.before(:each) do
config.before :suite do if example.metadata[:js]
DatabaseCleaner.strategy = :transaction DatabaseCleaner.strategy = :truncation, { :except => ['spree_countries', 'spree_zones', 'spree_zone_members', 'spree_states', 'spree_roles'] }
DatabaseCleaner.clean_with :truncation else
DatabaseCleaner.strategy = :transaction
end
end end
# Before each spec check if it is a Javascript test and switch between using database transactions or not where necessary. config.before(:each) do
config.before :each do
DatabaseCleaner.strategy = example.metadata[:js] ? :truncation : :transaction
DatabaseCleaner.start DatabaseCleaner.start
# reset_spree_preferences
end end
# After each spec clean the database. config.after(:each) do
config.after :each do
DatabaseCleaner.clean DatabaseCleaner.clean
end end
config.fail_fast = ENV['FAIL_FAST'] || false
end end
+19 -25
View File
@@ -1,31 +1,25 @@
# encoding: UTF-8
Gem::Specification.new do |s| Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY s.platform = Gem::Platform::RUBY
s.name = 'spree_digital' s.name = 'spree_digital'
s.version = '2.0.0' s.version = '1.1.1'
s.summary = 'Digital download functionality for spree' s.summary = ''
s.description = 'Digital download functionality for spree' s.description = 'Add digital download functionality to spree'
s.required_ruby_version = '>= 1.9.3' s.authors = ['funkensturm', 'Michael Bianco']
s.email = ['info@cliffsidedev.com']
s.author = 'Dinis Lage' s.homepage = 'http://www.funkensturm.com'
s.email = 'dinis@senolage.com' s.files = `git ls-files`.split("\n")
s.homepage = 'http://senolage.com' s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
#s.files = `git ls-files`.split("\n")
#s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
s.require_path = 'lib' s.require_path = 'lib'
s.requirements << 'none' s.requirements << 'none'
s.required_ruby_version = '>= 1.8.7'
s.add_dependency 'spree_core', '>= 1.1.0'
s.add_dependency 'spree_core', '~> 2.0.0' # test suite
s.add_development_dependency 'shoulda-matchers'
s.add_development_dependency 'capybara', '~> 2.1' s.add_development_dependency 'capybara'
s.add_development_dependency 'coffee-rails' s.add_development_dependency 'factory_girl_rails', '~> 1.7.0'
s.add_development_dependency 'database_cleaner' s.add_development_dependency 'rspec-rails', '~> 2.8'
s.add_development_dependency 'factory_girl', '~> 4.2'
s.add_development_dependency 'ffaker'
s.add_development_dependency 'rspec-rails', '~> 2.13'
s.add_development_dependency 'sass-rails'
s.add_development_dependency 'selenium-webdriver'
s.add_development_dependency 'simplecov'
s.add_development_dependency 'sqlite3' s.add_development_dependency 'sqlite3'
s.add_development_dependency 'ffaker'
s.add_development_dependency 'database_cleaner'
end end