stall 0.1.0

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.
Files changed (82) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +7 -0
  4. data/Rakefile +22 -0
  5. data/app/assets/javascripts/stall.coffee +12 -0
  6. data/app/assets/javascripts/stall/add-to-cart-form.coffee +22 -0
  7. data/app/assets/javascripts/stall/application.js +13 -0
  8. data/app/assets/javascripts/stall/carts.js +2 -0
  9. data/app/assets/stylesheets/stall/application.css +15 -0
  10. data/app/assets/stylesheets/stall/carts.css +4 -0
  11. data/app/controllers/stall/application_controller.rb +18 -0
  12. data/app/controllers/stall/carts_controller.rb +28 -0
  13. data/app/controllers/stall/checkout/steps_controller.rb +32 -0
  14. data/app/controllers/stall/checkouts_controller.rb +9 -0
  15. data/app/controllers/stall/line_items_controller.rb +26 -0
  16. data/app/helpers/stall/add_to_cart_helper.rb +10 -0
  17. data/app/helpers/stall/application_helper.rb +4 -0
  18. data/app/helpers/stall/cart_helper.rb +28 -0
  19. data/app/helpers/stall/checkout_helper.rb +7 -0
  20. data/app/models/stall.rb +5 -0
  21. data/app/models/stall/address.rb +5 -0
  22. data/app/models/stall/address_ownership.rb +15 -0
  23. data/app/models/stall/cart.rb +14 -0
  24. data/app/models/stall/customer.rb +5 -0
  25. data/app/models/stall/line_item.rb +45 -0
  26. data/app/models/stall/product_list.rb +56 -0
  27. data/app/models/stall/shipment.rb +15 -0
  28. data/app/models/stall/shipping_method.rb +5 -0
  29. data/app/services/stall/add_to_cart_service.rb +52 -0
  30. data/app/services/stall/base_service.rb +4 -0
  31. data/app/services/stall/shipping_fee_calculator_service.rb +21 -0
  32. data/app/views/checkout/steps/_informations.html.haml +41 -0
  33. data/app/views/checkout/steps/_payment_method.html.haml +1 -0
  34. data/app/views/checkout/steps/_shipping_method.html.haml +10 -0
  35. data/app/views/layouts/stall/application.html.erb +15 -0
  36. data/app/views/stall/carts/show.html.haml +23 -0
  37. data/app/views/stall/checkout/steps/show.html.haml +1 -0
  38. data/app/views/stall/line_items/_add_error.html.haml +17 -0
  39. data/app/views/stall/line_items/_added.html.haml +23 -0
  40. data/app/views/stall/line_items/_form.html.haml +12 -0
  41. data/config/locales/stall.en.yml +60 -0
  42. data/config/locales/stall.fr.yml +60 -0
  43. data/db/migrate/20151103154313_create_stall_line_items.rb +19 -0
  44. data/db/migrate/20160118121116_create_stall_product_lists.rb +15 -0
  45. data/db/migrate/20160118124016_create_customers.rb +11 -0
  46. data/db/migrate/20160122143746_create_stall_addresses.rb +17 -0
  47. data/db/migrate/20160122143748_create_stall_address_ownerships.rb +17 -0
  48. data/db/migrate/20160124014144_create_stall_shipping_methods.rb +10 -0
  49. data/db/migrate/20160124020313_create_stall_shipments.rb +17 -0
  50. data/lib/generators/stall/checkout/step/step_generator.rb +20 -0
  51. data/lib/generators/stall/checkout/step/templates/step.rb.erb +2 -0
  52. data/lib/generators/stall/checkout/wizard/templates/wizard.rb.erb +3 -0
  53. data/lib/generators/stall/checkout/wizard/wizard_generator.rb +20 -0
  54. data/lib/generators/stall/install/install_generator.rb +17 -0
  55. data/lib/generators/stall/install/templates/initializer.rb +47 -0
  56. data/lib/stall.rb +38 -0
  57. data/lib/stall/addressable.rb +44 -0
  58. data/lib/stall/checkout.rb +15 -0
  59. data/lib/stall/checkout/informations_checkout_step.rb +41 -0
  60. data/lib/stall/checkout/payment_checkout_step.rb +6 -0
  61. data/lib/stall/checkout/payment_method_checkout_step.rb +6 -0
  62. data/lib/stall/checkout/shipping_method_checkout_step.rb +20 -0
  63. data/lib/stall/checkout/step.rb +47 -0
  64. data/lib/stall/checkout/wizard.rb +85 -0
  65. data/lib/stall/config.rb +27 -0
  66. data/lib/stall/engine.rb +30 -0
  67. data/lib/stall/rails/currency_helper.rb +26 -0
  68. data/lib/stall/rails/routing_mapper.rb +13 -0
  69. data/lib/stall/routes.rb +27 -0
  70. data/lib/stall/sellable.rb +8 -0
  71. data/lib/stall/sellable/mixin.rb +17 -0
  72. data/lib/stall/sellable/model.rb +46 -0
  73. data/lib/stall/shipping.rb +16 -0
  74. data/lib/stall/shipping/calculator.rb +28 -0
  75. data/lib/stall/shipping/config.rb +17 -0
  76. data/lib/stall/shipping/country_weight_table_calculator.rb +69 -0
  77. data/lib/stall/shipping/free_shipping_calculator.rb +23 -0
  78. data/lib/stall/utils.rb +22 -0
  79. data/lib/stall/utils/config_dsl.rb +19 -0
  80. data/lib/stall/version.rb +3 -0
  81. data/lib/tasks/stall_tasks.rake +4 -0
  82. metadata +362 -0
