magentwo 0.1.6 → 0.1.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1f59f2c1b33cb0312fc53612b912df7a33e0497963daab678d4d9483e64cbd70
4
- data.tar.gz: 4fdd910bc6d19c011eacc347a23102ba0a04a4a67179137f88a3a1d18ee32c73
3
+ metadata.gz: 76391fb49be2eacf141856ba17a36dda1edd5b08e0e7069be28ae7bedef35736
4
+ data.tar.gz: f6faa7a572b2a0c71007852272ad227032224786c8a42691cde861213a2591c5
5
5
  SHA512:
6
- metadata.gz: 4ed9e751d283d7ceeee972b61edbfe19338e1c86fb8c2db312104f75346de47c6592c5ff885a3a3c593c4c2cbad6b7230efd60f533600875a290ef72b6b45872
7
- data.tar.gz: 1f32e42bca87fda93e87f0bad9b42092b67a3c885679c42784321ebfc460eb27adb102de34fe85d1211a67c91cb8263a76cb8b8355b21ccc8f4cbf22db0a8ad7
6
+ metadata.gz: 8ca9a91c6c9e7cbd6df412e71fb418bf79adc68f40c10bb165ba8af3953f1717859f6562c01f5758c4669884cfd66fb14e657a6b00a6df43599624ee092e99f8
7
+ data.tar.gz: 985a28699825066decefabdbe438afcad4d4db0105ac12df34971c68c17a70c7cf7a427352a2101daa57d8d9f517f67ac5c133b06a0cfd693cff504d5dfc20ca
data/README.md CHANGED
@@ -23,9 +23,21 @@ bundle
23
23
 
24
24
 
25
25
  # How to connect to your magento 2 shop
26
- Currently there is only one connection at a time possible
26
+ When only using one connection simply type
27
27
  ```
28
- Magentwo.connect http://example.com, username, password
28
+ Magentwo.connect "http://example.com", "user_name", "password"
29
+ ```
30
+ When using multiple connections at once you can save the result of `Magentwo.connect` and use the `Magentwo.with` method
31
+ ```
32
+ connection1 = Magentwo.connect "http://example1.com", "user_name", "password"
33
+ connection2 = Magentwo.connect "http://example2.com", "user_name", "password"
34
+
35
+ Magentwo.with (connection1) do
36
+ #do things in the context of connection1
37
+ end
38
+ Magentwo.with (connection2) do
39
+ #do things in the context of connection2
40
+ end
29
41
  ```
30
42
 
31
43
  # How to use
@@ -67,6 +79,26 @@ Look for all Products whose name includes the word "Computer"
67
79
  Magentwo::Product.like(:name => "%Computer%").all
