adzerk 0.14 → 0.19

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dfcb33e06a66b4728d0a27e69c41a240a3d3f73ce3af93056fdbb794e6b1361c
4
- data.tar.gz: d6b9c3113f6120d074a517643a56fb4cb1fc2b98b98abe016cb31cbebcadad32
3
+ metadata.gz: 50824b8af7ba3980d0c4c4d7efe9a3ab2abf581c3707f110dc5d2abd5c11bd90
4
+ data.tar.gz: e898b5d79bceeddedd7aadcae625b27eb863d73767bb0790291244ef5e88c440
5
5
  SHA512:
6
- metadata.gz: f549e8160c19e563cdb4aa4c54b085a833b62b6588227c2540f7e58471805ed88f79680f3d3a32c125639e98a7502b55fe9dee2b4736c560322a10ef5aa5aa61
7
- data.tar.gz: 2be8a73fb39675f73bd02e13ddd6165f2402005b561b03ab94cf546fd4702c8fcf5105b1240cd7b0a8b71dcb214064764e6d7ce249bee12f2e87d7947533ceaa
6
+ metadata.gz: 713844e36ce3b5d0472599321cbf8b068d2f8b1d1b2507d17586f7a140bc3602eaf698bcd12ba24a3eb45011af18973919ed45358c7fcb89fbcc811e47930820
7
+ data.tar.gz: 9642fc67837970c0c4aa9865f2e97d1188184cc956aea590d1ba099042d1b838e9385c6285d1248784397fb0de01f8f8cbd364b11574234425b00c05e629c44b
data/lib/adzerk.rb CHANGED
@@ -13,8 +13,15 @@ require "adzerk/publisher"
13
13
  require "adzerk/invitation"
14
14
  require "adzerk/reporting"
15
15
  require "adzerk/channel_site_map"
16
+ require "adzerk/channel"
16
17
  require "adzerk/geo_targeting"
17
18
  require "adzerk/site_zone_targeting"
18
19
  require "adzerk/category"
19
20
  require "adzerk/client"
20
21
  require "adzerk/priority"
22
+ require "adzerk/campaign"
23
+ require "adzerk/instant_count"
24
+ require "adzerk/creative_template"
25
+ require "adzerk/scheduled_reporting"
26
+ require "adzerk/day_parting"
27
+ require "adzerk/distance_targeting"
@@ -5,5 +5,16 @@ module Adzerk
5
5
  data = { 'advertiserName' => advertiser_name }
6
6
  parse_response(client.post_request(url, data))
7
7
  end
8
+
9
+ def instant_counts(advertiser_id, data={})
10
+ query_string = URI.encode_www_form(data)
11
+ url = "instantcounts/#{endpoint}/#{advertiser_id}?#{query_string}"
12
+ parse_response(client.get_request(url))
13
+ end
14
+
15
+ def list_creatives(advertiser_id, page: 1, pageSize: 500)
16
+ url = "advertiser/#{advertiser_id}/creatives?page=#{page}&pageSize=#{pageSize}"
17
+ parse_response(@client.get_request(url))
18
+ end
8
19
  end
9
20
  end
@@ -14,8 +14,8 @@ module Adzerk
14
14
 
15
15
  def create(opts={}, subid=nil)
16
16
  e = (subid && subendpoint) ? "#{subendpoint}/#{subid}/#{endpoint}" : endpoint
17
- data = { datakey => camelize_data(opts).to_json }
18
- response = @client.post_request(e, data)
17
+ data = camelize_data(opts)
18
+ response = @client.post_json_request(e, data)
19
19
  parse_response(response)
20
20
  end
21
21
 
@@ -24,16 +24,17 @@ module Adzerk
24
24
  parse_response(response)
25
25
  end
26
26
 
27
- def list(subid=nil)
27
+ def list(subid=nil, page: 1, pageSize: 500)
28
28
  e = (subid && subendpoint) ? "#{subendpoint}/#{subid}/#{endpoint}" : endpoint
29
+ e = "#{e}?page=#{page}&pageSize=#{pageSize}"
29
30
  response = @client.get_request(e)
30
31
  parse_response(response)
31
32
  end
32
33
 
33
34
  def update(opts={})
34
35
  id = opts[:id].to_s
