stall 0.1.1 → 0.1.2
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/README.md +45 -0
- data/app/assets/javascripts/stall.coffee +2 -0
- data/app/assets/javascripts/stall/cart-form.coffee +23 -0
- data/app/controllers/stall/application_controller.rb +10 -2
- data/app/controllers/stall/carts_controller.rb +31 -10
- data/app/controllers/stall/checkout/steps_controller.rb +36 -4
- data/app/controllers/stall/checkouts_controller.rb +12 -3
- data/app/controllers/stall/line_items_controller.rb +3 -3
- data/app/controllers/stall/payments_controller.rb +5 -3
- data/app/helpers/stall/add_to_cart_helper.rb +1 -1
- data/app/helpers/stall/checkout_helper.rb +22 -2
- data/app/helpers/stall/payments_helper.rb +8 -0
- data/app/mailers/stall/admin_mailer.rb +11 -0
- data/app/mailers/stall/base_mailer.rb +17 -0
- data/app/mailers/stall/customer_mailer.rb +13 -0
- data/app/models/address.rb +3 -0
- data/app/models/address_ownership.rb +3 -0
- data/app/models/adjustment.rb +3 -0
- data/app/models/cart.rb +3 -0
- data/app/models/customer.rb +3 -0
- data/app/models/line_item.rb +3 -0
- data/app/models/payment.rb +3 -0
- data/app/models/payment_method.rb +3 -0
- data/app/models/product_list.rb +3 -0
- data/app/models/shipment.rb +3 -0
- data/app/models/shipping_method.rb +3 -0
- data/app/models/stall/models.rb +4 -0
- data/app/models/stall/models/address.rb +45 -0
- data/app/models/stall/models/address_ownership.rb +26 -0
- data/app/models/stall/models/adjustment.rb +49 -0
- data/app/models/stall/models/cart.rb +37 -0
- data/app/models/stall/models/customer.rb +18 -0
- data/app/models/stall/models/line_item.rb +57 -0
- data/app/models/stall/models/payment.rb +33 -0
- data/app/models/stall/models/payment_method.rb +18 -0
- data/app/models/stall/models/product_list.rb +147 -0
- data/app/models/stall/models/shipment.rb +29 -0
- data/app/models/stall/models/shipping_method.rb +16 -0
- data/app/services/stall/add_to_cart_service.rb +11 -1
- data/app/services/stall/cart_update_service.rb +26 -0
- data/app/services/stall/payment_notification_service.rb +23 -9
- data/app/services/stall/shipping_fee_calculator_service.rb +13 -2
- data/app/views/checkout/steps/_informations.html.haml +3 -3
- data/app/views/checkout/steps/_payment.html.haml +25 -4
- data/app/views/checkout/steps/_payment_method.html.haml +1 -3
- data/app/views/checkout/steps/_payment_return.html.haml +6 -0
- data/app/views/checkout/steps/_shipping_method.html.haml +1 -1
- data/app/views/stall/admin_mailer/order_paid_email.html.haml +4 -0
- data/app/views/stall/carts/show.html.haml +36 -8
- data/app/views/stall/customer_mailer/order_paid_email.html.haml +8 -0
- data/app/views/stall/line_items/_added.html.haml +1 -1
- data/app/views/stall/shared/mailers/_address.html.haml +18 -0
- data/app/views/stall/shared/mailers/_cart.html.haml +114 -0
- data/config/locales/stall.fr.yml +90 -8
- data/db/migrate/20160304134849_change_all_json_columns_to_jsonb.rb +18 -0
- data/db/migrate/20160307142924_add_state_to_stall_addresses.rb +5 -0
- data/db/migrate/20160308142713_create_adjustments.rb +16 -0
- data/db/migrate/20160309165136_add_identifier_to_stall_product_lists.rb +5 -0
- data/db/migrate/20160316114649_add_data_to_stall_shipments.rb +5 -0
- data/db/migrate/20160317141632_add_state_to_stall_shipments.rb +5 -0
- data/db/migrate/20160629102943_add_active_to_stall_shipping_methods.rb +11 -0
- data/db/migrate/20160629104617_add_active_to_stall_payment_methods.rb +11 -0
- data/db/migrate/20160705110151_add_locale_to_stall_customers.rb +5 -0
- data/lib/generators/stall/checkout/step/templates/step.html.haml.erb +1 -1
- data/lib/generators/stall/checkout/step/templates/step.rb.erb +10 -2
- data/lib/generators/stall/checkout/wizard/templates/wizard.rb.erb +1 -1
- data/lib/generators/stall/install/templates/initializer.rb +85 -1
- data/lib/generators/stall/model/model_generator.rb +27 -0
- data/lib/generators/stall/service/service_generator.rb +39 -0
- data/lib/generators/stall/service/templates/service.rb.erb +16 -0
- data/lib/generators/stall/shipping/calculator/calculator_generator.rb +17 -0
- data/lib/generators/stall/shipping/calculator/templates/calculator.rb.erb +29 -0
- data/lib/stall.rb +4 -0
- data/lib/stall/addressable.rb +28 -2
- data/lib/stall/cart_helper.rb +84 -0
- data/lib/stall/carts_cleaner.rb +46 -0
- data/lib/stall/checkout.rb +2 -0
- data/lib/stall/checkout/informations_checkout_step.rb +3 -5
- data/lib/stall/checkout/payment_checkout_step.rb +3 -0
- data/lib/stall/checkout/payment_return_checkout_step.rb +11 -0
- data/lib/stall/checkout/shipping_method_checkout_step.rb +2 -1
- data/lib/stall/checkout/step.rb +47 -11
- data/lib/stall/checkout/step_form.rb +71 -0
- data/lib/stall/checkout/wizard.rb +15 -5
- data/lib/stall/config.rb +51 -0
- data/lib/stall/engine.rb +24 -2
- data/lib/stall/payable.rb +26 -0
- data/lib/stall/payments.rb +7 -3
- data/lib/stall/payments/config.rb +37 -0
- data/lib/stall/payments/fake_gateway_payment_notification.rb +34 -0
- data/lib/stall/payments/gateway.rb +19 -12
- data/lib/stall/payments/urls_config.rb +40 -0
- data/lib/stall/priceable.rb +7 -0
- data/lib/stall/rails/currency_helper.rb +1 -1
- data/lib/stall/routes.rb +17 -4
- data/lib/stall/sellable.rb +1 -2
- data/lib/stall/shipping.rb +3 -1
- data/lib/stall/shipping/calculator.rb +36 -3
- data/lib/stall/shipping/config.rb +17 -3
- data/lib/stall/shipping/country_weight_table_calculator.rb +1 -1
- data/lib/stall/shipping/free_shipping_calculator.rb +1 -1
- data/lib/stall/utils.rb +2 -2
- data/lib/stall/utils/config_dsl.rb +5 -1
- data/lib/stall/version.rb +1 -1
- data/lib/tasks/stall_tasks.rake +11 -0
- metadata +73 -15
- data/app/assets/javascripts/stall/application.js +0 -13
- data/app/assets/javascripts/stall/carts.js +0 -2
- data/app/helpers/stall/cart_helper.rb +0 -28
- data/app/models/stall/address.rb +0 -5
- data/app/models/stall/address_ownership.rb +0 -8
- data/app/models/stall/cart.rb +0 -31
- data/app/models/stall/customer.rb +0 -8
- data/app/models/stall/line_item.rb +0 -49
- data/app/models/stall/payment.rb +0 -14
- data/app/models/stall/payment_method.rb +0 -7
- data/app/models/stall/product_list.rb +0 -68
- data/app/models/stall/shipment.rb +0 -15
- data/app/models/stall/shipping_method.rb +0 -5
data/config/locales/stall.fr.yml
CHANGED
@@ -11,11 +11,16 @@ fr:
|
|
11
11
|
success: "Votre panier a bien été mis à jour."
|
12
12
|
error: "Votre panier n'a pu être mis à jour, merci de vérifier les champs."
|
13
13
|
recap:
|
14
|
+
order_ref: "Commande n°%{ref}"
|
15
|
+
ordered_at: "Passée le %{at}"
|
16
|
+
subtotal: "Sous-total"
|
17
|
+
total_shipment_price: "Livraison"
|
14
18
|
total_eot_price: "Prix total HT"
|
15
19
|
total_vat: "Total TVA"
|
16
20
|
total_price: "Prix total"
|
17
21
|
update: "Mettre à jour le panier"
|
18
22
|
validate: "Passer la commande"
|
23
|
+
paid_at: "Payée le %{at}"
|
19
24
|
|
20
25
|
line_items:
|
21
26
|
form:
|
@@ -29,6 +34,8 @@ fr:
|
|
29
34
|
description: "Merci de vérifier que vous avez bien rempli la quantité avant d'ajouter le produit au panier."
|
30
35
|
|
31
36
|
checkout:
|
37
|
+
shared:
|
38
|
+
not_checkoutable: "Aucun produit dans le panier, impossible de passer la commande."
|
32
39
|
informations:
|
33
40
|
title: "Vos informations"
|
34
41
|
validate: "Valider mes adresses"
|
@@ -41,23 +48,72 @@ fr:
|
|
41
48
|
validate: "Valider mon mode de paiement"
|
42
49
|
payment:
|
43
50
|
title: "Paiement"
|
51
|
+
error: |
|
52
|
+
Votre paiement n'a pas pu être pris en compte, vous pouvez réessayer
|
53
|
+
de payer avec le bouton : "Payer ma commande"
|
54
|
+
payment_return:
|
55
|
+
title: "Paiement effectué"
|
56
|
+
help: |
|
57
|
+
Votre paiement a bien été pris en compte et votre commande a été
|
58
|
+
validée. Celle-ci sera traitée dans les plus bref délais.
|
59
|
+
<br><br>
|
60
|
+
Un e-mail de confirmation vous a été envoyé.
|
61
|
+
<br><br>
|
62
|
+
Merci pour votre confiance !
|
63
|
+
|
64
|
+
back_to_shop: "Retour à la boutique"
|
44
65
|
|
45
66
|
payments:
|
46
67
|
gateway:
|
47
68
|
pay: "Payer ma commande"
|
48
69
|
|
70
|
+
addresses:
|
71
|
+
civilities:
|
72
|
+
m: M.
|
73
|
+
mme: Mme.
|
74
|
+
|
75
|
+
mailers:
|
76
|
+
customer:
|
77
|
+
order_paid_email:
|
78
|
+
subject: "Le paiement de votre commande n°%{ref} a bien été effectué !"
|
79
|
+
intro: "Votre commande sera traitée dans les meilleurs délais."
|
80
|
+
admin:
|
81
|
+
order_paid_email:
|
82
|
+
subject: "Une nouvelle commande a été passée sur le site - %{ref}"
|
83
|
+
|
49
84
|
activerecord:
|
85
|
+
enums:
|
86
|
+
shipment:
|
87
|
+
state:
|
88
|
+
pending: "En attente"
|
89
|
+
shipped: "Expédié"
|
90
|
+
payment:
|
91
|
+
state:
|
92
|
+
pending: "En attente"
|
93
|
+
shipped: "Payé"
|
94
|
+
models:
|
95
|
+
line_item: "Produit"
|
96
|
+
customer: "Client"
|
97
|
+
address: "Adresse"
|
98
|
+
cart: "Panier"
|
99
|
+
shipment: "Livraison"
|
100
|
+
payment: "Paiement"
|
50
101
|
attributes:
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
unit_eot_price: "Prix unitaire HT"
|
55
|
-
price: "Prix"
|
56
|
-
eot_price: "Prix HT"
|
102
|
+
line_item:
|
103
|
+
sellable: "Produit source"
|
104
|
+
name: "Nom du produit"
|
57
105
|
quantity: "Quantité"
|
58
|
-
|
106
|
+
unit_eot_price: "Prix unitaire HT"
|
107
|
+
unit_price: "Prix unitaire TTC"
|
108
|
+
eot_price: "Prix total HT"
|
109
|
+
price: "Prix total TTC"
|
110
|
+
vat_rate: "Taux de TVA"
|
111
|
+
weight: "Poids"
|
112
|
+
customer:
|
59
113
|
email: "Adresse e-mail"
|
60
|
-
|
114
|
+
shipping_address: "Adresse de livraison"
|
115
|
+
billing_address: "Adresse de facturation"
|
116
|
+
address:
|
61
117
|
civility: "Civilité"
|
62
118
|
first_name: "Prénom"
|
63
119
|
last_name: "Nom"
|
@@ -67,3 +123,29 @@ fr:
|
|
67
123
|
city: "Ville"
|
68
124
|
country: "Pays"
|
69
125
|
phone: "Téléphone"
|
126
|
+
state: "État"
|
127
|
+
product_list:
|
128
|
+
reference: "Référence"
|
129
|
+
customer: "Client"
|
130
|
+
created_at: "Date"
|
131
|
+
line_items: "Produits"
|
132
|
+
cart:
|
133
|
+
state: "Étape du panier"
|
134
|
+
total_price: "Montant total"
|
135
|
+
payment: "Paiement"
|
136
|
+
shipment: "Livraison"
|
137
|
+
shipping_address: "Adresse de livraison"
|
138
|
+
billing_address: "Adresse de facturation"
|
139
|
+
shipment:
|
140
|
+
price: "Prix"
|
141
|
+
eot_price: "Prix HT"
|
142
|
+
vat_rate: "Taux de TVA"
|
143
|
+
sent_at: "Expédié le"
|
144
|
+
shipping_method: "Mode de livraison"
|
145
|
+
tracking_code: "Code de suivi"
|
146
|
+
state: "État"
|
147
|
+
payment:
|
148
|
+
payment_method: "Mode de paiement"
|
149
|
+
paid_at: "Payé le"
|
150
|
+
transaction_id: "Numéro de transaction"
|
151
|
+
state: "État"
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# This allows to avoid SELECT DISTINCT errors where JSON field type would throw
|
2
|
+
# a PG::UndefinedFunction error
|
3
|
+
#
|
4
|
+
# See : https://github.com/activerecord-hackery/ransack/issues/453
|
5
|
+
#
|
6
|
+
class ChangeAllJsonColumnsToJsonb < ActiveRecord::Migration
|
7
|
+
def up
|
8
|
+
change_column :stall_line_items, :data, 'jsonb USING CAST(data AS jsonb)'
|
9
|
+
change_column :stall_payments, :data, 'jsonb USING CAST(data AS jsonb)'
|
10
|
+
change_column :stall_product_lists, :data, 'jsonb USING CAST(data AS jsonb)'
|
11
|
+
end
|
12
|
+
|
13
|
+
def down
|
14
|
+
change_column :stall_line_items, :data, 'json USING CAST(data AS json)'
|
15
|
+
change_column :stall_payments, :data, 'json USING CAST(data AS json)'
|
16
|
+
change_column :stall_product_lists, :data, 'json USING CAST(data AS json)'
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class CreateAdjustments < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :stall_adjustments do |t|
|
4
|
+
t.string :name, null: false
|
5
|
+
t.monetize :eot_price, null: false, currency: { present: false }
|
6
|
+
t.monetize :price, null: false, currency: { present: false }
|
7
|
+
t.decimal :vat_rate, null: false
|
8
|
+
t.string :type
|
9
|
+
t.references :cart, index: true
|
10
|
+
|
11
|
+
t.timestamps null: false
|
12
|
+
end
|
13
|
+
|
14
|
+
add_foreign_key :stall_adjustments, :stall_product_lists, column: :cart_id
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class AddActiveToStallShippingMethods < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
add_column :stall_shipping_methods, :active, :boolean, default: true
|
4
|
+
|
5
|
+
ShippingMethod.update_all(active: true)
|
6
|
+
end
|
7
|
+
|
8
|
+
def down
|
9
|
+
remove_column :stall_shipping_methods, :active
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class AddActiveToStallPaymentMethods < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
add_column :stall_payment_methods, :active, :boolean, default: true
|
4
|
+
|
5
|
+
PaymentMethod.update_all(active: true)
|
6
|
+
end
|
7
|
+
|
8
|
+
def down
|
9
|
+
remove_column :stall_payment_methods, :active
|
10
|
+
end
|
11
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
%h1= t('stall.checkout.<%= base_file_name %>.title')
|
2
2
|
|
3
|
-
= simple_form_for cart, as: :cart, url: step_path
|
3
|
+
= simple_form_for cart, as: :cart, url: step_path do |form|
|
4
4
|
|
5
5
|
%button.btn.btn-primary{ type: 'submit' }
|
6
6
|
= t('stall.checkout.<%= base_file_name %>.validate')
|
@@ -1,13 +1,21 @@
|
|
1
1
|
class <%= class_name %> < Stall::Checkout::Step
|
2
|
+
# Declare your step validations here
|
3
|
+
# Those validations will be run against the cart object
|
4
|
+
#
|
5
|
+
# validations do
|
6
|
+
# validates :foo, presence: true
|
7
|
+
# end
|
8
|
+
|
2
9
|
# Prepare the `cart` before showing your view
|
3
10
|
#
|
4
11
|
# def prepare
|
5
12
|
# end
|
6
13
|
|
7
|
-
# Process `params` here, defaults to
|
8
|
-
# (params[:cart])
|
14
|
+
# Process `params` here, defaults to assigning the cart with `cart_params`
|
15
|
+
# (params[:cart]) to the cart, running the step validations
|
9
16
|
#
|
10
17
|
# def process
|
18
|
+
# save
|
11
19
|
# end
|
12
20
|
|
13
21
|
# Handle the case where the step should be skipped by returning true from
|
@@ -1,4 +1,30 @@
|
|
1
1
|
Stall.configure do |config|
|
2
|
+
# Store name used by the system when a human readable identifier for your
|
3
|
+
# store is needed, e.g. for payment gateways
|
4
|
+
#
|
5
|
+
config.store_name = "My stall (Change me in config/initializers/stall.rb)"
|
6
|
+
|
7
|
+
# Configure the admin e-mail to which order notifications will be sent
|
8
|
+
#
|
9
|
+
# Either set the `STALL_ADMIN_EMAIL` env var or use the below config.
|
10
|
+
#
|
11
|
+
# You can also set that param as a proc / lambda that will get the cart
|
12
|
+
# as argument, allowing you to dynamically define which e-mail to send
|
13
|
+
# notifications *to*
|
14
|
+
#
|
15
|
+
# config.admin_email = ENV['STALL_ADMIN_EMAIL']
|
16
|
+
|
17
|
+
# Configure the e-mail address used to send e-mails to customers for
|
18
|
+
# order notifications
|
19
|
+
#
|
20
|
+
# Either set the `STALL_SENDER_EMAIL` env var or use the below config
|
21
|
+
#
|
22
|
+
# You can also set that param as a proc / lambda that will get the cart
|
23
|
+
# as argument, allowing you to dynamically define which e-mail to send
|
24
|
+
# notifications *from*
|
25
|
+
#
|
26
|
+
# config.sender_email = ENV['STALL_SENDER_EMAIL']
|
27
|
+
|
2
28
|
# Global default VAT rate, can be overrided by products
|
3
29
|
#
|
4
30
|
# config.vat_rate = BigDecimal.new('20.0')
|
@@ -11,6 +37,19 @@ Stall.configure do |config|
|
|
11
37
|
#
|
12
38
|
# config.application_controller_ancestor = '::ApplicationController'
|
13
39
|
|
40
|
+
# Set a layout to use in the checkouts controllers
|
41
|
+
#
|
42
|
+
# The default is set to nil, which will make the controllers inherit from the
|
43
|
+
# layout of the controller set in `config.application_controller_ancestor`
|
44
|
+
#
|
45
|
+
# config.default_layout = nil
|
46
|
+
|
47
|
+
# Defines the parent mailer for the Stall customer and admin mailers
|
48
|
+
#
|
49
|
+
# If commented out, ActionMailer::Base will be used
|
50
|
+
#
|
51
|
+
config.mailers_parent_class = 'ApplicationMailer'
|
52
|
+
|
14
53
|
# Default currency used in the app for money objects.
|
15
54
|
#
|
16
55
|
# Note : If you need multi currency support in your app, you'll have to ensure
|
@@ -19,6 +58,15 @@ Stall.configure do |config|
|
|
19
58
|
#
|
20
59
|
# param :default_currency, 'EUR'
|
21
60
|
|
61
|
+
# Default app domain use for building URLs in payment gateway forms and in
|
62
|
+
# e-mails.
|
63
|
+
#
|
64
|
+
# Add the `APP_DOMAIN` environment variable, or modify the parameter below.
|
65
|
+
#
|
66
|
+
# Ex : 'localhost:3000', 'www.example.com'
|
67
|
+
#
|
68
|
+
# config.default_app_domain = ENV['APP_DOMAIN']
|
69
|
+
|
22
70
|
# Defined the default checkout wizard used for checking carts out in the
|
23
71
|
# shop process.
|
24
72
|
#
|
@@ -39,12 +87,30 @@ Stall.configure do |config|
|
|
39
87
|
|
40
88
|
# Allows configuring which countries are available for free shipping offers
|
41
89
|
#
|
42
|
-
# Accepts an array of country codes or a proc with
|
90
|
+
# Accepts an array of country codes or a proc with an Address argument
|
43
91
|
#
|
44
92
|
# Defaults to nil, which means all countries are available
|
45
93
|
#
|
46
94
|
# config.shipping.free_shipping.available = nil
|
47
95
|
|
96
|
+
# Register custom shipping methods and calculators
|
97
|
+
#
|
98
|
+
# If no existing shipping method / calculator cover your needs, you can
|
99
|
+
# create one by subclassing Stall::Shipping::Calculator
|
100
|
+
#
|
101
|
+
# Read more at : https://github.com/rails-stall/stall/wiki/Shipping-methods
|
102
|
+
#
|
103
|
+
# config.shipping.register_calculator :my_calculator, 'MyCalculator'
|
104
|
+
|
105
|
+
# Register custom payment methods and gateways
|
106
|
+
#
|
107
|
+
# If no existing payment method / gateway cover your needs, you can
|
108
|
+
# create one by subclassing Stall::Payments::Gateway
|
109
|
+
#
|
110
|
+
# Read more at : https://github.com/rails-stall/stall/wiki/Payment-methods
|
111
|
+
#
|
112
|
+
# config.payment.register_gateway :my_gateway, 'MyGateway'
|
113
|
+
|
48
114
|
# Allows hooking into checkout steps initialization in the steps controller
|
49
115
|
# to inject dependencies to all or a specific step
|
50
116
|
#
|
@@ -54,4 +120,22 @@ Stall.configure do |config|
|
|
54
120
|
# # Only inject in the :some step :
|
55
121
|
# step.inject(:ip, request.remote_ip) if SomeCheckoutStep === step
|
56
122
|
# end
|
123
|
+
|
124
|
+
# Configure app services to override default Stall services and add
|
125
|
+
# functionalities to existing ones
|
126
|
+
#
|
127
|
+
# config.services = {
|
128
|
+
# payment_notification: 'PaymentNotificationService'
|
129
|
+
# }
|
130
|
+
|
131
|
+
# Delay before empty carts are cleaned with the `stall:carts:clean` task
|
132
|
+
#
|
133
|
+
# config.empty_carts_expires_after = 1.day
|
134
|
+
|
135
|
+
# Delay before aborted carts are cleaned with the `stall:carts:clean` task
|
136
|
+
#
|
137
|
+
# Aborted carts are controlled with a scope on the cart model. To change
|
138
|
+
# the `aborted` behavior, you can override the `.aborted` scope in your model.
|
139
|
+
#
|
140
|
+
# config.aborted_carts_expires_after = 14.days
|
57
141
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Stall
|
2
|
+
class ModelGenerator < ::Rails::Generators::NamedBase
|
3
|
+
class ModelModelNotFound < StandardError; end
|
4
|
+
|
5
|
+
MODELS_DIR = File.expand_path('../../../../../app/models', __FILE__)
|
6
|
+
source_root MODELS_DIR
|
7
|
+
|
8
|
+
def copy_model_template
|
9
|
+
if File.exist?(source_path)
|
10
|
+
template source_path, "app/models/#{ file_path_with_ext }"
|
11
|
+
else
|
12
|
+
raise ModelModelNotFound,
|
13
|
+
"Could not find any stall model for #{ class_name }"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def source_path
|
20
|
+
@source_path ||= File.join(MODELS_DIR, file_path_with_ext)
|
21
|
+
end
|
22
|
+
|
23
|
+
def file_path_with_ext
|
24
|
+
@file_path_with_ext ||= "#{ file_path }.rb"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Stall
|
2
|
+
class ServiceGenerator < ::Rails::Generators::NamedBase
|
3
|
+
source_root File.expand_path('../templates', __FILE__)
|
4
|
+
|
5
|
+
def store_services_folder_existence
|
6
|
+
@services_folder_existed = File.exist?('app/services')
|
7
|
+
end
|
8
|
+
|
9
|
+
def copy_service_template
|
10
|
+
template 'service.rb.erb', "app/services/#{ service_file_path }.rb"
|
11
|
+
end
|
12
|
+
|
13
|
+
def post_template_message
|
14
|
+
puts "\n" +
|
15
|
+
"Service class generated. Please add the service to the " +
|
16
|
+
"`config.services` hash in your config/initializers/stall.rb file\n\n"
|
17
|
+
|
18
|
+
return if @services_folder_existed
|
19
|
+
|
20
|
+
puts " * Warning : app/services folder was just created, \n" +
|
21
|
+
" * please restart your server to let Rails know that it should\n" +
|
22
|
+
" * autoload this folder.\n\n"
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def service_class_name
|
28
|
+
@service_class_name ||= service_file_path.camelize
|
29
|
+
end
|
30
|
+
|
31
|
+
def stall_service_class_name
|
32
|
+
@stall_service_class_name ||= ['Stall', service_class_name.demodulize].join('::')
|
33
|
+
end
|
34
|
+
|
35
|
+
def service_file_path
|
36
|
+
@service_file_path ||= [file_path.gsub(/service$/, ''), 'service'].join('_')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|