Permalink
Browse files

Initial commit;

Spree 0.30.X+ compatible only
  • Loading branch information...
0 parents commit eea89248f5d3c5c4474a2806646c9e1af2e6d702 @jumph4x committed Mar 27, 2011
@@ -0,0 +1,23 @@
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * 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 of the Rails Dog LLC nor the names of its
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+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.
@@ -0,0 +1,137 @@
+# I think this is the one that should be moved to the extension Rakefile template
+
+# In rails 1.2, plugins aren't available in the path until they're loaded.
+# Check to see if the rspec plugin is installed first and require
+# it if it is. If not, use the gem version.
+
+# Determine where the RSpec plugin is by loading the boot
+unless defined? SPREE_ROOT
+ ENV["RAILS_ENV"] = "test"
+ case
+ when ENV["SPREE_ENV_FILE"]
+ require File.dirname(ENV["SPREE_ENV_FILE"]) + "/boot"
+ when File.dirname(__FILE__) =~ %r{vendor/SPREE/vendor/extensions}
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../")}/config/boot"
+ else
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../")}/config/boot"
+ end
+end
+
+require 'rake'
+require 'rake/rdoctask'
+require 'rake/testtask'
+
+rspec_base = File.expand_path(SPREE_ROOT + '/vendor/plugins/rspec/lib')
+$LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
+require 'spec/rake/spectask'
+# require 'spec/translator'
+
+# Cleanup the SPREE_ROOT constant so specs will load the environment
+Object.send(:remove_const, :SPREE_ROOT)
+
+extension_root = File.expand_path(File.dirname(__FILE__))
+
+task :default => :spec
+task :stats => "spec:statsetup"
+
+desc "Run all specs in spec directory"
+Spec::Rake::SpecTask.new(:spec) do |t|
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
+ t.spec_files = FileList["#{extension_root}/spec/**/*_spec.rb"]
+end
+
+namespace :spec do
+ desc "Run all specs in spec directory with RCov"
+ Spec::Rake::SpecTask.new(:rcov) do |t|
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
+ t.spec_files = FileList['spec/**/*_spec.rb']
+ t.rcov = true
+ t.rcov_opts = ['--exclude', 'spec', '--rails']
+ end
+
+ desc "Print Specdoc for all specs"
+ Spec::Rake::SpecTask.new(:doc) do |t|
+ t.spec_opts = ["--format", "specdoc", "--dry-run"]
+ t.spec_files = FileList['spec/**/*_spec.rb']
+ end
+
+ [:models, :controllers, :views, :helpers].each do |sub|
+ desc "Run the specs under spec/#{sub}"
+ Spec::Rake::SpecTask.new(sub) do |t|
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
+ t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
+ end
+ end
+
+ # Hopefully no one has written their extensions in pre-0.9 style
+ # desc "Translate specs from pre-0.9 to 0.9 style"
+ # task :translate do
+ # translator = ::Spec::Translator.new
+ # dir = RAILS_ROOT + '/spec'
+ # translator.translate(dir, dir)
+ # end
+
+ # Setup specs for stats
+ task :statsetup do
+ require 'code_statistics'
+ ::STATS_DIRECTORIES << %w(Model\ specs spec/models)
+ ::STATS_DIRECTORIES << %w(View\ specs spec/views)
+ ::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers)
+ ::STATS_DIRECTORIES << %w(Helper\ specs spec/views)
+ ::CodeStatistics::TEST_TYPES << "Model specs"
+ ::CodeStatistics::TEST_TYPES << "View specs"
+ ::CodeStatistics::TEST_TYPES << "Controller specs"
+ ::CodeStatistics::TEST_TYPES << "Helper specs"
+ ::STATS_DIRECTORIES.delete_if {|a| a[0] =~ /test/}
+ end
+
+ namespace :db do
+ namespace :fixtures do
+ desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y"
+ task :load => :environment do
+ require 'active_record/fixtures'
+ ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
+ (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'spec', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
+ Fixtures.create_fixtures('spec/fixtures', File.basename(fixture_file, '.*'))
+ end
+ end
+ end
+ end
+end
+
+desc 'Generate documentation for the core_charges extension.'
+Rake::RDocTask.new(:rdoc) do |rdoc|
+ rdoc.rdoc_dir = 'rdoc'
+ rdoc.title = 'CoreChargesExtension'
+ rdoc.options << '--line-numbers' << '--inline-source'
+ rdoc.rdoc_files.include('README')
+ rdoc.rdoc_files.include('lib/**/*.rb')
+end
+
+# For extensions that are in transition
+desc 'Test the core_charges extension.'
+Rake::TestTask.new(:test) do |t|
+ t.libs << 'lib'
+ t.pattern = 'test/**/*_test.rb'
+ t.verbose = true
+end
+
+namespace :test do
+ desc 'Functional test the core_charges extension.'
+ Rake::TestTask.new(:functionals) do |t|
+ t.libs << 'lib'
+ t.pattern = 'test/functional/*_test.rb'
+ t.verbose = true
+ end
+
+ desc 'Unit test the core_charges extension.'
+ Rake::TestTask.new(:units) do |t|
+ t.libs << 'lib'
+ t.pattern = 'test/unit/*_test.rb'
+ t.verbose = true
+ end
+end
+
+
+# Load any custom rakefiles for extension
+Dir[File.dirname(__FILE__) + '/tasks/*.rake'].sort.each { |f| require f }
@@ -0,0 +1,23 @@
+class CoreCharge < ::Adjustment
+ belongs_to :order
+ scope :with_order, :conditions => "order_id IS NOT NULL"
+
+ before_validation :set_amount
+
+ # We check if core charges even apply to this order
+ # For this we see if any associated products have their core amounts set
+ def applicable?
+ order.line_items.include? source
+ end
+
+ def update!
+ set_amount
+ save!
+ end
+
+ # Calculates core charges by summing relevant ones
+ def set_amount
+ self.amount = source.variant.product.core_amount * source.quantity
+ end
+
+end
@@ -0,0 +1,5 @@
+en:
+ core_charge: "Core charge"
+ core_charges: "Core charges"
+ core_amount: "Core deposit amount"
+ core_charge_total: "Core charge total"
@@ -0,0 +1,9 @@
+class AddCoreFieldToProducts < ActiveRecord::Migration
+ def self.up
+ add_column :products, :core_amount, :decimal, :null => true, :default => nil, :precision => 8, :scale => 2
+ end
+
+ def self.down
+ remove_column :products, :core_amount
+ end
+end
@@ -0,0 +1,12 @@
+class CoreChargesHooks < Spree::ThemeSupport::HookListener
+
+ insert_after :admin_product_form_right do
+ '<%= f.label :core_amount, t("core_amount") %> <br />
+ <%= f.select :core_amount, [nil, 25.0, 50.0, 75.0, 100.0, 150.0, 200.0], :class => "text " %>
+ <%= f.error_message_on :core_amount %>'
+ end
+
+# insert_after :cart_items do
+# '<%- if @order.core_charges.any? -%><div class="right charge"><h3><%= t("core_charge_total") -%>: <span class="price"><%= number_to_currency(@order.core_charges.map(&:amount).sum) -%></span></h3></div><%- end -%>'
+# end
+end
@@ -0,0 +1,39 @@
+require 'spree_core'
+require 'core_charges_hooks'
+
+module SpreeCoreCharges
+ class Engine < Rails::Engine
+
+ def self.activate
+# Dir.glob(File.join(File.dirname(__FILE__), "../app/models/*.rb")) do |c|
+# Rails.env.production? ? require(c) : load(c)
+# end
+
+ Adjustment.class_eval do
+ scope :core, lambda { where('label like ?',"#{I18n.t(:core_charge)}%") }
+ end
+
+ Order.class_eval do
+ #has_many :core_charges
+ before_save :update_core_charges
+
+ private
+
+ def update_core_charges
+ line_items.collect{|item| item if item.variant.product.core_amount }.compact.each do |item|
+ adjustments << CoreCharge.create({
+ :label => I18n.t(:core_charge) + " [#{item.variant.sku || item.variant.name}]",
+ :source => item,
+ :order => self
+ }) unless adjustments.find(:first, :conditions => {:source_id => item.id})
+ end
+ end
+
+ end
+
+ end
+
+ config.autoload_paths += %W(#{config.root}/lib)
+ config.to_prepare &method(:activate).to_proc
+ end
+end
@@ -0,0 +1,17 @@
+namespace :spree do
+ namespace :extensions do
+ namespace :core_charges do
+ desc "Copies public assets of the Core Charges to the instance public/ directory."
+ task :update => :environment do
+ is_svn_git_or_dir = proc {|path| path =~ /\.svn/ || path =~ /\.git/ || File.directory?(path) }
+ Dir[CoreChargesExtension.root + "/public/**/*"].reject(&is_svn_git_or_dir).each do |file|
+ path = file.sub(CoreChargesExtension.root, '')
+ directory = File.dirname(path)
+ puts "Copying #{path}..."
+ mkdir_p RAILS_ROOT + directory
+ cp file, RAILS_ROOT + path
+ end
+ end
+ end
+ end
+end
@@ -0,0 +1,11 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+
+describe CoreCharge do
+ before(:each) do
+ @core_charge = CoreCharge.new
+ end
+
+ it "should be valid" do
+ @core_charge.should be_valid
+ end
+end
@@ -0,0 +1,6 @@
+--colour
+--format
+progress
+--loadby
+mtime
+--reverse
@@ -0,0 +1,37 @@
+unless defined? SPREE_ROOT
+ ENV["RAILS_ENV"] = "test"
+ case
+ when ENV["SPREE_ENV_FILE"]
+ require ENV["SPREE_ENV_FILE"]
+ when File.dirname(__FILE__) =~ %r{vendor/SPREE/vendor/extensions}
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../../")}/config/environment"
+ else
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../")}/config/environment"
+ end
+end
+require "#{SPREE_ROOT}/spec/spec_helper"
+
+if File.directory?(File.dirname(__FILE__) + "/scenarios")
+ Scenario.load_paths.unshift File.dirname(__FILE__) + "/scenarios"
+end
+if File.directory?(File.dirname(__FILE__) + "/matchers")
+ Dir[File.dirname(__FILE__) + "/matchers/*.rb"].each {|file| require file }
+end
+
+Spec::Runner.configure do |config|
+ # config.use_transactional_fixtures = true
+ # config.use_instantiated_fixtures = false
+ # config.fixture_path = RAILS_ROOT + '/spec/fixtures'
+
+ # You can declare fixtures for each behaviour like this:
+ # describe "...." do
+ # fixtures :table_a, :table_b
+ #
+ # Alternatively, if you prefer to declare them only once, you can
+ # do so here, like so ...
+ #
+ # config.global_fixtures = :table_a, :table_b
+ #
+ # If you declare global fixtures, be aware that they will be declared
+ # for all of your examples, even those that don't use them.
+end
@@ -0,0 +1,18 @@
+version = '0.0.1'
+
+Gem::Specification.new do |s|
+ s.platform = Gem::Platform::RUBY
+ s.name = 'spree_core_charges'
+ s.version = version
+ s.summary = 'Ability to have basic core charges added to orders'
+ s.required_ruby_version = '>= 1.8.7'
+
+ s.files = Dir['README.markdown', 'lib/*', 'app/**/*', 'config/*']
+ s.require_path = 'lib'
+ s.requirements << 'none'
+
+ s.has_rdoc = true
+
+ s.add_dependency('spree_core', '>= 0.30.1')
+
+end

0 comments on commit eea8924

Please sign in to comment.