35
- data = { datakey => camelize_data(opts).to_json }
36
- response = @client.put_request("#{endpoint}/#{id}", data)
36
+ data = camelize_data(opts)
37
+ response = @client.put_json_request("#{endpoint}/#{id}", data)
37
38
  parse_response(response)
38
39
  end
39
40
 
@@ -0,0 +1,15 @@
1
+ module Adzerk
2
+ class Campaign < ApiEndpoint
3
+ def instant_counts(campaign_id, data={})
4
+ query_string = URI.encode_www_form(data)
5
+ url = "instantcounts/#{endpoint}/#{campaign_id}?#{query_string}"
6
+ parse_response(client.get_request(url))
7
+ end
8
+
9
+ def search(campaign_name)
10
+ url = 'campaign/search'
11
+ data = { 'campaignName' => campaign_name }
12
+ parse_response(client.post_request(url, data))
13
+ end
14
+ end
15
+ end
@@ -20,13 +20,13 @@ module Adzerk
20
20
  @client.get_request(url)
21
21
  end
22
22
 
23
- def listAll
23
+ def listAll(page: 1, pageSize: 500)
24
24
  response = client.get_request('categories')
25
25
  parse_response(response)
26
26
  end
27
27
 
28
- def list(flight_id)
29
- url = "flight/#{flight_id}/categories"
28
+ def list(flight_id, page: 1, pageSize: 500)
29
+ url = "flight/#{flight_id}/categories?page=#{page}&pageSize=#{pageSize}"
30
30
  response = client.get_request(url)
31
31
  parse_response(response)
32
32
  end
@@ -0,0 +1,9 @@
1
+ module Adzerk
2
+ class Channel < ApiEndpoint
3
+ def get_priorities(channel_id)
4
+ url = "channel/#{channel_id}/priorities"
5
+ response = client.get_request(url)
6
+ parse_response(response)
7
+ end
8
+ end
9
+ end
@@ -21,7 +21,7 @@ module Adzerk
21
21
  response = parse_response(response)
22
22
  end
23
23
 
24
- def list
24
+ def list(page: 1, pageSize: 500)
25
25
  response = client.get_request('channelSite')
26
26
  parse_response(response)
27
27
  end
data/lib/adzerk/client.rb CHANGED
@@ -6,11 +6,21 @@ module Adzerk
6
6
  attr_reader :sites, :ad_types, :zones, :campaigns, :channels, :priorities,
7
7
  :advertisers, :flights, :creatives, :creative_maps,
8
8
  :publishers, :invitations, :reports, :channel_site_maps,
9
- :logins, :geotargetings, :sitezonetargetings, :categories
9
+ :logins, :geotargetings, :sitezonetargetings, :categories,
10
+ :instant_counts, :ads, :creative_templates, :scheduled_reports,
11
+ :day_parts, :distance_targetings
12
+
13
+ VERSION = Gem.loaded_specs['adzerk'].version.to_s
14
+ SDK_HEADER_NAME = 'X-Adzerk-Sdk-Version'
15
+ SDK_HEADER_VALUE = "adzerk-management-sdk-ruby:#{VERSION}"
16
+ BASE_SLEEP = 0.25
17
+ MAX_SLEEP = 5
18
+ MAX_ATTEMPTS = 10
10
19
 
11
20
  DEFAULTS = {
12
- :host => ENV["ADZERK_API_HOST"] || 'https://api.adzerk.net/v1/',
13
- :header => 'X-Adzerk-ApiKey'
21
+ :host => ENV["ADZERK_API_HOST"] || 'https://api.adzerk.net/',
22
+ :header => 'X-Adzerk-ApiKey',
23
+ :include_creative_templates => true
14
24
  }
15
25
 
16
26
  def initialize(key, opts = {})
@@ -19,75 +29,138 @@ module Adzerk
19
29
  @logins = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'login')
20
30
  @sites = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'site')
21
31
  @ad_types = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'adtypes', :subendpoint => 'channel', :datakey => 'adtype')
22
- @flights = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'flight')
32
+ @flights = Adzerk::Flight.new(:client => self, :endpoint => 'flight')
23
33
  @zones = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'zone')
