vending-machine 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.
data/README.md CHANGED
@@ -51,7 +51,7 @@ Once you have a store instance you can retrieve your objects
51
51
  ```ruby
52
52
  customers = store.customers
53
53
  customers.first.customer_code
54
- => ["WALKIN"]
54
+ => "WALKIN"
55
55
  ```
56
56
 
57
57
  ### Payment Types
@@ -69,6 +69,7 @@ store.products.map &:name
69
69
  => ["Coffee (Demo)", "T-shirt (Demo)", "Discount", "test"]
70
70
  ```
71
71
 
72
+ #### Scopes
72
73
  Scopes available: `active`, `order_by`, `order_direction` and an `order` shortcut to do both order by and direction at once. Scopes are chainable.
73
74
 
74
75
  ```ruby
@@ -85,6 +86,34 @@ store.products.order('name', 'DESC').map &:name
85
86
  => ["test", "T-shirt (Demo)", "Discount", "Coffee (Demo)"]
86
87
  ```
87
88
 
89
+ #### Creating a Product
90
+
91
+ Initialize a new product with `#build`, `#create` or `#create!`.
92
+
93
+ * `build` create an unsaved instance
94
+ * `create` create an instance, and call `#save`
95
+ * `create!` create an instance, and call `#save!`
96
+
97
+
98
+ ```ruby
99
+ product = store.products.build name: "Product Name", handle: "prod1", retail_price: 25
100
+
101
+ # Safe save
102
+ product.save
103
+ => false
104
+
105
+ product.error
106
+ => ["Could not Add or Update: Missing sku"]
107
+
108
+ # Explosive save
109
+ product.save!
110
+ => Vend::ValidationFailed: Could not Add or Update: Missing sku
111
+
112
+ product.sku = 'prod1'
113
+ product.save!
114
+ => true
115
+ ```
116
+
88
117
  ### Register Sales
89
118
 
90
119
  ```ruby
@@ -93,10 +122,10 @@ sales = store.sales
93
122
  sales.map{|sale| sale.total_price + sale.total_tax }
94
123
  => [1337.0, 1341.95]
95
124
 
96
- sales.first.register_sale_products.map &:name
97
- => ["T-shirt (Demo)"]
125
+ sales.first.products.map &:name
126
+ => ["T-shirt (Demo)", "Coffee (Demo)"]
98
127
 
99
- sales.first.register_sale_products.first.to_s
128
+ sales.first.products.first
100
129
  => "#<Vend::RegisterSaleProduct:0x007fe238720d68>"
101
130
  ```
102
131
 
@@ -104,7 +133,7 @@ sales.first.register_sale_products.first.to_s
104
133
 
105
134
  ```ruby
106
135
  store.registers.map &:name
107
- => ["Main Register"]
136
+ => ["Main Register", "Back office Register"]
108
137
  ```
109
138
 
110
139
  ### Suppliers
@@ -118,10 +147,10 @@ store.suppliers.map &:name
118
147
 
119
148
  ```ruby
120
149
  store.taxes.map &:name
121
- => ["NZ GST", "AU GST", "Some other tax"]
150
+ => ["NZ GST", "AU GST", "Asshole Tax"]
122
151
  ```
123
152
 
124
- The `default` scope will provide you the first returned default tax (note, this still retrieves all taxes).
153
+ The `default` scope will provide you the first returned default tax (note, this still retrieves all taxes from the API).
125
154
 
