Permalink
Browse files

initial commit

  • Loading branch information...
wlipa committed Jul 8, 2011
0 parents commit 6b35f01d066258f3ad5fdc94374ca49d440885af
@@ -0,0 +1,9 @@
+\#*
+*~
+.#*
+.DS_Store
+.idea
+.project
+tmp
+nbproject
+*.swp
23 LICENSE
@@ -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,13 @@
+SpreeFulfillment
+================
+
+Introduction goes here.
+
+
+Example
+=======
+
+Example goes here.
+
+
+Copyright (c) 2011 [name of extension creator], released under the New BSD License
@@ -0,0 +1,75 @@
+require 'rubygems'
+require 'rake'
+require 'rake/testtask'
+require 'rake/packagetask'
+require 'rake/gempackagetask'
+
+gemfile = File.expand_path('../spec/test_app/Gemfile', __FILE__)
+if File.exists?(gemfile) && (%w(spec cucumber).include?(ARGV.first.to_s) || ARGV.size == 0)
+ require 'bundler'
+ ENV['BUNDLE_GEMFILE'] = gemfile
+ Bundler.setup
+
+ require 'rspec'
+ require 'rspec/core/rake_task'
+ RSpec::Core::RakeTask.new
+
+ require 'cucumber/rake/task'
+ Cucumber::Rake::Task.new do |t|
+ t.cucumber_opts = %w{--format progress}
+ end
+end
+
+desc "Default Task"
+task :default => [:spec, :cucumber ]
+
+spec = eval(File.read('spree_fulfillment.gemspec'))
+
+Rake::GemPackageTask.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 "Default Task"
+task :default => [ :spec ]
+
+desc "Regenerates a rails 3 app for testing"
+task :test_app do
+ require '../spree/lib/generators/spree/test_app_generator'
+ class SpreeFulfillmentTestAppGenerator < Spree::Generators::TestAppGenerator
+
+ def install_gems
+ inside "test_app" do
+ run 'bundle exec rake spree_core:install'
+ run 'bundle exec rake spree_fulfillment:install'
+ end
+ end
+
+ def migrate_db
+ run_migrations
+ end
+
+ protected
+ def full_path_for_local_gems
+ <<-gems
+gem 'spree_core', :path => \'#{File.join(File.dirname(__FILE__), "../spree/", "core")}\'
+gem 'spree_fulfillment', :path => \'#{File.dirname(__FILE__)}\'
+ gems
+ end
+
+ end
+ SpreeFulfillmentTestAppGenerator.start
+end
+
+namespace :test_app do
+ desc 'Rebuild test and cucumber databases'
+ task :rebuild_dbs do
+ system("cd spec/test_app && bundle exec rake db:drop db:migrate RAILS_ENV=test && rake db:drop db:migrate RAILS_ENV=cucumber")
+ end
+end
@@ -0,0 +1,9 @@
+# This file is used to designate compatibilty with different versions of Spree
+# Please see http://spreecommerce.com/documentation/extensions.html#versionfile for details
+
+# Examples
+#
+# "0.50.x" => { :branch => "master" }
+# "0.40.x" => { :tag => "v1.0.0", :version => "1.0.0" }
+
+
@@ -0,0 +1,39 @@
+class Fulfillment < ActiveRecord::Base
+
+ belongs_to :order
+
+ scope :with_state, lambda {|s| where(:state => s)}
+ scope :completed, with_state('completed')
+ scope :pending, with_state('pending')
+ scope :failed, with_state('failed')
+
+
+ # fulfillment state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
+ state_machine :initial => 'checkout' do
+ event :started_processing do
+ transition :from => ['checkout', 'pending', 'completed'], :to => 'processing'
+ end
+ # When processing during checkout fails
+ event :fail do
+ transition :from => 'processing', :to => 'failed'
+ end
+ # With card payments this represents authorizing the payment
+ event :pend do
+ transition :from => 'processing', :to => 'pending'
+ end
+ # With card payments this represents completing a purchase or capture transaction
+ event :complete do
+ transition :from => ['processing', 'pending'], :to => 'completed'
+ end
+ end
+
+
+ def process!
+ if !processing? and source and source.respond_to?(:process!)
+ started_processing!
+ source.process!(self) # source is responsible for updating the payment state when it's done processing
+ end
+ end
+
+end
+
@@ -0,0 +1,3 @@
+Rails.application.routes.draw do
+ # Add your extension routes here
+end
@@ -0,0 +1,15 @@
+class CreateFulfillments < ActiveRecord::Migration
+ def self.up
+ create_table :fulfillments do |t|
+ t.references :order, :null => false
+ t.string :state
+ t.string :reference
+ t.timestamps
+ end
+ add_index :fulfillments, :order_id
+ end
+
+ def self.down
+ drop_table :fulfillments
+ end
+end
@@ -0,0 +1,31 @@
+require 'spree_core'
+require 'spree_fulfillment_hooks'
+
+
+module SpreeFulfillment
+ class Engine < Rails::Engine
+
+ config.autoload_paths += %W(#{config.root}/lib)
+
+ def self.activate
+ Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*_decorator*.rb")) do |c|
+ Rails.env.production? ? require(c) : load(c)
+ end
+
+ Order.class_eval do
+
+ alias_method :orig_process_payments!, :process_payments!
+ def process_payments!
+ orig_process_payments!
+ raise "fulfillment awaits you, lord!"
+ end
+
+ end
+
+ end
+
+ config.to_prepare &method(:activate).to_proc
+ end
+end
+
+
@@ -0,0 +1,3 @@
+class SpreeFulfillmentHooks < Spree::ThemeSupport::HookListener
+ # custom hooks go here
+end
@@ -0,0 +1,25 @@
+namespace :spree_fulfillment do
+ desc "Copies all migrations and assets (NOTE: This will be obsolete with Rails 3.1)"
+ task :install do
+ Rake::Task['spree_fulfillment:install:migrations'].invoke
+ Rake::Task['spree_fulfillment:install:assets'].invoke
+ end
+
+ namespace :install do
+ desc "Copies all migrations (NOTE: This will be obsolete with Rails 3.1)"
+ task :migrations do
+ source = File.join(File.dirname(__FILE__), '..', '..', 'db')
+ destination = File.join(Rails.root, 'db')
+ Spree::FileUtilz.mirror_files(source, destination)
+ end
+
+ desc "Copies all assets (NOTE: This will be obsolete with Rails 3.1)"
+ task :assets do
+ source = File.join(File.dirname(__FILE__), '..', '..', 'public')
+ destination = File.join(Rails.root, 'public')
+ puts "INFO: Mirroring assets from #{source} to #{destination}"
+ Spree::FileUtilz.mirror_files(source, destination)
+ end
+ end
+
+end
@@ -0,0 +1 @@
+# add custom rake tasks here
@@ -0,0 +1,30 @@
+# This file is copied to ~/spec when you run 'ruby script/generate rspec'
+# from the project root directory.
+ENV["RAILS_ENV"] ||= 'test'
+require File.expand_path("../test_app/config/environment", __FILE__)
+require 'rspec/rails'
+
+# Requires supporting files with custom matchers and macros, etc,
+# in ./support/ and its subdirectories.
+Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
+
+RSpec.configure do |config|
+ # == 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.fixture_path = "#{::Rails.root}/spec/fixtures"
+
+ #config.include Devise::TestHelpers, :type => :controller
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
+ # examples within a transaction, comment the following line or assign false
+ # instead of true.
+ config.use_transactional_fixtures = true
+end
+
+@configuration ||= AppConfiguration.find_or_create_by_name("Default configuration")
@@ -0,0 +1,19 @@
+Gem::Specification.new do |s|
+ s.platform = Gem::Platform::RUBY
+ s.name = 'spree_fulfillment'
+ s.version = '0.60.1'
+ s.summary = 'Spree extension to do fulfillment processing after checkout'
+ s.required_ruby_version = '>= 1.9.2'
+ s.required_rubygems_version = ">= 1.8.5"
+
+ s.author = 'Bill Lipa'
+ s.email = 'dojo@masterleep.com'
+ s.homepage = 'http://masterleep.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.add_dependency('spree', '>= 0.60.1')
+end

0 comments on commit 6b35f01

Please sign in to comment.