spree_channable 0.0.18.alpha
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/.rspec +3 -0
- data/.rubocop.yml +24 -0
- data/.travis.yml +35 -0
- data/Appraisals +27 -0
- data/Gemfile +17 -0
- data/LICENSE +29 -0
- data/README.md +56 -0
- data/Rakefile +21 -0
- data/app/assets/javascripts/spree/backend/spree_channable.js +2 -0
- data/app/assets/javascripts/spree/frontend/spree_channable.js +2 -0
- data/app/assets/stylesheets/spree/backend/spree_channable.css +4 -0
- data/app/assets/stylesheets/spree/frontend/spree_channable.css +4 -0
- data/app/controllers/spree/admin/channable_settings_controller.rb +14 -0
- data/app/controllers/spree/api/v1/channable_controller.rb +21 -0
- data/app/jobs/application_job.rb +7 -0
- data/app/jobs/spree_channable/order_import_job.rb +37 -0
- data/app/jobs/spree_channable/return_import_job.rb +36 -0
- data/app/models/channable_setting.rb +10 -0
- data/app/models/spree/order_decorator.rb +127 -0
- data/app/models/spree/product_decorator.rb +118 -0
- data/app/models/spree/reimbursement_decorator.rb +39 -0
- data/app/models/spree/shipment_decorator.rb +28 -0
- data/app/models/spree/shipment_handler_decorator.rb +11 -0
- data/app/models/spree/variant_decorator.rb +78 -0
- data/app/overrides/add_settings_to_admin_configurator.rb +32 -0
- data/app/overrides/order_index.rb +13 -0
- data/app/views/spree/admin/channable_settings/_form.html.erb +105 -0
- data/app/views/spree/admin/channable_settings/edit.html.erb +1 -0
- data/app/views/spree/admin/channable_settings/new.html.erb +1 -0
- data/app/views/spree/admin/orders/_index_channable_state_override.html.erb +7 -0
- data/app/views/spree/admin/orders/_index_channable_state_override_head.html.erb +1 -0
- data/bin/rails +8 -0
- data/config/locales/en.yml +5 -0
- data/config/routes.rb +18 -0
- data/db/migrate/20190710092345_create_channable_settings.rb +16 -0
- data/db/migrate/20190710103701_add_settings_to_settings_table.rb +9 -0
- data/db/migrate/20190710115409_add_order_columns.rb +9 -0
- data/db/migrate/20190711122425_set_order_connection_defaults.rb +5 -0
- data/db/migrate/20190711123402_add_channable_fields_to_shipping_methods.rb +8 -0
- data/db/migrate/20190711140015_add_payment_method_for_channable.rb +7 -0
- data/db/migrate/20190711145940_add_order_import_settings.rb +9 -0
- data/db/migrate/20190717120144_add_channable_id_to_return_authorisations.rb +5 -0
- data/gemfiles/spree_3_2.gemfile +10 -0
- data/gemfiles/spree_3_5.gemfile +10 -0
- data/gemfiles/spree_3_7.gemfile +10 -0
- data/gemfiles/spree_master.gemfile +10 -0
- data/lib/channable/client.rb +42 -0
- data/lib/channable/response.rb +15 -0
- data/lib/generators/spree_channable/install/install_generator.rb +20 -0
- data/lib/spree_channable/engine.rb +20 -0
- data/lib/spree_channable/factories.rb +6 -0
- data/lib/spree_channable/order_importer.rb +280 -0
- data/lib/spree_channable/return_importer.rb +63 -0
- data/lib/spree_channable/version.rb +18 -0
- data/lib/spree_channable.rb +36 -0
- data/spec/fixtures/invalid_channable_order.json +117 -0
- data/spec/fixtures/valid_channable_order.json +117 -0
- data/spree_channable.gemspec +50 -0
- metadata +451 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
module Spree
|
2
|
+
module SpreeChannable
|
3
|
+
module ReimbursementDecorator
|
4
|
+
def send_reimbursement_email
|
5
|
+
super unless order.is_channable_order?
|
6
|
+
end
|
7
|
+
|
8
|
+
def reimburse_channable_order
|
9
|
+
return unless order.is_channable_order?
|
10
|
+
|
11
|
+
client = ::Channable::Client.new
|
12
|
+
client.return_update(customer_return.channable_return_id, channable_return)
|
13
|
+
end
|
14
|
+
|
15
|
+
def channable_return
|
16
|
+
{
|
17
|
+
status: channable_return_status
|
18
|
+
}.to_json
|
19
|
+
end
|
20
|
+
|
21
|
+
def channable_return_status
|
22
|
+
case reimbursement_status
|
23
|
+
when 'reimbursed'
|
24
|
+
'accepted'
|
25
|
+
when 'errored'
|
26
|
+
'cancelled'
|
27
|
+
else
|
28
|
+
'accepted'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.prepended(base)
|
33
|
+
base.state_machine.after_transition to: :reimbursed, do: :reimburse_channable_order
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
Spree::Reimbursement.prepend(Spree::SpreeChannable::ReimbursementDecorator)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Spree
|
2
|
+
module SpreeChannable
|
3
|
+
module ShipmentDecorator
|
4
|
+
|
5
|
+
def self.prepended(base)
|
6
|
+
base.state_machine.after_transition to: :shipped, do: :send_shipment_update
|
7
|
+
end
|
8
|
+
|
9
|
+
def send_shipment_update
|
10
|
+
return unless order.is_channable_order?
|
11
|
+
|
12
|
+
client = ::Channable::Client.new
|
13
|
+
client.shipment_update(order.channable_order_id, channable_shipment)
|
14
|
+
end
|
15
|
+
|
16
|
+
def channable_shipment
|
17
|
+
{
|
18
|
+
tracking_code: tracking,
|
19
|
+
tracking_url: tracking_url,
|
20
|
+
transporter: shipping_method.channable_transporter_code
|
21
|
+
}.to_json
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
Spree::Shipment.prepend(Spree::SpreeChannable::ShipmentDecorator)
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Spree
|
2
|
+
module SpreeChannable
|
3
|
+
module VariantDecorator
|
4
|
+
|
5
|
+
def self.same_product_colors(variant)
|
6
|
+
joins(option_values: :translations).where(spree_option_value_translations: {presentation: variant.option_value('color')}, product_id: variant.product_id).includes(:default_price, option_values: :option_type)
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_channable_feed_entry
|
10
|
+
return nil if price.blank?
|
11
|
+
|
12
|
+
Nokogiri::XML::Builder.new do |xml|
|
13
|
+
xml.product {
|
14
|
+
xml.id id
|
15
|
+
xml.product_id product.id
|
16
|
+
xml.title "#{product.name}"
|
17
|
+
xml.description ActionController::Base.helpers.strip_tags(product.normalized_description)
|
18
|
+
xml.link URI.join(::SpreeChannable.configuration.host, "/#{::SpreeChannable.configuration.url_prefix}/" + product.slug).to_s
|
19
|
+
(xml.image_link URI.join(::SpreeChannable.configuration.image_host, get_images.first.attachment.url(:large)).to_s) unless get_images.empty?
|
20
|
+
xml.condition product.property('product_condition') || ::SpreeChannable.configuration.product_condition
|
21
|
+
|
22
|
+
xml.availability can_supply?
|
23
|
+
xml.stock total_on_hand
|
24
|
+
xml.price price
|
25
|
+
xml.sale_price respond_to?(:sale_price) ? (sale_price || price) : price
|
26
|
+
|
27
|
+
xml.gtin sku
|
28
|
+
xml.mpn sku
|
29
|
+
xml.sku sku
|
30
|
+
|
31
|
+
xml.brand product.property('brand') || ::SpreeChannable.configuration.brand
|
32
|
+
|
33
|
+
xml.categories do
|
34
|
+
product.taxons.each do |taxon|
|
35
|
+
xml.category taxon.self_and_ancestors.collect(&:name).join('|')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
xml.currency Spree::Config.currency
|
40
|
+
xml.locale I18n.default_locale
|
41
|
+
|
42
|
+
option_values.each do |option_value|
|
43
|
+
xml.send(option_value.option_type.name, option_value.presentation)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Property fields
|
47
|
+
|
48
|
+
xml.gender product.property('gender') || 'Not set'
|
49
|
+
xml.delivery_period product.property('delivery_period') || ::SpreeChannable.configuration.delivery_period
|
50
|
+
xml.material product.property('material') || 'Not set'
|
51
|
+
}
|
52
|
+
end.to_xml
|
53
|
+
end
|
54
|
+
|
55
|
+
def get_images
|
56
|
+
images = []
|
57
|
+
if ::SpreeChannable.configuration.use_variant_images
|
58
|
+
if self.class.respond_to?(:same_product_colors)
|
59
|
+
images = self.class.same_product_colors(self).flat_map(&:images)
|
60
|
+
else
|
61
|
+
self.images
|
62
|
+
end
|
63
|
+
else
|
64
|
+
self.product.images
|
65
|
+
end
|
66
|
+
|
67
|
+
if images.any?
|
68
|
+
images
|
69
|
+
else
|
70
|
+
self.product.images
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
Spree::Variant.prepend(Spree::SpreeChannable::VariantDecorator)
|
@@ -0,0 +1,32 @@
|
|
1
|
+
Deface::Override.new(
|
2
|
+
virtual_path: "spree/admin/shared/sub_menu/_configuration",
|
3
|
+
name: "add_channable_settings_configuration_menu",
|
4
|
+
insert_bottom: '[data-hook="admin_configurations_sidebar_menu"]',
|
5
|
+
text: '<%= configurations_sidebar_menu_item "Channable settings", spree.admin_channable_settings_path %>'
|
6
|
+
)
|
7
|
+
|
8
|
+
shipping_method_form = <<-ERB
|
9
|
+
|
10
|
+
<div data-hook="admin_shipping_method_form_channable_name" class="col-md-2">
|
11
|
+
<%= f.field_container :channable_channel_name, :class => ['form-group'] do %>
|
12
|
+
<%= f.label :channable_channel_name, Spree.t(:channable_channel_name) + '(s)' %>
|
13
|
+
<%= f.text_field :channable_channel_name, class: 'form-control', label: false %>
|
14
|
+
<%= f.error_message_on :channable_channel_name %>
|
15
|
+
<% end %>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<div data-hook="admin_shipping_method_form_channable_transporter_code" class="col-md-2">
|
19
|
+
<%= f.field_container :channable_transporter_code, :class => ['form-group'] do %>
|
20
|
+
<%= f.label :channable_transporter_code, Spree.t(:channable_transporter_code) %>
|
21
|
+
<%= f.text_field :channable_transporter_code, class: 'form-control', label: false %>
|
22
|
+
<%= f.error_message_on :channable_transporter_code %>
|
23
|
+
<% end %>
|
24
|
+
</div>
|
25
|
+
ERB
|
26
|
+
|
27
|
+
Deface::Override.new(
|
28
|
+
virtual_path: "spree/admin/shipping_methods/_form",
|
29
|
+
name: "add_channable_settings_to_shipping_methods",
|
30
|
+
insert_after: '[data-hook="admin_shipping_method_form_tracking_url_field"]',
|
31
|
+
text: shipping_method_form
|
32
|
+
)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Deface::Override.new(
|
2
|
+
virtual_path: 'spree/admin/orders/index',
|
3
|
+
name: 'add tradebyte order info header',
|
4
|
+
insert_after: '#listing_orders thead th:nth-last-child(3)',
|
5
|
+
partial: 'spree/admin/orders/index_channable_state_override_head'
|
6
|
+
)
|
7
|
+
|
8
|
+
Deface::Override.new(
|
9
|
+
virtual_path: 'spree/admin/orders/index',
|
10
|
+
name: 'add tradebyte order info',
|
11
|
+
insert_after: '#listing_orders tbody td:nth-last-child(3)',
|
12
|
+
partial: 'spree/admin/orders/index_channable_state_override'
|
13
|
+
)
|
@@ -0,0 +1,105 @@
|
|
1
|
+
<%= form_for [:admin, resource] do |f| %>
|
2
|
+
<div data-hook="">
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-md-12">
|
5
|
+
<h2>Feed settings</h2>
|
6
|
+
</div>
|
7
|
+
<div class="col-md-6">
|
8
|
+
<div class="form-group">
|
9
|
+
<%= f.label :host %>
|
10
|
+
<%= f.text_field :host, class: 'form-control' %>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
<div class="col-md-6">
|
14
|
+
<div class="form-group">
|
15
|
+
<%= f.label :url_prefix, 'Product url prefix (eg. /products)' %>
|
16
|
+
<%= f.text_field :url_prefix, class: 'form-control' %>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
<div class="col-md-6">
|
20
|
+
<div class="form-group">
|
21
|
+
<%= f.label :image_host %>
|
22
|
+
<%= f.text_field :image_host, class: 'form-control' %>
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
<div class="col-md-6">
|
26
|
+
<div class="form-group">
|
27
|
+
<%= f.label :product_condition %>
|
28
|
+
<%= f.select :product_condition, options_for_select(ChannableSetting::PRODUCT_CONDITIONS), {}, class: 'form-control' %>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
<div class="col-md-6">
|
32
|
+
<div class="form-group">
|
33
|
+
<%= f.label :brand %>
|
34
|
+
<%= f.text_field :brand, class: 'form-control' %>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
<div class="col-md-6">
|
38
|
+
<div class="form-group">
|
39
|
+
<%= f.label :delivery_period %>
|
40
|
+
<%= f.text_field :delivery_period, class: 'form-control' %>
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
|
44
|
+
<div class="col-md-12">
|
45
|
+
<div class="form-check">
|
46
|
+
<%= f.check_box :use_variant_images, class: 'form-check-input' %>
|
47
|
+
<%= f.label :use_variant_images, 'Use images on the variant instead of all image', class: 'form-check-label' %>
|
48
|
+
</div>
|
49
|
+
</div>
|
50
|
+
</div>
|
51
|
+
|
52
|
+
<div class="row">
|
53
|
+
<div class="col-md-12">
|
54
|
+
<h2>Order settings</h2>
|
55
|
+
</div>
|
56
|
+
<div class="col-md-12">
|
57
|
+
<div class="form-group">
|
58
|
+
<%= f.label :channable_api_key %>
|
59
|
+
<%= f.text_field :channable_api_key, class: 'form-control' %>
|
60
|
+
</div>
|
61
|
+
</div>
|
62
|
+
<div class="col-md-6">
|
63
|
+
<div class="form-group">
|
64
|
+
<%= f.label :company_id %>
|
65
|
+
<%= f.text_field :company_id, class: 'form-control' %>
|
66
|
+
</div>
|
67
|
+
</div>
|
68
|
+
<div class="col-md-6">
|
69
|
+
<div class="form-group">
|
70
|
+
<%= f.label :project_id %>
|
71
|
+
<%= f.text_field :project_id, class: 'form-control' %>
|
72
|
+
</div>
|
73
|
+
</div>
|
74
|
+
<div class="col-md-6">
|
75
|
+
<div class="form-group">
|
76
|
+
<%= f.label :spree_stock_location_id, 'Stock location' %>
|
77
|
+
<%= f.select :spree_stock_location_id, options_from_collection_for_select(Spree::StockLocation.all, :id, :name, f.object.spree_stock_location_id), {}, class: 'form-control' %>
|
78
|
+
</div>
|
79
|
+
</div>
|
80
|
+
<div class="col-md-6">
|
81
|
+
<div class="form-group">
|
82
|
+
<%= f.label :spree_payment_method_id, 'Payment method' %>
|
83
|
+
<%= f.select :spree_payment_method_id, options_from_collection_for_select(Spree::PaymentMethod.all, :id, :name, f.object.spree_payment_method_id), {}, class: 'form-control' %>
|
84
|
+
</div>
|
85
|
+
</div>
|
86
|
+
|
87
|
+
<div class="col-md-6">
|
88
|
+
<div class="form-group">
|
89
|
+
<%= f.label :polling_interval, 'How often do we need to retrieve orders (minutes)' %>
|
90
|
+
<%= f.number_field :polling_interval, class: 'form-control' %>
|
91
|
+
</div>
|
92
|
+
</div>
|
93
|
+
|
94
|
+
<div class="col-md-12">
|
95
|
+
<div class="form-check">
|
96
|
+
<%= f.check_box :active, class: 'form-check-input' %>
|
97
|
+
<%= f.label :active, 'Connection active?', class: 'form-check-label' %>
|
98
|
+
</div>
|
99
|
+
</div>
|
100
|
+
</div>
|
101
|
+
|
102
|
+
</div>
|
103
|
+
|
104
|
+
<%= render "spree/admin/shared/#{resource.new_record? ? 'new' : 'edit'}_resource_links" %>
|
105
|
+
<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render 'form', resource: @channable_setting %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render 'form', resource: @channable_setting %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<th><%= sort_link @search, :is_channable_order?, 'Type' %></th>
|
data/bin/rails
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" from the root of your extension
|
3
|
+
|
4
|
+
ENGINE_ROOT = File.expand_path('../..', __FILE__)
|
5
|
+
ENGINE_PATH = File.expand_path('../../lib/spree_channable/engine', __FILE__)
|
6
|
+
|
7
|
+
require 'rails/all'
|
8
|
+
require 'rails/engine/commands'
|
data/config/routes.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Spree::Core::Engine.add_routes do
|
2
|
+
|
3
|
+
namespace :admin do
|
4
|
+
resources :channable_settings
|
5
|
+
end
|
6
|
+
|
7
|
+
namespace :api do
|
8
|
+
namespace :v1 do
|
9
|
+
resources :channable, only: [] do
|
10
|
+
collection do
|
11
|
+
get :product_feed
|
12
|
+
get :variant_feed
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class CreateChannableSettings < ActiveRecord::Migration[5.0]
|
2
|
+
def change
|
3
|
+
create_table :channable_settings do |t|
|
4
|
+
|
5
|
+
t.string :host
|
6
|
+
t.string :url_prefix
|
7
|
+
t.string :image_host
|
8
|
+
t.string :product_condition
|
9
|
+
t.string :brand
|
10
|
+
t.string :delivery_period
|
11
|
+
t.boolean :use_variant_images
|
12
|
+
|
13
|
+
t.timestamps
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# This file was generated by Appraisal
|
2
|
+
|
3
|
+
source 'https://rubygems.org'
|
4
|
+
|
5
|
+
gem 'rails-controller-testing'
|
6
|
+
gem 'spree_core', github: 'spree/spree', branch: 'master'
|
7
|
+
gem 'spree_backend', github: 'spree/spree', branch: 'master'
|
8
|
+
gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'master'
|
9
|
+
|
10
|
+
gemspec path: '../'
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
|
3
|
+
module Channable
|
4
|
+
class Client
|
5
|
+
include ::HTTParty
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
self.class.base_uri "https://api.channable.com/v1/companies/#{SpreeChannable.configuration.company_id}/projects/#{SpreeChannable.configuration.project_id}"
|
9
|
+
self.class.headers 'Authorization' => "Bearer #{SpreeChannable.configuration.channable_api_key}"
|
10
|
+
self.class.headers 'Content-Type' => 'application/json'
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_orders(start_date: 1.day.ago, offset: 0, limit: 100)
|
14
|
+
Channable::Response.new(self.class.get('/orders', query: {
|
15
|
+
limit: limit,
|
16
|
+
start_date: start_date.strftime('%Y-%m-%d'),
|
17
|
+
offset: offset
|
18
|
+
}))
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_returns(start_date: 1.day.ago, offset: 0, limit: 100)
|
22
|
+
Channable::Response.new(self.class.get('/returns', query: {
|
23
|
+
limit: limit,
|
24
|
+
start_date: start_date,
|
25
|
+
offset: offset
|
26
|
+
}))
|
27
|
+
end
|
28
|
+
|
29
|
+
def return_update(return_id, return_body)
|
30
|
+
Channable::Response.new(self.class.post("/returns/#{return_id}/status", body: return_body))
|
31
|
+
end
|
32
|
+
|
33
|
+
def shipment_update(order_id, shipment_body)
|
34
|
+
Channable::Response.new(self.class.post("/orders/#{order_id}/shipment", body: shipment_body))
|
35
|
+
end
|
36
|
+
|
37
|
+
def cancellation_update(order_id)
|
38
|
+
Channable::Response.new(self.class.post("/orders/#{order_id}/cancel"))
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Channable
|
2
|
+
class Response
|
3
|
+
|
4
|
+
attr_reader :data
|
5
|
+
attr_reader :success
|
6
|
+
attr_reader :response
|
7
|
+
|
8
|
+
def initialize(response_data)
|
9
|
+
@response = response_data
|
10
|
+
@success = response_data.success?
|
11
|
+
@data = JSON.parse(response_data.body, object_class: OpenStruct)
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module SpreeChannable
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
class_option :auto_run_migrations, type: :boolean, default: false
|
5
|
+
|
6
|
+
def add_migrations
|
7
|
+
run 'bundle exec rake railties:install:migrations FROM=spree_channable'
|
8
|
+
end
|
9
|
+
|
10
|
+
def run_migrations
|
11
|
+
run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]'))
|
12
|
+
if run_migrations
|
13
|
+
run 'bundle exec rake db:migrate'
|
14
|
+
else
|
15
|
+
puts 'Skipping rake db:migrate, don\'t forget to run it!'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module SpreeChannable
|
2
|
+
class Engine < Rails::Engine
|
3
|
+
require 'spree/core'
|
4
|
+
isolate_namespace Spree
|
5
|
+
engine_name 'spree_channable'
|
6
|
+
|
7
|
+
# use rspec for tests
|
8
|
+
config.generators do |g|
|
9
|
+
g.test_framework :rspec
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.activate
|
13
|
+
Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
|
14
|
+
Rails.configuration.cache_classes ? require(c) : load(c)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
config.to_prepare(&method(:activate).to_proc)
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
FactoryBot.define do
|
2
|
+
# Define your Spree extensions Factories within this file to enable applications, and other extensions to use and override them.
|
3
|
+
#
|
4
|
+
# Example adding this to your spec_helper will load these Factories for use:
|
5
|
+
# require 'spree_channable/factories'
|
6
|
+
end
|