68
80
  ```
69
81
 
82
+ 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.
83
+ ```
84
+ Magentwo::Product.lt(:price => 42).all
85
+ Magentwo::Product.gt(:id => 1337).first
86
+ ```
87
+
88
+ Compare using `from` and `to`, you may also use both to specify a range.
89
+ ```
90
+ Magentwo::Product.from(:updated_at => Time.new(2019, 1, 1).all
91
+ Magentwo::Product.to(:created_at => Time.new(2019, 2, 1).all
92
+ ```
93
+
94
+ All of these filter-functions can be chained as needed
95
+
96
+ # Select
97
+ If you know which fields you are interested in you can speed up the fetching process by only requesting these fields
98
+ ```
99
+ Magentwo::Product.filter(...).select(:id, :sku).all
100
+ ```
101
+
70
102
  # Pagination
71
103
  On default the pagesize is set to 20, you can change this with
72
104
  ```
@@ -85,6 +117,19 @@ Magentwo::Product.each_page(512) do |page|
85
117
  p page
86
118
  end
87
119
  ```
120
+ You may also want to fetch all pages of products that match a certain criteria
121
+ ```
122
+ Magentwo::Product.from(:updated_at => my_last_sync_value).each_page(512) do |page|
123
+ p page
124
+ end
125
+ ```
126
+
127
+ # Order
128
+ 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.
129
+ ```
130
+ Magentwo::Product.order_by(:id, "ASC").all
131
+ Magentwo::Product.order_by(:id, "DESC").all
132
+ ```
88
133
 
89
134
  # Updates
90
135
  To update Models back to Magento 2 use the `save` method
@@ -96,4 +141,11 @@ customer.lastname = "Foo"
96
141
  customer.save
97
142
  ```
98
143
 
99
- to be continued
144
+ # Delete
145
+ To delete a Model use the `delete` method
146
+ ```
147
+ product = Magentwo::Product.first
148
+ product.delete
149
+ ```
150
+
151
+ to be continued ...
@@ -10,9 +10,10 @@ module Magentwo
10
10
  end
11
11
 
12
12
  response = self.send(http_method, path, params)
13
- Magentwo.logger.debug "Response body: #{response.body}"
13
+ Magentwo.logger.debug "Response body: #{response.body}" unless response.is_a? TrueClass
14
+
14
15
  parsed_response = case method
15
- when :get_with_meta_data, :put, :post, :delete then transform( parse( response))
16
+ when :get_with_meta_data, :put, :post then transform( parse( response))
16
17
  when :get
17
18
  parsed = parse(response)
18
19
  if parsed.is_a?(Hash) && (parsed.has_key? :items)
@@ -22,6 +23,8 @@ module Magentwo
22
23
  else
23
24
  transform parsed
24
25
  end
26
+ when :delete
27
+ response
25
28
  else
26
29
  raise ArgumentError, "unknown method type. Expected :get, :get_with_meta_data, :post, :put or :delete. #{method} #{path}"
27
30
  end
@@ -47,7 +50,7 @@ module Magentwo
47
50
 
48
51
  def date_transform item
49
52
  DateFields.each do |date_field|
50
- item[date_field] = Time.new item[date_field] if item[date_field]
53
+ item[date_field] = Time.parse item[date_field] if item[date_field]
51
54
  end
52
55
  item
53
56
  end
@@ -26,11 +26,17 @@ module Magentwo
26
26
  end
27
27
 
28
28
  def delete path, data
29
- Magentwo.logger.info "DELETE #{path}"
29
+ Magentwo.logger.info "DELETE #{host}/#{base_path}/#{path}"
30
30
  Magentwo.logger.debug "DATA #{data}"
31
31
 
32
- Magentwo.logger.warn "not implemented"
33
-
32
+ url = "#{base_path}/#{path}"
33
+ Net::HTTP.start(self.host,self.port) do |http|
34
+ req = Net::HTTP::Delete.new(url)
35
+ req["Authorization"] = "Bearer #{self.token}"
36
+ req['Content-Type'] = "application/json"
37
+ req.body = data
38
+ http.request(req)
39
+ end
34
40
  end
35
41
 
36
42
  def put path, data
@@ -64,6 +64,14 @@ module Magentwo
64
64
  Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::Like.new(args.keys.first, args.values.first)])
65
65
  end
66
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
+
67
75
  #################
68
76
  # Pagination
69
77
  ################
@@ -108,23 +116,55 @@ module Magentwo
108
116
  #################
109
117
  # Transformation
110
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
+
111
149
  def to_query
150
+ self.validate
151
+ ds = self
112
152
  [
113
- self.opts[:filters]
153
+ ds.opts[:filters]
114
154
  .each_with_index
115
155
  .map { |opt, idx| opt.to_query(idx) }
116
156
  .join("&"),
117
157
 
118
- self.opts[:pagination]
158
+ ds.opts[:pagination]
119
159
  .map { |k, v| v.to_query}
120
160
  .join("&"),
121
161
 
122
162
 
123
- self.opts[:ordering]
163
+ ds.opts[:ordering]
124
164
  .map { |opt, idx| opt.to_query(idx) }
125
165
  .join("&"),
126
166
 
127
- self.opts[:fields]? self.opts[:fields].to_query() : ""
167
+ ds.opts[:fields]? ds.opts[:fields].to_query() : ""
128
168
  ].reject(&:empty?)
129
169
  .join("&")
130
170
  end
@@ -156,5 +196,12 @@ module Magentwo
156
196
  current_page += 1
157
197
  end
158
198
  end
199
+
200
+ #################
201
+ # Validation
202
+ ################
203
+ def validate
204
+ true
205
+ end
159
206
  end
160
207
  end
@@ -14,6 +14,10 @@ module Magentwo
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
@@ -24,6 +28,10 @@ module Magentwo
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
 
@@ -79,6 +97,12 @@ module Magentwo
79
97
  class Lteq < Magentwo::Filter::Compare
80
98
  end
81
99
 
100
+ class From < Magentwo::Filter::Compare
101
+ end
102
+
103
+ class To < Magentwo::Filter::Compare
104
+ end
105
+
82
106
  class PageSize < Magentwo::Filter::Simple
83
107
  def initialize value