24
- @campaigns = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'campaign')
25
- @channels = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'channel')
34
+ @campaigns = Adzerk::Campaign.new(:client => self, :endpoint => 'campaign')
35
+ @channels = Adzerk::Channel.new(:client => self, :endpoint => 'channel')
26
36
  @priorities = Adzerk::Priority.new(:client => self, :endpoint => 'priority')
27
37
  @advertisers = Adzerk::Advertiser.new(:client => self, :endpoint => 'advertiser')
28
38
  @publishers = Adzerk::Publisher.new(:client => self, :endpoint => 'publisher')
29
39
  @creatives = Adzerk::Creative.new(:client => self, :endpoint => 'creative')
30
40
  @creative_maps = Adzerk::CreativeMap.new(:client => self)
41
+ @ads = @creative_maps
31
42
  @invitations = Adzerk::Invitation.new(:client => self)
32
43
  @reports = Adzerk::Reporting.new(:client => self)
33
44
  @channel_site_maps = Adzerk::ChannelSiteMap.new(:client => self)
34
45
  @geotargetings = Adzerk::GeoTargeting.new(:client => self, :endpoint => 'geotargeting')
35
46
  @sitezonetargetings = Adzerk::SiteZoneTargeting.new(:client => self, :endpoint => 'sitezone')
36
47
  @categories = Adzerk::Category.new(:client => self, :endpoint => 'category')
37
-
48
+ @instant_counts = Adzerk::InstantCount.new(:client => self)
49
+ @creative_templates = Adzerk::CreativeTemplate.new(:client => self)
50
+ @scheduled_reports = Adzerk::ScheduledReporting.new(:client => self, :endpoint => 'report')
51
+ @day_parts = Adzerk::DayParting.new(:client => self, :endpoint => 'dayparting')
52
+ @distance_targetings = Adzerk::DistanceTargeting.new(:client => self, :endpoint => 'distancetargeting')
38
53
  end
39
54
 
40
- def get_request(url)
41
- uri = URI.parse(@config[:host] + url)
55
+ def get_request(url, version: 'v1')
56
+ uri = URI.parse("#{@config[:host]}#{version}/#{url}")
42
57
  request = Net::HTTP::Get.new(uri.request_uri)
43
58
  request.add_field(@config[:header], @api_key)
59
+ request.add_field(SDK_HEADER_NAME, SDK_HEADER_VALUE)
60
+ send_request(request, uri)
61
+ end
62
+
63
+ def delete_request(url, version: 'v1')
64
+ uri = URI.parse("#{@config[:host]}#{version}/#{url}")
65
+ request = Net::HTTP::Delete.new(uri.request_uri)
66
+ request.add_field(@config[:header], @api_key)
67
+ request.add_field(SDK_HEADER_NAME, SDK_HEADER_VALUE)
44
68
  send_request(request, uri)
45
69
  end
46
70
 
47
- def post_request(url, data)
48
- uri = URI.parse(@config[:host] + url)
71
+ def post_request(url, data, version: 'v1')
72
+ uri = URI.parse("#{@config[:host]}#{version}/#{url}")
49
73
  request = Net::HTTP::Post.new(uri.request_uri)
50
74
  request.add_field(@config[:header], @api_key)
75
+ request.add_field(SDK_HEADER_NAME, SDK_HEADER_VALUE)
51
76
  request.set_form_data(data)
52
77
  send_request(request, uri)
53
78
  end
54
79
 
55
- def put_request(url, data)
56
- uri = URI.parse(@config[:host] + url)
80
+ def post_json_request(url, data, version: 'v1')
81
+ uri = URI.parse("#{@config[:host]}#{version}/#{url}")
82
+ request = Net::HTTP::Post.new(uri.request_uri, 'Content-Type' => 'application/json')
83
+ request.add_field(@config[:header], @api_key)
84
+ request.add_field(SDK_HEADER_NAME, SDK_HEADER_VALUE)
85
+ request.body = data.to_json
86
+ send_request(request, uri)
87
+ end
88
+
89
+ def put_request(url, data, version: 'v1')
90
+ uri = URI.parse("#{@config[:host]}#{version}/#{url}")
57
91
  request = Net::HTTP::Put.new(uri.request_uri)
58
92
  request.add_field(@config[:header], @api_key)
93
+ request.add_field(SDK_HEADER_NAME, SDK_HEADER_VALUE)
59
94
  request.set_form_data(data)
