power_shop 0.1.0 → 0.1.1

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE +20 -0
  6. data/README.md +13 -0
  7. data/Rakefile +18 -0
  8. data/app/controllers/catalog_controller.rb +2 -0
  9. data/app/controllers/power_shop/application_controller.rb +13 -0
  10. data/app/controllers/power_shop/cart_controller.rb +53 -0
  11. data/app/controllers/power_shop/catalog_controller.rb +32 -0
  12. data/app/controllers/power_shop/orders_controller.rb +33 -0
  13. data/app/forms/power_shop/order_form.rb +99 -0
  14. data/app/mailers/order_notifications.rb +2 -0
  15. data/app/mailers/power_shop/order_notifications.rb +29 -0
  16. data/app/models/category.rb +4 -0
  17. data/app/models/order.rb +2 -0
  18. data/app/models/order_item.rb +2 -0
  19. data/app/models/power_shop/category.rb +18 -0
  20. data/app/models/power_shop/order.rb +8 -0
  21. data/app/models/power_shop/order_item.rb +9 -0
  22. data/app/models/power_shop/product.rb +45 -0
  23. data/app/models/power_shop/shop_image.rb +8 -0
  24. data/app/models/power_shop/shopping_cart.rb +8 -0
  25. data/app/models/power_shop/shopping_cart_item.rb +6 -0
  26. data/app/models/product.rb +4 -0
  27. data/app/models/shop_image.rb +3 -0
  28. data/app/models/shopping_cart.rb +2 -0
  29. data/app/models/shopping_cart_item.rb +2 -0
  30. data/app/uploaders/power_shop/shop_image_uploader.rb +30 -0
  31. data/app/uploaders/shop_image_uploader.rb +2 -0
  32. data/app/views/power_shop/cart/show.html.erb +0 -0
  33. data/app/views/power_shop/catalog/category.html.erb +0 -0
  34. data/app/views/power_shop/catalog/index.html.erb +2 -0
  35. data/app/views/power_shop/catalog/product.html.erb +0 -0
  36. data/app/views/power_shop/orders/success.html.erb +0 -0
  37. data/config/locales/ru.yml +12 -0
  38. data/config/routes.rb +18 -0
  39. data/db/migrate/20140723131458_create_categories.rb +20 -0
  40. data/db/migrate/20140728071046_create_products.rb +20 -0
  41. data/db/migrate/20140729041407_create_cart.rb +8 -0
  42. data/db/migrate/20140731171009_create_shop_image.rb +13 -0
  43. data/db/migrate/20140804101936_create_friendly_id_slugs.rb +15 -0
  44. data/db/migrate/20140828061402_create_orders.rb +13 -0
  45. data/db/migrate/20140828061556_create_order_items.rb +14 -0
  46. data/lib/generators/power_shop/install/install_generator.rb +20 -0
  47. data/lib/generators/power_shop/install/templates/active_admin/category.rb.erb +43 -0
  48. data/lib/generators/power_shop/install/templates/active_admin/order.rb +50 -0
  49. data/lib/generators/power_shop/install/templates/active_admin/product.rb.erb +64 -0
  50. data/lib/power_shop/engine.rb +27 -0
  51. data/lib/power_shop/middleware/shopping_cart.rb +26 -0
  52. data/lib/power_shop/version.rb +3 -0
  53. data/lib/power_shop.rb +4 -0
  54. data/lib/spec.rake +15 -0
  55. data/lib/tasks/spec.rake +15 -0
  56. data/power_shop.gemspec +45 -0
  57. data/script/rails +7 -0
  58. data/spec/dummy/app/assets/images/.keep +0 -0
  59. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  60. data/spec/dummy/app/mailers/.keep +0 -0
  61. data/spec/dummy/app/models/.keep +0 -0
  62. data/spec/dummy/app/models/concerns/.keep +0 -0
  63. data/spec/dummy/lib/assets/.keep +0 -0
  64. data/spec/dummy/log/.keep +0 -0
  65. metadata +78 -10
  66. data/spec/dummy/log/test.log +0 -85730
