promoqui-api-sdk 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a65b12aea27b17e9b2e5d6d73d5ffa05b3997201
4
+ data.tar.gz: 1b8295cd31a68857a5f6ff9eded09a2b3df8fc27
5
+ SHA512:
6
+ metadata.gz: 912165fb1e50e7c0573b4d05ef997d4baac0f99e04acc5d8c2d2139f47f2fffc395957124fcdaf68b7d79dacc8b132f1eb400ebd7856793717fc98eace54b193
7
+ data.tar.gz: c37b57cde25cda4a1e6dc6ea3dfce046a7a1b16b3c68d44e5eee922e83bce9cbad3a170c48037dab1dd45b62334455bfd13b42ac730ee72a3b22a73755f58eab
@@ -0,0 +1,10 @@
1
+ require 'net/http'
2
+ require 'json'
3
+ require 'time'
4
+ require 'pqsdk/city'
5
+ require 'pqsdk/leaflet'
6
+ require 'pqsdk/rest_layer'
7
+ require 'pqsdk/settings'
8
+ require 'pqsdk/store'
9
+ require 'pqsdk/token'
10
+ require 'pqsdk/version'
@@ -0,0 +1,46 @@
1
+ module PQSDK
2
+ class City
3
+ attr_accessor :id, :name, :inhabitants, :latitude, :longitude
4
+
5
+ def self.find(name)
6
+ res = RestLayer.get('v1/cities', { q: name }, { 'Authorization' => "Bearer #{Token.access_token}" })
7
+ if res[0] == 200
8
+ City.from_json res[1]
9
+ elsif res[0] == 404
10
+ nil
11
+ else
12
+ raise Exception.new("Unexpected HTTP status code #{res[0]}")
13
+ end
14
+ end
15
+
16
+ def self.find_or_create(name)
17
+ city = self.find(name)
18
+ return city if city
19
+
20
+ city = City.new
21
+ city.name = name
22
+ city.save
23
+
24
+ city
25
+ end
26
+
27
+ def save
28
+ res = RestLayer.post('v1/cities', { name: name }, { 'Authorization' => "Bearer #{Token.access_token}" })
29
+
30
+ if res[0] != 201
31
+ raise Exception.new("Unexpected HTTP status code #{res[0]}")
32
+ end
33
+ end
34
+
35
+ private
36
+ def self.from_json(json)
37
+ result = City.new
38
+
39
+ json.each do |key, val|
40
+ result.send("#{key}=", val)
41
+ end
42
+
43
+ result
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,55 @@
1
+ module PQSDK
2
+ class Leaflet
3
+ attr_accessor :id, :name, :url, :start_date, :end_date, :pdf_data, :store_ids
4
+
5
+ def initialize
6
+ self.store_ids = []
7
+ end
8
+
9
+ def self.find(url)
10
+ res = RestLayer.get('v1/leaflets', { url: url }, { 'Authorization' => "Bearer #{Token.access_token}" })
11
+ if res[0] == 200
12
+ Leaflet.from_json res[1]
13
+ elsif res[0] == 404
14
+ nil
15
+ else
16
+ raise Exception.new("Unexpected HTTP status code #{res[0]}")
17
+ end
18
+ end
19
+
20
+ def save
21
+ method = :post
22
+ endpoint = "v1/leaflets"
23
+ expected_status = 201
24
+
25
+ fields = {}
26
+ fields['name'] = name unless name.nil?
27
+ fields['url'] = url unless url.nil?
28
+ fields['start_date'] = start_date unless start_date.nil?
29
+ fields['end_date'] = end_date unless end_date.nil?
30
+ fields['pdf_data'] = pdf_data unless pdf_data.nil?
31
+ fields['store_ids'] = store_ids unless store_ids.nil?
32
+
33
+ res = RestLayer.send(method, endpoint, fields, { 'Authorization' => "Bearer #{Token.access_token}" })
34
+
35
+ if res[0] != expected_status
36
+ raise Exception.new("Unexpected HTTP status code #{res[0]}")
37
+ else
38
+ if method == :post
39
+ self.id = res[1]['id']
40
+ end
41
+ end
42
+ end
43
+
44
+ private
45
+ def self.from_json(json)
46
+ result = Leaflet.new
47
+
48
+ json.each do |key, val|
49
+ result.send("#{key}=", val)
50
+ end
51
+
52
+ result
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,66 @@
1
+ module PQSDK
2
+ class RestLayer
3
+ def self.get(endpoint, parameters, headers)
4
+ url = URI.parse("http://#{Settings.host}/#{endpoint}")
5
+ url.query = URI.encode_www_form(parameters)
6
+ req = Net::HTTP::Get.new(url.request_uri)
7
+
8
+ headers.each do |name, value|
9
+ req[name.to_s] = value
10
+ end
11
+
12
+ res = Net::HTTP.start(url.host, url.port) do |http|
13
+ http.request(req)
14
+ end
15
+
16
+ check_status(res.code.to_i, res.body)
17
+
18
+ [ res.code.to_i, JSON.parse(res.body), res.to_hash ]
19
+ end
20
+
21
+ def self.post(endpoint, parameters, headers)
22
+ url = URI.parse("http://#{Settings.host}/#{endpoint}")
23
+ req = Net::HTTP::Post.new(url.request_uri)
24
+ req.set_form_data(parameters)
25
+
26
+ headers.each do |name, value|
27
+ req[name.to_s] = value
28
+ end
29
+
30
+ res = Net::HTTP.start(url.host, url.port) do |http|
31
+ http.request(req)
32
+ end
33
+
34
+ check_status(res.code.to_i, res.body)
35
+ [ res.code.to_i, JSON.parse(res.body), res.to_hash ]
36
+ end
37
+
38
+ def self.put(endpoint, parameters, headers)
39
+ url = URI.parse("http://#{Settings.host}/#{endpoint}")
40
+ req = Net::HTTP::Put.new(url.request_uri)
41
+ req.set_form_data(parameters)
42
+
43
+ headers.each do |name, value|
44
+ req[name.to_s] = value
45
+ end
46
+
47
+ res = Net::HTTP.start(url.host, url.port) do |http|
48
+ http.request(req)
49
+ end
50
+
51
+ check_status(res.code.to_i, res.body)
52
+ [ res.code.to_i, JSON.parse(res.body), res.to_hash ]
53
+ end
54
+
55
+ private
56
+ def self.check_status(code, body)
57
+ if code >= 500
58
+ raise Exception.new("Internal Server Error")
59
+ elsif code == 400
60
+ raise Exception.new("Bad Request. This usually imples a bug in this gem! Error: #{JSON.parse(body)['error']}")
61
+ elsif code == 401
62
+ raise Exception.new("You are not authorized to perform that request")
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,22 @@
1
+ module PQSDK
2
+ class Settings
3
+ @@host = nil
4
+ @@app_secret = nil
5
+
6
+ def self.host
7
+ @@host
8
+ end
9
+
10
+ def self.host=(val)
11
+ @@host = val
12
+ end
13
+
14
+ def self.app_secret
15
+ @@app_secret
16
+ end
17
+
18
+ def self.app_secret=(val)
19
+ @@app_secret = val
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,74 @@
1
+ module PQSDK
2
+ class Store
3
+ attr_accessor :id, :name, :address, :zipcode, :latitude, :longitude, :phone, :city_id, :origin, :opening_hours
4
+
5
+ def self.find(address, zipcode, retailer = nil)
6
+ res = RestLayer.get('v1/stores', { address: address, zipcode: zipcode, retailer: retailer }, { 'Authorization' => "Bearer #{Token.access_token}" })
7
+ if res[0] == 200
8
+ Store.from_json res[1]
9
+ elsif res[0] == 404
10
+ nil
11
+ else
12
+ raise Exception.new("Unexpected HTTP status code #{res[0]}")
13
+ end
14
+ end
15
+
16
+ def self.get(id)
17
+ res = RestLayer.get("v1/stores/#{id}", { }, { 'Authorization' => "Bearer #{Token.access_token}" })
18
+ if res[0] == 200
19
+ Store.from_json res[1]
20
+ elsif res[0] == 404
21
+ nil
22
+ else
23
+ raise Exception.new("Unexpected HTTP status code #{res[0]}")
24
+ end
25
+ end
26
+
27
+ def save
28
+ if self.id != nil
29
+ method = :put
30
+ url = "v1/stores/#{self.id}"
31
+ expected_status = 200
32
+ else
33
+ method = :post
34
+ url = "v1/stores"
35
+ expected_status = 201
36
+ end
37
+
38
+ fields = {}
39
+ fields['name'] = name unless name.nil?
40
+ fields['address'] = address unless address.nil?
41
+ fields['zipcode'] = zipcode unless zipcode.nil?
42
+ fields['latitude'] = latitude unless latitude.nil?
43
+ fields['longitude'] = longitude unless longitude.nil?
44
+ fields['city_id'] = city_id unless city_id.nil?
45
+ fields['origin'] = origin unless origin.nil?
46
+ fields['opening_hours'] = opening_hours.to_json unless opening_hours.nil?
47
+
48
+ res = RestLayer.send(method, url, fields, { 'Authorization' => "Bearer #{Token.access_token}" })
49
+
50
+ if res[0] != expected_status
51
+ raise Exception.new("Unexpected HTTP status code #{res[0]}")
52
+ else
53
+ if method == :post
54
+ self.id = res[1]['id']
55
+ end
56
+ end
57
+ end
58
+
59
+ private
60
+ def self.from_json(json)
61
+ result = Store.new
62
+
63
+ json.each do |key, val|
64
+ if key != 'country' && key != 'city'
65
+ result.send("#{key}=", val)
66
+ end
67
+ end
68
+
69
+ result.city_id = PQSDK::City.find(json['city']).id
70
+
71
+ result
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,25 @@
1
+ module PQSDK
2
+ class Token
3
+ @@access_token = nil
4
+ @@expiration = nil
5
+
6
+ def self.get
7
+ res = RestLayer.get('v1/token', {}, { 'Authentication' => "Key #{Settings.app_secret}" })
8
+
9
+ if res[0] == 200
10
+ @@access_token = res[1]['token']
11
+ @@expiration = Time.parse(res[1]['expired_at'])
12
+ end
13
+
14
+ @@access_token
15
+ end
16
+
17
+ def self.access_token
18
+ if @@access_token == nil || @@expiration <= Time.now
19
+ self.get
20
+ else
21
+ @@access_token
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,3 @@
1
+ module PQSDK
2
+ VERSION = '1.0.0'
3
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: promoqui-api-sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Francesco Boffa
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: This gem helps Crawler Writers to interact with the PromoQui REST API
28
+ email: f.boffa@promoqui.it
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/pqsdk.rb
34
+ - lib/pqsdk/city.rb
35
+ - lib/pqsdk/leaflet.rb
36
+ - lib/pqsdk/rest_layer.rb
37
+ - lib/pqsdk/settings.rb
38
+ - lib/pqsdk/store.rb
39
+ - lib/pqsdk/token.rb
40
+ - lib/pqsdk/version.rb
41
+ homepage: ''
42
+ licenses:
43
+ - MIT
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 2.4.5
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: A wrapper around PromoQui HTTP Crawler API
65
+ test_files: []