live_paper 0.0.8 → 0.0.9

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
  SHA1:
3
- metadata.gz: bac85ce7d86248d235c457c1de2d84cd715f0175
4
- data.tar.gz: 8acc4818c69b8b792806353966964655a6c5b1db
3
+ metadata.gz: e0be6ece34f4d51cf32f7ea78ffaae9d6c8543b3
4
+ data.tar.gz: b3838914f2bbaca46a1af9d87d259612186849f0
5
5
  SHA512:
6
- metadata.gz: 6289ddfcf77c671e5876bf5765fe5b6d9c3289277c80a6127890d9759f1fe39c3326c9e6289560f284b77da8d2876c26975f7ffc5cf2b854d675c2375e955db2
7
- data.tar.gz: ffbbda4ee49a0d1ee245efc4166c63b0a82b8d89c1dc4cf81dd4472f2f3f2bca632b63159288a11c492f783ee8b867f04dec7f421d8349e1bdef3de95f4833c6
6
+ metadata.gz: 4956d0c6516a9f2778e2e84c2958a4ebc50b981fa9fce39dd2260b8ef00b07016834d13b43f14858c2f72a3ba516501c6058baca22fa50f8564d2b3310291346
7
+ data.tar.gz: bde0081f9039ec48fb5354cee3fdf5c062967a7f2cd3ca85bd5fab44ea7cda3067e3b68f99305895c4256c1e36e413159983159b7692713f6ec8dbf805545aa8
data/Rakefile CHANGED
@@ -1,2 +1,10 @@
1
+ require 'rspec/core/rake_task'
1
2
  require "bundler/gem_tasks"
2
3
 
4
+ # Default directory to look in is `/specs`
5
+ # Run with `rake spec`
6
+ RSpec::Core::RakeTask.new(:spec) do |task|
7
+ task.rspec_opts = ['--color', '--format', 'documentation']
8
+ end
9
+
10
+ task :default => :spec
data/lib/live_paper.rb CHANGED
@@ -1,6 +1,15 @@
1
+ require "live_paper/base_object"
2
+ require "live_paper/http_client"
3
+ require "live_paper/image"
4
+ require "live_paper/link"
5
+ require "live_paper/payoff"
6
+ require "live_paper/wm_trigger"
7
+ require "live_paper/qr_trigger"
8
+ require "live_paper/short_trigger"
1
9
  require "live_paper/version"
2
10
  require 'base64'
3
11
  require 'rest-client'
12
+ require 'json'
4
13
 
5
14
  module LivePaper
6
15
 
@@ -12,7 +21,8 @@ module LivePaper
12
21
 
13
22
  class LivePaperSession
14
23
  def initialize(auth)
15
- authorize(auth)
24
+ #todo: tdd, verify hash
25
+ $lpp_basic_auth = Base64.strict_encode64("#{auth[:id]}:#{auth[:secret]}")
16
26
  end
17
27
 
18
28
  def smart_link(dest, image=nil)
@@ -32,129 +42,30 @@ module LivePaper
32
42
  end
33
43
 
34
44
  def shorten(dest)
35
- #returns shortened url
36
- trig = trigger "shorturl"
37
- payoff = url_payoff dest
38
- link(trig, payoff)
39
-
40
- trig["link"].select { |item| item["rel"] == "shortURL" }.first["href"]
45
+ t=ShortTrigger.create(name: 'short trigger')
46
+ p=Payoff.create(name: 'name', type: Payoff::TYPE[:WEB], url: dest)
47
+ Link.create(payoff_id: p.id, trigger_id: t.id, name: "link")
48
+ t.short_url
41
49
  end
42
50
 
43
51
  def qr_bytes(dest)
44
- #returns shortened url
45
- trig = trigger "qrcode"
46
- payoff = url_payoff dest
47
- link(trig, payoff)
48
-
49
- img_loc = trig["link"].select { |item| item["rel"] == "image" }.first["href"]
50
- resp = RestClient.get(img_loc, {Authorization: api_headers[:Authorization], Accept: 'image/png'})
51
- resp.body
52
+ t=QrTrigger.create(name: 'QR code trigger')
53
+ p=Payoff.create(name: 'name', type: Payoff::TYPE[:WEB], url: dest)
54
+ Link.create(payoff_id: p.id, trigger_id: t.id, name: "link")
55
+ t.download_qrcode
52
56
  end
53
57
 
54
58
  def watermark_bytes(dest, image_url)
55
- image = upload_image image_url
59
+ image = Image.upload image_url
56
60
 
