spree_core 4.0.9 → 4.1.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/spree.js +0 -1
- data/app/finders/spree/products/find.rb +19 -6
- data/app/finders/spree/variants/option_types_finder.rb +21 -0
- data/app/finders/spree/variants/visible_finder.rb +22 -0
- data/app/helpers/spree/base_helper.rb +48 -18
- data/app/helpers/spree/products_helper.rb +76 -8
- data/app/models/concerns/spree/user_methods.rb +2 -2
- data/app/models/spree/app_dependencies.rb +1 -7
- data/app/models/spree/credit_card.rb +4 -5
- data/app/models/spree/image/configuration/active_storage.rb +9 -1
- data/app/models/spree/image.rb +52 -3
- data/app/models/spree/line_item.rb +1 -2
- data/app/models/spree/option_type.rb +4 -0
- data/app/models/spree/order/address_book.rb +20 -7
- data/app/models/spree/order/store_credit.rb +0 -8
- data/app/models/spree/order.rb +12 -12
- data/app/models/spree/payment_method.rb +8 -0
- data/app/models/spree/preferences/preferable.rb +1 -1
- data/app/models/spree/product.rb +7 -6
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +1 -1
- data/app/models/spree/promotion_handler/coupon.rb +2 -1
- data/app/models/spree/return_item/eligibility_validator/base_validator.rb +1 -1
- data/app/models/spree/store.rb +2 -1
- data/app/models/spree/taxon.rb +2 -6
- data/app/models/spree/variant.rb +2 -14
- data/app/models/spree/zone.rb +6 -3
- data/app/presenters/spree/product_summary_presenter.rb +26 -0
- data/app/presenters/spree/variant_presenter.rb +69 -0
- data/app/presenters/spree/variants/option_types_presenter.rb +74 -0
- data/app/presenters/spree/variants/options_presenter.rb +49 -0
- data/app/services/spree/checkout/get_shipping_rates.rb +10 -7
- data/app/services/spree/checkout/update.rb +2 -13
- data/config/locales/en.yml +156 -14
- data/db/default/spree/stores.rb +8 -3
- data/db/migrate/20140309033438_create_store_from_preferences.rb +8 -4
- data/db/migrate/20191005121504_add_store_id_to_payment_methods.rb +7 -0
- data/db/migrate/20191016134113_add_deafult_value_for_store_default_currency.rb +5 -0
- data/db/migrate/20200102141311_add_social_to_spree_stores.rb +7 -0
- data/lib/generators/spree/dummy/dummy_generator.rb +3 -1
- data/lib/generators/spree/dummy/templates/initializers/bullet.rb +5 -0
- data/lib/generators/spree/install/install_generator.rb +13 -5
- data/lib/generators/spree/install/templates/config/initializers/spree.rb +0 -1
- data/lib/generators/spree/install/templates/config/initializers/spree_storefront.rb +1 -0
- data/lib/generators/spree/install/templates/config/spree_storefront.yml +67 -0
- data/lib/spree/core/controller_helpers/order.rb +12 -6
- data/lib/spree/core/controller_helpers/store.rb +2 -2
- data/lib/spree/core/search/base.rb +59 -22
- data/lib/spree/core/version.rb +1 -3
- data/lib/spree/core.rb +0 -1
- data/lib/spree/money.rb +8 -1
- data/lib/spree/permitted_attributes.rb +3 -2
- data/lib/spree/testing_support/capybara_ext.rb +0 -52
- data/lib/spree/testing_support/common_rake.rb +1 -1
- data/lib/spree/testing_support/factories/store_factory.rb +3 -0
- data/lib/spree/testing_support/order_walkthrough.rb +7 -3
- data/spree_core.gemspec +9 -15
- metadata +49 -35
- data/app/finders/spree/addresses/find.rb +0 -17
- data/app/models/spree/order_contents.rb +0 -31
- data/app/services/spree/account/addresses/base.rb +0 -39
- data/app/services/spree/account/addresses/create.rb +0 -18
- data/app/services/spree/account/addresses/update.rb +0 -18
- data/lib/spree/database_type_utilities.rb +0 -12
@@ -0,0 +1,67 @@
|
|
1
|
+
default:
|
2
|
+
navigation:
|
3
|
+
- title: Women
|
4
|
+
subtitle: Categories
|
5
|
+
url: /t/women
|
6
|
+
items:
|
7
|
+
- :title: Skirts
|
8
|
+
:url: /t/women/skirts
|
9
|
+
- :title: Dresses
|
10
|
+
:url: /t/women/dresses
|
11
|
+
- :title: Shirts and Blouses
|
12
|
+
:url: /t/women/shirts-and-blouses
|
13
|
+
- :title: Sweaters
|
14
|
+
:url: /t/women/sweaters
|
15
|
+
- :title: Tops and T-shirts
|
16
|
+
:url: /t/women/tops-and-t-shirts
|
17
|
+
- :title: Jackets and Coats
|
18
|
+
:url: /t/women/jackets-and-coats
|
19
|
+
promo_banners:
|
20
|
+
- subtitle: New collection
|
21
|
+
title: Summer 2019
|
22
|
+
url: /t/summer-collection
|
23
|
+
image: 'meganav/promo_banner_left-first-category.jpg'
|
24
|
+
- subtitle: Special Offers
|
25
|
+
title: Get up to 30% off
|
26
|
+
url: /t/special-offers
|
27
|
+
image: 'meganav/promo_banner_right-first-category.jpg'
|
28
|
+
- title: Men
|
29
|
+
subtitle: Categories
|
30
|
+
url: /t/men
|
31
|
+
items:
|
32
|
+
- :title: Shirts
|
33
|
+
:url: /t/men/shirts
|
34
|
+
- :title: T-shirts
|
35
|
+
:url: /t/men/t-shirts
|
36
|
+
- :title: Sweaters
|
37
|
+
:url: /t/men/sweaters
|
38
|
+
- :title: Jackets and Coats
|
39
|
+
:url: /t/men/jackets-and-coats
|
40
|
+
promo_banners:
|
41
|
+
- subtitle: New collection
|
42
|
+
title: Summer 2019
|
43
|
+
url: /t/summer-collection
|
44
|
+
image: 'meganav/promo_banner_left-second-category.jpg'
|
45
|
+
- subtitle: Special Offers
|
46
|
+
title: Get up to 30% off
|
47
|
+
url: /t/special-offers
|
48
|
+
image: 'meganav/promo_banner_right-second-category.jpg'
|
49
|
+
- title: Sportswear
|
50
|
+
subtitle: Categories
|
51
|
+
url: /t/sportswear
|
52
|
+
items:
|
53
|
+
- :title: Tops
|
54
|
+
:url: /t/sportswear/tops
|
55
|
+
- :title: Sweatshirts
|
56
|
+
:url: /t/sportswear/sweatshirts
|
57
|
+
- :title: Pants
|
58
|
+
:url: /t/sportswear/pants
|
59
|
+
promo_banners:
|
60
|
+
- subtitle: New collection
|
61
|
+
title: Summer 2019
|
62
|
+
url: /t/summer-collection
|
63
|
+
image: 'meganav/promo_banner_left-third-category.jpg'
|
64
|
+
- subtitle: Special Offers
|
65
|
+
title: Get up to 30% off
|
66
|
+
url: /t/special-offers
|
67
|
+
image: 'meganav/promo_banner_right-third-category.jpg'
|
@@ -5,8 +5,6 @@ module Spree
|
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
7
|
included do
|
8
|
-
before_action :set_current_order
|
9
|
-
|
10
8
|
helper_method :current_order
|
11
9
|
helper_method :simple_current_order
|
12
10
|
end
|
@@ -28,6 +26,7 @@ module Spree
|
|
28
26
|
# The current incomplete order from the token for use in cart and during checkout
|
29
27
|
def current_order(options = {})
|
30
28
|
options[:create_order_if_necessary] ||= false
|
29
|
+
options[:includes] ||= true
|
31
30
|
|
32
31
|
if @current_order
|
33
32
|
@current_order.last_ip_address = ip_address
|
@@ -66,8 +65,8 @@ module Spree
|
|
66
65
|
|
67
66
|
private
|
68
67
|
|
69
|
-
def last_incomplete_order
|
70
|
-
@last_incomplete_order ||= try_spree_current_user.last_incomplete_spree_order(current_store)
|
68
|
+
def last_incomplete_order(includes = {})
|
69
|
+
@last_incomplete_order ||= try_spree_current_user.last_incomplete_spree_order(current_store, includes: includes)
|
71
70
|
end
|
72
71
|
|
73
72
|
def current_order_params
|
@@ -77,8 +76,15 @@ module Spree
|
|
77
76
|
def find_order_by_token_or_user(options = {}, with_adjustments = false)
|
78
77
|
options[:lock] ||= false
|
79
78
|
|
79
|
+
includes = if options[:includes]
|
80
|
+
{ line_items: [variant: [:images, :option_values, :product]] }
|
81
|
+
else
|
82
|
+
{}
|
83
|
+
end
|
84
|
+
|
80
85
|
# Find any incomplete orders for the token
|
81
|
-
incomplete_orders = Spree::Order.incomplete.includes(
|
86
|
+
incomplete_orders = Spree::Order.incomplete.includes(includes)
|
87
|
+
|
82
88
|
token_order_params = current_order_params.except(:user_id)
|
83
89
|
order = if with_adjustments
|
84
90
|
incomplete_orders.includes(:adjustments).lock(options[:lock]).find_by(token_order_params)
|
@@ -87,7 +93,7 @@ module Spree
|
|
87
93
|
end
|
88
94
|
|
89
95
|
# Find any incomplete orders for the current user
|
90
|
-
order = last_incomplete_order if order.nil? && try_spree_current_user
|
96
|
+
order = last_incomplete_order(includes) if order.nil? && try_spree_current_user
|
91
97
|
|
92
98
|
order
|
93
99
|
end
|
@@ -11,7 +11,7 @@ module Spree
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def current_currency
|
14
|
-
|
14
|
+
current_store.default_currency
|
15
15
|
end
|
16
16
|
|
17
17
|
def current_store
|
@@ -43,7 +43,7 @@ module Spree
|
|
43
43
|
private
|
44
44
|
|
45
45
|
def current_tax_zone
|
46
|
-
@current_tax_zone ||= current_order
|
46
|
+
@current_tax_zone ||= @current_order&.tax_zone || Spree::Zone.default_tax
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -13,7 +13,7 @@ module Spree
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def retrieve_products
|
16
|
-
@products =
|
16
|
+
@products = extended_base_scope&.available
|
17
17
|
curr_page = page || 1
|
18
18
|
|
19
19
|
unless Spree::Config.show_products_without_price
|
@@ -33,34 +33,37 @@ module Spree
|
|
33
33
|
|
34
34
|
protected
|
35
35
|
|
36
|
-
def
|
36
|
+
def extended_base_scope
|
37
37
|
base_scope = Spree::Product.spree_base_scopes.active
|
38
|
-
base_scope = base_scope.in_taxon(taxon) unless taxon.blank?
|
39
38
|
base_scope = get_products_conditions_for(base_scope, keywords)
|
39
|
+
base_scope = Spree::Products::Find.new(
|
40
|
+
scope: base_scope,
|
41
|
+
params: {
|
42
|
+
filter: {
|
43
|
+
price: price,
|
44
|
+
option_value_ids: option_value_ids,
|
45
|
+
taxons: taxon&.id
|
46
|
+
},
|
47
|
+
sort_by: sort_by
|
48
|
+
},
|
49
|
+
current_currency: current_currency
|
50
|
+
).execute
|
40
51
|
base_scope = add_search_scopes(base_scope)
|
41
52
|
base_scope = add_eagerload_scopes(base_scope)
|
42
53
|
base_scope
|
43
54
|
end
|
44
55
|
|
45
56
|
def add_eagerload_scopes(scope)
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
#
|
57
|
-
# Would we use `includes` in this particular case, Rails would do
|
58
|
-
# separate queries most of the time but opt for a join as soon as any
|
59
|
-
# `where` constraints affecting joined tables are added to the search;
|
60
|
-
# which is the case as soon as a taxon is added to the base scope.
|
61
|
-
scope = scope.preload(:tax_category)
|
62
|
-
scope = scope.preload(master: :prices)
|
63
|
-
scope = scope.preload(master: :images) if include_images
|
57
|
+
scope = scope.includes(
|
58
|
+
:tax_category,
|
59
|
+
variants: [
|
60
|
+
{ images: { attachment_attachment: :blob } }
|
61
|
+
],
|
62
|
+
master: [
|
63
|
+
:prices,
|
64
|
+
{ images: { attachment_attachment: :blob } }
|
65
|
+
]
|
66
|
+
)
|
64
67
|
scope
|
65
68
|
end
|
66
69
|
|
@@ -68,6 +71,7 @@ module Spree
|
|
68
71
|
if search.is_a?(ActionController::Parameters)
|
69
72
|
search.each do |name, scope_attribute|
|
70
73
|
scope_name = name.to_sym
|
74
|
+
|
71
75
|
base_scope = if base_scope.respond_to?(:search_scopes) && base_scope.search_scopes.include?(scope_name.to_sym)
|
72
76
|
base_scope.send(scope_name, *scope_attribute)
|
73
77
|
else
|
@@ -81,15 +85,48 @@ module Spree
|
|
81
85
|
# method should return new scope based on base_scope
|
82
86
|
def get_products_conditions_for(base_scope, query)
|
83
87
|
unless query.blank?
|
84
|
-
base_scope = base_scope.like_any([:name, :description], query
|
88
|
+
base_scope = base_scope.like_any([:name, :description], [query])
|
89
|
+
end
|
90
|
+
base_scope
|
91
|
+
end
|
92
|
+
|
93
|
+
def get_products_option_values_conditions(base_scope, option_value_ids)
|
94
|
+
unless option_value_ids.blank?
|
95
|
+
base_scope = base_scope.joins(variants: :option_values).where(spree_option_values: { id: option_value_ids })
|
85
96
|
end
|
86
97
|
base_scope
|
87
98
|
end
|
88
99
|
|
100
|
+
def get_price_range(price_param)
|
101
|
+
return if price_param.blank?
|
102
|
+
|
103
|
+
less_than_string = I18n.t('activerecord.attributes.spree/product.less_than')
|
104
|
+
|
105
|
+
if price_param.include? less_than_string
|
106
|
+
low_price = 0
|
107
|
+
high_price = Monetize.parse(price_param.remove("#{less_than_string} ")).to_i
|
108
|
+
else
|
109
|
+
low_price, high_price = Monetize.parse_collection(price_param).map(&:to_i)
|
110
|
+
end
|
111
|
+
|
112
|
+
"#{low_price},#{high_price}"
|
113
|
+
end
|
114
|
+
|
115
|
+
def build_option_value_ids(params)
|
116
|
+
filter_params = Spree::OptionType.all.map(&:filter_param)
|
117
|
+
|
118
|
+
filter_params.reduce([]) do |acc, filter_param|
|
119
|
+
acc + params[filter_param].to_s.split(',')
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
89
123
|
def prepare(params)
|
90
124
|
@properties[:taxon] = params[:taxon].blank? ? nil : Spree::Taxon.find(params[:taxon])
|
91
125
|
@properties[:keywords] = params[:keywords]
|
126
|
+
@properties[:option_value_ids] = build_option_value_ids(params)
|
127
|
+
@properties[:price] = get_price_range(params[:price])
|
92
128
|
@properties[:search] = params[:search]
|
129
|
+
@properties[:sort_by] = params[:sort_by] || 'default'
|
93
130
|
@properties[:include_images] = params[:include_images]
|
94
131
|
|
95
132
|
per_page = params[:per_page].to_i
|
data/lib/spree/core/version.rb
CHANGED
data/lib/spree/core.rb
CHANGED
data/lib/spree/money.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'money'
|
2
2
|
|
3
3
|
Money.locale_backend = :i18n
|
4
|
+
Money.rounding_mode = BigDecimal::ROUND_HALF_UP
|
4
5
|
|
5
6
|
module Spree
|
6
7
|
class Money
|
@@ -18,6 +19,7 @@ module Spree
|
|
18
19
|
delegate :cents, :currency, to: :money
|
19
20
|
|
20
21
|
def initialize(amount, options = {})
|
22
|
+
use_default_currency
|
21
23
|
@money = Monetize.parse([amount, (options[:currency] || Spree::Config[:currency])].join)
|
22
24
|
@options = Spree::Money.default_formatting_rules.merge(options)
|
23
25
|
end
|
@@ -27,7 +29,7 @@ module Spree
|
|
27
29
|
end
|
28
30
|
|
29
31
|
def to_s
|
30
|
-
money
|
32
|
+
money&.format(options)
|
31
33
|
end
|
32
34
|
|
33
35
|
# 1) prevent blank, breaking spaces
|
@@ -62,6 +64,11 @@ module Spree
|
|
62
64
|
money == obj.money
|
63
65
|
end
|
64
66
|
|
67
|
+
def use_default_currency
|
68
|
+
currency = Spree::Store.default.default_currency || Spree::Config[:currency]
|
69
|
+
::Money.default_currency = currency
|
70
|
+
end
|
71
|
+
|
65
72
|
private
|
66
73
|
|
67
74
|
attr_reader :options
|
@@ -39,7 +39,7 @@ module Spree
|
|
39
39
|
]
|
40
40
|
|
41
41
|
@@checkout_attributes = [
|
42
|
-
:coupon_code, :email, :shipping_method_id, :special_instructions, :use_billing,
|
42
|
+
:coupon_code, :email, :shipping_method_id, :special_instructions, :use_billing,
|
43
43
|
:user_id, :bill_address_id, :ship_address_id
|
44
44
|
]
|
45
45
|
|
@@ -97,7 +97,8 @@ module Spree
|
|
97
97
|
]
|
98
98
|
|
99
99
|
@@store_attributes = [:name, :url, :seo_title, :code, :meta_keywords,
|
100
|
-
:meta_description, :default_currency, :mail_from_address
|
100
|
+
:meta_description, :default_currency, :mail_from_address,
|
101
|
+
:facebook, :twitter, :instagram]
|
101
102
|
|
102
103
|
@@store_credit_attributes = %i[amount currency category_id memo]
|
103
104
|
|
@@ -32,51 +32,6 @@ module CapybaraExt
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
def select2_search(value, options)
|
36
|
-
options[:from] = select2_from_label(options[:from])
|
37
|
-
targetted_select2_search(value, options)
|
38
|
-
end
|
39
|
-
|
40
|
-
def targetted_select2_search(value, options)
|
41
|
-
select2_el = find(:css, options[:from])
|
42
|
-
select2_el.click
|
43
|
-
page.document.find('.select2-search input.select2-input,
|
44
|
-
.select2-search-field input.select2-input.select2-focused').send_keys(value)
|
45
|
-
select_select2_result(value)
|
46
|
-
end
|
47
|
-
|
48
|
-
def select2(value, options)
|
49
|
-
options[:from] = select2_from_label(options[:from])
|
50
|
-
targetted_select2(value, options)
|
51
|
-
end
|
52
|
-
|
53
|
-
def select2_from_label(from)
|
54
|
-
label = find(:label, from, class: '!select2-offscreen')
|
55
|
-
within label.first(:xpath, './/..') do
|
56
|
-
"##{find('.select2-container')['id']}"
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def select2_no_label(value, options = {})
|
61
|
-
raise "Must pass a hash containing 'from'" if !options.is_a?(Hash) || !options.key?(:from)
|
62
|
-
|
63
|
-
placeholder = options[:from]
|
64
|
-
click_link placeholder
|
65
|
-
|
66
|
-
select_select2_result(value)
|
67
|
-
end
|
68
|
-
|
69
|
-
def targetted_select2(value, options)
|
70
|
-
# find select2 element and click it
|
71
|
-
find(options[:from]).find('a').click
|
72
|
-
select_select2_result(value)
|
73
|
-
end
|
74
|
-
|
75
|
-
def select_select2_result(value)
|
76
|
-
# results are in a div appended to the end of the document
|
77
|
-
page.document.find('div.select2-result-label', match: :first, text: %r{#{Regexp.escape(value)}}i).click
|
78
|
-
end
|
79
|
-
|
80
35
|
# arg delay in seconds
|
81
36
|
def wait_for_ajax(delay = Capybara.default_max_wait_time)
|
82
37
|
Timeout.timeout(delay) do
|
@@ -108,13 +63,6 @@ rescue Selenium::WebDriver::Error::TimeOutError
|
|
108
63
|
default_options[:error].nil? ? false : raise(default_options[:error])
|
109
64
|
end
|
110
65
|
|
111
|
-
# Usage examples:
|
112
|
-
# fill_in_with_force 'CVC', with: 123
|
113
|
-
def fill_in_with_force(locator, with:)
|
114
|
-
field_id = find_field(locator)[:id]
|
115
|
-
page.execute_script "document.getElementById('#{field_id}').value = '#{with}';"
|
116
|
-
end
|
117
|
-
|
118
66
|
Capybara.configure do |config|
|
119
67
|
config.match = :smart
|
120
68
|
config.ignore_hidden_elements = true
|
@@ -15,7 +15,7 @@ namespace :common do
|
|
15
15
|
Rails.env = 'test'
|
16
16
|
|
17
17
|
Spree::DummyGenerator.start ["--lib_name=#{ENV['LIB_NAME']}", '--quiet']
|
18
|
-
Spree::InstallGenerator.start ["--lib_name=#{ENV['LIB_NAME']}", '--auto-accept', '--migrate=false', '--seed=false', '--sample=false', '--quiet', '--
|
18
|
+
Spree::InstallGenerator.start ["--lib_name=#{ENV['LIB_NAME']}", '--auto-accept', '--migrate=false', '--seed=false', '--sample=false', '--quiet', '--copy_storefront=false', "--user_class=#{args[:user_class]}"]
|
19
19
|
|
20
20
|
puts 'Setting up dummy database...'
|
21
21
|
system("bundle exec rake db:drop db:create > #{File::NULL}")
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class OrderWalkthrough
|
2
2
|
def self.up_to(state)
|
3
3
|
# A default store must exist to provide store settings
|
4
|
-
FactoryBot.create(:store
|
4
|
+
store = Spree::Store.default || FactoryBot.create(:store, default: true)
|
5
5
|
|
6
6
|
# A payment method must exist for an order to proceed through the Address state
|
7
7
|
unless Spree::PaymentMethod.exists?
|
@@ -18,7 +18,7 @@ class OrderWalkthrough
|
|
18
18
|
unless Spree::ShippingMethod.exists?
|
19
19
|
FactoryBot.create(:shipping_method).tap do |sm|
|
20
20
|
sm.calculator.preferred_amount = 10
|
21
|
-
sm.calculator.preferred_currency =
|
21
|
+
sm.calculator.preferred_currency = store.default_currency
|
22
22
|
sm.calculator.save
|
23
23
|
end
|
24
24
|
end
|
@@ -53,7 +53,11 @@ class OrderWalkthrough
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def self.payment(order)
|
56
|
-
|
56
|
+
FactoryBot.create :payment,
|
57
|
+
order: order,
|
58
|
+
payment_method: Spree::PaymentMethod.first,
|
59
|
+
amount: order.total
|
60
|
+
|
57
61
|
# TODO: maybe look at some way of making this payment_state change automatic
|
58
62
|
order.payment_state = 'paid'
|
59
63
|
order.next!
|
data/spree_core.gemspec
CHANGED
@@ -6,23 +6,17 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.platform = Gem::Platform::RUBY
|
7
7
|
s.name = 'spree_core'
|
8
8
|
s.version = Spree.version
|
9
|
-
s.author = 'Sean Schofield'
|
10
|
-
s.email = 'sean@spreecommerce.com'
|
11
9
|
s.summary = 'The bare bones necessary for Spree.'
|
12
10
|
s.description = 'The bare bones necessary for Spree.'
|
13
|
-
s.homepage = 'http://spreecommerce.org'
|
14
|
-
s.license = 'BSD-3-Clause'
|
15
|
-
|
16
|
-
s.metadata = {
|
17
|
-
"bug_tracker_uri" => "https://github.com/spree/spree/issues",
|
18
|
-
"changelog_uri" => "https://github.com/spree/spree/releases/tag/v#{s.version}",
|
19
|
-
"documentation_uri" => "https://guides.spreecommerce.org/",
|
20
|
-
"source_code_uri" => "https://github.com/spree/spree/tree/v#{s.version}",
|
21
|
-
}
|
22
11
|
|
23
12
|
s.required_ruby_version = '>= 2.5.0'
|
24
13
|
s.required_rubygems_version = '>= 1.8.23'
|
25
14
|
|
15
|
+
s.author = 'Sean Schofield'
|
16
|
+
s.email = 'sean@spreecommerce.com'
|
17
|
+
s.homepage = 'http://spreecommerce.org'
|
18
|
+
s.license = 'BSD-3-Clause'
|
19
|
+
|
26
20
|
s.files = `git ls-files`.split("\n").reject { |f| f.match(/^spec/) && !f.match(/^spec\/fixtures/) }
|
27
21
|
s.require_path = 'lib'
|
28
22
|
|
@@ -34,21 +28,21 @@ Gem::Specification.new do |s|
|
|
34
28
|
s.add_dependency 'ffaker', '~> 2.9'
|
35
29
|
s.add_dependency 'friendly_id', '>= 5.2.1', '< 5.4.0'
|
36
30
|
s.add_dependency 'highline', '~> 2.0.0' # Necessary for the install generator
|
37
|
-
s.add_dependency 'kaminari', '
|
31
|
+
s.add_dependency 'kaminari', '>= 1.0.1', '< 1.2.0'
|
38
32
|
s.add_dependency 'money', '~> 6.13'
|
39
33
|
s.add_dependency 'monetize', '~> 1.9'
|
40
34
|
s.add_dependency 'paranoia', '~> 2.4.2'
|
41
35
|
s.add_dependency 'premailer-rails'
|
42
|
-
s.add_dependency 'rails', '
|
36
|
+
s.add_dependency 'rails', '~> 6.0.0'
|
43
37
|
s.add_dependency 'ransack', '~> 2.3.0'
|
44
38
|
s.add_dependency 'responders'
|
45
39
|
s.add_dependency 'state_machines-activerecord', '~> 0.6'
|
46
40
|
s.add_dependency 'state_machines-activemodel', '~> 0.7'
|
47
41
|
s.add_dependency 'stringex'
|
48
|
-
s.add_dependency 'twitter_cldr', '
|
42
|
+
s.add_dependency 'twitter_cldr', '>= 4.3', '< 6.0'
|
49
43
|
s.add_dependency 'sprockets', '~> 3.7'
|
50
44
|
s.add_dependency 'sprockets-rails'
|
51
|
-
s.add_dependency 'mini_magick', '
|
45
|
+
s.add_dependency 'mini_magick', '>= 4.9.4', '< 4.11.0'
|
52
46
|
s.add_dependency 'image_processing', '~> 1.2'
|
53
47
|
|
54
48
|
s.add_development_dependency 'email_spec', '~> 2.2'
|