minicart 0.0.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.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in minicart.gemspec
4
+ gemspec
data/README.rdoc ADDED
@@ -0,0 +1,57 @@
1
+ == Minicart: simple shopping cart w/o dependencies
2
+
3
+ Minicart is a simple shopping cart w/o dependecies written in Ruby
4
+
5
+ == Installation
6
+
7
+ gem install minicart
8
+
9
+ == Example
10
+
11
+ require 'rubygems'
12
+ require 'minicart'
13
+
14
+ # Create some products (just for presentation)
15
+ class Product
16
+ attr_accessor :sku, :name, :price
17
+
18
+ def initialize(sku, name, price)
19
+ @sku, @name, @price = sku, name, price
20
+ end
21
+ end
22
+
23
+ ipad2 = Product.new('ipad2', 'Apple Ipad 2', 500)
24
+ ipod3 = Product.new('ipod3', 'Apple Ipod 3rd Gen', 400)
25
+ iphone4 = Product.new('iph4', 'Apple Iphone 4', 800)
26
+
27
+ # You can use minicart like this
28
+ cart = Minicart::Cart.new
29
+ ipod3_id = cart.add_product ipod3
30
+ iphone4_id = cart.add_product iphone4
31
+ ipad2_id = cart.add_product ipad2
32
+ cart.add_product ipod3
33
+
34
+ cart.remove ipad2_id
35
+ cart.update_quantity(iphone4_id, 5)
36
+
37
+ # check result
38
+ cart.count_items # => 7
39
+ cart.items.map{ |item| item.product.sku } # => ["ipod3", "iph4"]
40
+ cart.item(iphone4_id).quantity # => 5
41
+ cart.item(ipod3_id).product.price # => 400
42
+
43
+ # You can store any object in cart
44
+ # for example: hashes or strings
45
+ cart = Minicart::Cart.new
46
+
47
+ id1 = cart.add_product({'name'=>'Windows', 'price'=>100})
48
+ cart.item(id1).product['price'] # => 100
49
+
50
+ id2 = cart.add_product 'Love Linux'
51
+ cart.item(id2).product # => "Love Linux"
52
+
53
+ cart.count_items # => 2
54
+
55
+ == Author
56
+
57
+ Alex Boreysha gorizvezda@gmail.com
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/lib/minicart.rb ADDED
@@ -0,0 +1,2 @@
1
+ require "minicart/version"
2
+ require "minicart/cart"
@@ -0,0 +1,56 @@
1
+ module Minicart
2
+ class Cart
3
+ # - cart is a collection of items
4
+ # - item is a product, quantity and id of item
5
+
6
+ class Item
7
+ attr_accessor :id, :product, :quantity
8
+
9
+ def initialize(product, quantity = 1, id = self.object_id)
10
+ @product, @quantity, @id = product, quantity, id
11
+ end
12
+ end
13
+
14
+ def initialize
15
+ @items = []
16
+ end
17
+
18
+ def items
19
+ @items
20
+ end
21
+
22
+ def add_product(product)
23
+ if item = item_from_product(product)
24
+ update_quantity(item.id, item.quantity + 1)
25
+ else
26
+ @items << item = Item.new(product)
27
+ end
28
+ item.id
29
+ end
30
+
31
+ def item(item_id)
32
+ @items.detect { |item| item.id == item_id }
33
+ end
34
+
35
+ def remove(item_id)
36
+ @items.delete_if { |item| item.id == item_id }
37
+ end
38
+
39
+ def update_quantity(item_id, quantity)
40
+ @items.map { |item| item.quantity = quantity if item.id == item_id }
41
+ end
42
+
43
+ def count_items
44
+ items.inject(0) { |sum, item| sum += item.quantity }
45
+ end
46
+
47
+ def clear
48
+ @items.clear
49
+ end
50
+
51
+ def item_from_product(product)
52
+ @items.detect { |item| item.product == product }
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,3 @@
1
+ module Minicart
2
+ VERSION = "0.0.1"
3
+ end
data/minicart.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "minicart/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "minicart"
7
+ s.version = Minicart::VERSION
8
+ s.authors = ["Alexander Boreysha"]
9
+ s.email = ["gorizvezda@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Minimal shopping cart}
12
+ s.description = %q{This is minimal shopping cart w/o dependencies}
13
+
14
+ s.rubyforge_project = "minicart"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.require_paths = ["lib"]
19
+
20
+ s.extra_rdoc_files = %w[README.rdoc]
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ # s.add_runtime_dependency "rest-client"
24
+ end
@@ -0,0 +1,114 @@
1
+ require 'minitest/autorun'
2
+
3
+ require 'minicart/cart'
4
+
5
+ describe 'Cart' do
6
+ before do
7
+ @cart = Minicart::Cart.new
8
+ end
9
+
10
+ def non_empty_cart
11
+ cart = Minicart::Cart.new
12
+ cart.add_product 'product1'
13
+ cart.add_product 'product3'
14
+ cart.add_product 'product2'
15
+ cart.add_product 'product3'
16
+ cart
17
+ end
18
+
19
+ it 'create cart' do
20
+ assert @cart
21
+ end
22
+
23
+ it 'add item to cart' do
24
+ assert @cart.add_product('super product')
25
+ end
26
+
27
+ it 'count items' do
28
+ assert_equal 0, @cart.count_items
29
+ assert_equal 4, non_empty_cart.count_items
30
+ end
31
+
32
+ it 'get item by id' do
33
+ cart = non_empty_cart
34
+ item = cart.items[1]
35
+ assert_equal 'product3', cart.item(item.id).product
36
+ end
37
+
38
+ it 'clear cart content' do
39
+ assert_equal [], @cart.items
40
+ @cart.add_product 'some product'
41
+ assert_equal 1, @cart.count_items
42
+ refute_equal [], @cart.items
43
+ @cart.clear
44
+ assert_equal [], @cart.items
45
+ end
46
+
47
+ it 'remove product from cart' do
48
+ cart = non_empty_cart
49
+ item_id = cart.items[2].id
50
+ assert cart.item(item_id)
51
+ cart.remove(item_id)
52
+ refute cart.item(item_id)
53
+ end
54
+
55
+ it 'increment quantity for adding same product' do
56
+ item_id = @cart.add_product 'popular product'
57
+ @cart.add_product 'popular product'
58
+ assert_equal 2, @cart.item(item_id).quantity
59
+ end
60
+
61
+ it 'add item to cart return item_id' do
62
+ assert_equal @cart.add_product('some product'), @cart.items[0].id
63
+ end
64
+
65
+ it 'set quantity of item in shopping cart' do
66
+ cart = non_empty_cart
67
+ item = cart.items[0]
68
+ assert_equal 1, item.quantity
69
+ cart.update_quantity(item.id, 99)
70
+ assert_equal 99, item.quantity
71
+ end
72
+
73
+ it 'possible usage scenario' do
74
+ class Product
75
+ attr_accessor :sku, :name, :price
76
+
77
+ def initialize(sku, name, price)
78
+ @sku, @name, @price = sku, name, price
79
+ end
80
+ end
81
+
82
+ ipad2 = Product.new('ipad2', 'Apple Ipad 2', 500)
83
+ ipod3 = Product.new('ipod3', 'Apple Ipod 3rd Gen', 400)
84
+ iphone4 = Product.new('iph4', 'Apple Iphone 4', 800)
85
+
86
+ cart = Minicart::Cart.new
87
+ ipod3_id = cart.add_product ipod3
88
+ iphone4_id = cart.add_product iphone4
89
+ ipad2_id = cart.add_product ipad2
90
+ cart.add_product ipod3
91
+
92
+
93
+ cart.remove ipad2_id
94
+
95
+ cart.update_quantity(iphone4_id, 5)
96
+
97
+ # check result
98
+ assert_equal 7, cart.count_items
99
+ assert_equal %w[ipod3 iph4], cart.items.map{ |item| item.product.sku }
100
+ assert_equal 5, cart.item(iphone4_id).quantity
101
+ assert_equal 400, cart.item(ipod3_id).product.price
102
+
103
+ # You can store any object in cart as product
104
+ # for example: hashes or strings
105
+ cart = Minicart::Cart.new
106
+
107
+ id1 = cart.add_product({'name'=>'Windows', 'price'=>100})
108
+ assert_equal 100, cart.item(id1).product['price']
109
+
110
+ id2 = cart.add_product 'Love Linux'
111
+ assert_equal 'Love Linux', cart.item(id2).product
112
+ end
113
+ end
114
+
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minicart
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Alexander Boreysha
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-05 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: This is minimal shopping cart w/o dependencies
15
+ email:
16
+ - gorizvezda@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files:
20
+ - README.rdoc
21
+ files:
22
+ - .gitignore
23
+ - Gemfile
24
+ - README.rdoc
25
+ - Rakefile
26
+ - lib/minicart.rb
27
+ - lib/minicart/cart.rb
28
+ - lib/minicart/version.rb
29
+ - minicart.gemspec
30
+ - test/test_minicart.rb
31
+ homepage: ''
32
+ licenses: []
33
+ post_install_message:
34
+ rdoc_options: []
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ requirements: []
50
+ rubyforge_project: minicart
51
+ rubygems_version: 1.8.12
52
+ signing_key:
53
+ specification_version: 3
54
+ summary: Minimal shopping cart
55
+ test_files:
56
+ - test/test_minicart.rb
57
+ has_rdoc: