promoqui-api-sdk 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.
@@ -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: []