magentwo 0.1.4 → 0.1.9
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/.gitignore +2 -0
- data/README.md +187 -3
- data/lib/adapter.rb +19 -8
- data/lib/connection.rb +34 -20
- data/lib/dataset.rb +94 -16
- data/lib/filter.rb +46 -3
- data/lib/magentwo.rb +50 -6
- data/lib/model/base.rb +39 -9
- data/lib/model/cart.rb +12 -0
- data/lib/model/category.rb +10 -0
- data/lib/model/coupon.rb +5 -1
- data/lib/model/order.rb +25 -0
- data/lib/model/product.rb +14 -0
- data/lib/model/sales_rule.rb +18 -0
- data/lib/model/stock_item.rb +12 -0
- data/magentwo.gemspec +1 -1
- data/spec/dataset_spec.rb +27 -2
- data/spec/product_spec.rb +79 -0
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20edcef61f1dd6dcb2d941e61c8c2ec307b3b34f5a8cc20a6bd4b7e5ac13fb78
|
4
|
+
data.tar.gz: 69d77fdbd17a9379a6f17427a3e2095b30aa8f4d36e8f4dc0cba6400767439e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e0e08d0b6d433b7e3c8a67a0c1e31a1e15784facf810c3f959cf4c078feb38f3dfde82bc84d55cb3f8ee1fb815b2c87fcfb8273b2ec6bad2598a8f8683c6c2c3
|
7
|
+
data.tar.gz: 6068da51a75fa3cf357354341d9c8a8b27976321454ae44dc0a6e7294db97b57e737cc5f4dedb05f81691f587f33630cabe71265ae3c794e98687147a12839e0
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,188 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
This gem is under developement and nowhere near finished but feel free to play around with it.
|
2
|
+
I am grateful for any ideas and suggestions
|
3
3
|
|
4
|
-
|
4
|
+
# Magentwo
|
5
|
+
|
6
|
+
Ruby-Wrapper for the Magento 2 REST API
|
7
|
+
|
8
|
+
# How to install
|
9
|
+
|
10
|
+
To install the Gem directly use
|
11
|
+
|
12
|
+
```
|
13
|
+
gem install magentwo
|
14
|
+
```
|
15
|
+
|
16
|
+
or add the following line to your Gemfile
|
17
|
+
|
18
|
+
```
|
19
|
+
gem 'magentwo'
|
20
|
+
```
|
21
|
+
|
22
|
+
and call bundler
|
23
|
+
|
24
|
+
```
|
25
|
+
bundle
|
26
|
+
```
|
27
|
+
|
28
|
+
# How to connect to your magento 2 shop
|
29
|
+
|
30
|
+
When only using one connection simply type
|
31
|
+
|
32
|
+
```
|
33
|
+
Magentwo.connect "http://example.com", "user_name", "password"
|
34
|
+
```
|
35
|
+
|
36
|
+
or
|
37
|
+
|
38
|
+
```
|
39
|
+
Magentwo.connect_with_token "http://example.com", "my_secret_token"
|
40
|
+
```
|
41
|
+
|
42
|
+
When using multiple connections at once you can save the result of `Magentwo.connect` and use the `Magentwo.with` method
|
43
|
+
|
44
|
+
```
|
45
|
+
connection1 = Magentwo.connect "http://example1.com", "user_name", "password"
|
46
|
+
connection2 = Magentwo.connect_with_token "http://example2.com", "my_secret_token"
|
47
|
+
|
48
|
+
Magentwo.with (connection1) do
|
49
|
+
#do things in the context of connection1
|
50
|
+
end
|
51
|
+
Magentwo.with (connection2) do
|
52
|
+
#do things in the context of connection2
|
53
|
+
end
|
54
|
+
```
|
55
|
+
|
56
|
+
# How to use
|
57
|
+
|
58
|
+
In Magentwo you interact with the API using Models. These are named according the the REST-API specifications of Magento 2
|
59
|
+
The basic functionality is the same for all Models. For products some simple requests would look like this
|
60
|
+
|
61
|
+
```
|
62
|
+
Magentwo::Product.all #fetches all Products
|
63
|
+
Magentwo::Product.first #fetches the first product
|
64
|
+
Magentwo::Product.count #returns the number of available products
|
65
|
+
Magentwo::Product.fields #returns an array of productfields
|
66
|
+
```
|
67
|
+
|
68
|
+
# Filtering
|
69
|
+
|
70
|
+
You can filter requests to search for specific elements
|
71
|
+
Here are some examples
|
72
|
+
|
73
|
+
Look for all customers whose firstname is Foobar
|
74
|
+
|
75
|
+
```
|
76
|
+
Magentwo::Customer.filter(:firstname => "Foobar").all
|
77
|
+
```
|
78
|
+
|
79
|
+
Look for all customers whose id is not 42
|
80
|
+
|
81
|
+
```
|
82
|
+
Magentwo::Customer.exclude(:id => 42).all
|
83
|
+
```
|
84
|
+
|
85
|
+
You can also combine these
|
86
|
+
|
87
|
+
```
|
88
|
+
Magentwo::Customer.filter(:firstname => "Foobar").exclude(:id => 42).all
|
89
|
+
```
|
90
|
+
|
91
|
+
The `filter` and `exclude` methods can also be used to filter for a set. To Request all Customers whose firstname is either Foo or Bar you could write
|
92
|
+
|
93
|
+
```
|
94
|
+
Magentwo::Customer.filter(:firstname => ["Foo", "bar"]).all
|
95
|
+
```
|
96
|
+
|
97
|
+
Look for all Products whose name includes the word "Computer"
|
98
|
+
|
99
|
+
```
|
100
|
+
Magentwo::Product.like(:name => "%Computer%").all
|
101
|
+
```
|
102
|
+
|
103
|
+
Compare using `gt`, `gteq`, `lt` or `lteq`. These methods do not seem to work with dates, please use `from` and `to` when e.g. trying to fetch all Products that changed within a certain period.
|
104
|
+
|
105
|
+
```
|
106
|
+
Magentwo::Product.lt(:price => 42).all
|
107
|
+
Magentwo::Product.gt(:id => 1337).first
|
108
|
+
```
|
109
|
+
|
110
|
+
Compare using `from` and `to`, you may also use both to specify a range.
|
111
|
+
|
112
|
+
```
|
113
|
+
Magentwo::Product.from(:updated_at => Time.new(2019, 1, 1).all
|
114
|
+
Magentwo::Product.to(:created_at => Time.new(2019, 2, 1).all
|
115
|
+
```
|
116
|
+
|
117
|
+
All of these filter-functions can be chained as needed
|
118
|
+
|
119
|
+
# Select
|
120
|
+
|
121
|
+
If you know which fields you are interested in you can speed up the fetching process by only requesting these fields
|
122
|
+
|
123
|
+
```
|
124
|
+
Magentwo::Product.filter(...).select(:id, :sku).all
|
125
|
+
```
|
126
|
+
|
127
|
+
# Pagination
|
128
|
+
|
129
|
+
On default the pagesize is set to 20, you can change this with
|
130
|
+
|
131
|
+
```
|
132
|
+
Magentwo.default_page_size=42
|
133
|
+
```
|
134
|
+
|
135
|
+
The pagesize can also be set on the fly
|
136
|
+
To request page 2 with a pagesize of 100 simply write the following. The second paramter is optional
|
137
|
+
|
138
|
+
```
|
139
|
+
Magentwo::Product.exclude(:name => "foobar").page(2, 100).all
|
140
|
+
```
|
141
|
+
|
142
|
+
To iterate threw all the pages use `each_page`. Again the pagesize parameter is optional
|
143
|
+
|
144
|
+
```
|
145
|
+
Magentwo::Product.each_page(512) do |page|
|
146
|
+
p page
|
147
|
+
end
|
148
|
+
```
|
149
|
+
|
150
|
+
You may also want to fetch all pages of products that match a certain criteria
|
151
|
+
|
152
|
+
```
|
153
|
+
Magentwo::Product.from(:updated_at => my_last_sync_value).each_page(512) do |page|
|
154
|
+
p page
|
155
|
+
end
|
156
|
+
```
|
157
|
+
|
158
|
+
# Order
|
159
|
+
|
160
|
+
By default the results are ordered as Magento2 "thinks" its best. At any place you may add the `order_by` to sepcify this to your liking. If you skip the `ASC/DESC` argument, `ASC` will be set.
|
161
|
+
|
162
|
+
```
|
163
|
+
Magentwo::Product.order_by(:id, "ASC").all
|
164
|
+
Magentwo::Product.order_by(:id, "DESC").all
|
165
|
+
```
|
166
|
+
|
167
|
+
# Updates
|
168
|
+
|
169
|
+
To update Models back to Magento 2 use the `save` method
|
170
|
+
This switches the first and last name of the Customer Foo Bar
|
171
|
+
|
172
|
+
```
|
173
|
+
customer = Magentwo::Customer.filter(:first_name => "Foo", :last_name => "Bar").first
|
174
|
+
customer.firstname = "Bar"
|
175
|
+
customer.lastname = "Foo"
|
176
|
+
customer.save
|
177
|
+
```
|
178
|
+
|
179
|
+
# Delete
|
180
|
+
|
181
|
+
To delete a Model use the `delete` method
|
182
|
+
|
183
|
+
```
|
184
|
+
product = Magentwo::Product.first
|
185
|
+
product.delete
|
186
|
+
```
|
187
|
+
|
188
|
+
to be continued ...
|
data/lib/adapter.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Magentwo
|
2
2
|
class Adapter < Magentwo::Connection
|
3
|
-
|
3
|
+
DateTimeFields = %i(created_at updated_at change_status_at)
|
4
|
+
DateFields = %i(dob)
|
4
5
|
def call method, path, params
|
5
6
|
http_method, params = case method
|
6
7
|
when :put, :post, :delete then [method, params.to_json]
|
@@ -10,18 +11,21 @@ module Magentwo
|
|
10
11
|
end
|
11
12
|
|
12
13
|
response = self.send(http_method, path, params)
|
14
|
+
Magentwo.logger.debug "Response body: #{response.body}" unless response.is_a? TrueClass
|
13
15
|
|
14
16
|
parsed_response = case method
|
15
|
-
when :get_with_meta_data, :put, :post
|
17
|
+
when :get_with_meta_data, :put, :post then transform( parse( response))
|
16
18
|
when :get
|
17
19
|
parsed = parse(response)
|
18
|
-
if parsed
|
19
|
-
parsed[:items].map do |item|
|
20
|
+
if parsed.is_a?(Hash) && (parsed.has_key? :items)
|
21
|
+
(parsed[:items] || []).map do |item|
|
20
22
|
transform item
|
21
23
|
end
|
22
24
|
else
|
23
25
|
transform parsed
|
24
26
|
end
|
27
|
+
when :delete
|
28
|
+
response
|
25
29
|
else
|
26
30
|
raise ArgumentError, "unknown method type. Expected :get, :get_with_meta_data, :post, :put or :delete. #{method} #{path}"
|
27
31
|
end
|
@@ -33,18 +37,25 @@ module Magentwo
|
|
33
37
|
when "200"
|
34
38
|
JSON.parse response.body, :symbolize_names => true
|
35
39
|
else
|
36
|
-
puts "
|
40
|
+
puts "error #{response.code}: #{JSON.parse(response.body)}"
|
41
|
+
return nil
|
37
42
|
end
|
38
43
|
end
|
39
44
|
|
40
45
|
def transform item
|
41
|
-
|
46
|
+
if(item && item.is_a?(Hash))
|
47
|
+
date_transform item
|
48
|
+
else
|
49
|
+
item
|
50
|
+
end
|
42
51
|
end
|
43
52
|
|
44
53
|
def date_transform item
|
45
|
-
p "datetransform: #{item}"
|
46
54
|
DateFields.each do |date_field|
|
47
|
-
item[date_field] =
|
55
|
+
item[date_field] = Date.parse item[date_field] if item[date_field]
|
56
|
+
end
|
57
|
+
DateTimeFields.each do |datetime_field|
|
58
|
+
item[datetime_field] = (Time.parse "#{item[datetime_field]} UTC").getlocal if item[datetime_field]
|
48
59
|
end
|
49
60
|
item
|
50
61
|
end
|
data/lib/connection.rb
CHANGED
@@ -1,44 +1,58 @@
|
|
1
1
|
module Magentwo
|
2
2
|
class Connection
|
3
|
-
attr_accessor :host, :port, :user, :password, :token, :base_path
|
3
|
+
attr_accessor :host, :port, :user, :password, :token, :base_path, :scheme
|
4
4
|
|
5
|
-
def initialize
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
def initialize uri:, user:nil, password:nil, base_path:nil, token:nil
|
6
|
+
uri = URI(uri)
|
7
|
+
@host = uri.host
|
8
|
+
@port = uri.port
|
9
|
+
@scheme = uri.scheme
|
10
|
+
@base_path = base_path || "/rest/V1"
|
11
|
+
|
12
|
+
if (user && password)
|
13
|
+
@user = user
|
14
|
+
@password = password
|
15
|
+
request_token
|
16
|
+
elsif (token)
|
17
|
+
@token = token
|
9
18
|
else
|
10
|
-
|
11
|
-
@port = 80
|
19
|
+
raise ArgumentError, "expected user/password or token"
|
12
20
|
end
|
13
|
-
|
14
|
-
@password = password
|
15
|
-
@base_path = base_path || "/rest/default/V1"
|
16
|
-
request_token
|
21
|
+
|
17
22
|
end
|
18
23
|
|
19
24
|
def request_token
|
20
|
-
Net::HTTP.start(self.host,self.port) do |http|
|
21
|
-
|
25
|
+
Net::HTTP.start(self.host,self.port, :use_ssl => self.scheme == 'https') do |http|
|
26
|
+
url = "#{base_path}/integration/admin/token"
|
27
|
+
Magentwo.logger.info "POST #{url}"
|
28
|
+
req = Net::HTTP::Post.new(url)
|
22
29
|
req.body = {:username=> self.user, :password=> self.password}.to_json
|
23
30
|
req['Content-Type'] = "application/json"
|
24
31
|
req['Content-Length'] = req.body.length
|
25
|
-
|
32
|
+
response = http.request(req).body
|
33
|
+
@token = JSON.parse response
|
26
34
|
end
|
27
35
|
end
|
28
36
|
|
29
37
|
def delete path, data
|
30
|
-
Magentwo.logger.info "DELETE #{path}"
|
38
|
+
Magentwo.logger.info "DELETE #{host}/#{base_path}/#{path}"
|
31
39
|
Magentwo.logger.debug "DATA #{data}"
|
32
40
|
|
33
|
-
|
34
|
-
|
41
|
+
url = "#{base_path}/#{path}"
|
42
|
+
Net::HTTP.start(self.host,self.port, :use_ssl => self.scheme == 'https') do |http|
|
43
|
+
req = Net::HTTP::Delete.new(url)
|
44
|
+
req["Authorization"] = "Bearer #{self.token}"
|
45
|
+
req['Content-Type'] = "application/json"
|
46
|
+
req.body = data
|
47
|
+
http.request(req)
|
48
|
+
end
|
35
49
|
end
|
36
50
|
|
37
51
|
def put path, data
|
38
52
|
Magentwo.logger.info "PUT #{host}/#{base_path}/#{path}"
|
39
53
|
Magentwo.logger.debug "DATA #{data}"
|
40
54
|
url = "#{base_path}/#{path}"
|
41
|
-
Net::HTTP.start(self.host,self.port) do |http|
|
55
|
+
Net::HTTP.start(self.host,self.port, :use_ssl => self.scheme == 'https') do |http|
|
42
56
|
req = Net::HTTP::Put.new(url)
|
43
57
|
req["Authorization"] = "Bearer #{self.token}"
|
44
58
|
req['Content-Type'] = "application/json"
|
@@ -51,7 +65,7 @@ module Magentwo
|
|
51
65
|
Magentwo.logger.info "POST #{host}/#{path}"
|
52
66
|
Magentwo.logger.debug "DATA #{data}"
|
53
67
|
url = "#{base_path}/#{path}"
|
54
|
-
Net::HTTP.start(self.host,self.port) do |http|
|
68
|
+
Net::HTTP.start(self.host,self.port, :use_ssl => self.scheme == 'https') do |http|
|
55
69
|
req = Net::HTTP::Post.new(url)
|
56
70
|
req["Authorization"] = "Bearer #{self.token}"
|
57
71
|
req['Content-Type'] = "application/json"
|
@@ -64,7 +78,7 @@ module Magentwo
|
|
64
78
|
def get path, query
|
65
79
|
Magentwo.logger.info "GET #{host}#{base_path}/#{path}?#{query}"
|
66
80
|
url = "#{base_path}/#{path}?#{query}"
|
67
|
-
Net::HTTP.start(self.host,self.port) do |http|
|
81
|
+
Net::HTTP.start(self.host,self.port, :use_ssl => self.scheme == 'https') do |http|
|
68
82
|
req = Net::HTTP::Get.new(url)
|
69
83
|
req["Authorization"] = "Bearer #{self.token}"
|
70
84
|
req['Content-Type'] = "application/json"
|
data/lib/dataset.rb
CHANGED
@@ -7,7 +7,7 @@ module Magentwo
|
|
7
7
|
:filters => [],
|
8
8
|
:pagination => {
|
9
9
|
:current_page => Filter::CurrentPage.new(1),
|
10
|
-
:page_size => Filter::PageSize.new(
|
10
|
+
:page_size => Filter::PageSize.new(0)
|
11
11
|
},
|
12
12
|
:ordering => [],
|
13
13
|
:fields => nil
|
@@ -18,27 +18,44 @@ module Magentwo
|
|
18
18
|
# Filters
|
19
19
|
################
|
20
20
|
def filter hash_or_other, invert:false
|
21
|
-
|
21
|
+
filters = case hash_or_other
|
22
22
|
when Hash
|
23
23
|
raise ArgumentError, "empty hash supplied" if hash_or_other.empty?
|
24
|
-
key, value
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
hash_or_other.map do |key, value|
|
25
|
+
klass = case value
|
26
|
+
when Array
|
27
|
+
invert ? Filter::Nin : Filter::In
|
28
|
+
else
|
29
|
+
invert ? Filter::Neq : Filter::Eq
|
30
|
+
end
|
31
|
+
klass.new(key, value)
|
30
32
|
end
|
31
|
-
klass.new(key, value)
|
32
33
|
else
|
33
34
|
raise ArgumentError, "filter function expects Hash as input"
|
34
35
|
end
|
35
|
-
Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] +
|
36
|
+
Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + filters)
|
36
37
|
end
|
37
38
|
|
38
39
|
def exclude args
|
39
40
|
filter args, invert:true
|
40
41
|
end
|
41
42
|
|
43
|
+
def gt args
|
44
|
+
Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::Gt.new(args.keys.first, args.values.first)])
|
45
|
+
end
|
46
|
+
|
47
|
+
def lt args
|
48
|
+
Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::Lt.new(args.keys.first, args.values.first)])
|
49
|
+
end
|
50
|
+
|
51
|
+
def gteq args
|
52
|
+
Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::Gteq.new(args.keys.first, args.values.first)])
|
53
|
+
end
|
54
|
+
|
55
|
+
def lteq args
|
56
|
+
Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::Lteq.new(args.keys.first, args.values.first)])
|
57
|
+
end
|
58
|
+
|
42
59
|
def select *fields
|
43
60
|
Dataset.new self.model, self.opts.merge(:fields => Filter::Fields.new(fields))
|
44
61
|
end
|
@@ -47,6 +64,14 @@ module Magentwo
|
|
47
64
|
Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::Like.new(args.keys.first, args.values.first)])
|
48
65
|
end
|
49
66
|
|
67
|
+
def from args
|
68
|
+
Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::From.new(args.keys.first, args.values.first)])
|
69
|
+
end
|
70
|
+
|
71
|
+
def to args
|
72
|
+
Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::To.new(args.keys.first, args.values.first)])
|
73
|
+
end
|
74
|
+
|
50
75
|
#################
|
51
76
|
# Pagination
|
52
77
|
################
|
@@ -84,30 +109,62 @@ module Magentwo
|
|
84
109
|
self.model.first self
|
85
110
|
end
|
86
111
|
|
87
|
-
def all
|
88
|
-
self.model.all self
|
112
|
+
def all meta_data:false
|
113
|
+
self.model.all self, :meta_data => meta_data
|
89
114
|
end
|
90
115
|
|
91
116
|
#################
|
92
117
|
# Transformation
|
93
118
|
################
|
119
|
+
def print_readable
|
120
|
+
ds = self
|
121
|
+
|
122
|
+
puts "*** Pagination ***"
|
123
|
+
puts ds.opts[:pagination][:current_page].to_s
|
124
|
+
puts ds.opts[:pagination][:page_size].to_s
|
125
|
+
|
126
|
+
puts "*** Filters ***"
|
127
|
+
ds.opts[:filters].each do |filter|
|
128
|
+
puts filter.to_s
|
129
|
+
end
|
130
|
+
|
131
|
+
puts "*** Ordering ***"
|
132
|
+
order_filters = ds.opts[:ordering]
|
133
|
+
if order_filters.size > 0
|
134
|
+
order_filters.each do |filter|
|
135
|
+
puts filter.to_s
|
136
|
+
end
|
137
|
+
else
|
138
|
+
puts "non specified"
|
139
|
+
end
|
140
|
+
|
141
|
+
puts "*** Fields ***"
|
142
|
+
if fields = ds.opts[:fields]&.fields
|
143
|
+
puts "Fetch only: #{fields}"
|
144
|
+
else
|
145
|
+
puts "Fetch everything"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
94
149
|
def to_query
|
150
|
+
self.validate
|
151
|
+
ds = self
|
95
152
|
[
|
96
|
-
|
153
|
+
ds.opts[:filters]
|
97
154
|
.each_with_index
|
98
155
|
.map { |opt, idx| opt.to_query(idx) }
|
99
156
|
.join("&"),
|
100
157
|
|
101
|
-
|
158
|
+
ds.opts[:pagination]
|
102
159
|
.map { |k, v| v.to_query}
|
103
160
|
.join("&"),
|
104
161
|
|
105
162
|
|
106
|
-
|
163
|
+
ds.opts[:ordering]
|
107
164
|
.map { |opt, idx| opt.to_query(idx) }
|
108
165
|
.join("&"),
|
109
166
|
|
110
|
-
|
167
|
+
ds.opts[:fields]? ds.opts[:fields].to_query() : ""
|
111
168
|
].reject(&:empty?)
|
112
169
|
.join("&")
|
113
170
|
end
|
@@ -124,5 +181,26 @@ module Magentwo
|
|
124
181
|
raise ArgumentError, "no block given" unless block_given?
|
125
182
|
self.model.all.each(&block)
|
126
183
|
end
|
184
|
+
|
185
|
+
def each_page page_size=Magentwo.default_page_size, &block
|
186
|
+
raise ArgumentError, "no block given" unless block_given?
|
187
|
+
|
188
|
+
received_element_count = page_size
|
189
|
+
current_page = 1
|
190
|
+
total_count = nil
|
191
|
+
until(total_count && current_page*page_size > (total_count + page_size)) do
|
192
|
+
page = self.page(current_page, page_size).all meta_data:true
|
193
|
+
total_count = page[:total_count] unless total_count
|
194
|
+
block.call(page[:items])
|
195
|
+
current_page += 1
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
#################
|
200
|
+
# Validation
|
201
|
+
################
|
202
|
+
def validate
|
203
|
+
true
|
204
|
+
end
|
127
205
|
end
|
128
206
|
end
|
data/lib/filter.rb
CHANGED
@@ -7,23 +7,31 @@ module Magentwo
|
|
7
7
|
@value = value
|
8
8
|
end
|
9
9
|
|
10
|
-
def to_query idx
|
10
|
+
def to_query idx, field:self.field, value:self.value
|
11
11
|
[
|
12
12
|
"searchCriteria[filter_groups][#{idx}][filters][0][field]=#{self.field}",
|
13
|
-
"searchCriteria[filter_groups][#{idx}][filters][0][value]=#{URI::encode(self.value)}",
|
13
|
+
"searchCriteria[filter_groups][#{idx}][filters][0][value]=#{URI::encode(self.value.to_s)}",
|
14
14
|
"searchCriteria[filter_groups][#{idx}][filters][0][condition_type]=#{self.class.name.split("::").last.downcase}"]
|
15
15
|
.join("&")
|
16
16
|
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
"#{self.field} #{self.class.name.split("::").last.downcase} #{self.value}"
|
20
|
+
end
|
17
21
|
end
|
18
22
|
|
19
23
|
class CompareArray < Compare
|
20
24
|
def to_query idx
|
21
25
|
[
|
22
26
|
"searchCriteria[filter_groups][#{idx}][filters][0][field]=#{self.field}",
|
23
|
-
"searchCriteria[filter_groups][#{idx}][filters][0][value]=#{URI::encode(self.value.join(","))}",
|
27
|
+
"searchCriteria[filter_groups][#{idx}][filters][0][value]=#{URI::encode(self.value.map(&:to_s).join(","))}",
|
24
28
|
"searchCriteria[filter_groups][#{idx}][filters][0][condition_type]=#{self.class.name.split("::").last.downcase}"]
|
25
29
|
.join("&")
|
26
30
|
end
|
31
|
+
|
32
|
+
def to_s
|
33
|
+
"#{self.field} #{self.class.name.split("::").last.downcase} #{self.value}"
|
34
|
+
end
|
27
35
|
end
|
28
36
|
|
29
37
|
class Simple
|
@@ -36,6 +44,10 @@ module Magentwo
|
|
36
44
|
def to_query idx=nil
|
37
45
|
"searchCriteria[#{key}]=#{value}"
|
38
46
|
end
|
47
|
+
|
48
|
+
def to_s
|
49
|
+
"#{self.key} == #{self.value}"
|
50
|
+
end
|
39
51
|
end
|
40
52
|
|
41
53
|
class Multi
|
@@ -49,6 +61,12 @@ module Magentwo
|
|
49
61
|
"searchCriteria[#{kvp[:key]}]=#{kvp[:value]}"
|
50
62
|
end.join("&")
|
51
63
|
end
|
64
|
+
|
65
|
+
def to_s
|
66
|
+
self.kvps.map do |kvp|
|
67
|
+
"#{kvp[:key]} = #{kvp[:value]}"
|
68
|
+
end.join("\n")
|
69
|
+
end
|
52
70
|
end
|
53
71
|
|
54
72
|
|
@@ -67,6 +85,31 @@ module Magentwo
|
|
67
85
|
class Like < Magentwo::Filter::Compare
|
68
86
|
end
|
69
87
|
|
88
|
+
class Gt < Magentwo::Filter::Compare
|
89
|
+
end
|
90
|
+
|
91
|
+
class Lt < Magentwo::Filter::Compare
|
92
|
+
end
|
93
|
+
|
94
|
+
class Gteq < Magentwo::Filter::Compare
|
95
|
+
end
|
96
|
+
|
97
|
+
class Lteq < Magentwo::Filter::Compare
|
98
|
+
end
|
99
|
+
|
100
|
+
class From < Magentwo::Filter::Compare
|
101
|
+
def to_query idx
|
102
|
+
value = case self.value
|
103
|
+
when Time then self.value.utc
|
104
|
+
else self.value
|
105
|
+
end
|
106
|
+
super idx, value:value
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
class To < Magentwo::Filter::Compare
|
111
|
+
end
|
112
|
+
|
70
113
|
class PageSize < Magentwo::Filter::Simple
|
71
114
|
def initialize value
|
72
115
|
super(:page_size, value)
|
data/lib/magentwo.rb
CHANGED
@@ -1,12 +1,36 @@
|
|
1
1
|
require 'uri'
|
2
2
|
require 'net/http'
|
3
3
|
require 'json'
|
4
|
+
require 'time'
|
4
5
|
require 'logger'
|
5
6
|
|
6
7
|
module Magentwo
|
7
|
-
Models = %w(base product customer order coupon sales_rule)
|
8
|
-
|
9
|
-
|
8
|
+
Models = %w(base product customer order coupon sales_rule category cart stock_item)
|
9
|
+
@@mutex = Mutex.new
|
10
|
+
def self.connect host=nil, user_name=nil, password=nil
|
11
|
+
raise ArgumentError, "no host specified" unless host
|
12
|
+
raise ArgumentError, "no user_name specified" unless user_name
|
13
|
+
raise ArgumentError, "no password specified" unless password
|
14
|
+
Base.adapter = Adapter.new ({uri: host, user: user_name, password: password})
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.connect_with_token host=nil, token=nil
|
18
|
+
raise ArgumentError, "no host specified" unless host
|
19
|
+
raise ArgumentError, "no token specified" unless token
|
20
|
+
Base.adapter = Adapter.new ({token: token, uri: host})
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.with connection
|
24
|
+
raise ArgumentError, "no connection specified" unless connection
|
25
|
+
@@mutex.synchronize do
|
26
|
+
old_connection = Magentwo::Base.adapter
|
27
|
+
begin
|
28
|
+
Magentwo::Base.adapter = connection
|
29
|
+
yield
|
30
|
+
ensure
|
31
|
+
Magentwo::Base.adapter = old_connection
|
32
|
+
end
|
33
|
+
end
|
10
34
|
end
|
11
35
|
|
12
36
|
def self.logger= logger
|
@@ -14,7 +38,20 @@ module Magentwo
|
|
14
38
|
end
|
15
39
|
|
16
40
|
def self.logger
|
17
|
-
@@logger ||= Logger.new STDOUT, {:level => Logger::
|
41
|
+
@@logger ||= Logger.new STDOUT, {:level => Logger::INFO}
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.log_level= level
|
45
|
+
new_log_level = case level
|
46
|
+
when :debug then Logger::DEBUG
|
47
|
+
when :info then Logger::INFO
|
48
|
+
when :warn then Logger::WARN
|
49
|
+
when :error then Logger::ERROR
|
50
|
+
when :fatal then Logger::FATAL
|
51
|
+
else
|
52
|
+
raise ArgumentError, "invalid log_level"
|
53
|
+
end
|
54
|
+
self.logger= Logger.new STDOUT, {:level => new_log_level}
|
18
55
|
end
|
19
56
|
|
20
57
|
def self.default_page_size
|
@@ -25,7 +62,14 @@ module Magentwo
|
|
25
62
|
@@default_page_size = page_size
|
26
63
|
end
|
27
64
|
|
28
|
-
|
65
|
+
def self.models
|
66
|
+
Models.map do |model_file_name|
|
67
|
+
model_file_name
|
68
|
+
.split('_')
|
69
|
+
.map(&:capitalize)
|
70
|
+
.join
|
71
|
+
end
|
72
|
+
end
|
29
73
|
end
|
30
74
|
|
31
75
|
require_relative 'connection.rb'
|
@@ -35,5 +79,5 @@ require_relative 'dataset.rb'
|
|
35
79
|
require_relative 'util/validator.rb'
|
36
80
|
|
37
81
|
Magentwo::Models.each do |file_name|
|
38
|
-
|
82
|
+
require_relative("model/#{file_name}.rb")
|
39
83
|
end
|
data/lib/model/base.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
module Magentwo
|
2
2
|
class Base
|
3
|
-
DatasetMethods = %i(filter exclude select fields count fields info page order_by like)
|
4
|
-
|
5
|
-
attr_accessor :base_path
|
3
|
+
DatasetMethods = %i(filter exclude select fields count fields info page order_by like gt lt gteq lteq from to)
|
6
4
|
|
7
5
|
def initialize args
|
8
6
|
args.each do |key, value|
|
@@ -20,12 +18,14 @@ module Magentwo
|
|
20
18
|
|
21
19
|
def save
|
22
20
|
self.validate
|
23
|
-
|
21
|
+
self.check_presence self.class.unique_identifier
|
22
|
+
response = Magentwo::Base.call :put, "#{self.class.base_path}/#{self.send(self.class.unique_identifier)}", self
|
24
23
|
self.class.new response
|
25
24
|
end
|
26
25
|
|
27
26
|
def delete
|
28
|
-
|
27
|
+
self.check_presence self.class.unique_identifier
|
28
|
+
Magentwo::Base.call :delete, "#{self.class.base_path}/#{self.send(self.class.unique_identifier)}", nil
|
29
29
|
end
|
30
30
|
|
31
31
|
def validate
|
@@ -64,6 +64,15 @@ module Magentwo
|
|
64
64
|
class << self
|
65
65
|
attr_accessor :adapter
|
66
66
|
|
67
|
+
def [] unique_identifier_value
|
68
|
+
result = Magentwo::Base.get nil, path:"#{base_path}/#{unique_identifier_value}"
|
69
|
+
self.new result if result
|
70
|
+
end
|
71
|
+
|
72
|
+
def unique_identifier
|
73
|
+
:id
|
74
|
+
end
|
75
|
+
|
67
76
|
def lower_case_name
|
68
77
|
name = self.name.split(/::/).last
|
69
78
|
"#{name[0,1].downcase}#{name[1..-1]}"
|
@@ -77,15 +86,36 @@ module Magentwo
|
|
77
86
|
base_path
|
78
87
|
end
|
79
88
|
|
80
|
-
def all ds=self.dataset
|
81
|
-
self.get(ds.to_query)
|
89
|
+
def all ds=self.dataset, meta_data:false
|
90
|
+
response = self.get(ds.to_query, :meta_data => meta_data)
|
91
|
+
return [] if response.nil?
|
92
|
+
items = (meta_data ? response[:items] : response)
|
82
93
|
.map do |item|
|
83
94
|
self.new item
|
84
95
|
end
|
96
|
+
if meta_data
|
97
|
+
response[:items] = items
|
98
|
+
response
|
99
|
+
else
|
100
|
+
items
|
101
|
+
end
|
85
102
|
end
|
86
103
|
|
87
104
|
def first ds=self.dataset
|
88
|
-
|
105
|
+
response = self.get(ds.page(1, 1).to_query).first
|
106
|
+
self.new response if response
|
107
|
+
end
|
108
|
+
|
109
|
+
def each_page page_size=Magentwo.default_page_size, &block
|
110
|
+
self.dataset.each_page page_size, &block
|
111
|
+
end
|
112
|
+
|
113
|
+
def each &block
|
114
|
+
self.dataset.each &block
|
115
|
+
end
|
116
|
+
|
117
|
+
def map &block
|
118
|
+
self.dataset.map &block
|
89
119
|
end
|
90
120
|
|
91
121
|
def dataset
|
@@ -108,7 +138,7 @@ module Magentwo
|
|
108
138
|
end
|
109
139
|
|
110
140
|
def call method, path=self.base_path, params
|
111
|
-
|
141
|
+
Magentwo::Base.adapter.call(method, path, params)
|
112
142
|
end
|
113
143
|
|
114
144
|
end
|
data/lib/model/cart.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
module Magentwo
|
2
|
+
class Cart < Base
|
3
|
+
Attributes = %i(id created_at updated_at is_active is_virtual items_count items_qty customer billing_address reserved_order_id orig_order_id currency customer_is_guest customer_note_notify customer_tax_class_id store_id)
|
4
|
+
Attributes.each do |attr| attr_accessor attr end
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def get_path
|
8
|
+
"#{self.base_path}/search"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/model/coupon.rb
CHANGED
@@ -11,7 +11,7 @@ module Magentwo
|
|
11
11
|
def generate rule_id, quantity:1, length:16, format:(:alpha), delimiter:"-", delimiter_at_every:4
|
12
12
|
format = format.to_sym
|
13
13
|
Magentwo::Validator.one_of format, :num, :alpha, :alphanum
|
14
|
-
self.call :post, "
|
14
|
+
self.call :post, "#{base_path}/generate",
|
15
15
|
{
|
16
16
|
:couponSpec => {
|
17
17
|
:rule_id => rule_id,
|
@@ -23,6 +23,10 @@ module Magentwo
|
|
23
23
|
}
|
24
24
|
}
|
25
25
|
end
|
26
|
+
|
27
|
+
def unique_identifier
|
28
|
+
:coupon_id
|
29
|
+
end
|
26
30
|
end
|
27
31
|
|
28
32
|
end
|
data/lib/model/order.rb
CHANGED
@@ -1,5 +1,30 @@
|
|
1
1
|
module Magentwo
|
2
2
|
class Order < Base
|
3
|
+
Attributes = %i(base_currency_code base_discount_amount base_discount_invoiced base_grand_total base_discount_tax_compensation_amount base_discount_tax_compensation_invoiced base_shipping_amount base_shipping_discount_amount base_shipping_discount_tax_compensation_amnt base_shipping_incl_tax base_shipping_invoiced base_shipping_tax_amount base_subtotal base_subtotal_incl_tax base_subtotal_invoiced base_tax_amount base_tax_invoiced base_total_due base_total_invoiced base_total_invoiced_cost base_total_paid base_to_global_rate base_to_order_rate billing_address_id created_at customer_dob customer_email customer_firstname customer_gender customer_group_id customer_id customer_is_guest customer_lastname customer_note_notify discount_amount discount_invoiced entity_id global_currency_code grand_total discount_tax_compensation_amount discount_tax_compensation_invoiced increment_id is_virtual order_currency_code protect_code quote_id shipping_amount shipping_description shipping_discount_amount shipping_discount_tax_compensation_amount shipping_incl_tax shipping_invoiced shipping_tax_amount state status store_currency_code store_id store_name store_to_base_rate store_to_order_rate subtotal subtotal_incl_tax subtotal_invoiced tax_amount tax_invoiced total_due total_invoiced total_item_count total_paid total_qty_ordered updated_at weight items billing_address payment status_histories extension_attributes amount_refunded base_amount_refunded base_discount_amount base_discount_invoiced base_discount_tax_compensation_amount base_discount_tax_compensation_invoiced base_original_price base_price base_price_incl_tax base_row_invoiced base_row_total base_row_total_incl_tax base_tax_amount base_tax_invoiced created_at discount_amount discount_invoiced discount_percent free_shipping discount_tax_compensation_amount discount_tax_compensation_invoiced is_qty_decimal item_id name no_discount order_id original_price price price_incl_tax product_id product_type qty_canceled qty_invoiced qty_ordered qty_refunded qty_shipped row_invoiced row_total row_total_incl_tax row_weight sku store_id tax_amount tax_invoiced tax_percent updated_at weight)
|
4
|
+
Attributes.each do |attr| attr_accessor attr end
|
3
5
|
|
6
|
+
def products
|
7
|
+
product_skus = self.items.map do |item|
|
8
|
+
item[:sku]
|
9
|
+
end
|
10
|
+
Magentwo::Product.filter(:sku => product_skus).all
|
11
|
+
end
|
12
|
+
|
13
|
+
def customer
|
14
|
+
self.check_presence :customer_id
|
15
|
+
Magentwo::Customer[self.customer_id]
|
16
|
+
end
|
17
|
+
|
18
|
+
class << self
|
19
|
+
#this is necessary as the return type of magento2 is not consistent
|
20
|
+
def [] unique_identifier
|
21
|
+
self.filter(:entity_id => unique_identifier).first
|
22
|
+
end
|
23
|
+
|
24
|
+
def unique_identifier
|
25
|
+
Magentwo::Logger.error "orders do not contain id on default requests, therefore they cannot be targeted on the API"
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
end
|
4
29
|
end
|
5
30
|
end
|
data/lib/model/product.rb
CHANGED
@@ -2,5 +2,19 @@ module Magentwo
|
|
2
2
|
class Product < Base
|
3
3
|
Attributes = %i(id sku name attribute_set_id price status visibility type_id created_at updated_at extension_attributes product_links options media_gallery_entries tier_prices custom_attributes)
|
4
4
|
Attributes.each do |attr| attr_accessor attr end
|
5
|
+
|
6
|
+
def stocks
|
7
|
+
Magentwo::StockItem[self.sku]
|
8
|
+
end
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def types
|
12
|
+
Magentwo::Base.get nil, path:"#{base_path}/types"
|
13
|
+
end
|
14
|
+
|
15
|
+
def unique_identifier
|
16
|
+
:sku
|
17
|
+
end
|
18
|
+
end
|
5
19
|
end
|
6
20
|
end
|
data/lib/model/sales_rule.rb
CHANGED
@@ -3,10 +3,28 @@ module Magentwo
|
|
3
3
|
Attributes = %i(rule_id name store_labels description website_ids customer_group_ids uses_per_customer is_active condition action_condition stop_rules_processing is_advanced sort_order simple_action discount_amount discount_step apply_to_shipping times_used is_rss coupon_type use_auto_generation uses_per_coupon simple_free_shipping)
|
4
4
|
Attributes.each do |attr| attr_accessor attr end
|
5
5
|
|
6
|
+
def generate quantity:1, length:16, format:(:alpha), delimiter:"-", delimiter_at_every:4
|
7
|
+
self.check_presence :rule_id
|
8
|
+
Magentwo::Coupon.generate self.rule_id, quantity:quantity, length:length, format:format, delimiter:delimiter, delimiter_at_every:delimiter_at_every
|
9
|
+
end
|
10
|
+
|
11
|
+
def coupons
|
12
|
+
self.check_presence :rule_id
|
13
|
+
Magentwo::Coupon.filter(:rule_id => self.rule_id).all
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_json
|
17
|
+
Hash["rule", self.to_h].to_json
|
18
|
+
end
|
19
|
+
|
6
20
|
class << self
|
7
21
|
def get_path
|
8
22
|
"#{base_path}/search"
|
9
23
|
end
|
24
|
+
|
25
|
+
def unique_identifier
|
26
|
+
:rule_id
|
27
|
+
end
|
10
28
|
end
|
11
29
|
|
12
30
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# Usage:
|
2
|
+
# Magentwo::StockItems['sku']
|
3
|
+
|
4
|
+
module Magentwo
|
5
|
+
class StockItem < Base
|
6
|
+
Attributes = %i(item_id product_id stock_id qty is_in_stock is_qty_decimal show_default_notification_message use_config_min_qty min_qty use_config_min_sale_qty min_sale_qty use_config_max_sale_qty max_sale_qty use_config_backorders backorders use_config_notify_stock_qty notify_stock_qty use_config_qty_increments qty_increments use_config_enable_qty_inc enable_qty_increments use_config_manage_stock manage_stock low_stock_date is_decimal_divided stock_status_changed_auto)
|
7
|
+
Attributes.each do |attr| attr_accessor attr end
|
8
|
+
|
9
|
+
class << self
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/magentwo.gemspec
CHANGED
data/spec/dataset_spec.rb
CHANGED
@@ -18,9 +18,9 @@ describe Magentwo::Dataset do
|
|
18
18
|
expect(dataset.opts[:pagination]).to have_key :current_page
|
19
19
|
expect(dataset.opts[:pagination]).to have_key :page_size
|
20
20
|
end
|
21
|
-
it "requests
|
21
|
+
it "requests all items on default" do
|
22
22
|
expect(initial_query).to include "searchCriteria[current_page]=1"
|
23
|
-
expect(initial_query).to include "searchCriteria[page_size]
|
23
|
+
expect(initial_query).to include "searchCriteria[page_size]=0"
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -37,6 +37,31 @@ describe Magentwo::Dataset do
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
context "multi filter" do
|
41
|
+
let(:multi_filter_ds) {dataset.filter(:name => "foobar").filter(:id => 42)}
|
42
|
+
let(:multi_filter_query) {multi_filter_ds.to_query}
|
43
|
+
let(:multi_filter_in_one_ds) {dataset.filter(:name => "foobar", :id => 42)}
|
44
|
+
let(:multi_filter_in_one_query) {multi_filter_in_one_ds.to_query}
|
45
|
+
it "contains filter with type Filter::Eq" do
|
46
|
+
expect(multi_filter_ds.opts[:filters]).to include Magentwo::Filter::Eq
|
47
|
+
end
|
48
|
+
it "contains two filters" do
|
49
|
+
expect(multi_filter_ds.opts[:filters].count).to eq 2
|
50
|
+
end
|
51
|
+
it "compute query" do
|
52
|
+
expect(multi_filter_query).to include "searchCriteria[filter_groups][0][filters][0][field]=name"
|
53
|
+
expect(multi_filter_query).to include "searchCriteria[filter_groups][0][filters][0][condition_type]=eq"
|
54
|
+
expect(multi_filter_query).to include "searchCriteria[filter_groups][0][filters][0][value]=foobar"
|
55
|
+
expect(multi_filter_query).to include "searchCriteria[filter_groups][1][filters][0][field]=id"
|
56
|
+
expect(multi_filter_query).to include "searchCriteria[filter_groups][1][filters][0][condition_type]=eq"
|
57
|
+
expect(multi_filter_query).to include "searchCriteria[filter_groups][1][filters][0][value]=42"
|
58
|
+
end
|
59
|
+
it "is the same for multiple keys in one filter" do
|
60
|
+
expect(multi_filter_ds.opts.count).to eq multi_filter_in_one_ds.opts.count
|
61
|
+
expect(multi_filter_query).to eq multi_filter_in_one_query
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
40
65
|
context "select" do
|
41
66
|
let(:name_select_ds) {dataset.select(:name)}
|
42
67
|
let(:name_select_query) {name_select_ds.to_query}
|
data/spec/product_spec.rb
CHANGED
@@ -1,4 +1,83 @@
|
|
1
1
|
require_relative '../lib/magentwo.rb'
|
2
2
|
|
3
3
|
describe Magentwo::Product do
|
4
|
+
before(:all) do
|
5
|
+
Magentwo.logger = Logger.new STDOUT, {:level => Logger::ERROR}
|
6
|
+
@original_count = Magentwo::Product.count
|
7
|
+
end
|
8
|
+
|
9
|
+
context "#dataset" do
|
10
|
+
let(:dataset) {Magentwo::Product.dataset}
|
11
|
+
it "returns dataset" do
|
12
|
+
expect(dataset).to be_a Magentwo::Dataset
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "#count" do
|
17
|
+
let(:count) {Magentwo::Product.count}
|
18
|
+
it "responds to :count" do
|
19
|
+
expect(Magentwo::Product).to respond_to :count
|
20
|
+
end
|
21
|
+
it "correct count" do
|
22
|
+
expect(count).to eq @original_count
|
23
|
+
end
|
24
|
+
it "count is integer" do
|
25
|
+
expect(count).to be_a Integer
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "#all" do
|
30
|
+
let(:products) {Magentwo::Product.all}
|
31
|
+
let(:ds) {Magentwo::Product.dataset}
|
32
|
+
|
33
|
+
it "responds to all" do
|
34
|
+
expect(Magentwo::Product).to respond_to :all
|
35
|
+
end
|
36
|
+
it "returns an array" do
|
37
|
+
expect(products).to be_a Array
|
38
|
+
end
|
39
|
+
it "requested all" do
|
40
|
+
expect(products.count).to eq @original_count
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "#fields" do
|
45
|
+
let(:fields) {Magentwo::Product.fields}
|
46
|
+
|
47
|
+
it "returns array of symbols" do
|
48
|
+
expect(fields).to be_a Array
|
49
|
+
fields.each do |field|
|
50
|
+
expect(field).to be_a Symbol
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "#first" do
|
56
|
+
let(:product) {Magentwo::Product.first}
|
57
|
+
|
58
|
+
it "returns a product" do
|
59
|
+
expect(product).to be_a Magentwo::Product
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context "#types" do
|
64
|
+
let(:types) {Magentwo::Product.types}
|
65
|
+
|
66
|
+
it "returns array" do
|
67
|
+
expect(types).to be_a Array
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "#[]" do
|
72
|
+
let(:first_product) {Magentwo::Product.first}
|
73
|
+
let(:by_sku_product) {Magentwo::Product[first_product.sku]}
|
74
|
+
|
75
|
+
it "returns a product" do
|
76
|
+
expect(by_sku_product).to be_a Magentwo::Product
|
77
|
+
end
|
78
|
+
|
79
|
+
it "returns product by :sku" do
|
80
|
+
expect(first_product.sku).to eq by_sku_product.sku
|
81
|
+
end
|
82
|
+
end
|
4
83
|
end
|
metadata
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: magentwo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- André Mueß
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
date: 2019-01-17 00:00:00.000000000 Z
|
@@ -27,11 +27,14 @@ files:
|
|
27
27
|
- lib/filter.rb
|
28
28
|
- lib/magentwo.rb
|
29
29
|
- lib/model/base.rb
|
30
|
+
- lib/model/cart.rb
|
31
|
+
- lib/model/category.rb
|
30
32
|
- lib/model/coupon.rb
|
31
33
|
- lib/model/customer.rb
|
32
34
|
- lib/model/order.rb
|
33
35
|
- lib/model/product.rb
|
34
36
|
- lib/model/sales_rule.rb
|
37
|
+
- lib/model/stock_item.rb
|
35
38
|
- lib/util/validator.rb
|
36
39
|
- magentwo.gemspec
|
37
40
|
- spec/base_model_spec.rb
|
@@ -43,7 +46,7 @@ licenses:
|
|
43
46
|
- MIT
|
44
47
|
metadata:
|
45
48
|
source_code_uri: https://github.com/Arkad82x/magentwo
|
46
|
-
post_install_message:
|
49
|
+
post_install_message:
|
47
50
|
rdoc_options: []
|
48
51
|
require_paths:
|
49
52
|
- lib
|
@@ -58,8 +61,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
58
61
|
- !ruby/object:Gem::Version
|
59
62
|
version: '0'
|
60
63
|
requirements: []
|
61
|
-
rubygems_version: 3.
|
62
|
-
signing_key:
|
64
|
+
rubygems_version: 3.2.15
|
65
|
+
signing_key:
|
63
66
|
specification_version: 4
|
64
67
|
summary: Magento 2 API Wrapper
|
65
68
|
test_files: []
|