57
- trig = trigger "watermark", watermark: {imageURL: image, resolution: "75", strength: "10"}
58
- payoff = url_payoff dest
59
- link(trig, payoff)
60
-
61
- img_loc = trig["link"].select { |item| item["rel"] == "image" }.first["href"]
62
- resp = RestClient.get(img_loc, Authorization: api_headers[:Authorization])
63
- resp.body
61
+ t=WmTrigger.create(name: 'watermark', watermark: {strength: 10, resolution: 75, imageURL: image})
62
+ p=Payoff.create(name: 'name', type: Payoff::TYPE[:WEB], url: dest)
63
+ Link.create(payoff_id: p.id, trigger_id: t.id, name: "link")
64
+ t.download_watermark
64
65
  rescue Exception => e
65
66
  puts "Exception!"
66
67
  puts e.response
67
68
  end
68
69
 
69
- private
70
- def upload_image(img)
71
- uri='https://storage.livepaperapi.com/objects/v1/files'
72
- # return the original img uri if it is LPP storage
73
- if img.include? uri
74
- return img
75
- end
76
- begin
77
- src_image = RestClient.get(img, Accept: 'image/jpg')
78
- response = RestClient.post uri,
79
- src_image.body,
80
- Authorization: api_headers[:Authorization],
81
- content_type: 'image/jpg'
82
- response.headers[:location]
83
- rescue Exception => e
84
- puts "Exception! ******\n#{e}"
85
- img
86
- end
87
- end
88
-
89
- def trigger(type="shorturl", options={})
90
- body = {
91
- trigger: {
92
- name: "trigger",
93
- type: type,
94
- expiryDate: Time.now + (365 * 24 * 60 * 60)
95
- }.merge(options)
96
- }
97
- create_resource('trigger', body)
98
- end
99
-
100
- def url_payoff(dest)
101
- body = {
102
- payoff: {
103
- name: "payoff",
104
- URL: dest
105
- }
106
- }
107
- create_resource('payoff', body)
108
- end
109
-
110
- def link(trigger, payoff)
111
- body = {
112
- link: {
113
- name: "link",
114
- payoffId: payoff["id"],
115
- triggerId: trigger["id"]
116
- }
117
- }
118
- create_resource('link', body)
119
- end
120
-
121
- def authorize(auth)
122
- uri = "#{LP_API_HOST}/auth/token"
123
- body = "grant_type=client_credentials&scope=all"
124
-
125
- basic_auth = Base64.strict_encode64("#{auth[:id]}:#{auth[:secret]}")
126
-
127
- begin
128
- response = RestClient.post uri, body,
129
- :content_type => 'application/x-www-form-urlencoded',
130
- Accept: 'application/json',
131
- Authorization: "Basic #{basic_auth}"
132
- rescue Exception => e
133
- puts "Exception!"
134
- puts e.response
135
- end
136
-
137
- body = JSON.parse(response.body)
138
- @token=body["accessToken"]
139
- end
140
-
141
- def api_headers
142
- {Authorization: "Bearer #{@token}",
143
- content_type: 'application/json',
144
- Accept: 'application/json'
145
- }
146
- end
147
-
148
- def create_resource(resource, body)
149
- uri= "https://www.livepaperapi.com/api/v1/#{resource}s"
150
- response = RestClient.post uri, body.to_json, api_headers
151
- JSON.parse(response.body)[resource]
152
- rescue Exception => e
153
- puts "Exception!"
154
- puts e.response
155
- nil
156
- end
157
-
158
70
  end
159
-
160
71
  end