84
108
  super(:page_size, value)
@@ -1,10 +1,12 @@
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
8
  Models = %w(base product customer order coupon sales_rule category cart)
9
+ @@mutex = Mutex.new
8
10
  def self.connect host=nil, user_name=nil, password=nil
9
11
  raise ArgumentError, "no host specified" unless host
10
12
  raise ArgumentError, "no user_name specified" unless user_name
@@ -12,12 +14,25 @@ module Magentwo
12
14
  Base.adapter = Adapter.new host, user_name, password
13
15
  end
14
16
 
17
+ def self.with connection
18
+ raise ArgumentError, "no connection specified" unless connection
19
+ @@mutex.synchronize do
20
+ old_connection = Magentwo::Base.adapter
21
+ begin
22
+ Magentwo::Base.adapter = connection
23
+ yield
24
+ ensure
25
+ Magentwo::Base.adapter = old_connection
26
+ end
27
+ end
28
+ end
29
+
15
30
  def self.logger= logger
16
31
  @@logger = logger
17
32
  end
18
33
 
19
34
  def self.logger
20
- @@logger ||= Logger.new STDOUT, {:level => Logger::DEBUG}
35
+ @@logger ||= Logger.new STDOUT, {:level => Logger::INFO}
21
36
  end
22
37
 
23
38
  def self.default_page_size
@@ -1,6 +1,6 @@
1
1
  module Magentwo
2
2
  class Base
3
- DatasetMethods = %i(filter exclude select fields count fields info page order_by like gt lt gteq lteq)
3
+ DatasetMethods = %i(filter exclude select fields count fields info page order_by like gt lt gteq lteq from to)
4
4
 
5
5
  def initialize args
6
6
  args.each do |key, value|
@@ -18,12 +18,12 @@ module Magentwo
18
18
 
19
19
  def save
20
20
  self.validate
21
- response = Magentwo::Base.call :put, "#{self.class.base_path}/#{self.id}", self
21
+ response = Magentwo::Base.call :put, "#{self.class.base_path}/#{self.send(self.class.unique_identifier)}", self
22
22
  self.class.new response
23
23
  end
24
24
 
25
25
  def delete
26
- Magentwo.logger.warn "not implemented"
26
+ Magentwo::Base.call :delete, "#{self.class.base_path}/#{self.send(self.class.unique_identifier)}", nil
27
27
  end
28
28
 
29
29
  def validate
@@ -62,8 +62,12 @@ module Magentwo
62
62
  class << self
63
63
  attr_accessor :adapter
64
64
 
65
- def [] unique_identifier
66
- self.new (Magentwo::Base.get nil, path:"#{base_path}/#{unique_identifier}")
65
+ def [] unique_identifier_value
66
+ self.new (Magentwo::Base.get nil, path:"#{base_path}/#{unique_identifier_value}")
67
+ end
68
+
69
+ def unique_identifier
70
+ :id
67
71
  end
68
72
 
69
73
  def lower_case_name
@@ -1,5 +1,6 @@
1
1
  module Magentwo
2
2
  class Category < Base
3
+ #TODO implement
3
4
  class << self
4
5
  def base_path
5
6
  "categories"
@@ -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
@@ -19,6 +19,11 @@ module Magentwo
19
19
  def [] unique_identifier
20
20
  self.filter(:entity_id => unique_identifier).first
21
21
  end
22
+
23
+ def unique_identifier
24
+ Magentwo::Logger.error "orders do not container id on default requests, therefore they cannot be targeted on the API"
25
+ nil
26
+ end
22
27
  end
23
28
  end
24
29
  end
@@ -7,6 +7,10 @@ module Magentwo
7
7
  def types
8
8
  Magentwo::Base.get nil, path:"#{base_path}/types"
9
9
  end
10
+
11
+ def unique_identifier
12
+ :sku
13
+ end
10
14
  end
11
15
  end
12
16
  end
@@ -16,6 +16,10 @@ module Magentwo
16
16
  def get_path
17
17
  "#{base_path}/search"
18
18
  end
19
+
20
+ def unique_identifier
21
+ :rule_id
22
+ end
19
23
  end
20
24
 
21
25
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'magentwo'
3
- s.version = '0.1.6'
3
+ s.version = '0.1.7'
4
4
  s.date = '2019-01-17'
5
5
  s.summary = "Magento 2 API Wrapper"
6
6
  s.description = "Provides a simple Ruby Interface to interact with the Magento 2 API"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: magentwo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - André Mueß