126
155
  ```ruby
127
156
  store.taxes.default.name
@@ -138,7 +167,9 @@ store.users.map &:name
138
167
  ## Status
139
168
  * COMPLETE: GET index resources are implemented, with the exception of Stock Control
140
169
  * IN PROGRESS: find singular resources `store.products.find('some_id')`
141
- * IN PROGRESS: create resources `store.sale.create products: [product1, product2]`
170
+ * IN PROGRESS: create register sales `store.sale.create products: [product1, product2]`
171
+ * COMPLETE: create products
172
+ * IN PROGRESS: Create Product Variants (This seems to happen when posting a new product with a same handle, but different sku)
142
173
  * TODO: Delete resources
143
174
  * TODO: Scopes for Customer and Register Sales
144
175
 
@@ -1,10 +1,36 @@
1
+ require 'json'
2
+
1
3
  module Vend
2
4
  class RemoteResource < Resource
3
5
  include Vend::DeclarativeSetters
4
6
  include Vend::Paths
5
7
 
8
+ attr_reader :error
9
+
6
10
  def save
7
- id ? save_existing : save_new
11
+ begin
12
+ save!
13
+ rescue ValidationFailed
14
+ (@error ||= []) << $!.message
15
+ false
16
+ end
17
+ end
18
+
19
+ def save!
20
+ save_path = id ? update_path : self.class.create_path
21
+ method = id ? :put : :post
22
+ response = store.send(method, path: save_path,
23
+ data: sendable_attributes.to_json,
24
+ status: 200
25
+ ).data
26
+
27
+ if response['status'] && response['status'] == 'error'
28
+ raise ValidationFailed.
29
+ new [response['error'], response['details']].join(': ')
30
+ end
31
+
32
+ self.attributes = response[self.class.path]
33
+ true
8
34
  end
9
35
 
10
36
  def load
@@ -24,23 +50,5 @@ module Vend
24
50
  }
25
51
  attributes.delete_if{|name,value| blacklist.include? name }.dup
26
52
  end
27
-
28
- def save_new
29
- self.attributes = store.post(
30
- path: create_path,
31
- parameters: sendable_attributes,
32
- status: 200
33
- ).data
34
- self
35
- end
36
-
37
- def save_existing
38
- self.attributes = store.put(
39
- path: update_path,
40
- parameters: sendable_attributes,
41
- status: 200
42
- ).data
43
- self
44
- end
45
53
  end
46
54
  end
@@ -26,6 +26,10 @@ module Vend
26
26
  build(attributes).tap(&:save)
27
27
  end
28
28
 
29
+ def create!(attributes = {})
30
+ build(attributes).tap(&:save!)
31
+ end
32
+
29
33
  def build(attributes)
30
34
  @klass.new(attributes.merge store: @store)
31
35
  end
@@ -1,9 +1,6 @@
1
1
  # TODO: Implement the attribute declaration as a Proc to avoid this
2
2
  module Vend
3
- class Product < RemoteResource
4
- end
5
- end
6
- module Vend
3
+ class Product < RemoteResource; end
7
4
  class Inventory < RemoteResource
8
5
  attribute :attributed_cost, Float
9
6
  attribute :count, Integer
@@ -15,6 +15,13 @@ module Vend
15
15
  attribute :tax, Float
16
16
  attribute :tax_rate, Float
17
17
 
18
+ ##
19
+ # Required Attributes
20
+ attribute :name, String
21
+ attribute :handle, String
22
+ attribute :sku, String
23
+ attribute :retail_price, Float
24
+
18
25
  ##
19
26
  # Scopes
20
27
  collection_scope :active, default: true
@@ -8,9 +8,11 @@ module Vend
8
8
  attribute :total_price, Float
9
9
  attribute :total_tax, Float
10
10
  attribute :totals, Hash[Symbol => Float] # Requires updated virtus gem
11
- #attribute :totals, Array[Float]
12
11
  attribute :user, Vend::User
13
12
 
13
+ alias_method :products, :register_sale_products
14
+ alias_method :payments, :register_sale_payments
15
+
14
16
  path "register_sale"
15
17
  end
16
18
  end
data/lib/vend/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Vend
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vending-machine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-13 00:00:00.000000000 Z
12
+ date: 2012-12-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
@@ -165,7 +165,6 @@ files:
165
165
  - .gitignore
166
166
  - Gemfile
167
167
  - LICENSE
168
- - LICENSE.txt
169
168
  - README.md
170
169
  - Rakefile
171
170
  - lib/vend.rb
data/LICENSE.txt DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2012 Mal Curtis
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.