60
95
  send_request(request, uri)
61
96
  end
62
97
 
63
- def create_creative(data={}, image_path='')
64
- response = RestClient.post(@config[:host] + 'creative',
65
- {:creative => camelize_data(data).to_json},
66
- :X_Adzerk_ApiKey => @api_key,
67
- :accept => :json)
98
+ def put_json_request(url, data, version: 'v1')
99
+ uri = URI.parse("#{@config[:host]}#{version}/#{url}")
100
+ request = Net::HTTP::Put.new(uri.request_uri, 'Content-Type' => 'application/json')
101
+ request.add_field(@config[:header], @api_key)
102
+ request.add_field(SDK_HEADER_NAME, SDK_HEADER_VALUE)
103
+ request.body = data.to_json
104
+ send_request(request, uri)
105
+ end
106
+
107
+ def create_creative(data={}, image_path='', version: 'v1')
108
+ response = nil
109
+ attempt = 0
110
+
111
+ loop do
112
+ response = RestClient.post(@config[:host] + version + '/creative',
113
+ {:creative => camelize_data(data).to_json},
114
+ :X_Adzerk_ApiKey => @api_key,
115
+ :X_Adzerk_Sdk_Version => SDK_HEADER_VALUE,
116
+ :accept => :json)
117
+ break if response.code != 429 or attempt >= (@config[:max_attempts] || MAX_ATTEMPTS)
118
+ sleep(rand(0.0..[MAX_SLEEP, BASE_SLEEP * 2 ** attempt].min()))
119
+ attempt += 1
120
+ end
68
121
  response = upload_creative(JSON.parse(response)["Id"], image_path) unless image_path.empty?
69
122
  response
70
123
  end
71
124
 
72
- def upload_creative(id, image_path, size_override: false)
125
+ def upload_creative(id, image_path, size_override: false, version: 'v1')
126
+ response = nil
127
+ attempt = 0
73
128
  image = File.new(image_path, 'rb')
74
- url = @config[:host] + 'creative/' + id.to_s + '/upload'
129
+ url = @config[:host] + version + '/creative/' + id.to_s + '/upload'
75
130
  url += '?sizeOverride=true' if size_override
76
- RestClient.post(url,
77
- {:image => image},
78
- "X-Adzerk-ApiKey" => @api_key,
79
- :accept => :mime)
131
+ loop do
132
+ response = RestClient.post(url,
133
+ {:image => image},
134
+ "X-Adzerk-ApiKey" => @api_key,
135
+ SDK_HEADER_NAME => SDK_HEADER_VALUE,
136
+ :accept => :mime)
137
+
138
+ break if response.code != 429 or attempt >= (@config[:max_attempts] || MAX_ATTEMPTS)
139
+ sleep(rand(0.0..[MAX_SLEEP, BASE_SLEEP * 2 ** attempt].min()))
140
+ attempt += 1
141
+ end
142
+ response
80
143
  end
81
144
 
82
145
  def send_request(request, uri)
146
+ response = nil
147
+ attempt = 0
83
148
  http = Net::HTTP.new(uri.host, uri.port)
84
149
  http.use_ssl = uri.scheme == 'https'
85
- response = http.request(request)
150
+
151
+ loop do
152
+ response = http.request(request)
153
+ break if response.code != "429" or attempt >= (@config[:max_attempts] || MAX_ATTEMPTS)
154
+ sleep(rand(0.0..[MAX_SLEEP, BASE_SLEEP * 2 ** attempt].min()))
155
+ attempt += 1
156
+ end
157
+
86
158
  if response.kind_of? Net::HTTPClientError or response.kind_of? Net::HTTPServerError
87
159
  error_response = JSON.parse(response.body)
88
- msg = error_response["message"] || error_response["Error"]
160
+ msg = error_response["message"] || error_response["Error"] || response.body
89
161
  raise Adzerk::ApiError.new(msg)
90
162
  end
163
+
91
164
  response
92
165
  end
93
166
 
@@ -8,8 +8,8 @@ module Adzerk
8
8
  uncamelize_data(JSON.parse(response))
9
9
  end
10
10
 
11
- def list(advertiserId)
12
- url = 'advertiser/' + advertiserId.to_s + "/creatives"
11
+ def list(advertiserId, page: 1, pageSize: 500)
12
+ url = "advertiser/#{advertiserId}/creatives?page=#{page}&pageSize=#{pageSize}"
13
13
  parse_response(@client.get_request(url))