@@ -0,0 +1,13 @@
1
+ class CreateOrders < ActiveRecord::Migration
2
+ def change
3
+ create_table :orders do |t|
4
+ t.string :user_name
5
+ t.string :user_phone
6
+ t.string :user_email
7
+ t.string :delivery_address
8
+ t.float :total, null: false
9
+
10
+ t.timestamps
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ class CreateOrderItems < ActiveRecord::Migration
2
+ def change
3
+ create_table :order_items do |t|
4
+ t.belongs_to :order, null: false
5
+ t.belongs_to :product, null: false
6
+ t.string :product_title, null: false
7
+ t.float :price, null: false
8
+ t.integer :quantity, null: false
9
+ end
10
+
11
+ add_index :order_items, :order_id
12
+ add_index :order_items, :product_id
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ require 'rails/generators/active_record'
2
+
3
+ module PowerShop
4
+ module Generators
5
+ class InstallGenerator < ActiveRecord::Generators::Base
6
+ desc "Installs Power Shop"
7
+
8
+ def self.source_root
9
+ @_power_shop_source_root ||= File.expand_path("../templates", __FILE__)
10
+ end
11
+
12
+ def setup_directory
13
+ empty_directory "app/admin"
14
+
15
+ template 'active_admin/category.rb.erb', 'app/admin/category.rb'
16
+ template 'active_admin/product.rb.erb', 'app/admin/product.rb'
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,43 @@
1
+ ActiveAdmin.register Category do
2
+ menu :priority => 4, label: 'Categories'
3
+
4
+ config.sort_order = 'lft_asc'
5
+ sortable_tree_member_actions
6
+
7
+ permit_params :id, :name, :parent_id, :description,
8
+ image_attributes: [:id, :_destroy, :image]
9
+
10
+ index do
11
+ sortable_tree_indented_column :name
12
+
13
+ actions
14
+ sortable_tree_columns
15
+ end
16
+
17
+ filter :name
18
+
19
+ form(:html => { :multipart => true }) do |f|
20
+ f.inputs do
21
+ f.input :parent, :as => :select
22
+ f.input :name
23
+ f.input :description, :as => :ckeditor
24
+ end
25
+
26
+ f.inputs 'Image', :for => [:image, f.object.image || f.object.build_image] do |image_form|
27
+ image_form.input :image,
28
+ :hint => f.object.image.present? ? image_tag(f.object.image.image.admin_thumb.url) : ''
29
+
30
+ unless f.object.image.new_record?
31
+ image_form.input :_destroy, :as => :boolean, :label => 'delete?'
32
+ end
33
+ end
34
+
35
+ f.actions
36
+ end
37
+
38
+ controller do
39
+ def find_resource
40
+ scoped_collection.friendly.find(params[:id])
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,50 @@
1
+ ActiveAdmin.register Order do
2
+ menu :priority => 2, label: 'Orders'
3
+
4
+ filter :user_name
5
+ filter :user_phone
6
+ filter :user_email
7
+ filter :created_at
8
+
9
+ # == Customization list items
10
+ index do
11
+ column :id
12
+ column :user_name
13
+ column :user_phone
14
+ column :user_email
15
+ column :total
16
+ column :created_at
17
+
18
+ column "" do |resource|
19
+ links = ''.html_safe
20
+ links += link_to I18n.t('active_admin.view'), resource_path(resource), :class => "member_link view_link"
21
+ links
22
+ end
23
+ end
24
+
25
+ # == Customization show page
26
+ show do |order|
27
+ attributes_table do
28
+ row :id
29
+ row :user_name
30
+ row :user_phone
31
+ row :user_email
32
+ row :total
33
+ row :delivery_address
34
+ end
35
+
36
+ panel "Заказанные товары" do
37
+ table_for order.order_items do |t|
38
+ t.column('Название товара') do |item|
39
+ if item.product.present?
40
+ link_to item.product.name, admin_product_path(item.product)
41
+ else
42
+ item.product_title
43
+ end
44
+ end
45
+ t.column('Цена') { |item| item.price }
46
+ t.column('Количество') { |item| item.quantity }
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,64 @@
1
+ ActiveAdmin.register Product do
2
+ menu :priority => 3, label: 'Products'
3
+
4
+ permit_params :category_id, :active, :name, :slug, :price, :description,
5
+ images_attributes: [:id, :_destroy, :image]
6
+
7
+ form(:html => { :multipart => true }) do |f|
8
+ f.inputs 'Product' do
9
+ f.input :category, :as => :select,
10
+ :collection => Category.all.collect { |c| ["#{' -- ' * c.depth}#{c.name}", c.id ] }
11
+ f.input :active
12
+ f.input :name
13
+ f.input :price
14
+ f.input :description, :as => :ckeditor
15
+ end
16
+
17
+ f.inputs 'Additional images' do
18
+ f.has_many :images do |image_form|
19
+ image_form.input :image, :as => :file,
20
+ :hint => image_tag(image_form.object.image.admin_thumb.url)
21
+ image_form.input :_destroy, :as => :boolean, :label => 'delete?'
22
+ end
23
+ end
24
+
25
+ f.actions
26
+ end
27
+
28
+ index do
29
+ column :name
30
+ column :image do |product|
31
+ if (image = product.main_image).present?
32
+ link_to edit_admin_product_path(product) do
33
+ image_tag(product.main_image.image.admin_thumb.url)
34
+ end
35
+ else
36
+ status_tag('Image not uplaoded')
37
+ end
38
+ end
39
+ column :slug
40
+ column :category
41
+ column :active do |product|
42
+ product.active? ? status_tag("Active", :ok) : status_tag("Disabled")
43
+ end
44
+ column :price
45
+
46
+ actions
47
+ end
48
+
49
+ filter :active
50
+ filter :category
51
+ filter :name
52
+ filter :price
53
+
54
+ # Preload association fore remove (n+1) query
55
+ def scoped_collection
56
+ resource_class.includes(:category, :images)
57
+ end
58
+
59
+ controller do
60
+ def find_resource
61
+ scoped_collection.friendly.find(params[:id])
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,27 @@
1
+ require 'rails'
2
+ require 'pg'
3
+
4
+ require 'awesome_nested_set'
5
+ require 'acts_as_shopping_cart'
6
+ require 'carrierwave'
7
+ require 'friendly_id'
8
+ require 'kaminari'
9
+ require 'validates_email_format_of'
10
+
11
+ module PowerShop
12
+ class Engine < Rails::Engine
13
+ isolate_namespace PowerShop
14
+
15
+ config.autoload_paths += %W(#{config.root}/lib)
16
+
17
+ initializer 'power_shop.add_middleware' do |app|
18
+ app.middleware.use PowerShop::Middleware::ShoppingCart
19
+ end
20
+
21
+ initializer :power_shop_factories, after: "factory_girl.set_factory_paths" do |app|
22
+ if defined?(FactoryGirl)
23
+ FactoryGirl.definition_file_paths << root.join('spec', 'factories')
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ module PowerShop
2
+ module Middleware
3
+ # Public: class find shopping cart from session for existing user
4
+ # or create new shopping cart in session
5
+ class ShoppingCart
6
+ def initialize(app)
7
+ @app = app
8
+ end
9
+
10
+ def call(env)
11
+ unless env['PATH_INFO'] =~ %r{^/assets/}
12
+ env['shopping_cart'] ||= get_or_crete_cart(env['rack.session'])
13
+ end
14
+
15
+ @app.call(env)
16
+ end
17
+
18
+ def get_or_crete_cart(session)
19
+ cart = ::ShoppingCart.find_or_create_by_id(session[:shopping_cart_id])
20
+ session[:shopping_cart_id] = cart.id
21
+
22
+ cart
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,3 @@
1
+ module PowerShop
2
+ VERSION = '0.1.1'
3
+ end
data/lib/power_shop.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'power_shop/engine'
2
+
3
+ module PowerShop
4
+ end
data/lib/spec.rake ADDED
@@ -0,0 +1,15 @@
1
+ namespace :power_shop do
2
+ namespace :spec do
3
+ task :prepare do
4
+ Rake::Task['app:log:clear'].invoke
5
+ Rake::Task['app:db:abort_if_pending_migrations'].clear
6
+ Rake::Task['app:db:test:prepare'].invoke
7
+ Rake::Task['app:db:migrate'].invoke
8
+ end
9
+ end
10
+
11
+ desc 'Run all tulip engine specs'
12
+ task :spec => 'spec:prepare' do
13
+ exec 'rspec'
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ namespace :power_shop do
2
+ namespace :spec do
3
+ task :prepare do
4
+ Rake::Task['app:log:clear'].invoke
5
+ Rake::Task['app:db:abort_if_pending_migrations'].clear
6
+ Rake::Task['app:db:test:prepare'].invoke
7
+ Rake::Task['app:db:migrate'].invoke
8
+ end
9
+ end
10
+
11
+ desc 'Run all tulip engine specs'
12
+ task :spec => 'spec:prepare' do
13
+ exec 'rspec'
14
+ end
15
+ end
@@ -0,0 +1,45 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+
3
+ require "power_shop/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'power_shop'
7
+ s.version = PowerShop::VERSION
8
+ s.authors = ["Semyon Pupkov"]
9
+ s.email = ["semen.pupkov@gmail.com"]
10
+ s.homepage = "https://github.com/artofhuman/power_shop"
11
+ s.summary = "Simple and flexible Ruby On Rails Ecomerce engine"
12
+ s.description = "Simple and flexible Ruby On Rails Ecomerce engine"
13
+
14
+ s.licenses = ['MIT']
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_dependency 'rails', '~> 4.0.0'
22
+ s.add_dependency 'awesome_nested_set'
23
+ s.add_dependency 'pg'
24
+
25
+ s.add_dependency 'carrierwave'
26
+ s.add_dependency 'kaminari'
27
+ # TODO: migrate to minimagic
28
+ s.add_dependency 'rmagick'
29
+ s.add_dependency 'validates_email_format_of'
30
+
31
+ #s.add_dependency 'active_admin-awesome_nested_set'
32
+
33
+ s.add_dependency 'acts_as_shopping_cart', '~> 0.2.1'
34
+ s.add_dependency 'friendly_id', '~> 5.0.0'
35
+
36
+ s.add_development_dependency 'simplecov'
37
+ s.add_development_dependency 'rspec-core'
38
+ s.add_development_dependency 'rspec-rails', '~> 3.0.0'
39
+ s.add_development_dependency 'simplecov'
40
+ s.add_development_dependency 'shoulda-matchers'
41
+ s.add_development_dependency 'factory_girl_rails'
42
+
43
+ s.add_development_dependency 'pry-rails'
44
+ s.add_development_dependency 'pry-byebug'
45
+ end
data/script/rails ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
4
+ ENGINE_PATH = File.expand_path('../../lib/power_shop/engine', __FILE__)
5
+
6
+ require 'rails/all'
7
+ require 'rails/engine/commands'
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: power_shop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Semyon Pupkov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-07 00:00:00.000000000 Z
11
+ date: 2014-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -255,16 +255,80 @@ executables: []
255
255
  extensions: []
256
256
  extra_rdoc_files: []
257
257
  files:
258
+ - .gitignore
259
+ - .rspec
260
+ - Gemfile
261
+ - LICENSE
262
+ - README.md
263
+ - Rakefile
264
+ - app/controllers/catalog_controller.rb
265
+ - app/controllers/power_shop/application_controller.rb
266
+ - app/controllers/power_shop/cart_controller.rb
267
+ - app/controllers/power_shop/catalog_controller.rb
268
+ - app/controllers/power_shop/orders_controller.rb
269
+ - app/forms/power_shop/order_form.rb
270
+ - app/mailers/order_notifications.rb
271
+ - app/mailers/power_shop/order_notifications.rb
272
+ - app/models/category.rb
273
+ - app/models/order.rb
274
+ - app/models/order_item.rb
275
+ - app/models/power_shop/category.rb
276
+ - app/models/power_shop/order.rb
277
+ - app/models/power_shop/order_item.rb
278
+ - app/models/power_shop/product.rb
279
+ - app/models/power_shop/shop_image.rb
280
+ - app/models/power_shop/shopping_cart.rb
281
+ - app/models/power_shop/shopping_cart_item.rb
282
+ - app/models/product.rb
283
+ - app/models/shop_image.rb
284
+ - app/models/shopping_cart.rb
285
+ - app/models/shopping_cart_item.rb
286
+ - app/uploaders/power_shop/shop_image_uploader.rb
287
+ - app/uploaders/shop_image_uploader.rb
288
+ - app/views/power_shop/cart/show.html.erb
289
+ - app/views/power_shop/catalog/category.html.erb
290
+ - app/views/power_shop/catalog/index.html.erb
291
+ - app/views/power_shop/catalog/product.html.erb
292
+ - app/views/power_shop/orders/success.html.erb
293
+ - config/locales/ru.yml
294
+ - config/routes.rb
295
+ - db/migrate/20140723131458_create_categories.rb
296
+ - db/migrate/20140728071046_create_products.rb
297
+ - db/migrate/20140729041407_create_cart.rb
298
+ - db/migrate/20140731171009_create_shop_image.rb
299
+ - db/migrate/20140804101936_create_friendly_id_slugs.rb
300
+ - db/migrate/20140828061402_create_orders.rb
301
+ - db/migrate/20140828061556_create_order_items.rb
302
+ - lib/generators/power_shop/install/install_generator.rb
303
+ - lib/generators/power_shop/install/templates/active_admin/category.rb.erb
304
+ - lib/generators/power_shop/install/templates/active_admin/order.rb
305
+ - lib/generators/power_shop/install/templates/active_admin/product.rb.erb
306
+ - lib/power_shop.rb
307
+ - lib/power_shop/engine.rb
308
+ - lib/power_shop/middleware/shopping_cart.rb
309
+ - lib/power_shop/version.rb
310
+ - lib/spec.rake
311
+ - lib/tasks/spec.rake
312
+ - power_shop.gemspec
313
+ - script/rails
258
314
  - spec/controllers/cart_controller_spec.rb
259
315
  - spec/controllers/catalog_controller_spec.rb
316
+ - spec/dummy/README.rdoc
317
+ - spec/dummy/Rakefile
318
+ - spec/dummy/app/assets/images/.keep
260
319
  - spec/dummy/app/assets/javascripts/application.js
261
320
  - spec/dummy/app/assets/stylesheets/application.css
262
321
  - spec/dummy/app/controllers/application_controller.rb
322
+ - spec/dummy/app/controllers/concerns/.keep
263
323
  - spec/dummy/app/helpers/application_helper.rb
324
+ - spec/dummy/app/mailers/.keep
325
+ - spec/dummy/app/models/.keep
326
+ - spec/dummy/app/models/concerns/.keep
264
327
  - spec/dummy/app/views/layouts/application.html.erb
265
328
  - spec/dummy/bin/bundle
266
329
  - spec/dummy/bin/rails
267
330
  - spec/dummy/bin/rake
331
+ - spec/dummy/config.ru
268
332
  - spec/dummy/config/application.rb
269
333
  - spec/dummy/config/boot.rb
270
334
  - spec/dummy/config/database.yml
@@ -284,16 +348,14 @@ files:
284
348
  - spec/dummy/config/locales/en.yml
285
349
  - spec/dummy/config/routes.rb
286
350
  - spec/dummy/config/secrets.yml
287
- - spec/dummy/config.ru
288
351
  - spec/dummy/db/schema.rb
352
+ - spec/dummy/lib/assets/.keep
353
+ - spec/dummy/log/.keep
289
354
  - spec/dummy/log/development.log
290
- - spec/dummy/log/test.log
291
355
  - spec/dummy/public/404.html
292
356
  - spec/dummy/public/422.html
293
357
  - spec/dummy/public/500.html
294
358
  - spec/dummy/public/favicon.ico
295
- - spec/dummy/Rakefile
296
- - spec/dummy/README.rdoc
297
359
  - spec/factories/categories.rb
298
360
  - spec/factories/order.rb
299
361
  - spec/factories/products.rb
@@ -332,14 +394,22 @@ summary: Simple and flexible Ruby On Rails Ecomerce engine
332
394
  test_files:
333
395
  - spec/controllers/cart_controller_spec.rb
334
396
  - spec/controllers/catalog_controller_spec.rb
397
+ - spec/dummy/README.rdoc
398
+ - spec/dummy/Rakefile
399
+ - spec/dummy/app/assets/images/.keep
335
400
  - spec/dummy/app/assets/javascripts/application.js
336
401
  - spec/dummy/app/assets/stylesheets/application.css
337
402
  - spec/dummy/app/controllers/application_controller.rb
403
+ - spec/dummy/app/controllers/concerns/.keep
338
404
  - spec/dummy/app/helpers/application_helper.rb
405
+ - spec/dummy/app/mailers/.keep
406
+ - spec/dummy/app/models/.keep
407
+ - spec/dummy/app/models/concerns/.keep
339
408
  - spec/dummy/app/views/layouts/application.html.erb
340
409
  - spec/dummy/bin/bundle
341
410
  - spec/dummy/bin/rails
342
411
  - spec/dummy/bin/rake
412
+ - spec/dummy/config.ru
343
413
  - spec/dummy/config/application.rb
344
414
  - spec/dummy/config/boot.rb
345
415
  - spec/dummy/config/database.yml
@@ -359,16 +429,14 @@ test_files:
359
429
  - spec/dummy/config/locales/en.yml
360
430
  - spec/dummy/config/routes.rb
361
431
  - spec/dummy/config/secrets.yml
362
- - spec/dummy/config.ru
363
432
  - spec/dummy/db/schema.rb
433
+ - spec/dummy/lib/assets/.keep
434
+ - spec/dummy/log/.keep
364
435
  - spec/dummy/log/development.log
365
- - spec/dummy/log/test.log
366
436
  - spec/dummy/public/404.html
367
437
  - spec/dummy/public/422.html
368
438
  - spec/dummy/public/500.html
369
439
  - spec/dummy/public/favicon.ico
370
- - spec/dummy/Rakefile
371
- - spec/dummy/README.rdoc
372
440
  - spec/factories/categories.rb
373
441
  - spec/factories/order.rb
374
442
  - spec/factories/products.rb