mercadolibre 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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3 -0
- data/LICENSE.md +22 -0
- data/README.md +29 -0
- data/lib/mercadolibre.rb +26 -0
- data/lib/mercadolibre/api.rb +79 -0
- data/lib/mercadolibre/core/auth.rb +50 -0
- data/lib/mercadolibre/core/items.rb +126 -0
- data/lib/mercadolibre/core/orders.rb +126 -0
- data/lib/mercadolibre/core/questions.rb +103 -0
- data/lib/mercadolibre/core/users.rb +23 -0
- data/lib/mercadolibre/entity/answer.rb +25 -0
- data/lib/mercadolibre/entity/auth.rb +21 -0
- data/lib/mercadolibre/entity/feedback.rb +25 -0
- data/lib/mercadolibre/entity/item.rb +33 -0
- data/lib/mercadolibre/entity/item_picture.rb +21 -0
- data/lib/mercadolibre/entity/order.rb +42 -0
- data/lib/mercadolibre/entity/order_item.rb +26 -0
- data/lib/mercadolibre/entity/payment.rb +27 -0
- data/lib/mercadolibre/entity/phone.rb +21 -0
- data/lib/mercadolibre/entity/question.rb +30 -0
- data/lib/mercadolibre/entity/user.rb +28 -0
- data/lib/mercadolibre/version.rb +3 -0
- metadata +108 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4bda882833f219b09860591510737da06e9efc35
|
4
|
+
data.tar.gz: 88f475983b507c41f431e2d8d347a89d245e632a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cb07e39e79ff3269dbe9f076d7576f68a68d119055e277dc540c82295ebffc9f30a1eb3fad7b29c49c2380866502b276cf8046e54c80b4aa11d6a76960a44aff
|
7
|
+
data.tar.gz: 8d9f250629040276e30574ff5667bb04f3b8d7ba6fce8e86abbed3f7430d7a11b97b99cef6f1ca8de2ca5918a520aed4f71c217cca707239b88c233f65218d14
|
data/CHANGELOG.md
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 unformatt
|
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.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Mercadolibre
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'mercadolibre'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install mercadolibre
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it ( http://github.com/<my-github-username>/mercadolibre/fork )
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/lib/mercadolibre.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require "mercadolibre/version"
|
2
|
+
|
3
|
+
# entities
|
4
|
+
require "mercadolibre/entity/answer"
|
5
|
+
require "mercadolibre/entity/auth"
|
6
|
+
require "mercadolibre/entity/feedback"
|
7
|
+
require "mercadolibre/entity/item"
|
8
|
+
require "mercadolibre/entity/item_picture"
|
9
|
+
require "mercadolibre/entity/order"
|
10
|
+
require "mercadolibre/entity/order_item"
|
11
|
+
require "mercadolibre/entity/payment"
|
12
|
+
require "mercadolibre/entity/phone"
|
13
|
+
require "mercadolibre/entity/question"
|
14
|
+
require "mercadolibre/entity/user"
|
15
|
+
# core
|
16
|
+
require "mercadolibre/core/auth"
|
17
|
+
require "mercadolibre/core/items"
|
18
|
+
require "mercadolibre/core/orders"
|
19
|
+
require "mercadolibre/core/questions"
|
20
|
+
require "mercadolibre/core/users"
|
21
|
+
require "mercadolibre/api"
|
22
|
+
|
23
|
+
# dependencies
|
24
|
+
require 'rest-client'
|
25
|
+
require 'singleton'
|
26
|
+
require 'time'
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
class Api
|
3
|
+
attr_accessor :access_token
|
4
|
+
|
5
|
+
def initialize(args={})
|
6
|
+
@app_key = args[:app_key]
|
7
|
+
@app_secret = args[:app_secret]
|
8
|
+
@callback_url = args[:callback_url]
|
9
|
+
@site = args[:site]
|
10
|
+
@access_token = args[:access_token]
|
11
|
+
@endpoint_url = 'https://api.mercadolibre.com'
|
12
|
+
@auth_url = 'https://auth.mercadolibre.com.ar'
|
13
|
+
end
|
14
|
+
|
15
|
+
include Mercadolibre::Core::Auth
|
16
|
+
include Mercadolibre::Core::Users
|
17
|
+
include Mercadolibre::Core::Items
|
18
|
+
include Mercadolibre::Core::Questions
|
19
|
+
include Mercadolibre::Core::Orders
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def get_request(action, params={}, headers={})
|
24
|
+
begin
|
25
|
+
parse_response(RestClient.get("#{@endpoint_url}#{action}", {params: params}.merge(headers)))
|
26
|
+
rescue => e
|
27
|
+
parse_response(e.response)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def post_request(action, params={}, headers={})
|
32
|
+
begin
|
33
|
+
parse_response(RestClient.post("#{@endpoint_url}#{action}", params, headers))
|
34
|
+
rescue => e
|
35
|
+
parse_response(e.response)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def put_request(action, params={}, headers={})
|
40
|
+
begin
|
41
|
+
parse_response(RestClient.put("#{@endpoint_url}#{action}", params, headers))
|
42
|
+
rescue => e
|
43
|
+
parse_response(e.response)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def patch_request(action, params={}, headers={})
|
48
|
+
begin
|
49
|
+
parse_response(RestClient.patch("#{@endpoint_url}#{action}", params, headers))
|
50
|
+
rescue => e
|
51
|
+
parse_response(e.response)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def head_request(action, params={})
|
56
|
+
begin
|
57
|
+
parse_response(RestClient.head("#{@endpoint_url}#{action}", params))
|
58
|
+
rescue => e
|
59
|
+
parse_response(e.response)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def delete_request(action, params={})
|
64
|
+
begin
|
65
|
+
parse_response(RestClient.delete("#{@endpoint_url}#{action}", params))
|
66
|
+
rescue => e
|
67
|
+
parse_response(e.response)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def parse_response(response)
|
72
|
+
{
|
73
|
+
headers: response.headers,
|
74
|
+
body: (JSON.parse(response.body) rescue response.body),
|
75
|
+
status_code: response.code
|
76
|
+
}
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Core
|
3
|
+
module Auth
|
4
|
+
def authenticate_url
|
5
|
+
get_attrs = {
|
6
|
+
response_type: 'code',
|
7
|
+
client_id: @app_key,
|
8
|
+
redirect_uri: CGI.escape(@callback_url)
|
9
|
+
}.map { |k,v| "#{k}=#{v}" }.join('&')
|
10
|
+
|
11
|
+
"#{@auth_url}/authorization?#{get_attrs}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def authenticate(auth_code)
|
15
|
+
response = post_request('/oauth/token', {
|
16
|
+
grant_type: 'authorization_code',
|
17
|
+
client_id: @app_key,
|
18
|
+
client_secret: @app_secret,
|
19
|
+
code: auth_code,
|
20
|
+
redirect_uri: @callback_url
|
21
|
+
})[:body]
|
22
|
+
|
23
|
+
@access_token = response['access_token']
|
24
|
+
|
25
|
+
Mercadolibre::Entity::Auth.new({
|
26
|
+
access_token: @access_token,
|
27
|
+
refresh_token: response['refresh_token'],
|
28
|
+
expired_at: response['expires_in'].to_i.seconds.from_now
|
29
|
+
})
|
30
|
+
end
|
31
|
+
|
32
|
+
def update_token(refresh_token)
|
33
|
+
response = post_request('/oauth/token', {
|
34
|
+
grant_type: 'refresh_token',
|
35
|
+
client_id: @app_key,
|
36
|
+
client_secret: @app_secret,
|
37
|
+
refresh_token: refresh_token
|
38
|
+
})[:body]
|
39
|
+
|
40
|
+
@access_token = response['access_token']
|
41
|
+
|
42
|
+
Mercadolibre::Entity::Auth.new({
|
43
|
+
access_token: @access_token,
|
44
|
+
refresh_token: response['refresh_token'],
|
45
|
+
expired_at: response['expires_in'].to_i.seconds.from_now
|
46
|
+
})
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Core
|
3
|
+
module Items
|
4
|
+
def get_all_my_item_ids(filters={})
|
5
|
+
user_id = get_my_user.id
|
6
|
+
|
7
|
+
filters.merge!({ access_token: @access_token, limit: 50, offset: 0 })
|
8
|
+
|
9
|
+
results = []
|
10
|
+
has_results = true
|
11
|
+
|
12
|
+
pages_remaining = filters[:pages_count] || -1
|
13
|
+
|
14
|
+
while (has_results && (pages_remaining != 0)) do
|
15
|
+
partial_results = get_request("/users/#{user_id}/items/search", filters)[:body]['results']
|
16
|
+
results += partial_results
|
17
|
+
has_results = partial_results.any?
|
18
|
+
filters[:offset] += 50
|
19
|
+
pages_remaining -= 1
|
20
|
+
end
|
21
|
+
|
22
|
+
results
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_my_item_ids(filters={})
|
26
|
+
user_id = get_my_user.id
|
27
|
+
|
28
|
+
filters.merge!({ access_token: @access_token, limit: 50, offset: 0 })
|
29
|
+
|
30
|
+
response = get_request("/users/#{user_id}/items/search", filters)[:body]
|
31
|
+
|
32
|
+
{
|
33
|
+
results: response['results'],
|
34
|
+
paging: response['paging']
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def get_all_item_ids(filters={})
|
39
|
+
filters.merge!({ limit: 50, offset: 0 })
|
40
|
+
|
41
|
+
results = []
|
42
|
+
has_results = true
|
43
|
+
|
44
|
+
pages_remaining = filters[:pages_count] || -1
|
45
|
+
|
46
|
+
while (has_results && (pages_remaining != 0)) do
|
47
|
+
partial_results = get_request("/sites/#{@site}/search", filters)[:body]['results']
|
48
|
+
results += partial_results.map { |r| r['id'] }
|
49
|
+
has_results = partial_results.any?
|
50
|
+
filters[:offset] += 50
|
51
|
+
pages_remaining -= 1
|
52
|
+
end
|
53
|
+
|
54
|
+
results
|
55
|
+
end
|
56
|
+
|
57
|
+
def get_item_ids(filters={})
|
58
|
+
response = get_request("/sites/#{@site}/search", filters)[:body]
|
59
|
+
|
60
|
+
{
|
61
|
+
results: response['results'].map { |r| r['id'] },
|
62
|
+
paging: response['paging']
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
def get_item_visits(item_ids)
|
67
|
+
if item_ids.is_a? Array
|
68
|
+
get_request("/visits/items?ids=#{item_ids.join(',')}")[:body]
|
69
|
+
else
|
70
|
+
get_request("/visits/items?ids=#{item_ids}")[:body][item_ids]
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
def create_item(attribs)
|
76
|
+
payload = attribs.to_json
|
77
|
+
|
78
|
+
headers = { content_type: :json }
|
79
|
+
|
80
|
+
result = post_request("/items?access_token=#{@access_token}", payload, headers)
|
81
|
+
|
82
|
+
Mercadolibre::Entity::Item.new(result[:body])
|
83
|
+
end
|
84
|
+
|
85
|
+
def relist_item(item_id, price, quantity, listing_type_id)
|
86
|
+
payload = { price: price, quantity: quantity, listing_type_id: listing_type_id }.to_json
|
87
|
+
|
88
|
+
headers = { content_type: :json, accept: :json }
|
89
|
+
|
90
|
+
result = post_request("/items/#{item_id}/relist?access_token=#{@access_token}", payload, headers)
|
91
|
+
|
92
|
+
Mercadolibre::Entity::Item.new(result[:body])
|
93
|
+
end
|
94
|
+
|
95
|
+
def get_item(item_id)
|
96
|
+
result = get_request("/items/#{item_id}")
|
97
|
+
|
98
|
+
Mercadolibre::Entity::Item.new(result[:body])
|
99
|
+
end
|
100
|
+
|
101
|
+
def add_item_description(item_id, text)
|
102
|
+
payload = { text: text }.to_json
|
103
|
+
|
104
|
+
headers = { content_type: :json, accept: :json }
|
105
|
+
|
106
|
+
post_request("/items/#{item_id}/descriptions?access_token=#{@access_token}", payload, headers)[:body]
|
107
|
+
end
|
108
|
+
|
109
|
+
def update_item_fields(item_id, attribs)
|
110
|
+
payload = attribs.to_json
|
111
|
+
|
112
|
+
headers = { content_type: :json, accept: :json }
|
113
|
+
|
114
|
+
put_request("/items/#{item_id}?access_token=#{@access_token}", payload, headers)[:body]
|
115
|
+
end
|
116
|
+
|
117
|
+
def update_item_listing_type(item_id, new_listing_kind)
|
118
|
+
payload = { id: new_listing_kind }.to_json
|
119
|
+
|
120
|
+
headers = { content_type: :json, accept: :json }
|
121
|
+
|
122
|
+
post_request("/items/#{item_id}/listing_type?access_token=#{@access_token}", payload, headers)[:body]
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Core
|
3
|
+
module Orders
|
4
|
+
def get_all_orders(filters={})
|
5
|
+
filters.merge!({
|
6
|
+
seller: get_my_user.id,
|
7
|
+
access_token: @access_token,
|
8
|
+
limit: 50
|
9
|
+
})
|
10
|
+
|
11
|
+
results = []
|
12
|
+
|
13
|
+
kind = filters.delete(:kind)
|
14
|
+
|
15
|
+
if kind.to_s == 'recent'
|
16
|
+
orders_urls = ['/orders/search/recent']
|
17
|
+
elsif kind.to_s == 'archived'
|
18
|
+
orders_urls = ['/orders/search/archived']
|
19
|
+
else
|
20
|
+
orders_urls = ['/orders/search/recent', '/orders/search/archived']
|
21
|
+
end
|
22
|
+
|
23
|
+
orders_urls.each do |orders_url|
|
24
|
+
has_results = true
|
25
|
+
filters[:offset] = 0
|
26
|
+
pages_remaining = filters[:pages_count] || -1
|
27
|
+
|
28
|
+
while (has_results && (pages_remaining != 0)) do
|
29
|
+
partial_results = get_request(orders_url, filters)[:body]['results']
|
30
|
+
|
31
|
+
results += partial_results.map { |r| Mercadolibre::Entity::Order.new(r) }
|
32
|
+
|
33
|
+
has_results = partial_results.any?
|
34
|
+
filters[:offset] += 50
|
35
|
+
pages_remaining -= 1
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
results
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_orders(kind, filters={})
|
43
|
+
filters.merge!({
|
44
|
+
seller: get_my_user.id,
|
45
|
+
access_token: @access_token
|
46
|
+
})
|
47
|
+
|
48
|
+
if kind.to_s == 'archived'
|
49
|
+
url = '/orders/search/archived'
|
50
|
+
else
|
51
|
+
url = '/orders/search/recent'
|
52
|
+
end
|
53
|
+
|
54
|
+
response = get_request(url, filters)[:body]
|
55
|
+
|
56
|
+
{
|
57
|
+
results: response['results'].map { |r| Mercadolibre::Entity::Order.new(r) },
|
58
|
+
paging: response['paging']
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
def get_order(order_id)
|
63
|
+
filters = { access_token: @access_token }
|
64
|
+
r = get_request("/orders/#{order_id}", filters)
|
65
|
+
|
66
|
+
Mercadolibre::Entity::Order.new(r[:body])
|
67
|
+
end
|
68
|
+
|
69
|
+
def get_order_feedbacks(order_id)
|
70
|
+
filters = { access_token: @access_token }
|
71
|
+
|
72
|
+
result = get_request("/orders/#{order_id}/feedback", filters)[:body]
|
73
|
+
|
74
|
+
if result['sale']
|
75
|
+
sale_feedback = Mercadolibre::Entity::Feedback.new(result['sale'])
|
76
|
+
else
|
77
|
+
sale_feedback = nil
|
78
|
+
end
|
79
|
+
|
80
|
+
if result['purchase']
|
81
|
+
purchase_feedback = Mercadolibre::Entity::Feedback.new(result['purchase'])
|
82
|
+
else
|
83
|
+
purchase_feedback = nil
|
84
|
+
end
|
85
|
+
|
86
|
+
{ seller: sale_feedback, buyer: purchase_feedback }
|
87
|
+
end
|
88
|
+
|
89
|
+
def give_feedback_to_order(order_id, feedback_data)
|
90
|
+
payload = feedback_data.to_json
|
91
|
+
|
92
|
+
headers = { content_type: :json }
|
93
|
+
|
94
|
+
post_request("/orders/#{order_id}/feedback?access_token=#{@access_token}", payload, headers)[:body]
|
95
|
+
end
|
96
|
+
|
97
|
+
def change_feedback_from_order(order_id, kind, feedback_data)
|
98
|
+
payload = feedback_data.to_json
|
99
|
+
|
100
|
+
headers = { content_type: :json }
|
101
|
+
|
102
|
+
if kind.to_s == 'buyer'
|
103
|
+
put_request("/orders/#{order_id}/feedback/purchase?access_token=#{@access_token}", payload, headers)[:body]
|
104
|
+
elsif kind.to_s == 'seller'
|
105
|
+
put_request("/orders/#{order_id}/feedback/sale?access_token=#{@access_token}", payload, headers)[:body]
|
106
|
+
else
|
107
|
+
raise 'invalid kind'
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def reply_feedback(order_id, kind, text)
|
112
|
+
payload = { reply: text }.to_json
|
113
|
+
|
114
|
+
headers = { content_type: :json }
|
115
|
+
|
116
|
+
if kind.to_s == 'buyer'
|
117
|
+
post_request("/orders/#{order_id}/feedback/purchase?access_token=#{@access_token}", payload, headers)[:body]
|
118
|
+
elsif kind.to_s == 'seller'
|
119
|
+
post_request("/orders/#{order_id}/feedback/sale?access_token=#{@access_token}", payload, headers)[:body]
|
120
|
+
else
|
121
|
+
raise 'invalid kind'
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Core
|
3
|
+
module Questions
|
4
|
+
def get_all_questions(filters={})
|
5
|
+
filters.merge!({ access_token: @access_token, limit: 50, offset: 0 })
|
6
|
+
|
7
|
+
if filters[:seller_id]
|
8
|
+
action = '/questions/search'
|
9
|
+
else
|
10
|
+
action = '/my/received_questions/search'
|
11
|
+
end
|
12
|
+
|
13
|
+
results = []
|
14
|
+
has_results = true
|
15
|
+
pages_remaining = filters[:pages_count] || -1
|
16
|
+
|
17
|
+
while (has_results && (pages_remaining != 0)) do
|
18
|
+
partial_results = get_request(action, filters)['questions'][:body]
|
19
|
+
|
20
|
+
results += partial_results.map { |q| Mercadolibre::Entity::Question.new(q) }
|
21
|
+
|
22
|
+
has_results = partial_results.any?
|
23
|
+
filters[:offset] += 50
|
24
|
+
pages_remaining -= 1
|
25
|
+
end
|
26
|
+
|
27
|
+
results
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_questions(filters={})
|
31
|
+
filters.merge!({ access_token: @access_token })
|
32
|
+
|
33
|
+
if filters[:seller_id]
|
34
|
+
url = '/questions/search'
|
35
|
+
else
|
36
|
+
url = '/my/received_questions/search'
|
37
|
+
end
|
38
|
+
|
39
|
+
response = get_request(url, filters)[:body]
|
40
|
+
|
41
|
+
{
|
42
|
+
results: response['questions'].map { |r| Mercadolibre::Entity::Question.new(r) },
|
43
|
+
paging: { total: response['total'], limit: response['limit'] }
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
def get_question(question_id)
|
48
|
+
filters = { access_token: @access_token }
|
49
|
+
|
50
|
+
result = get_request("/questions/#{question_id}", filters)[:body]
|
51
|
+
|
52
|
+
Mercadolibre::Entity::Question.new(result)
|
53
|
+
end
|
54
|
+
|
55
|
+
def delete_question(question_id)
|
56
|
+
result = delete_request("/questions/#{question_id}?access_token=#{@access_token}")
|
57
|
+
|
58
|
+
result
|
59
|
+
end
|
60
|
+
|
61
|
+
def ask_question(item_id, text)
|
62
|
+
payload = { item_id: item_id, text: text }.to_json
|
63
|
+
|
64
|
+
headers = { content_type: :json }
|
65
|
+
|
66
|
+
result = post_request("/questions?access_token=#{@access_token}", payload, headers)
|
67
|
+
|
68
|
+
::Mercadolibre::Entity::Question.new(result[:body])
|
69
|
+
end
|
70
|
+
|
71
|
+
def answer_question(question_id, text)
|
72
|
+
payload = { question_id: question_id, text: text }.to_json
|
73
|
+
|
74
|
+
headers = { content_type: :json, accept: :json }
|
75
|
+
|
76
|
+
result = post_request("/answers?access_token=#{@access_token}", payload, headers)
|
77
|
+
|
78
|
+
Mercadolibre::Entity::Question.new(result[:body])
|
79
|
+
end
|
80
|
+
|
81
|
+
def get_blacklisted_users_ids(seller_id)
|
82
|
+
result = get_request("/users/#{seller_id}/questions_blacklist?access_token=#{@access_token}")
|
83
|
+
result[:body].map { |r| r['user']['id'] }
|
84
|
+
end
|
85
|
+
|
86
|
+
def add_user_to_blacklist(seller_id, user_id)
|
87
|
+
payload = { user_id: user_id }.to_json
|
88
|
+
|
89
|
+
headers = { content_type: :json }
|
90
|
+
|
91
|
+
url = "/users/#{seller_id}/questions_blacklist?access_token=#{@access_token}"
|
92
|
+
|
93
|
+
post_request(url, payload, headers)[:status_code] == 200
|
94
|
+
end
|
95
|
+
|
96
|
+
def remove_user_from_blacklist(seller_id, user_id)
|
97
|
+
url = "/users/#{seller_id}/questions_blacklist/#{user_id}?access_token=#{@access_token}"
|
98
|
+
|
99
|
+
delete_request(url)[:status_code] == 200
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Core
|
3
|
+
module Users
|
4
|
+
def get_my_user
|
5
|
+
result = get_request('/users/me', { access_token: @access_token })
|
6
|
+
|
7
|
+
Mercadolibre::Entity::User.new(result[:body])
|
8
|
+
end
|
9
|
+
|
10
|
+
def get_user(user_id)
|
11
|
+
result = get_request("/users/#{user_id}")
|
12
|
+
|
13
|
+
Mercadolibre::Entity::User.new(result[:body])
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_users(user_ids)
|
17
|
+
results = get_request('/users', { ids: user_ids.join(',') })
|
18
|
+
|
19
|
+
results[:body].map { |r| Mercadolibre::Entity::User.new(r) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Entity
|
3
|
+
class Answer
|
4
|
+
def self.attr_list
|
5
|
+
[:text, :status, :date_created]
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader *attr_list
|
9
|
+
|
10
|
+
def initialize(attributes={})
|
11
|
+
attributes.each do |k, v|
|
12
|
+
if k.to_s == 'date_created'
|
13
|
+
self.date_created = Time.parse(v)
|
14
|
+
else
|
15
|
+
self.send("#{k}=", v) if self.respond_to?(k)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_writer *attr_list
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Entity
|
3
|
+
class Auth
|
4
|
+
def self.attr_list
|
5
|
+
[:access_token, :refresh_token, :expired_at]
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader *attr_list
|
9
|
+
|
10
|
+
def initialize(attributes={})
|
11
|
+
attributes.each do |attr, val|
|
12
|
+
self.send("#{attr}=", val)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
attr_writer *attr_list
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Entity
|
3
|
+
class Feedback
|
4
|
+
def self.attr_list
|
5
|
+
[:rating, :date_created, :fulfilled, :reason, :message, :reply]
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader *attr_list
|
9
|
+
|
10
|
+
def initialize(attributes={})
|
11
|
+
attributes.each do |k, v|
|
12
|
+
if k.to_s == 'date_created'
|
13
|
+
self.date_created = Time.parse(v)
|
14
|
+
else
|
15
|
+
self.send("#{k}=", v) if self.respond_to?(k)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_writer *attr_list
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Entity
|
3
|
+
class Item
|
4
|
+
def self.attr_list
|
5
|
+
[:id, :site_id, :title, :subtitle, :seller_id, :category_id, :price,
|
6
|
+
:base_price, :currency_id, :initial_quantity, :available_quantity, :sold_quantity,
|
7
|
+
:buying_mode, :listing_type_id, :start_time, :stop_time, :condition, :permalink,
|
8
|
+
:thumbnail, :secure_thumbnail, :pictures, :status, :sub_status, :parent_item_id,
|
9
|
+
:automatic_relist, :date_created, :last_updated]
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_reader *attr_list
|
13
|
+
|
14
|
+
def initialize(attributes={})
|
15
|
+
attributes.each do |k, v|
|
16
|
+
if k.to_s == 'pictures'
|
17
|
+
self.pictures = v.map { |x| ItemPicture.new(x) }
|
18
|
+
elsif ['stop_time', 'last_updated', 'start_time', 'date_created'].include?(k.to_s)
|
19
|
+
self.send("#{k}=", Time.parse(v)) unless v.nil?
|
20
|
+
else
|
21
|
+
self.send("#{k}=", v) if self.respond_to?(k)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
self.last_updated = date_created if last_updated.nil?
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
attr_writer *attr_list
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Entity
|
3
|
+
class ItemPicture
|
4
|
+
def self.attr_list
|
5
|
+
[:id, :url, :secure_url, :size, :max_size, :quality]
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader *attr_list
|
9
|
+
|
10
|
+
def initialize(attributes={})
|
11
|
+
attributes.each do |k, v|
|
12
|
+
self.send("#{k}=", v) if self.respond_to?(k)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
attr_writer *attr_list
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Entity
|
3
|
+
class Order
|
4
|
+
def self.attr_list
|
5
|
+
[:id, :status, :date_created, :date_closed, :date_last_updated,
|
6
|
+
:hidden_for_seller, :currency_id, :order_items, :total_amount, :buyer, :seller,
|
7
|
+
:payments, :seller_feedback, :buyer_feedback, :shipping_status, :tags]
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_reader *attr_list
|
11
|
+
|
12
|
+
def initialize(attributes={})
|
13
|
+
attributes.each do |k, v|
|
14
|
+
if k.to_s == 'order_items'
|
15
|
+
self.order_items = v.map { |x| OrderItem.new(x) }
|
16
|
+
elsif k.to_s == 'payments'
|
17
|
+
self.payments = v.map { |x| Payment.new(x) }
|
18
|
+
elsif k.to_s == 'feedback'
|
19
|
+
unless v.nil?
|
20
|
+
self.buyer_feedback = Feedback.new(v['purchase']) unless v['purchase'].nil?
|
21
|
+
self.seller_feedback = Feedback.new(v['sale']) unless v['sale'].nil?
|
22
|
+
end
|
23
|
+
elsif k.to_s == 'shipping'
|
24
|
+
self.shipping_status = v['status']
|
25
|
+
elsif ['buyer', 'seller'].include?(k.to_s)
|
26
|
+
self.send("#{k}=", User.new(v)) unless v.nil?
|
27
|
+
elsif ['date_created', 'date_closed', 'date_last_updated'].include?(k.to_s)
|
28
|
+
self.send("#{k}=", Time.parse(v)) unless v.nil?
|
29
|
+
else
|
30
|
+
self.send("#{k}=", v) if self.respond_to?(k)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
self.date_last_updated = date_created if date_last_updated.nil?
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
attr_writer *attr_list
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Entity
|
3
|
+
class OrderItem
|
4
|
+
def self.attr_list
|
5
|
+
[:currency_id, :item_id, :item_title, :quantity, :unit_price]
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader *attr_list
|
9
|
+
|
10
|
+
def initialize(attributes={})
|
11
|
+
attributes.each do |k, v|
|
12
|
+
if k.to_s == 'item'
|
13
|
+
self.item_id = v['id']
|
14
|
+
self.item_title = v['title']
|
15
|
+
else
|
16
|
+
self.send("#{k}=", v) if self.respond_to?(k)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
attr_writer *attr_list
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Entity
|
3
|
+
class Payment
|
4
|
+
def self.attr_list
|
5
|
+
[:id, :status, :transaction_amount, :currency_id, :date_created, :date_last_updated]
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader *attr_list
|
9
|
+
|
10
|
+
def initialize(attributes={})
|
11
|
+
attributes.each do |k, v|
|
12
|
+
if ['date_last_updated', 'date_created'].include?(k.to_s)
|
13
|
+
self.send("#{k}=", Time.parse(v)) unless v.nil?
|
14
|
+
else
|
15
|
+
self.send("#{k}=", v) if self.respond_to?(k)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
self.date_last_updated = date_created if date_last_updated.nil?
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_writer *attr_list
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Entity
|
3
|
+
class Phone
|
4
|
+
def self.attr_list
|
5
|
+
[:area_code, :number, :extension]
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader *attr_list
|
9
|
+
|
10
|
+
def initialize(attributes={})
|
11
|
+
attributes.each do |k, v|
|
12
|
+
self.send("#{k}=", v) if self.respond_to?(k)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
attr_writer *attr_list
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Entity
|
3
|
+
class Question
|
4
|
+
def self.attr_list
|
5
|
+
[:date_created, :item_id, :seller_id, :status, :text,
|
6
|
+
:id, :deleted_from_listing, :hold, :answer, :user_id]
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader *attr_list
|
10
|
+
|
11
|
+
def initialize(attributes={})
|
12
|
+
attributes.each do |k, v|
|
13
|
+
if k.to_s == 'answer'
|
14
|
+
self.answer = Answer.new(v) unless v.nil?
|
15
|
+
elsif k.to_s == 'from'
|
16
|
+
self.user_id = v['id'] unless v.nil?
|
17
|
+
elsif k.to_s == 'date_created'
|
18
|
+
self.date_created = Time.parse(v)
|
19
|
+
else
|
20
|
+
self.send("#{k}=", v) if self.respond_to?(k)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_writer *attr_list
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Mercadolibre
|
2
|
+
module Entity
|
3
|
+
class User
|
4
|
+
def self.attr_list
|
5
|
+
[:id, :nickname, :registration_date, :first_name, :last_name,
|
6
|
+
:country_id, :email, :user_type, :points, :site_id, :permalink, :phone]
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader *attr_list
|
10
|
+
|
11
|
+
def initialize(attributes={})
|
12
|
+
attributes.each do |k, v|
|
13
|
+
if k.to_s == 'registration_date'
|
14
|
+
self.registration_date = Time.parse(v)
|
15
|
+
elsif k.to_s == 'phone'
|
16
|
+
self.phone = Phone.new(v)
|
17
|
+
else
|
18
|
+
self.send("#{k}=", v) if self.respond_to?(k)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
attr_writer *attr_list
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mercadolibre
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matias Hick
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-03-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.5'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rest-client
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.6.7
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.6.7
|
55
|
+
description: Connect to meli api
|
56
|
+
email:
|
57
|
+
- unformatt@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- CHANGELOG.md
|
63
|
+
- LICENSE.md
|
64
|
+
- README.md
|
65
|
+
- lib/mercadolibre.rb
|
66
|
+
- lib/mercadolibre/api.rb
|
67
|
+
- lib/mercadolibre/core/auth.rb
|
68
|
+
- lib/mercadolibre/core/items.rb
|
69
|
+
- lib/mercadolibre/core/orders.rb
|
70
|
+
- lib/mercadolibre/core/questions.rb
|
71
|
+
- lib/mercadolibre/core/users.rb
|
72
|
+
- lib/mercadolibre/entity/answer.rb
|
73
|
+
- lib/mercadolibre/entity/auth.rb
|
74
|
+
- lib/mercadolibre/entity/feedback.rb
|
75
|
+
- lib/mercadolibre/entity/item.rb
|
76
|
+
- lib/mercadolibre/entity/item_picture.rb
|
77
|
+
- lib/mercadolibre/entity/order.rb
|
78
|
+
- lib/mercadolibre/entity/order_item.rb
|
79
|
+
- lib/mercadolibre/entity/payment.rb
|
80
|
+
- lib/mercadolibre/entity/phone.rb
|
81
|
+
- lib/mercadolibre/entity/question.rb
|
82
|
+
- lib/mercadolibre/entity/user.rb
|
83
|
+
- lib/mercadolibre/version.rb
|
84
|
+
homepage: https://github.com/unformattmh/mercadolibre
|
85
|
+
licenses:
|
86
|
+
- MIT
|
87
|
+
metadata: {}
|
88
|
+
post_install_message:
|
89
|
+
rdoc_options: []
|
90
|
+
require_paths:
|
91
|
+
- lib
|
92
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
requirements: []
|
103
|
+
rubyforge_project:
|
104
|
+
rubygems_version: 2.2.0
|
105
|
+
signing_key:
|
106
|
+
specification_version: 4
|
107
|
+
summary: Connect to meli api
|
108
|
+
test_files: []
|