14
14
  end
15
15
 
@@ -18,8 +18,8 @@ module Adzerk
18
18
  parse_response(@client.get_request(url))
19
19
  end
20
20
 
21
- def list(flight_id)
22
- url = "flight/#{flight_id}/creatives"
21
+ def list(flight_id, page: 1, pageSize: 500)
22
+ url = "flight/#{flight_id}/creatives?page=#{page}&#pageSize=#{pageSize}"
23
23
  parse_response(@client.get_request(url))
24
24
  end
25
25
 
@@ -34,5 +34,10 @@ module Adzerk
34
34
  @client.get_request(url)
35
35
  end
36
36
 
37
+ def instant_counts(creative_map_id, data={})
38
+ query_string = URI.encode_www_form(data)
39
+ url = "instantcounts/ad/#{creative_map_id}?#{query_string}"
40
+ parse_response(@client.get_request(url))
41
+ end
37
42
  end
38
43
  end
@@ -0,0 +1,30 @@
1
+ module Adzerk
2
+ class CreativeTemplate
3
+
4
+ include Adzerk::Util
5
+
6
+ attr_reader :client
7
+
8
+ def initialize(args={})
9
+ @client = args[:client]
10
+ end
11
+
12
+ def create(data={})
13
+ parse_response(@client.post_json_request("creative-templates", camelize_data(data), version: 'v2'))
14
+ end
15
+
16
+ def update(id, data={})
17
+ url = "creative-templates/#{id}/update"
18
+ parse_response(@client.post_json_request(url, camelize_data(data), version: 'v2'))
19
+ end
20
+
21
+ def get(id)
22
+ parse_response(@client.get_request("creative-templates/#{id}", version: 'v2'))
23
+ end
24
+
25
+ def list(page: 1, pageSize: 100)
26
+ url = "creative-templates?page=#{page}&pageSize=#{pageSize}"
27
+ parse_response(@client.get_request(url, version: 'v2'))
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,23 @@
1
+ module Adzerk
2
+ class DayParting < ApiEndpoint
3
+ def create(flight_id, data={})
4
+ url = "flight/#{flight_id}/dayparting"
5
+ parse_response(@client.post_json_request(url, camelize_data(data)))
6
+ end
7
+
8
+ def get(flight_id, timepart_id)
9
+ url = "flight/#{flight_id}/dayparting/#{timepart_id}"
10
+ parse_response(@client.get_request(url))
11
+ end
12
+
13
+ def list(flight_id)
14
+ url = "flight/#{flight_id}/dayparting"
15
+ parse_response(@client.get_request(url))
16
+ end
17
+
18
+ def delete(flight_id, timepart_id)
19
+ url = "flight/#{flight_id}/dayparting/#{timepart_id}/delete"
20
+ @client.post_request(url, data={})
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,33 @@
1
+ module Adzerk
2
+ class DistanceTargeting < ApiEndpoint
3
+ def create(flight_id, data={})
4
+ url = "flight/#{flight_id}/distance"
5
+ parse_response(@client.post_json_request(url, camelize_data(data)))
6
+ end
7
+
8
+ def batch_upload(flight_id, data={})
9
+ url = "flight/#{flight_id}/distance/batch"
10
+ parse_response(@client.post_json_request(url, camelize_data(data)))
11
+ end
12
+
13
+ def update(flight_id, geometry_id, data={})
14
+ url = "flight/#{flight_id}/distance/#{geometry_id}"
15
+ parse_response(@client.put_json_request(url, camelize_data(data)))
16
+ end
17
+
18
+ def get(flight_id, geometry_id)
19
+ url = "flight/#{flight_id}/distance/#{geometry_id}"
20
+ parse_response(@client.get_request(url))
21
+ end
22
+
23
+ def list(flight_id)
24
+ url = "flight/#{flight_id}/distance"
25
+ parse_response(@client.get_request(url))
26
+ end
27
+
28
+ def delete(flight_id, geometry_id)
29
+ url = "flight/#{flight_id}/distance/#{geometry_id}"
30
+ @client.delete_request(url)
31
+ end
32
+ end
33
+ end