meli 1.0.0

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.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/lib/config.yml +5 -0
  3. data/lib/meli.rb +160 -0
  4. metadata +45 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 79d6ac914a73d63f023fab405af5d2f3dcef8254
4
+ data.tar.gz: 5848a00574ae843da02a6541b80c90683aad1e5c
5
+ SHA512:
6
+ metadata.gz: 361a0ecec366e78afce72bb99ee60322d425201617d3642d4b0094eb5b4a5621982bd5d07b93180ffbdf654254745f127e386d22126749832d884de3e67f70b7
7
+ data.tar.gz: ea4970a9a3ccf4fd86bf86f6c2342dfe4088bcfd4afd84d31e1ee132fd4d0ecc33b102f902930c2ccd89faecbba346b1324092caa8b7c86f14a5b21fb94bc568
data/lib/config.yml ADDED
@@ -0,0 +1,5 @@
1
+ config:
2
+ sdk_version: MELI-RUBY-SDK-1.0.0
3
+ api_root_url: https://api.mercadolibre.com
4
+ auth_url: https://auth.mercadolibre.com/authorization
5
+ oauth_url: /oauth/token
data/lib/meli.rb ADDED
@@ -0,0 +1,160 @@
1
+ # encoding: UTF-8
2
+ require 'rubygems'
3
+ require 'net/http'
4
+ require 'net/https'
5
+ require 'json'
6
+ require 'uri'
7
+ require 'yaml'
8
+
9
+ class Meli
10
+ attr_accessor :access_token, :refresh_token
11
+ attr_reader :secret, :app_id, :https
12
+
13
+ config = YAML.load_file(File.expand_path(File.dirname(__FILE__) + "/config.yml"))
14
+ SDK_VERSION = config["config"]["sdk_version"]
15
+ API_ROOT_URL = config["config"]["api_root_url"]
16
+ AUTH_URL = config["config"]["auth_url"]
17
+ OAUTH_URL = config["config"]["oauth_url"]
18
+
19
+ #constructor
20
+ def initialize(app_id = nil, secret = nil, access_token = nil, refresh_token = nil)
21
+ @access_token = access_token
22
+ @refresh_token = refresh_token
23
+ @app_id = app_id
24
+ @secret = secret
25
+ api_url = URI.parse API_ROOT_URL
26
+ @https = Net::HTTP.new(api_url.host, api_url.port)
27
+ @https.use_ssl = true
28
+ @https.verify_mode = OpenSSL::SSL::VERIFY_PEER
29
+ @https.ssl_version = :TLSv1
30
+ end
31
+
32
+ #AUTH METHODS
33
+ def auth_url(redirect_URI)
34
+ params = {:client_id => @app_id, :response_type => 'code', :redirect_uri => redirect_URI}
35
+ url = "#{AUTH_URL}?#{to_url_params(params)}"
36
+ end
37
+
38
+ def authorize(code, redirect_URI)
39
+ params = { :grant_type => 'authorization_code', :client_id => @app_id, :client_secret => @secret, :code => code, :redirect_uri => redirect_URI}
40
+
41
+ uri = make_path(OAUTH_URL, params)
42
+
43
+ req = Net::HTTP::Post.new(uri.path)
44
+ req['Accept'] = 'application/json'
45
+ req['User-Agent'] = SDK_VERSION
46
+ req['Content-Type'] = "application/x-www-form-urlencoded"
47
+ req.set_form_data(params)
48
+ response = @https.request(req)
49
+
50
+ case response
51
+ when Net::HTTPSuccess
52
+ response_info = JSON.parse response.body
53
+ #convert hash keys to symbol
54
+ response_info = Hash[response_info.map{ |k, v| [k.to_sym, v] }]
55
+
56
+ @access_token = response_info[:access_token]
57
+ if response_info.has_key?(:refresh_token)
58
+ @refresh_token = response_info[:refresh_token]
59
+ else
60
+ @refresh_token = '' # offline_access not set up
61
+ end
62
+ @access_token
63
+ else
64
+ # response code isn't a 200; raise an exception
65
+ response.error!
66
+ end
67
+
68
+ end
69
+
70
+ def get_refresh_token()
71
+ if !@refresh_token.nil? and !@refresh_token.empty?
72
+ params = {:grant_type => 'refresh_token', :client_id => @app_id, :client_secret => @secret, :refresh_token => @refresh_token}
73
+
74
+ uri = make_path(OAUTH_URL, params)
75
+
76
+ req = Net::HTTP::Post.new(uri.path)
77
+ req['Accept'] = 'application/json'
78
+ req['User-Agent'] = SDK_VERSION
79
+ req['Content-Type'] = "application/x-www-form-urlencoded"
80
+ req.set_form_data(params)
81
+ response = @https.request(req)
82
+
83
+ case response
84
+ when Net::HTTPSuccess
85
+ response_info = JSON.parse response.body
86
+
87
+ #convert hash keys to symbol
88
+ response_info = Hash[response_info.map{ |k, v| [k.to_sym, v] }]
89
+
90
+ @access_token = response_info[:access_token]
91
+ @refresh_token = response_info[:refresh_token]
92
+ else
93
+ # response code isn't a 200; raise an exception
94
+ response.error!
95
+ end
96
+ else
97
+ raise "Offline-Access is not allowed."
98
+ end
99
+ end
100
+
101
+
102
+ #REQUEST METHODS
103
+ def execute(req)
104
+ req['Accept'] = 'application/json'
105
+ req['User-Agent'] = SDK_VERSION
106
+ req['Content-Type'] = 'application/json'
107
+ response = @https.request(req)
108
+ end
109
+
110
+ def get(path, params = {})
111
+ uri = make_path(path, params)
112
+ req = Net::HTTP::Get.new("#{uri.path}?#{uri.query}")
113
+ execute req
114
+ end
115
+
116
+ def post(path, body, params = {})
117
+ uri = make_path(path, params)
118
+ req = Net::HTTP::Post.new("#{uri.path}?#{uri.query}")
119
+ req.set_form_data(params)
120
+ req.body = body.to_json unless body.nil?
121
+ execute req
122
+ end
123
+
124
+ def put(path, body, params = {})
125
+ uri = make_path(path, params)
126
+ req = Net::HTTP::Put.new("#{uri.path}?#{uri.query}")
127
+ req.set_form_data(params)
128
+ req.body = body.to_json unless body.nil?
129
+ execute req
130
+ end
131
+
132
+ def delete(path, params = {})
133
+ uri = make_path(path, params)
134
+ req = Net::HTTP::Delete.new("#{uri.path}?#{uri.query}")
135
+ execute req
136
+ end
137
+
138
+ def options(path, params = {})
139
+ uri = make_path(path, params)
140
+ req = Net::HTTP::Options.new("#{uri.path}?#{uri.query}")
141
+ execute req
142
+ end
143
+
144
+ private
145
+ def to_url_params(params)
146
+ URI.escape(params.collect{|k,v| "#{k}=#{v}"}.join('&'))
147
+ end
148
+
149
+ def make_path(path, params = {})
150
+ # Making Path and add a leading / if not exist
151
+ unless path =~ /^http/
152
+ path = "/#{path}" unless path =~ /^\//
153
+ path = "#{API_ROOT_URL}#{path}"
154
+ end
155
+ path = "#{path}?#{to_url_params(params)}" if params.keys.size > 0
156
+ uri = URI.parse path
157
+ end
158
+
159
+
160
+ end #class
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: meli
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Gastón Corrao
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-12 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Gem for accesing MercadoLibre API
14
+ email: gaston.corrao@mercadolibre.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/config.yml
20
+ - lib/meli.rb
21
+ homepage: http://developers.mercadolibre.com/ruby-sdk/
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 2.4.5.1
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: meli
45
+ test_files: []