@@ -0,0 +1,27 @@
1
+ module Stall
2
+ class Config
3
+ extend Stall::Utils::ConfigDSL
4
+
5
+ # Default VAT rate
6
+ param :vat_rate, BigDecimal.new('20.0')
7
+
8
+ # Default prices precision for rounding
9
+ param :prices_precision, 2
10
+
11
+ # Engine's ApplicationController parent
12
+ param :application_controller_ancestor, '::ApplicationController'
13
+
14
+ # Default currency for money objects
15
+ param :default_currency, 'EUR'
16
+
17
+ # Default checkout wizard used
18
+ param :default_checkout_wizard, 'DefaultCheckoutWizard'
19
+
20
+ # Default product weight if no weight is found
21
+ param :default_product_weight, 0
22
+
23
+ def shipping
24
+ @shipping ||= Stall::Shipping::Config.new
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ module Stall
2
+ class Engine < ::Rails::Engine
3
+ initializer 'include sellable mixin into models' do
4
+ ActiveSupport.on_load(:active_record) do
5
+ include Stall::Sellable::Mixin
6
+ end
7
+ end
8
+
9
+ initializer 'set money gem default currency' do
10
+ Money.default_currency = Stall.config.default_currency
11
+ end
12
+
13
+ initializer 'override actionview number helpers' do
14
+ ActiveSupport.on_load(:action_view) do
15
+ include Stall::CurrencyHelper
16
+ end
17
+ end
18
+
19
+ # Development : Configure rails generators to only generate the target
20
+ # files and not try to generate useless complementary files
21
+ #
22
+ config.generators do |generators|
23
+ generators.skip_routes true
24
+ generators.helper false
25
+ generators.stylesheets false
26
+ generators.javascripts false
27
+ generators.test_framework false
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ # Overrides the `#number_to_currency` rails helper to use the Money currency
2
+ # symbol as the unit when a Money object is passed and no unit is set.
3
+ #
4
+ # This allows to localize currency formats without messing around with Money
5
+ # custom format which is not integrated with the I18n gem, and rely on rails
6
+ # default way of localizing the currency formats.
7
+ #
8
+ module Stall
9
+ module CurrencyHelper
10
+ extend ActiveSupport::Concern
11
+
12
+ included do
13
+ if method_defined?(:number_to_currency)
14
+ alias_method :original_number_to_currency, :number_to_currency
15
+
16
+ define_method(:number_to_currency) do |price, options = {}|
17
+ if Money === price && !options.key?(:unit)
18
+ options[:unit] = price.symbol
19
+ end
20
+
21
+ original_number_to_currency(price, options)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ # Routing mapper override to allow mounting the engine as non-isolated, avoiding
2
+ # issues with routes in templates when switching from the app to the engine
3
+ #
4
+ module ActionDispatch
5
+ module Routing
6
+ class Mapper
7
+ def mount_stall(mount_location)
8
+ Stall::Routes.new(self).draw(mount_location)
9
+ end
10
+ end
11
+ end
12
+ end
13
+
@@ -0,0 +1,27 @@
1
+ module Stall
2
+ class Routes
3
+ attr_reader :router
4
+
5
+ def initialize(router)
6
+ @router = router
7
+ end
8
+
9
+ def draw(mount_location, options = {}, &block)
10
+ router.instance_eval do
11
+ scope mount_location do
12
+ scope module: :stall do
13
+ resources :carts do
14
+ resources :line_items
15
+ end
16
+
17
+ resources :checkouts, only: [:show]
18
+
19
+ scope '/checkout/:type/:cart_id', module: 'checkout', as: :checkout do
20
+ resource :step, only: [:show, :update]
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,8 @@
1
+ module Stall
2
+ module Sellable
3
+ extend ActiveSupport::Autoload
4
+
5
+ autoload :Mixin
6
+ autoload :Model
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ module Stall
2
+ module Sellable
3
+ module Mixin
4
+ extend ActiveSupport::Concern
5
+
6
+ def sellable?
7
+ false
8
+ end
9
+
10
+ module ClassMethods
11
+ def acts_as_sellable
12
+ include Stall::Sellable::Model
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,46 @@
1
+ module Stall
2
+ module Sellable
3
+ module Model
4
+ extend ActiveSupport::Concern
5
+
6
+ def sellable?
7
+ true
8
+ end
9
+
10
+ def to_line_item
11
+ value_if_method = -> name { send(name) if respond_to?(name) }
12
+
13
+ Stall::LineItem.new(
14
+ sellable: self,
15
+ quantity: 1,
16
+ name: (value_if_method.(:name) || value_if_method.(:title)),
17
+ unit_price: value_if_method.(:price),
18
+ unit_eot_price: eot_price,
19
+ vat_rate: vat_rate,
20
+ )
21
+ end
22
+
23
+ def vat_ratio
24
+ (vat_rate / 100.0) + 1
25
+ end
26
+
27
+ private
28
+
29
+ def default_eot_price
30
+ price && (price / vat_ratio)
31
+ end
32
+
33
+ def default_vat_rate
34
+ @default_vat_rate ||= Stall.config.vat_rate
35
+ end
36
+
37
+ def method_missing(name, *args, &block)
38
+ if [:eot_price, :vat_rate].include?(name)
39
+ send(:"default_#{ name }")
40
+ else
41
+ super
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,16 @@
1
+ module Stall
2
+ module Shipping
3
+ extend ActiveSupport::Autoload
4
+
5
+ autoload :Calculator
6
+
7
+ autoload :CountryWeightTableCalculator
8
+ autoload :FreeShippingCalculator
9
+
10
+ autoload :Config
11
+
12
+ mattr_reader :calculators
13
+ @@calculators = {}
14
+ end
15
+ end
16
+
@@ -0,0 +1,28 @@
1
+ module Stall
2
+ module Shipping
3
+ class Calculator
4
+ attr_reader :cart, :config
5
+
6
+ def initialize(cart, config)
7
+ @cart = cart
8
+ @config = config
9
+ end
10
+
11
+ def available_for?(address)
12
+ raise NoMethodError,
13
+ 'Shipping calculators must implement the #available_for? method ' \
14
+ 'to allow filtering available shipping methods'
15
+ end
16
+
17
+ def price
18
+ raise NoMethodError,
19
+ 'Shipping calculators must implement the #price method and return ' \
20
+ 'the actual shipping price for the given cart'
21
+ end
22
+
23
+ def self.register(name)
24
+ Stall::Shipping.calculators[name] = self
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,17 @@
1
+ module Stall
2
+ module Shipping
3
+ class Config
4
+ def configure
5
+ yield config
6
+ end
7
+
8
+ def method_missing(name, *args)
9
+ if (calculator = Stall::Shipping.calculators[name])
10
+ calculator
11
+ else
12
+ super
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,69 @@
1
+ require 'csv'
2
+
3
+ module Stall
4
+ module Shipping
5
+ class CountryWeightTableCalculator < Stall::Shipping::Calculator
6
+ def available_for?(address)
7
+ country?(address.country)
8
+ end
9
+
10
+ def price
11
+ total_weight = cart.total_weight
12
+
13
+ # Browse the data hash to find a suitable country code for the cart's
14
+ # total weight
15
+ if (prices = data[cart.shipping_address.country])
16
+ prices.each do |max_weight, price|
17
+ return price if total_weight < max_weight
18
+ end
19
+ end
20
+
21
+ # Return nil if no price was found
22
+ nil
23
+ end
24
+
25
+ private
26
+
27
+ def country?(country)
28
+ countries.include?(country)
29
+ end
30
+
31
+ def countries
32
+ @countries ||= data.keys
33
+ end
34
+
35
+ def data
36
+ @data ||= load_data
37
+ end
38
+
39
+ def load_data
40
+ raise NoMethodError,
41
+ 'CountryWeightTableCalculator subclasses must implement the ' \
42
+ '#load_data method and return a two dimensional array with ' \
43
+ 'countries as the first line and weight and prices on the other ' \
44
+ 'lines'
45
+ end
46
+
47
+ def load_from(csv_string)
48
+ csv = CSV.parse(csv_string)
49
+ headers = csv.shift
50
+
51
+ headers.each_with_index.each_with_object({}) do |(countries, index), hash|
52
+ # Skip first empty cell of the countries row
53
+ next if index == 0
54
+
55
+ countries.split(",").each do |country|
56
+ country_code = country.strip
57
+ hash[country_code] = {}
58
+
59
+ csv.each do |row|
60
+ max_weight = row.first.to_f
61
+ price = BigDecimal.new(row[index])
62
+ hash[country_code][max_weight] = price
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,23 @@
1
+ module Stall
2
+ module Shipping
3
+ class FreeShippingCalculator < Stall::Shipping::Calculator
4
+ register :free_shipping
5
+
6
+ class_attribute :available
7
+
8
+ def price
9
+ 0
10
+ end
11
+
12
+ def available_for?(address)
13
+ if Array === available
14
+ available.include?(address.country)
15
+ elsif Proc === available
16
+ available.call(address)
17
+ else
18
+ true
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ module Stall
2
+ module Utils
3
+ extend ActiveSupport::Autoload
4
+
5
+ autoload :ConfigDSL
6
+
7
+ class << self
8
+ def try_load_constant(name)
9
+ begin
10
+ name.constantize
11
+ rescue NameError
12
+ begin
13
+ require name.underscore
14
+ name.constantize
15
+ rescue LoadError, NameError => e
16
+ nil
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,19 @@
1
+ module Stall
2
+ module Utils
3
+ # The DSL allows for declaring instance-level configuration params
4
+ # with defaults in a single line
5
+ #
6
+ module ConfigDSL
7
+ def param(name, default = nil)
8
+ attr_writer name
9
+
10
+ instance_variable_name = :"@#{ name }"
11
+
12
+ define_method(name) do
13
+ instance_variable_get(instance_variable_name) ||
14
+ instance_variable_set(instance_variable_name, default)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ module Stall
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :stall do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,362 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stall
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - vala
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-01-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: coffee-rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pg
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.16'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.16'
55
+ - !ruby/object:Gem::Dependency
56
+ name: haml-rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simple_form
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: has_secure_token
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: vertebra
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.1'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: money-rails
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.6'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.6'
125
+ - !ruby/object:Gem::Dependency
126
+ name: request_store
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.3'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.3'
139
+ - !ruby/object:Gem::Dependency
140
+ name: country_select
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '2.0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '2.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rspec-rails
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: shoulda-matchers
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '3.0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '3.0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: factory_girl_rails
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '4.0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '4.0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: database_cleaner
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '1.5'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '1.5'
209
+ - !ruby/object:Gem::Dependency
210
+ name: capybara
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: launchy
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: rubocop
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "~>"
242
+ - !ruby/object:Gem::Version
243
+ version: 0.36.0
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: 0.36.0
251
+ description: Rails e-commerce framework
252
+ email:
253
+ - vala@glyph.fr
254
+ executables: []
255
+ extensions: []
256
+ extra_rdoc_files: []
257
+ files:
258
+ - MIT-LICENSE
259
+ - README.md
260
+ - Rakefile
261
+ - app/assets/javascripts/stall.coffee
262
+ - app/assets/javascripts/stall/add-to-cart-form.coffee
263
+ - app/assets/javascripts/stall/application.js
264
+ - app/assets/javascripts/stall/carts.js
265
+ - app/assets/stylesheets/stall/application.css
266
+ - app/assets/stylesheets/stall/carts.css
267
+ - app/controllers/stall/application_controller.rb
268
+ - app/controllers/stall/carts_controller.rb
269
+ - app/controllers/stall/checkout/steps_controller.rb
270
+ - app/controllers/stall/checkouts_controller.rb
271
+ - app/controllers/stall/line_items_controller.rb
272
+ - app/helpers/stall/add_to_cart_helper.rb
273
+ - app/helpers/stall/application_helper.rb
274
+ - app/helpers/stall/cart_helper.rb
275
+ - app/helpers/stall/checkout_helper.rb
276
+ - app/models/stall.rb
277
+ - app/models/stall/address.rb
278
+ - app/models/stall/address_ownership.rb
279
+ - app/models/stall/cart.rb
280
+ - app/models/stall/customer.rb
281
+ - app/models/stall/line_item.rb
282
+ - app/models/stall/product_list.rb
283
+ - app/models/stall/shipment.rb
284
+ - app/models/stall/shipping_method.rb
285
+ - app/services/stall/add_to_cart_service.rb
286
+ - app/services/stall/base_service.rb
287
+ - app/services/stall/shipping_fee_calculator_service.rb
288
+ - app/views/checkout/steps/_informations.html.haml
289
+ - app/views/checkout/steps/_payment_method.html.haml
290
+ - app/views/checkout/steps/_shipping_method.html.haml
291
+ - app/views/layouts/stall/application.html.erb
292
+ - app/views/stall/carts/show.html.haml
293
+ - app/views/stall/checkout/steps/show.html.haml
294
+ - app/views/stall/line_items/_add_error.html.haml
295
+ - app/views/stall/line_items/_added.html.haml
296
+ - app/views/stall/line_items/_form.html.haml
297
+ - config/locales/stall.en.yml
298
+ - config/locales/stall.fr.yml
299
+ - db/migrate/20151103154313_create_stall_line_items.rb
300
+ - db/migrate/20160118121116_create_stall_product_lists.rb
301
+ - db/migrate/20160118124016_create_customers.rb
302
+ - db/migrate/20160122143746_create_stall_addresses.rb
303
+ - db/migrate/20160122143748_create_stall_address_ownerships.rb
304
+ - db/migrate/20160124014144_create_stall_shipping_methods.rb
305
+ - db/migrate/20160124020313_create_stall_shipments.rb
306
+ - lib/generators/stall/checkout/step/step_generator.rb
307
+ - lib/generators/stall/checkout/step/templates/step.rb.erb
308
+ - lib/generators/stall/checkout/wizard/templates/wizard.rb.erb
309
+ - lib/generators/stall/checkout/wizard/wizard_generator.rb
310
+ - lib/generators/stall/install/install_generator.rb
311
+ - lib/generators/stall/install/templates/initializer.rb
312
+ - lib/stall.rb
313
+ - lib/stall/addressable.rb
314
+ - lib/stall/checkout.rb
315
+ - lib/stall/checkout/informations_checkout_step.rb
316
+ - lib/stall/checkout/payment_checkout_step.rb
317
+ - lib/stall/checkout/payment_method_checkout_step.rb
318
+ - lib/stall/checkout/shipping_method_checkout_step.rb
319
+ - lib/stall/checkout/step.rb
320
+ - lib/stall/checkout/wizard.rb
321
+ - lib/stall/config.rb
322
+ - lib/stall/engine.rb
323
+ - lib/stall/rails/currency_helper.rb
324
+ - lib/stall/rails/routing_mapper.rb
325
+ - lib/stall/routes.rb
326
+ - lib/stall/sellable.rb
327
+ - lib/stall/sellable/mixin.rb
328
+ - lib/stall/sellable/model.rb
329
+ - lib/stall/shipping.rb
330
+ - lib/stall/shipping/calculator.rb
331
+ - lib/stall/shipping/config.rb
332
+ - lib/stall/shipping/country_weight_table_calculator.rb
333
+ - lib/stall/shipping/free_shipping_calculator.rb
334
+ - lib/stall/utils.rb
335
+ - lib/stall/utils/config_dsl.rb
336
+ - lib/stall/version.rb
337
+ - lib/tasks/stall_tasks.rake
338
+ homepage: https://github.com/glyph-fr/stall
339
+ licenses:
340
+ - MIT
341
+ metadata: {}
342
+ post_install_message:
343
+ rdoc_options: []
344
+ require_paths:
345
+ - lib
346
+ required_ruby_version: !ruby/object:Gem::Requirement
347
+ requirements:
348
+ - - ">="
349
+ - !ruby/object:Gem::Version
350
+ version: '0'
351
+ required_rubygems_version: !ruby/object:Gem::Requirement
352
+ requirements:
353
+ - - ">="
354
+ - !ruby/object:Gem::Version
355
+ version: '0'
356
+ requirements: []
357
+ rubyforge_project:
358
+ rubygems_version: 2.5.1
359
+ signing_key:
360
+ specification_version: 4
361
+ summary: Rails e-commerce framework
362
+ test_files: []