@@ -0,0 +1,82 @@
1
+ require_relative 'http_client'
2
+ require 'json'
3
+
4
+ module LivePaper
5
+ class BaseObject
6
+ extend HttpClient
7
+ attr_accessor :id, :name, :date_created, :date_modified
8
+
9
+ def assign_attributes(data)
10
+ data.each do |key, value|
11
+ method = "#{underscore key.to_s}="
12
+ public_send(method, value) if respond_to?(method)
13
+ end unless data.empty?
14
+ end
15
+
16
+ def initialize(data={})
17
+ assign_attributes data
18
+ end
19
+
20
+ def self.create(data)
21
+ self.new(data).save
22
+ end
23
+
24
+ def save
25
+ validate_attributes!
26
+ BaseObject.request_handling_auth(self.class.api_url, 'POST') do |request|
27
+ response = BaseObject.send_request(request, 'application/json', create_body.to_json)
28
+ parse(response.body)
29
+ end unless present? @id
30
+ self
31
+ end
32
+
33
+ def self.find(id)
34
+ request_handling_auth("#{api_url}/#{id}", 'GET') do |request|
35
+ response = send_request(request, 'application/json')
36
+ parse response.body
37
+ end rescue nil
38
+ end
39
+
40
+ def self.parse(data)
41
+ self.new().parse(data)
42
+ end
43
+
44
+ def parse(data)
45
+ raise NotImplementedError
46
+ end
47
+
48
+ def self.api_url
49
+ raise NotImplementedError
50
+ end
51
+
52
+ protected
53
+ def all_present?(array)
54
+ array.all? { |e| present? e } rescue false
55
+ end
56
+
57
+ def all_keys_present?(hash, keys)
58
+ keys.all? { |e| present? hash[e] } rescue false
59
+ end
60
+
61
+ def present?(obj)
62
+ !(obj.respond_to?(:empty?) ? obj.empty? : !obj)
63
+ end
64
+
65
+ def underscore(camel_cased_word)
66
+ camel_cased_word.gsub(/::/, '/').
67
+ gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
68
+ gsub(/([a-z\d])([A-Z])/, '\1_\2').
69
+ tr("-", "_").
70
+ downcase
71
+ end
72
+
73
+ private
74
+ def validate_attributes!
75
+ raise NotImplementedError
76
+ end
77
+
78
+ def create_body
79
+ raise NotImplementedError
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,80 @@
1
+ require 'open-uri'
2
+ require 'net/https'
3
+
4
+ class NotAuthenticatedError < Exception
5
+ end
6
+
7
+ module LivePaper
8
+ module HttpClient
9
+ LP_API_HOST="https://www.livepaperapi.com"
10
+ AUTH_URL = "#{LP_API_HOST}/auth/token"
11
+
12
+ def send_request(request, content_type = nil, body = nil)
13
+ request['Content-type'] = content_type if content_type
14
+ request.body = body if body
15
+ response = @http.request(request)
16
+ check_response(response)
17
+ response
18
+ end
19
+
20
+ def check_response(response)
21
+ status = response.code.to_i
22
+ raise NotAuthenticatedError.new("Unauthorized") if status == 401
23
+ unless Array(200..201).include?(status)
24
+ raise "Request failed with code #{status}"
25
+ end
26
+ end
27
+
28
+ def request_handling_auth(url, method)
29
+ tries = 0
30
+ begin
31
+ request_access_token unless @access_token
32
+ request = http_request(url, method)
33
+ request['Authorization'] = "Bearer #{@access_token}"
34
+ yield request
35
+ rescue NotAuthenticatedError => e
36
+ tries += 1
37
+ if tries < 3
38
+ @access_token = nil
39
+ retry
40
+ else
41
+ raise e
42
+ end
43
+ end
44
+ end
45
+
46
+ def request_access_token
47
+ request = http_request(AUTH_URL, 'POST')
48
+ request['Authorization'] = "Basic #{$lpp_basic_auth}"
49
+ request['Content-Type'] = 'application/x-www-form-urlencoded'
50
+ request.body = 'grant_type=client_credentials&scope=all'
51
+ response = @http.request(request)
52
+ parsed = JSON.parse(response.body)
53
+ @access_token = parsed['accessToken']
54
+ end
55
+
56
+ def http_request(url, method)
57
+ uri = URI.parse(url)
58
+ set_http uri
59
+
60
+ case method.to_s.upcase
61
+ when 'POST'
62
+ Net::HTTP::Post.new(uri.request_uri)
63
+ when 'GET'
64
+ Net::HTTP::Get.new(uri.request_uri)
65
+ else
66
+ raise "Method '#{method}' not supported."
67
+ end
68
+ end
69
+
70
+ private
71
+ def set_http(uri)
72
+ http_params = [uri.host, uri.port]
73
+ http_params.concat ENV['HTTP_PROXY'].gsub('http://', '').split(':') unless ENV['HTTP_PROXY'].to_s.empty?
74
+
75
+ @http = Net::HTTP.new(*http_params)
76
+ @http.use_ssl = true
77
+ @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,32 @@
1
+ require_relative 'base_object'
2
+ require 'rest-client'
3
+
4
+ module LivePaper
5
+ class Image
6
+ extend HttpClient
7
+
8
+ attr_accessor :url
9
+
10
+ API_URL = 'https://storage.livepaperapi.com/objects/v1/files'
11
+
12
+ def self.upload(img)
13
+ # return the original img uri if it is LivePaper storage
14
+ if img.include? API_URL
15
+ return img
16
+ end
17
+ begin
18
+ src_image = RestClient.get(img, Accept: 'image/jpg')
19
+ request_access_token unless @access_token
20
+ response = RestClient.post API_URL,
21
+ src_image.body,
22
+ Authorization: "Bearer #{@access_token}",
23
+ content_type: 'image/jpg'
24
+ response.headers[:location]
25
+ rescue Exception => e
26
+ puts "Exception! ******\n#{e}"
27
+ img
28
+ end
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,46 @@
1
+ require_relative 'base_object'
2
+
3
+ module LivePaper
4
+ class Link < BaseObject
5
+ attr_accessor :payoff_id, :trigger_id, :analytics
6
+
7
+ def parse(data)
8
+ data = JSON.parse(data, symbolize_names: true)[:link]
9
+ assign_attributes data
10
+ @analytics = get_link_for data, 'analytics'
11
+ self
12
+ end
13
+
14
+ def payoff
15
+ @payoff ||= LivePaper::Payoff.find @payoff_id
16
+ end
17
+
18
+ def trigger
19
+ #todo: need to get the right object created here!!!
20
+ @trigger ||= LivePaper::WmTrigger.find @trigger_id
21
+ end
22
+
23
+ def self.api_url
24
+ "#{LP_API_HOST}/api/v1/links"
25
+ end
26
+
27
+ private
28
+ def validate_attributes!
29
+ raise ArgumentError, 'Required Attributes needed: name, payoff_id and trigger_id.' unless all_present? [@name, @payoff_id, @trigger_id]
30
+ end
31
+
32
+ def create_body
33
+ {
34
+ link: {
35
+ name: @name,
36
+ triggerId: @trigger_id,
37
+ payoffId: @payoff_id
38
+ }
39
+ }
40
+ end
41
+
42
+ def get_link_for(data, rel)
43
+ data[:link].find { |obj| obj[:rel] == rel }[:href] rescue ''
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,78 @@
1
+ require_relative 'base_object'
2
+
3
+ module LivePaper
4
+ class Payoff < BaseObject
5
+ attr_accessor :type, :url, :data_type, :data
6
+
7
+ TYPE = {
8
+ WEB: 'WEB_PAYOFF',
9
+ RICH: 'RICH_PAYOFF'
10
+ }
11
+
12
+ def parse(data)
13
+ data = JSON.parse(data, symbolize_names: true)[:payoff]
14
+ assign_attributes(data)
15
+ send(present?(data[:richPayoff]) ? :parse_richpayoff : :parse_webpayoff, data)
16
+ self
17
+ end
18
+
19
+ def self.api_url
20
+ "#{LP_API_HOST}/api/v1/payoffs"
21
+ end
22
+
23
+ private
24
+ def validate_attributes!
25
+ raise ArgumentError, 'Required Attributes needed: name, type, url.' unless all_present? [@name, @type, @url]
26
+ raise ArgumentError, 'Required Attributes needed: data_type, data.' if @type == TYPE[:RICH] and !all_present? [@data_type, @data]
27
+ end
28
+
29
+ def parse_richpayoff(data)
30
+ data = data[:richPayoff]
31
+
32
+ @type = TYPE[:RICH]
33
+ @url = data[:public][:url]
34
+ @data_type = data[:private][:'content-type']
35
+ @data = JSON.parse(Base64.decode64(data[:private][:data]), symbolize_names: true) rescue nil
36
+ end
37
+
38
+ def parse_webpayoff(data)
39
+ @type = TYPE[:WEB]
40
+ @url = data[:URL]
41
+ end
42
+
43
+ def create_body
44
+ {
45
+ payoff: case @type
46
+ when TYPE[:WEB]
47
+ create_webpayoff_body
48
+ when TYPE[:RICH]
49
+ create_richpayoff_body
50
+ else
51
+ raise ArgumentError, 'Type unknown.'
52
+ end
53
+ }
54
+ end
55
+
56
+ def create_webpayoff_body
57
+ {
58
+ name: @name,
59
+ URL: @url
60
+ }
61
+ end
62
+
63
+ def create_richpayoff_body
64
+ {
65
+ name: @name,
66
+ richPayoff: {
67
+ version: 1,
68
+ private: {
69
+ :'content-type' => @data_type,
70
+ :data => @data
71
+ },
72
+ public: {url: @url}
73
+ }
74
+ }
75
+ end
76
+
77
+ end
78
+ end