diff --git a/.gitignore b/.gitignore index 2030494..e8a3f9c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,11 +4,11 @@ .DS_Store .idea .project +.sass-cache +coverage +Gemfile.lock tmp nbproject +pkg *.swp spec/dummy -*.tmproj -Gemfile.lock -Guardfile - diff --git a/.rspec b/.rspec index cf6add7..5052887 100644 --- a/.rspec +++ b/.rspec @@ -1 +1 @@ ---colour \ No newline at end of file +--color \ No newline at end of file diff --git a/Gemfile b/Gemfile index f310df2..dbee678 100644 --- a/Gemfile +++ b/Gemfile @@ -1,12 +1,17 @@ -source 'http://rubygems.org' +source 'https://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 group :test do - if RUBY_PLATFORM.downcase.include? "darwin" - gem 'guard-rspec' - gem 'rb-fsevent' - gem 'growl' - end + gem "shoulda-matchers" end -gem 'spree', '~> 1.3.2' +# `rspec-rails` needs to be in the development group so that Rails generators work. +group :development, :test do + gem "rspec-rails", "~> 2.12" +end + +gem 'therubyracer' diff --git a/LICENSE b/LICENSE index 82bf74f..9822124 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,26 @@ -The MIT License +Copyright (c) 2013 [name of plugin creator] +All rights reserved. -Copyright (c) 2011 funkensturm. +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name Spree nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..68d5ef7 --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +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 diff --git a/Rakefile b/Rakefile index cfc0970..7b6ff70 100644 --- a/Rakefile +++ b/Rakefile @@ -1,31 +1,17 @@ -require 'rake' -require 'rake/testtask' -require 'rake/packagetask' -require 'rubygems/package_task' +require 'bundler' +Bundler::GemHelper.install_tasks + require 'rspec/core/rake_task' -require 'spree/core/testing_support/common_rake' +require 'spree/testing_support/extension_rake' RSpec::Core::RakeTask.new task :default => [:spec] -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" +desc 'Generates a dummy app for testing' task :test_app do - ENV['LIB_NAME'] = 'spree_digital' - + ENV['LIB_NAME'] = 'spree_digital' + require File.join `bundle show spree_core`.chomp, 'lib/generators/spree/dummy/dummy_generator.rb' Spree::DummyGenerator.class_eval do def test_dummy_add_digital @@ -35,5 +21,5 @@ task :test_app do end end - Rake::Task['common:test_app'].invoke + Rake::Task['extension:test_app'].invoke end diff --git a/Versionfile b/Versionfile index 46204a6..5db83aa 100644 --- a/Versionfile +++ b/Versionfile @@ -1,5 +1,11 @@ -"0.7.x" => { :ref => "eddaea63959586d123007cbca3be5bf9c5edb1a7" } -"1.0.x" => { :ref => "a8c27750ef1cf9d0ad1a2a6ebe33307da900a5c1" } -"1.1.x" => { :branch => "1-1-stable" } -"1.2.x" => { :ref => "9360c635039aaeeee18026b830aa96cc7587cd0d" } -"1.3.x" => { :branch => "master" } +# This file is used to designate compatibilty with different versions of Spree +# Please see http://spreecommerce.com/documentation/extensions.html#versionfile for details + +# Examples +# +# '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' } + diff --git a/app/assets/javascripts/admin/spree_digital.js b/app/assets/javascripts/admin/spree_digital.js new file mode 100644 index 0000000..b181e56 --- /dev/null +++ b/app/assets/javascripts/admin/spree_digital.js @@ -0,0 +1 @@ +//= require admin/spree_backend diff --git a/app/assets/javascripts/store/spree_digital.js b/app/assets/javascripts/store/spree_digital.js new file mode 100644 index 0000000..d10fba7 --- /dev/null +++ b/app/assets/javascripts/store/spree_digital.js @@ -0,0 +1 @@ +//= require store/spree_frontend diff --git a/app/assets/stylesheets/admin/spree_digital.css b/app/assets/stylesheets/admin/spree_digital.css new file mode 100644 index 0000000..ff89c72 --- /dev/null +++ b/app/assets/stylesheets/admin/spree_digital.css @@ -0,0 +1,3 @@ +/* + *= require admin/spree_backend +*/ diff --git a/app/assets/stylesheets/store/spree_digital.css b/app/assets/stylesheets/store/spree_digital.css new file mode 100644 index 0000000..bce0f84 --- /dev/null +++ b/app/assets/stylesheets/store/spree_digital.css @@ -0,0 +1,3 @@ +/* + *= require store/spree_frontend +*/ diff --git a/config/routes.rb b/config/routes.rb index cee532f..73585e1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,10 +6,10 @@ Spree::Core::Engine.routes.draw do resources :orders do member do - get :reset_digitals + get :reset_digitals end end end - + get '/digital/:secret', :to => 'digitals#show', :via => :get, :as => 'digital', :constraints => { :secret => /[a-zA-Z0-9]{30}/ } end diff --git a/lib/generators/spree_digital/install/install_generator.rb b/lib/generators/spree_digital/install/install_generator.rb index d5592fd..0750ee8 100644 --- a/lib/generators/spree_digital/install/install_generator.rb +++ b/lib/generators/spree_digital/install/install_generator.rb @@ -1,31 +1,31 @@ module SpreeDigital module Generators class InstallGenerator < Rails::Generators::Base - - # 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_stylesheets - # 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 - + + 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_stylesheets + 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 run 'bundle exec rake railties:install:migrations FROM=spree_digital' end - + def run_migrations - res = ask "Would you like to run the migrations now? [Y/n]" - if res == "" || res.downcase == "y" + run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]') + if run_migrations run 'bundle exec rake db:migrate' 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 \ No newline at end of file +end diff --git a/lib/spree_digital/engine.rb b/lib/spree_digital/engine.rb index 5aea332..2bb4b02 100644 --- a/lib/spree_digital/engine.rb +++ b/lib/spree_digital/engine.rb @@ -1,9 +1,16 @@ module SpreeDigital class Engine < Rails::Engine + require 'spree/core' + isolate_namespace Spree engine_name 'spree_digital' 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| Spree::DigitalConfiguration = Spree::SpreeDigitalConfiguration.new end @@ -11,10 +18,10 @@ module SpreeDigital initializer "spree.register.digital_shipping", :after => 'spree.register.calculators' do |app| app.config.spree.calculators.shipping_methods << Spree::Calculator::DigitalDelivery end - + def self.activate - Dir.glob(File.join(File.dirname(__FILE__), "../../app/**/*_decorator*.rb")) do |c| - Rails.application.config.cache_classes ? require(c) : load(c) + Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c| + Rails.configuration.cache_classes ? require(c) : load(c) end end diff --git a/lib/spree_digital/factories.rb b/lib/spree_digital/factories.rb new file mode 100644 index 0000000..99d914c --- /dev/null +++ b/lib/spree_digital/factories.rb @@ -0,0 +1,28 @@ +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 diff --git a/readme.md b/readme.md index 37c683f..d073880 100644 --- a/readme.md +++ b/readme.md @@ -25,7 +25,7 @@ The idea is simple. You attach a file to a Product (or a Variant of this Product Add this line to your gemfile: ```shell -gem 'spree_digital', :git => 'git://github.com/halo/spree_digital.git', :branch => 'master' +gem 'spree_digital', :git => 'git://github.com/dlage/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. @@ -106,7 +106,7 @@ Get the spree framework and spree_digital extension for it: ```shell git clone git://github.com/spree/spree.git -git clone git://github.com/halo/spree_digital.git +git clone git://github.com/dlage/spree_digital.git ``` Go into the spree directory and run the bundle command: @@ -138,6 +138,7 @@ This link may be very helpful to you: [http://github.com/spree/spree](http://git * [iloveitaly](http://github.com/iloveitaly/) * [halo](http://github.com/halo) +* [dlage](http://github.com/dlage) ### License diff --git a/script/rails b/script/rails new file mode 100644 index 0000000..dac90d0 --- /dev/null +++ b/script/rails @@ -0,0 +1,7 @@ +# 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' diff --git a/spec/factories/digital_factory.rb b/spec/factories/digital_factory.rb deleted file mode 100644 index 2ea86da..0000000 --- a/spec/factories/digital_factory.rb +++ /dev/null @@ -1,9 +0,0 @@ -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) } - - attachment_content_type 'application/octet-stream' - attachment_file_name 'a_great_book.epub' - end -end \ No newline at end of file diff --git a/spec/factories/digital_link_factory.rb b/spec/factories/digital_link_factory.rb deleted file mode 100644 index 0565be7..0000000 --- a/spec/factories/digital_link_factory.rb +++ /dev/null @@ -1,6 +0,0 @@ -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 \ No newline at end of file diff --git a/spec/factories/digital_shipping_factory.rb b/spec/factories/digital_shipping_factory.rb deleted file mode 100644 index 10f5afc..0000000 --- a/spec/factories/digital_shipping_factory.rb +++ /dev/null @@ -1,12 +0,0 @@ -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 \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 9e9f2b9..07498a6 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,40 +1,85 @@ -ENV["RAILS_ENV"] = "test" -require File.expand_path("../dummy/config/environment.rb", __FILE__) +# Run Coverage report +require 'simplecov' +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 'database_cleaner' require 'ffaker' require 'shoulda-matchers' -Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each {|f| require f } +# Requires supporting ruby files with custom matchers and macros, etc, +# in spec/support/ and its subdirectories. +Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f } -require 'spree/core/testing_support/factories' -require 'spree/core/testing_support/controller_requests' -require 'spree/core/url_helpers' +# Requires factories defined in spree_core +require 'spree/testing_support/factories' +require 'spree/testing_support/controller_requests' +require 'spree/testing_support/authorization_helpers' +require 'spree/testing_support/url_helpers' -Dir[File.join(File.dirname(__FILE__), "factories/*.rb")].each {|f| require f } +# Requires factories defined in lib/spree_digital/factories.rb +require 'spree_digital/factories' RSpec.configure do |config| - config.mock_with :rspec config.include FactoryGirl::Syntax::Methods - config.include Spree::Core::UrlHelpers - config.include Spree::Core::TestingSupport::ControllerRequests + + # == 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.color = true + + # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures + config.fixture_path = "#{::Rails.root}/spec/fixtures" + + # 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.before(:each) do - if example.metadata[:js] - DatabaseCleaner.strategy = :truncation, { :except => ['spree_countries', 'spree_zones', 'spree_zone_members', 'spree_states', 'spree_roles'] } - else - DatabaseCleaner.strategy = :transaction - end + # Ensure Suite is set to use transactions for speed. + config.before :suite do + DatabaseCleaner.strategy = :transaction + DatabaseCleaner.clean_with :truncation end - config.before(:each) do + # Before each spec check if it is a Javascript test and switch between using database transactions or not where necessary. + config.before :each do + DatabaseCleaner.strategy = example.metadata[:js] ? :truncation : :transaction DatabaseCleaner.start - # reset_spree_preferences end - config.after(:each) do + # After each spec clean the database. + config.after :each do DatabaseCleaner.clean end -end \ No newline at end of file + + config.fail_fast = ENV['FAIL_FAST'] || false +end diff --git a/spree_digital.gemspec b/spree_digital.gemspec index 98bcfe5..8509886 100644 --- a/spree_digital.gemspec +++ b/spree_digital.gemspec @@ -1,26 +1,31 @@ +# encoding: UTF-8 Gem::Specification.new do |s| - s.platform = Gem::Platform::RUBY - s.name = 'spree_digital' - s.version = '1.1.1' - s.summary = '' - s.description = 'Digital download functionality for spree' - s.authors = ['funkensturm', 'Michael Bianco'] - s.email = ['info@cliffsidedev.com'] - s.homepage = 'http://www.funkensturm.com' - s.files = `git ls-files`.split("\n") - s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") + s.platform = Gem::Platform::RUBY + s.name = 'spree_digital' + s.version = '2.0.0' + s.summary = 'Digital download functionality for spree' + s.description = 'Digital download functionality for spree' + s.required_ruby_version = '>= 1.9.3' + + s.author = 'Dinis Lage' + s.email = 'dinis@senolage.com' + s.homepage = 'http://senolage.com' + + #s.files = `git ls-files`.split("\n") + #s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") s.require_path = 'lib' s.requirements << 'none' - s.required_ruby_version = '>= 1.8.7' - s.add_dependency 'spree_core', '~> 1.3.0' + s.add_dependency 'spree_core', '~> 2.0.0' - # test suite - s.add_development_dependency 'shoulda-matchers' - s.add_development_dependency 'capybara' - s.add_development_dependency 'factory_girl_rails', '~> 1.7.0' - s.add_development_dependency 'rspec-rails', '~> 2.8' - s.add_development_dependency 'sqlite3' - s.add_development_dependency 'ffaker' + s.add_development_dependency 'capybara', '~> 2.1' + s.add_development_dependency 'coffee-rails' s.add_development_dependency 'database_cleaner' -end \ No newline at end of file + 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' +end