{"action":"created","comment":{"url":"https://api.github.com/repos/spree/spree/pulls/comments/35181349","id":35181349,"diff_hunk":"@@ -1,338 +1,338 @@\n module Spree\n   class Order < Spree::Base\n     module Checkout\n-      extend ActiveSupport::Concern\n-\n-      included do\n-        class_attribute :next_event_transitions\n-        class_attribute :previous_states\n-        class_attribute :checkout_flow\n-        class_attribute :checkout_steps\n-        class_attribute :removed_transitions\n-\n-        self.checkout_steps ||= {}\n-        self.next_event_transitions ||= []\n-        self.previous_states ||= [:cart]\n-        self.removed_transitions ||= []\n-\n-        def self.checkout_flow(&block)\n-          if block_given?\n-            @checkout_flow = block\n-            define_state_machine!\n-          else\n-            @checkout_flow\n+      def self.included(klass)\n+        klass.class_eval do\n+          class_attribute :next_event_transitions\n+          class_attribute :previous_states\n+          class_attribute :checkout_flow\n+          class_attribute :checkout_steps\n+          class_attribute :removed_transitions\n+\n+          self.checkout_steps ||= {}\n+          self.next_event_transitions ||= []\n+          self.previous_states ||= [:cart]\n+          self.removed_transitions ||= []\n+\n+          def self.checkout_flow(&block)\n+            if block_given?\n+              @checkout_flow = block\n+              define_state_machine!\n+            else\n+              @checkout_flow\n+            end\n           end\n-        end\n-\n-        def self.define_state_machine!\n-          self.checkout_steps = {}\n-          self.next_event_transitions = []\n-          self.previous_states = [:cart]\n-          self.removed_transitions = []\n \n-          # Build the checkout flow using the checkout_flow defined either\n-          # within the Order class, or a decorator for that class.\n-          #\n-          # This method may be called multiple times depending on if the\n-          # checkout_flow is re-defined in a decorator or not.\n-          instance_eval(&checkout_flow)\n-\n-          klass = self\n-\n-          # To avoid a ton of warnings when the state machine is re-defined\n-          StateMachines::Machine.ignore_method_conflicts = true\n-          # To avoid multiple occurrences of the same transition being defined\n-          # On first definition, state_machines will not be defined\n-          state_machines.clear if respond_to?(:state_machines)\n-          state_machine :state, initial: :cart, use_transactions: false, action: :save_state do\n-            klass.next_event_transitions.each { |t| transition(t.merge(on: :next)) }\n-\n-            # Persist the state on the order\n-            after_transition do |order, transition|\n-              order.state = order.state\n-              order.state_changes.create(\n-                previous_state: transition.from,\n-                next_state:     transition.to,\n-                name:           'order',\n-                user_id:        order.user_id\n-              )\n-              order.save\n-            end\n+          def self.define_state_machine!\n+            self.checkout_steps = {}\n+            self.next_event_transitions = []\n+            self.previous_states = [:cart]\n+            self.removed_transitions = []\n+\n+            # Build the checkout flow using the checkout_flow defined either\n+            # within the Order class, or a decorator for that class.\n+            #\n+            # This method may be called multiple times depending on if the\n+            # checkout_flow is re-defined in a decorator or not.\n+            instance_eval(&checkout_flow)\n+\n+            klass = self\n+\n+            # To avoid a ton of warnings when the state machine is re-defined\n+            StateMachines::Machine.ignore_method_conflicts = true\n+            # To avoid multiple occurrences of the same transition being defined\n+            # On first definition, state_machines will not be defined\n+            state_machines.clear if respond_to?(:state_machines)\n+            state_machine :state, initial: :cart, use_transactions: false, action: :save_state do\n+              klass.next_event_transitions.each { |t| transition(t.merge(on: :next)) }\n+\n+              # Persist the state on the order\n+              after_transition do |order, transition|\n+                order.state = order.state\n+                order.state_changes.create(\n+                  previous_state: transition.from,\n+                  next_state:     transition.to,\n+                  name:           'order',\n+                  user_id:        order.user_id\n+                )\n+                order.save\n+              end\n \n-            event :cancel do\n-              transition to: :canceled, if: :allow_cancel?\n-            end\n+              event :cancel do\n+                transition to: :canceled, if: :allow_cancel?\n+              end\n \n-            event :return do\n-              transition to: :returned,\n-                         from: [:complete, :awaiting_return, :canceled],\n-                         if: :all_inventory_units_returned?\n-            end\n+              event :return do\n+                transition to: :returned,\n+                           from: [:complete, :awaiting_return, :canceled],\n+                           if: :all_inventory_units_returned?\n+              end\n \n-            event :resume do\n-              transition to: :resumed, from: :canceled, if: :canceled?\n-            end\n+              event :resume do\n+                transition to: :resumed, from: :canceled, if: :canceled?\n+              end\n \n-            event :authorize_return do\n-              transition to: :awaiting_return\n-            end\n+              event :authorize_return do\n+                transition to: :awaiting_return\n+              end\n \n-            if states[:payment]\n-              before_transition to: :complete do |order|\n-                if order.payment_required? && order.payments.valid.empty?\n-                  order.errors.add(:base, Spree.t(:no_payment_found))\n-                  false\n-                elsif order.payment_required?\n-                  order.process_payments!\n+              if states[:payment]\n+                before_transition to: :complete do |order|\n+                  if order.payment_required? && order.payments.valid.empty?\n+                    order.errors.add(:base, Spree.t(:no_payment_found))\n+                    false\n+                  elsif order.payment_required?\n+                    order.process_payments!\n+                  end\n                 end\n+                after_transition to: :complete, do: :persist_user_credit_card\n+                before_transition to: :payment, do: :set_shipments_cost\n+                before_transition to: :payment, do: :create_tax_charge!\n+                before_transition to: :payment, do: :assign_default_credit_card\n               end\n-              after_transition to: :complete, do: :persist_user_credit_card\n-              before_transition to: :payment, do: :set_shipments_cost\n-              before_transition to: :payment, do: :create_tax_charge!\n-              before_transition to: :payment, do: :assign_default_credit_card\n-            end\n \n-            before_transition from: :cart, do: :ensure_line_items_present\n+              before_transition from: :cart, do: :ensure_line_items_present\n \n-            if states[:address]\n-              before_transition from: :address, do: :create_tax_charge!\n-              before_transition to: :address, do: :assign_default_addresses!\n-              before_transition from: :address, do: :persist_user_address!\n-            end\n+              if states[:address]\n+                before_transition from: :address, do: :create_tax_charge!\n+                before_transition to: :address, do: :assign_default_addresses!\n+                before_transition from: :address, do: :persist_user_address!\n+              end\n \n-            if states[:delivery]\n-              before_transition to: :delivery, do: :create_proposed_shipments\n-              before_transition to: :delivery, do: :ensure_available_shipping_rates\n-              before_transition to: :delivery, do: :set_shipments_cost\n-              before_transition from: :delivery, do: :apply_free_shipping_promotions\n-            end\n+              if states[:delivery]\n+                before_transition to: :delivery, do: :create_proposed_shipments\n+                before_transition to: :delivery, do: :ensure_available_shipping_rates\n+                before_transition to: :delivery, do: :set_shipments_cost\n+                before_transition from: :delivery, do: :apply_free_shipping_promotions\n+              end\n \n-            before_transition to: :resumed, do: :ensure_line_item_variants_are_not_deleted\n-            before_transition to: :resumed, do: :ensure_line_items_are_in_stock\n+              before_transition to: :resumed, do: :ensure_line_item_variants_are_not_deleted\n+              before_transition to: :resumed, do: :ensure_line_items_are_in_stock\n \n-            before_transition to: :complete, do: :ensure_line_item_variants_are_not_deleted\n-            before_transition to: :complete, do: :ensure_line_items_are_in_stock\n+              before_transition to: :complete, do: :ensure_line_item_variants_are_not_deleted\n+              before_transition to: :complete, do: :ensure_line_items_are_in_stock\n \n-            after_transition to: :complete, do: :finalize!\n-            after_transition to: :resumed,  do: :after_resume\n-            after_transition to: :canceled, do: :after_cancel\n+              after_transition to: :complete, do: :finalize!\n+              after_transition to: :resumed,  do: :after_resume\n+              after_transition to: :canceled, do: :after_cancel\n \n-            after_transition from: any - :cart, to: any - [:confirm, :complete] do |order|\n-              order.update_totals\n-              order.persist_totals\n+              after_transition from: any - :cart, to: any - [:confirm, :complete] do |order|\n+                order.update_totals\n+                order.persist_totals\n+              end\n             end\n-          end\n-\n-          alias_method :save_state, :save\n-        end\n \n-        def self.go_to_state(name, options = {})\n-          self.checkout_steps[name] = options\n-          previous_states.each do |state|\n-            add_transition({ from: state, to: name }.merge(options))\n+            alias_method :save_state, :save\n           end\n-          if options[:if]\n-            previous_states << name\n-          else\n-            self.previous_states = [name]\n-          end\n-        end\n \n-        def self.insert_checkout_step(name, options = {})\n-          before = options.delete(:before)\n-          after = options.delete(:after) unless before\n-          after = self.checkout_steps.keys.last unless before || after\n-\n-          cloned_steps = self.checkout_steps.clone\n-          cloned_removed_transitions = self.removed_transitions.clone\n-          checkout_flow do\n-            cloned_steps.each_pair do |key, value|\n-              go_to_state(name, options) if key == before\n-              go_to_state(key, value)\n-              go_to_state(name, options) if key == after\n+          def self.go_to_state(name, options = {})\n+            self.checkout_steps[name] = options\n+            previous_states.each do |state|\n+              add_transition({ from: state, to: name }.merge(options))\n             end\n-            cloned_removed_transitions.each do |transition|\n-              remove_transition(transition)\n+            if options[:if]\n+              previous_states << name\n+            else\n+              self.previous_states = [name]\n             end\n           end\n-        end\n \n-        def self.remove_checkout_step(name)\n-          cloned_steps = self.checkout_steps.clone\n-          cloned_removed_transitions = self.removed_transitions.clone\n-          checkout_flow do\n-            cloned_steps.each_pair do |key, value|\n-              go_to_state(key, value) unless key == name\n+          def self.insert_checkout_step(name, options = {})\n+            before = options.delete(:before)\n+            after = options.delete(:after) unless before\n+            after = self.checkout_steps.keys.last unless before || after\n+\n+            cloned_steps = self.checkout_steps.clone\n+            cloned_removed_transitions = self.removed_transitions.clone\n+            checkout_flow do\n+              cloned_steps.each_pair do |key, value|\n+                go_to_state(name, options) if key == before\n+                go_to_state(key, value)\n+                go_to_state(name, options) if key == after\n+              end\n+              cloned_removed_transitions.each do |transition|\n+                remove_transition(transition)\n+              end\n             end\n-            cloned_removed_transitions.each do |transition|\n-              remove_transition(transition)\n+          end\n+\n+          def self.remove_checkout_step(name)\n+            cloned_steps = self.checkout_steps.clone\n+            cloned_removed_transitions = self.removed_transitions.clone\n+            checkout_flow do\n+              cloned_steps.each_pair do |key, value|\n+                go_to_state(key, value) unless key == name\n+              end\n+              cloned_removed_transitions.each do |transition|\n+                remove_transition(transition)\n+              end\n             end\n           end\n-        end\n \n-        def self.remove_transition(options = {})\n-          self.removed_transitions << options\n-          self.next_event_transitions.delete(find_transition(options))\n-        end\n+          def self.remove_transition(options = {})\n+            self.removed_transitions << options\n+            self.next_event_transitions.delete(find_transition(options))\n+          end\n \n-        def self.find_transition(options = {})\n-          return nil if options.nil? || !options.include?(:from) || !options.include?(:to)\n-          self.next_event_transitions.detect do |transition|\n-            transition[options[:from].to_sym] == options[:to].to_sym\n+          def self.find_transition(options = {})\n+            return nil if options.nil? || !options.include?(:from) || !options.include?(:to)\n+            self.next_event_transitions.detect do |transition|\n+              transition[options[:from].to_sym] == options[:to].to_sym\n+            end\n           end\n-        end\n \n-        def self.checkout_step_names\n-          self.checkout_steps.keys\n-        end\n+          def self.checkout_step_names\n+            self.checkout_steps.keys\n+          end\n \n-        def self.add_transition(options)\n-          self.next_event_transitions << { options.delete(:from) => options.delete(:to) }.merge(options)\n-        end\n+          def self.add_transition(options)\n+            self.next_event_transitions << { options.delete(:from) => options.delete(:to) }.merge(options)\n+          end\n \n-        def checkout_steps\n-          steps = (self.class.checkout_steps.each_with_object([]) do |(step, options), checkout_steps|\n-            next if options.include?(:if) && !options[:if].call(self)\n-            checkout_steps << step\n-          end).map(&:to_s)\n-          # Ensure there is always a complete step\n-          steps << \"complete\" unless steps.include?(\"complete\")\n-          steps\n-        end\n+          def checkout_steps\n+            steps = (self.class.checkout_steps.each_with_object([]) do |(step, options), checkout_steps|\n+              next if options.include?(:if) && !options[:if].call(self)\n+              checkout_steps << step\n+            end).map(&:to_s)\n+            # Ensure there is always a complete step\n+            steps << \"complete\" unless steps.include?(\"complete\")\n+            steps\n+          end\n \n-        def has_checkout_step?(step)\n-          step.present? && self.checkout_steps.include?(step)\n-        end\n+          def has_checkout_step?(step)\n+            step.present? && self.checkout_steps.include?(step)\n+          end\n \n-        def passed_checkout_step?(step)\n-          has_checkout_step?(step) && checkout_step_index(step) < checkout_step_index(state)\n-        end\n+          def passed_checkout_step?(step)\n+            has_checkout_step?(step) && checkout_step_index(step) < checkout_step_index(state)\n+          end\n \n-        def checkout_step_index(step)\n-          self.checkout_steps.index(step).to_i\n-        end\n+          def checkout_step_index(step)\n+            self.checkout_steps.index(step).to_i\n+          end\n \n-        def can_go_to_state?(state)\n-          return false unless has_checkout_step?(self.state) && has_checkout_step?(state)\n-          checkout_step_index(state) > checkout_step_index(self.state)\n-        end\n+          def can_go_to_state?(state)\n+            return false unless has_checkout_step?(self.state) && has_checkout_step?(state)\n+            checkout_step_index(state) > checkout_step_index(self.state)\n+          end\n \n-        define_callbacks :updating_from_params, terminator: ->(_target, result) { result == false }\n+          define_callbacks :updating_from_params, terminator: ->(_target, result) { result == false }\n \n-        set_callback :updating_from_params, :before, :update_params_payment_source\n+          set_callback :updating_from_params, :before, :update_params_payment_source\n \n-        def update_from_params(params, permitted_params, request_env = {})\n-          success = false\n-          @updating_params = params\n-          run_callbacks :updating_from_params do\n-            # Set existing card after setting permitted parameters because\n-            # rails would slice parameters containg ruby objects, apparently\n-            existing_card_id = @updating_params[:order] ? @updating_params[:order].delete(:existing_card) : nil\n+          def update_from_params(params, permitted_params, request_env = {})\n+            success = false\n+            @updating_params = params\n+            run_callbacks :updating_from_params do\n+              # Set existing card after setting permitted parameters because\n+              # rails would slice parameters containg ruby objects, apparently\n+              existing_card_id = @updating_params[:order] ? @updating_params[:order].delete(:existing_card) : nil\n \n-            attributes = @updating_params[:order] ? @updating_params[:order].permit(permitted_params).delete_if { |_k, v| v.nil? } : {}\n+              attributes = @updating_params[:order] ? @updating_params[:order].permit(permitted_params).delete_if { |_k, v| v.nil? } : {}\n \n-            if existing_card_id.present?\n-              credit_card = CreditCard.find existing_card_id\n-              if credit_card.user_id != user_id || credit_card.user_id.blank?\n-                raise Core::GatewayError.new Spree.t(:invalid_credit_card)\n-              end\n+              if existing_card_id.present?\n+                credit_card = CreditCard.find existing_card_id\n+                if credit_card.user_id != user_id || credit_card.user_id.blank?\n+                  raise Core::GatewayError.new Spree.t(:invalid_credit_card)\n+                end\n \n-              credit_card.verification_value = params[:cvc_confirm] if params[:cvc_confirm].present?\n+                credit_card.verification_value = params[:cvc_confirm] if params[:cvc_confirm].present?\n \n-              attributes[:payments_attributes].first[:source] = credit_card\n-              attributes[:payments_attributes].first[:payment_method_id] = credit_card.payment_method_id\n-              attributes[:payments_attributes].first.delete :source_attributes\n-            end\n+                attributes[:payments_attributes].first[:source] = credit_card\n+                attributes[:payments_attributes].first[:payment_method_id] = credit_card.payment_method_id\n+                attributes[:payments_attributes].first.delete :source_attributes\n+              end\n+\n+              if attributes[:payments_attributes]\n+                attributes[:payments_attributes].first[:request_env] = request_env\n+              end\n \n-            if attributes[:payments_attributes]\n-              attributes[:payments_attributes].first[:request_env] = request_env\n+              success = update_attributes(attributes)\n+              set_shipments_cost if shipments.any?\n             end\n \n-            success = update_attributes(attributes)\n-            set_shipments_cost if shipments.any?\n+            @updating_params = nil\n+            success\n           end\n \n-          @updating_params = nil\n-          success\n-        end\n+          def assign_default_addresses!\n+            if user\n+              clone_billing\n+              # Skip setting ship address if order doesn't have a delivery checkout step\n+              # to avoid triggering validations on shipping address\n+              clone_shipping if checkout_steps.include?(\"delivery\")\n+            end\n+          end\n \n-        def assign_default_addresses!\n-          if user\n-            clone_billing\n-            # Skip setting ship address if order doesn't have a delivery checkout step\n-            # to avoid triggering validations on shipping address\n-            clone_shipping if checkout_steps.include?(\"delivery\")\n+          def clone_billing\n+            if !bill_address_id && user.bill_address.try(:valid?)\n+              self.bill_address = user.bill_address.try(:clone)\n+            end\n           end\n-        end\n \n-        def clone_billing\n-          if !bill_address_id && user.bill_address.try(:valid?)\n-            self.bill_address = user.bill_address.try(:clone)\n+          def clone_shipping\n+            if !ship_address_id && user.ship_address.try(:valid?)\n+              self.ship_address = user.ship_address.try(:clone)\n+            end\n           end\n-        end\n \n-        def clone_shipping\n-          if !ship_address_id && user.ship_address.try(:valid?)\n-            self.ship_address = user.ship_address.try(:clone)\n+          def persist_user_address!\n+            if !temporary_address && user && user.respond_to?(:persist_order_address) && bill_address_id\n+              user.persist_order_address(self)\n+            end\n           end\n-        end\n \n-        def persist_user_address!\n-          if !temporary_address && user && user.respond_to?(:persist_order_address) && bill_address_id\n-            user.persist_order_address(self)\n+          def persist_user_credit_card\n+            if !temporary_credit_card && user_id && valid_credit_cards.present?\n+              default_cc = valid_credit_cards.first\n+              default_cc.user_id = user_id\n+              default_cc.default = true\n+              default_cc.save\n+            end\n           end\n-        end\n \n-        def persist_user_credit_card\n-          if !temporary_credit_card && user_id && valid_credit_cards.present?\n-            default_cc = valid_credit_cards.first\n-            default_cc.user_id = user_id\n-            default_cc.default = true\n-            default_cc.save\n+          def assign_default_credit_card\n+            if payments.from_credit_card.count == 0 && user_has_valid_default_card? && payment_required?\n+              cc = user.default_credit_card\n+              payments.create!(payment_method_id: cc.payment_method_id, source: cc, amount: total)\n+            end\n           end\n-        end\n \n-        def assign_default_credit_card\n-          if payments.from_credit_card.count == 0 && user_has_valid_default_card? && payment_required?\n-            cc = user.default_credit_card\n-            payments.create!(payment_method_id: cc.payment_method_id, source: cc, amount: total)\n+          def user_has_valid_default_card?\n+            user && user.default_credit_card.try(:valid?)\n           end\n-        end\n \n-        def user_has_valid_default_card?\n-          user && user.default_credit_card.try(:valid?)\n-        end\n+          private\n \n-        private\n-\n-        # For payment step, filter order parameters to produce the expected nested\n-        # attributes for a single payment and its source, discarding attributes\n-        # for payment methods other than the one selected\n-        #\n-        # In case a existing credit card is provided it needs to build the payment\n-        # attributes from scratch so we can set the amount. example payload:\n-        #\n-        #   {\n-        #     \"order\": {\n-        #       \"existing_card\": \"2\"\n-        #     }\n-        #   }\n-        #\n-        def update_params_payment_source\n-          if @updating_params[:payment_source].present?\n-            source_params = @updating_params.\n-                            delete(:payment_source)[@updating_params[:order][:payments_attributes].\n-                                                    first[:payment_method_id].to_s]\n-\n-            if source_params\n-              @updating_params[:order][:payments_attributes].first[:source_attributes] = source_params\n+          # For payment step, filter order parameters to produce the expected nested\n+          # attributes for a single payment and its source, discarding attributes\n+          # for payment methods other than the one selected\n+          #\n+          # In case a existing credit card is provided it needs to build the payment\n+          # attributes from scratch so we can set the amount. example payload:\n+          #\n+          #   {\n+          #     \"order\": {\n+          #       \"existing_card\": \"2\"\n+          #     }\n+          #   }\n+          #\n+          def update_params_payment_source\n+            if @updating_params[:payment_source].present?\n+              source_params = @updating_params.\n+                              delete(:payment_source)[@updating_params[:order][:payments_attributes].\n+                                                      first[:payment_method_id].to_s]\n+\n+              if source_params\n+                @updating_params[:order][:payments_attributes].first[:source_attributes] = source_params","path":"core/app/models/spree/order/checkout.rb","position":589,"original_position":589,"commit_id":"cff2e04962edb5ce1195c2129fd097977daa30e1","original_commit_id":"cff2e04962edb5ce1195c2129fd097977daa30e1","user":{"login":"houndci","id":6697940,"avatar_url":"https://avatars.githubusercontent.com/u/6697940?v=3","gravatar_id":"","url":"https://api.github.com/users/houndci","html_url":"https://github.com/houndci","followers_url":"https://api.github.com/users/houndci/followers","following_url":"https://api.github.com/users/houndci/following{/other_user}","gists_url":"https://api.github.com/users/houndci/gists{/gist_id}","starred_url":"https://api.github.com/users/houndci/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/houndci/subscriptions","organizations_url":"https://api.github.com/users/houndci/orgs","repos_url":"https://api.github.com/users/houndci/repos","events_url":"https://api.github.com/users/houndci/events{/privacy}","received_events_url":"https://api.github.com/users/houndci/received_events","type":"User","site_admin":false},"body":"Line is too long. [104/100]","created_at":"2015-07-22T04:53:37Z","updated_at":"2015-07-22T04:53:37Z","html_url":"https://github.com/spree/spree/pull/6614#discussion_r35181349","pull_request_url":"https://api.github.com/repos/spree/spree/pulls/6614","_links":{"self":{"href":"https://api.github.com/repos/spree/spree/pulls/comments/35181349"},"html":{"href":"https://github.com/spree/spree/pull/6614#discussion_r35181349"},"pull_request":{"href":"https://api.github.com/repos/spree/spree/pulls/6614"}}},"pull_request":{"url":"https://api.github.com/repos/spree/spree/pulls/6614","id":40530179,"html_url":"https://github.com/spree/spree/pull/6614","diff_url":"https://github.com/spree/spree/pull/6614.diff","patch_url":"https://github.com/spree/spree/pull/6614.patch","issue_url":"https://api.github.com/repos/spree/spree/issues/6614","number":6614,"state":"open","locked":false,"title":"Fix order include duplication","user":{"login":"BenMorganIO","id":3117356,"avatar_url":"https://avatars.githubusercontent.com/u/3117356?v=3","gravatar_id":"","url":"https://api.github.com/users/BenMorganIO","html_url":"https://github.com/BenMorganIO","followers_url":"https://api.github.com/users/BenMorganIO/followers","following_url":"https://api.github.com/users/BenMorganIO/following{/other_user}","gists_url":"https://api.github.com/users/BenMorganIO/gists{/gist_id}","starred_url":"https://api.github.com/users/BenMorganIO/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BenMorganIO/subscriptions","organizations_url":"https://api.github.com/users/BenMorganIO/orgs","repos_url":"https://api.github.com/users/BenMorganIO/repos","events_url":"https://api.github.com/users/BenMorganIO/events{/privacy}","received_events_url":"https://api.github.com/users/BenMorganIO/received_events","type":"User","site_admin":false},"body":"After updating my Gemfile with the following settings:\r\n\r\n```ruby\r\ngithub 'spree', branch: '3-0-stable' do\r\n  gem 'spree_backend'\r\n  gem 'spree_sample'\r\nend\r\n```\r\n\r\nThe generate Gemfile.lock references were:\r\n\r\n```yaml\r\nGIT\r\n  remote: git://github.com/spree/spree.git\r\n  revision: 222ae3a9dfa98356d052ff0472a4663d9c5c3f79\r\n  branch: 3-0-stable\r\n  specs:\r\n    spree_api (3.0.3.beta)\r\n      rabl (~> 0.9.4.pre1)\r\n      spree_core (= 3.0.3.beta)\r\n      versioncake (~> 2.3.1)\r\n    spree_backend (3.0.3.beta)\r\n      bootstrap-sass (~> 3.3.1)\r\n      jquery-rails (~> 4.0.3)\r\n      jquery-ui-rails (~> 5.0.0)\r\n      select2-rails (= 3.5.9.1)\r\n      spree_api (= 3.0.3.beta)\r\n      spree_core (= 3.0.3.beta)\r\n      sprockets-rails (~> 2.2)\r\n    spree_core (3.0.3.beta)\r\n      activemerchant (~> 1.47.0)\r\n      acts_as_list (~> 0.6)\r\n      awesome_nested_set (~> 3.0.1)\r\n      cancancan (~> 1.10.1)\r\n      carmen (~> 1.0.0)\r\n      deface (~> 1.0.0)\r\n      ffaker (~> 1.16)\r\n      font-awesome-rails (~> 4.0)\r\n      friendly_id (~> 5.1.0)\r\n      highline (~> 1.6.18)\r\n      httparty (~> 0.11)\r\n      json (~> 1.7)\r\n      kaminari (~> 0.15, >= 0.15.1)\r\n      monetize (~> 1.1)\r\n      paperclip (~> 4.2.0)\r\n      paranoia (~> 2.1.0)\r\n      premailer-rails\r\n      rails (~> 4.2.2)\r\n      ransack (~> 1.4.1)\r\n      responders\r\n      state_machines-activerecord (~> 0.2)\r\n      stringex\r\n      truncate_html (= 0.9.2)\r\n      twitter_cldr (~> 3.0)\r\n    spree_sample (3.0.3.beta)\r\n      spree_core (= 3.0.3.beta)\r\n```\r\nI then booted my rails application with `foreman start`.\r\n\r\n```yaml\r\n# Procfile\r\nweb: spring rails server\r\ncache: redis-server config/redis.conf\r\nworker: bundle exec sidekiq -C config/sidekiq.yml\r\nsearch: elasticsearch --config=/usr/local/opt/elasticsearch/config/elasticsearch.yml\r\n```\r\n\r\nThe output and the reason for this bug fix is presented here:\r\n\r\n```log\r\n$ fs\r\n21:28:36 web.1    | started with pid 84344\r\n21:28:36 cache.1  | started with pid 84346\r\n21:28:36 worker.1 | started with pid 84348\r\n21:28:36 search.1 | started with pid 84349\r\n21:28:37 search.1 | [2015-07-21 21:28:37,556][INFO ][node                     ] [Sphinx] version[1.5.2], pid[84349], build[62ff986/2015-04-27T09:21:06Z]\r\n21:28:37 search.1 | [2015-07-21 21:28:37,556][INFO ][node                     ] [Sphinx] initializing ...\r\n21:28:37 search.1 | [2015-07-21 21:28:37,562][INFO ][plugins                  ] [Sphinx] loaded [], sites []\r\n21:28:41 search.1 | [2015-07-21 21:28:41,175][INFO ][node                     ] [Sphinx] initialized\r\n21:28:41 search.1 | [2015-07-21 21:28:41,177][INFO ][node                     ] [Sphinx] starting ...\r\n21:28:41 search.1 | [2015-07-21 21:28:41,393][INFO ][transport                ] [Sphinx] bound_address {inet[/127.0.0.1:9300]}, publish_address {inet[/127.0.0.1:9300]}\r\n21:28:41 search.1 | [2015-07-21 21:28:41,428][INFO ][discovery                ] [Sphinx] elasticsearch_brew/DJXdDnCKTVezO1D1ql4tjg\r\n21:28:45 search.1 | [2015-07-21 21:28:45,212][INFO ][cluster.service          ] [Sphinx] new_master [Sphinx][DJXdDnCKTVezO1D1ql4tjg][BENJAMINs-MacBook-Pro.local][inet[/127.0.0.1:9300]], reason: zen-disco-join (elected_as_master)\r\n21:28:45 search.1 | [2015-07-21 21:28:45,233][INFO ][http                     ] [Sphinx] bound_address {inet[/127.0.0.1:9200]}, publish_address {inet[/127.0.0.1:9200]}\r\n21:28:45 search.1 | [2015-07-21 21:28:45,233][INFO ][node                     ] [Sphinx] started\r\n21:28:46 search.1 | [2015-07-21 21:28:46,014][INFO ][gateway                  ] [Sphinx] recovered [1] indices into cluster_state\r\n21:28:47 web.1    | => Booting Puma\r\n21:28:47 web.1    | => Rails 4.2.3 application starting in development on http://0.0.0.0:3000\r\n21:28:47 web.1    | => Run `rails server -h` for more startup options\r\n21:28:47 web.1    | => Ctrl-C to shutdown server\r\n21:28:51 web.1    | Puma 2.11.2 starting...\r\n21:28:51 web.1    | * Min threads: 0, max threads: 16\r\n21:28:51 web.1    | * Environment: development\r\n21:28:51 web.1    | * Listening on tcp://0.0.0.0:3000\r\n21:28:51 worker.1 | Cannot define multiple 'included' blocks for a Concern\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.3/lib/active_support/concern.rb:126:in `included'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/bundler/gems/spree-222ae3a9dfa9/core/app/models/spree/order/checkout.rb:6:in `<module:Checkout>'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/bundler/gems/spree-222ae3a9dfa9/core/app/models/spree/order/checkout.rb:3:in `<class:Order>'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/bundler/gems/spree-222ae3a9dfa9/core/app/models/spree/order/checkout.rb:2:in `<module:Spree>'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/bundler/gems/spree-222ae3a9dfa9/core/app/models/spree/order/checkout.rb:1:in `<top (required)>'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:457:in `load'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:457:in `block in load_file'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:647:in `new_constants_in'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:456:in `load_file'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:354:in `require_or_load'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:317:in `depend_on'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:233:in `require_dependency'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/railties-4.2.3/lib/rails/engine.rb:472:in `block (2 levels) in eager_load!'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/railties-4.2.3/lib/rails/engine.rb:471:in `each'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/railties-4.2.3/lib/rails/engine.rb:471:in `block in eager_load!'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/railties-4.2.3/lib/rails/engine.rb:469:in `each'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/railties-4.2.3/lib/rails/engine.rb:469:in `eager_load!'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/railties-4.2.3/lib/rails/engine.rb:346:in `eager_load!'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/railties-4.2.3/lib/rails/application/finisher.rb:56:in `each'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/railties-4.2.3/lib/rails/application/finisher.rb:56:in `block in <module:Finisher>'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/railties-4.2.3/lib/rails/initializable.rb:30:in `instance_exec'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/railties-4.2.3/lib/rails/initializable.rb:30:in `run'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/railties-4.2.3/lib/rails/initializable.rb:55:in `block in run_initializers'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/tsort.rb:226:in `block in tsort_each'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/tsort.rb:348:in `block (2 levels) in each_strongly_connected_component'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/tsort.rb:429:in `each_strongly_connected_component_from'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/tsort.rb:347:in `block in each_strongly_connected_component'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/tsort.rb:345:in `each'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/tsort.rb:345:in `call'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/tsort.rb:345:in `each_strongly_connected_component'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/tsort.rb:224:in `tsort_each'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/tsort.rb:203:in `tsort_each'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/railties-4.2.3/lib/rails/initializable.rb:54:in `run_initializers'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/railties-4.2.3/lib/rails/application.rb:352:in `initialize!'\r\n21:28:51 worker.1 | /Users/BenAMorgan/Sites/private/WholeNewHome/config/environment.rb:5:in `<top (required)>'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/skylight-0.6.0/lib/skylight/probes.rb:81:in `require'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/skylight-0.6.0/lib/skylight/probes.rb:81:in `require'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/polyglot-0.3.5/lib/polyglot.rb:65:in `require'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:274:in `block in require'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:240:in `load_dependency'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:274:in `require'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/sidekiq-3.3.4/lib/sidekiq/cli.rb:241:in `boot_system'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/sidekiq-3.3.4/lib/sidekiq/cli.rb:50:in `run'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/gems/sidekiq-3.3.4/bin/sidekiq:8:in `<top (required)>'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/bin/sidekiq:23:in `load'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/bin/sidekiq:23:in `<main>'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/bin/ruby_executable_hooks:15:in `eval'\r\n21:28:51 worker.1 | /Users/BenAMorgan/.rvm/gems/ruby-2.2.2/bin/ruby_executable_hooks:15:in `<main>'\r\n21:28:51 worker.1 | exited with code 1\r\n21:28:51 system   | sending SIGTERM to all processes\r\n21:28:51 web.1    | Exiting\r\n21:28:51 search.1 | [2015-07-21 21:28:51,765][INFO ][node                     ] [Sphinx] stopping ...\r\n21:28:51 search.1 | [2015-07-21 21:28:51,815][INFO ][node                     ] [Sphinx] stopped\r\n21:28:51 search.1 | [2015-07-21 21:28:51,815][INFO ][node                     ] [Sphinx] closing ...\r\n21:28:51 search.1 | [2015-07-21 21:28:51,821][INFO ][node                     ] [Sphinx] closed\r\n21:28:51 cache.1  | exited with code 0\r\n21:28:51 search.1 | exited with code 143\r\n21:28:52 web.1    | terminated by SIGTERM\r\n```\r\n\r\nOn investigation, I discovered that @darbs has updated the `Spree::Order::Checkout` module as an `ActiveSupport::Concern` in 11cd50c0f5936af23130b0394c0cd7964e48fdb3. As lovely as this is, this generated a regression inside of Spree. It caused the `Cannot define multiple 'included' blocks for a Concern` error; no class given by Rails, may be nice to give them a PR on this issue with a better error message.\r\n\r\nI'm not too sure why this has occurred. My initial thought was that it was because `ActiveRecord::Base` was using  the `#included` method. After looking inside of [`ActiveRecord::Base`](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb) I wasn't able to see any instances where it was used, even in its dependencies.\r\n\r\nMaybe we can change the modules out into concerns when Spree hits 4.0.\r\n\r\nAnywho, my first attempt was to remove the `Spree::Base` in be1bc24, that way `ActiveSupport::Concern` doesn't think its working with a table. (It was an idea.) The error that I got from that was:\r\n\r\n```\r\nsuperclass mismatch for class Order\r\n```\r\n\r\nThe I realized: Just revert to the legacy since extending from `ActiveSupport::Concern` has generated a regression. After cff2e04 the rails application that I was didn't crash on server boot.","created_at":"2015-07-22T04:53:30Z","updated_at":"2015-07-22T04:53:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e52f0afee4ee0ff40c450a6adaee9ffe18146e22","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/spree/spree/pulls/6614/commits","review_comments_url":"https://api.github.com/repos/spree/spree/pulls/6614/comments","review_comment_url":"https://api.github.com/repos/spree/spree/pulls/comments{/number}","comments_url":"https://api.github.com/repos/spree/spree/issues/6614/comments","statuses_url":"https://api.github.com/repos/spree/spree/statuses/cff2e04962edb5ce1195c2129fd097977daa30e1","head":{"label":"BenMorganIO:fix-order-include-duplication","ref":"fix-order-include-duplication","sha":"cff2e04962edb5ce1195c2129fd097977daa30e1","user":{"login":"BenMorganIO","id":3117356,"avatar_url":"https://avatars.githubusercontent.com/u/3117356?v=3","gravatar_id":"","url":"https://api.github.com/users/BenMorganIO","html_url":"https://github.com/BenMorganIO","followers_url":"https://api.github.com/users/BenMorganIO/followers","following_url":"https://api.github.com/users/BenMorganIO/following{/other_user}","gists_url":"https://api.github.com/users/BenMorganIO/gists{/gist_id}","starred_url":"https://api.github.com/users/BenMorganIO/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BenMorganIO/subscriptions","organizations_url":"https://api.github.com/users/BenMorganIO/orgs","repos_url":"https://api.github.com/users/BenMorganIO/repos","events_url":"https://api.github.com/users/BenMorganIO/events{/privacy}","received_events_url":"https://api.github.com/users/BenMorganIO/received_events","type":"User","site_admin":false},"repo":{"id":21265635,"name":"spree","full_name":"BenMorganIO/spree","owner":{"login":"BenMorganIO","id":3117356,"avatar_url":"https://avatars.githubusercontent.com/u/3117356?v=3","gravatar_id":"","url":"https://api.github.com/users/BenMorganIO","html_url":"https://github.com/BenMorganIO","followers_url":"https://api.github.com/users/BenMorganIO/followers","following_url":"https://api.github.com/users/BenMorganIO/following{/other_user}","gists_url":"https://api.github.com/users/BenMorganIO/gists{/gist_id}","starred_url":"https://api.github.com/users/BenMorganIO/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BenMorganIO/subscriptions","organizations_url":"https://api.github.com/users/BenMorganIO/orgs","repos_url":"https://api.github.com/users/BenMorganIO/repos","events_url":"https://api.github.com/users/BenMorganIO/events{/privacy}","received_events_url":"https://api.github.com/users/BenMorganIO/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/BenMorganIO/spree","description":"Spree is a complete open source e-commerce solution for Ruby on Rails.","fork":true,"url":"https://api.github.com/repos/BenMorganIO/spree","forks_url":"https://api.github.com/repos/BenMorganIO/spree/forks","keys_url":"https://api.github.com/repos/BenMorganIO/spree/keys{/key_id}","collaborators_url":"https://api.github.com/repos/BenMorganIO/spree/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/BenMorganIO/spree/teams","hooks_url":"https://api.github.com/repos/BenMorganIO/spree/hooks","issue_events_url":"https://api.github.com/repos/BenMorganIO/spree/issues/events{/number}","events_url":"https://api.github.com/repos/BenMorganIO/spree/events","assignees_url":"https://api.github.com/repos/BenMorganIO/spree/assignees{/user}","branches_url":"https://api.github.com/repos/BenMorganIO/spree/branches{/branch}","tags_url":"https://api.github.com/repos/BenMorganIO/spree/tags","blobs_url":"https://api.github.com/repos/BenMorganIO/spree/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/BenMorganIO/spree/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/BenMorganIO/spree/git/refs{/sha}","trees_url":"https://api.github.com/repos/BenMorganIO/spree/git/trees{/sha}","statuses_url":"https://api.github.com/repos/BenMorganIO/spree/statuses/{sha}","languages_url":"https://api.github.com/repos/BenMorganIO/spree/languages","stargazers_url":"https://api.github.com/repos/BenMorganIO/spree/stargazers","contributors_url":"https://api.github.com/repos/BenMorganIO/spree/contributors","subscribers_url":"https://api.github.com/repos/BenMorganIO/spree/subscribers","subscription_url":"https://api.github.com/repos/BenMorganIO/spree/subscription","commits_url":"https://api.github.com/repos/BenMorganIO/spree/commits{/sha}","git_commits_url":"https://api.github.com/repos/BenMorganIO/spree/git/commits{/sha}","comments_url":"https://api.github.com/repos/BenMorganIO/spree/comments{/number}","issue_comment_url":"https://api.github.com/repos/BenMorganIO/spree/issues/comments{/number}","contents_url":"https://api.github.com/repos/BenMorganIO/spree/contents/{+path}","compare_url":"https://api.github.com/repos/BenMorganIO/spree/compare/{base}...{head}","merges_url":"https://api.github.com/repos/BenMorganIO/spree/merges","archive_url":"https://api.github.com/repos/BenMorganIO/spree/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/BenMorganIO/spree/downloads","issues_url":"https://api.github.com/repos/BenMorganIO/spree/issues{/number}","pulls_url":"https://api.github.com/repos/BenMorganIO/spree/pulls{/number}","milestones_url":"https://api.github.com/repos/BenMorganIO/spree/milestones{/number}","notifications_url":"https://api.github.com/repos/BenMorganIO/spree/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/BenMorganIO/spree/labels{/name}","releases_url":"https://api.github.com/repos/BenMorganIO/spree/releases{/id}","created_at":"2014-06-27T05:59:41Z","updated_at":"2015-05-01T06:07:20Z","pushed_at":"2015-07-22T04:24:22Z","git_url":"git://github.com/BenMorganIO/spree.git","ssh_url":"git@github.com:BenMorganIO/spree.git","clone_url":"https://github.com/BenMorganIO/spree.git","svn_url":"https://github.com/BenMorganIO/spree","homepage":"http://spreecommerce.com","size":72825,"stargazers_count":0,"watchers_count":0,"language":"Ruby","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"spree:3-0-stable","ref":"3-0-stable","sha":"222ae3a9dfa98356d052ff0472a4663d9c5c3f79","user":{"login":"spree","id":56702,"avatar_url":"https://avatars.githubusercontent.com/u/56702?v=3","gravatar_id":"","url":"https://api.github.com/users/spree","html_url":"https://github.com/spree","followers_url":"https://api.github.com/users/spree/followers","following_url":"https://api.github.com/users/spree/following{/other_user}","gists_url":"https://api.github.com/users/spree/gists{/gist_id}","starred_url":"https://api.github.com/users/spree/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spree/subscriptions","organizations_url":"https://api.github.com/users/spree/orgs","repos_url":"https://api.github.com/users/spree/repos","events_url":"https://api.github.com/users/spree/events{/privacy}","received_events_url":"https://api.github.com/users/spree/received_events","type":"Organization","site_admin":false},"repo":{"id":3314,"name":"spree","full_name":"spree/spree","owner":{"login":"spree","id":56702,"avatar_url":"https://avatars.githubusercontent.com/u/56702?v=3","gravatar_id":"","url":"https://api.github.com/users/spree","html_url":"https://github.com/spree","followers_url":"https://api.github.com/users/spree/followers","following_url":"https://api.github.com/users/spree/following{/other_user}","gists_url":"https://api.github.com/users/spree/gists{/gist_id}","starred_url":"https://api.github.com/users/spree/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spree/subscriptions","organizations_url":"https://api.github.com/users/spree/orgs","repos_url":"https://api.github.com/users/spree/repos","events_url":"https://api.github.com/users/spree/events{/privacy}","received_events_url":"https://api.github.com/users/spree/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/spree/spree","description":"Spree is a complete open source e-commerce solution for Ruby on Rails.","fork":false,"url":"https://api.github.com/repos/spree/spree","forks_url":"https://api.github.com/repos/spree/spree/forks","keys_url":"https://api.github.com/repos/spree/spree/keys{/key_id}","collaborators_url":"https://api.github.com/repos/spree/spree/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/spree/spree/teams","hooks_url":"https://api.github.com/repos/spree/spree/hooks","issue_events_url":"https://api.github.com/repos/spree/spree/issues/events{/number}","events_url":"https://api.github.com/repos/spree/spree/events","assignees_url":"https://api.github.com/repos/spree/spree/assignees{/user}","branches_url":"https://api.github.com/repos/spree/spree/branches{/branch}","tags_url":"https://api.github.com/repos/spree/spree/tags","blobs_url":"https://api.github.com/repos/spree/spree/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/spree/spree/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/spree/spree/git/refs{/sha}","trees_url":"https://api.github.com/repos/spree/spree/git/trees{/sha}","statuses_url":"https://api.github.com/repos/spree/spree/statuses/{sha}","languages_url":"https://api.github.com/repos/spree/spree/languages","stargazers_url":"https://api.github.com/repos/spree/spree/stargazers","contributors_url":"https://api.github.com/repos/spree/spree/contributors","subscribers_url":"https://api.github.com/repos/spree/spree/subscribers","subscription_url":"https://api.github.com/repos/spree/spree/subscription","commits_url":"https://api.github.com/repos/spree/spree/commits{/sha}","git_commits_url":"https://api.github.com/repos/spree/spree/git/commits{/sha}","comments_url":"https://api.github.com/repos/spree/spree/comments{/number}","issue_comment_url":"https://api.github.com/repos/spree/spree/issues/comments{/number}","contents_url":"https://api.github.com/repos/spree/spree/contents/{+path}","compare_url":"https://api.github.com/repos/spree/spree/compare/{base}...{head}","merges_url":"https://api.github.com/repos/spree/spree/merges","archive_url":"https://api.github.com/repos/spree/spree/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/spree/spree/downloads","issues_url":"https://api.github.com/repos/spree/spree/issues{/number}","pulls_url":"https://api.github.com/repos/spree/spree/pulls{/number}","milestones_url":"https://api.github.com/repos/spree/spree/milestones{/number}","notifications_url":"https://api.github.com/repos/spree/spree/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/spree/spree/labels{/name}","releases_url":"https://api.github.com/repos/spree/spree/releases{/id}","created_at":"2008-03-10T14:45:35Z","updated_at":"2015-07-22T03:46:01Z","pushed_at":"2015-07-22T04:53:31Z","git_url":"git://github.com/spree/spree.git","ssh_url":"git@github.com:spree/spree.git","clone_url":"https://github.com/spree/spree.git","svn_url":"https://github.com/spree/spree","homepage":"http://spreecommerce.com","size":137121,"stargazers_count":6546,"watchers_count":6546,"language":"Ruby","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3082,"mirror_url":null,"open_issues_count":166,"forks":3082,"open_issues":166,"watchers":6546,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/spree/spree/pulls/6614"},"html":{"href":"https://github.com/spree/spree/pull/6614"},"issue":{"href":"https://api.github.com/repos/spree/spree/issues/6614"},"comments":{"href":"https://api.github.com/repos/spree/spree/issues/6614/comments"},"review_comments":{"href":"https://api.github.com/repos/spree/spree/pulls/6614/comments"},"review_comment":{"href":"https://api.github.com/repos/spree/spree/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/spree/spree/pulls/6614/commits"},"statuses":{"href":"https://api.github.com/repos/spree/spree/statuses/cff2e04962edb5ce1195c2129fd097977daa30e1"}}}}