adzerk 0.14 → 0.15

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
  SHA256:
3
- metadata.gz: dfcb33e06a66b4728d0a27e69c41a240a3d3f73ce3af93056fdbb794e6b1361c
4
- data.tar.gz: d6b9c3113f6120d074a517643a56fb4cb1fc2b98b98abe016cb31cbebcadad32
3
+ metadata.gz: b08fcf724937ddb370874ccdf50506ca1f6e16be79cde06dc8777d1e1d99bfd6
4
+ data.tar.gz: 28776f7247b58b93c4590fa1689737288a738240403e0d0af18bebd381f9b97d
5
5
  SHA512:
6
- metadata.gz: f549e8160c19e563cdb4aa4c54b085a833b62b6588227c2540f7e58471805ed88f79680f3d3a32c125639e98a7502b55fe9dee2b4736c560322a10ef5aa5aa61
7
- data.tar.gz: 2be8a73fb39675f73bd02e13ddd6165f2402005b561b03ab94cf546fd4702c8fcf5105b1240cd7b0a8b71dcb214064764e6d7ce249bee12f2e87d7947533ceaa
6
+ metadata.gz: 4763be769dac520c65beb9e7e6049089633635a75fc20f9480428d1b286cbeaa2bd543d5a16e4ae4d4a40c5674ae3e6963e2f2d5f5141ab574686829d8511630
7
+ data.tar.gz: 5e6e08ec68228782bf1acdecc0c035ac66567f0886adcbde45ba77e03a073321d375287b1e4e316aee2a6d65ba7cb20c4812d1a4597567ae0eeb8a6dbc783090
@@ -18,3 +18,6 @@ require "adzerk/site_zone_targeting"
18
18
  require "adzerk/category"
19
19
  require "adzerk/client"
20
20
  require "adzerk/priority"
21
+ require "adzerk/campaign"
22
+ require "adzerk/instant_count"
23
+ require "adzerk/creative_template"
@@ -5,5 +5,15 @@ 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)
10
+ url = "instantcounts/#{endpoint}/#{advertiser_id}?page=#{page}&pageSize=#{pageSize}"
11
+ parse_response(client.get_request(url))
12
+ end
13
+
14
+ def list_creatives(advertiser_id, page: 1, pageSize: 500)
15
+ url = "advertiser/#{advertiser_id}/creatives?page=#{page}&pageSize=#{pageSize}"
16
+ parse_response(@client.get_request(url))
17
+ end
8
18
  end
9
19
  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,8 @@
1
+ module Adzerk
2
+ class Campaign < ApiEndpoint
3
+ def instant_counts(campaign_id)
4
+ url = "instantcounts/#{endpoint}/#{campaign_id}"
5
+ parse_response(client.get_request(url))
6
+ end
7
+ end
8
+ 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
@@ -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
@@ -6,11 +6,17 @@ 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
11
+
12
+ VERSION = Gem.loaded_specs['adzerk'].version.to_s
13
+ SDK_HEADER_NAME = 'X-Adzerk-Sdk-Version'
14
+ SDK_HEADER_VALUE = "adzerk-management-sdk-ruby:#{VERSION}"
10
15
 
11
16
  DEFAULTS = {
12
- :host => ENV["ADZERK_API_HOST"] || 'https://api.adzerk.net/v1/',
13
- :header => 'X-Adzerk-ApiKey'
17
+ :host => ENV["ADZERK_API_HOST"] || 'https://api.adzerk.net/',
18
+ :header => 'X-Adzerk-ApiKey',
19
+ :include_creative_templates => true
14
20
  }
15
21
 
16
22
  def initialize(key, opts = {})
@@ -19,63 +25,88 @@ module Adzerk
19
25
  @logins = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'login')
20
26
  @sites = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'site')
21
27
  @ad_types = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'adtypes', :subendpoint => 'channel', :datakey => 'adtype')
22
- @flights = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'flight')
28
+ @flights = Adzerk::Flight.new(:client => self, :endpoint => 'flight')
23
29
  @zones = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'zone')
24
- @campaigns = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'campaign')
30
+ @campaigns = Adzerk::Campaign.new(:client => self, :endpoint => 'campaign')
25
31
  @channels = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'channel')
26
32
  @priorities = Adzerk::Priority.new(:client => self, :endpoint => 'priority')
27
33
  @advertisers = Adzerk::Advertiser.new(:client => self, :endpoint => 'advertiser')
28
34
  @publishers = Adzerk::Publisher.new(:client => self, :endpoint => 'publisher')
29
35
  @creatives = Adzerk::Creative.new(:client => self, :endpoint => 'creative')
30
36
  @creative_maps = Adzerk::CreativeMap.new(:client => self)
37
+ @ads = @creative_maps
31
38
  @invitations = Adzerk::Invitation.new(:client => self)
32
39
  @reports = Adzerk::Reporting.new(:client => self)
33
40
  @channel_site_maps = Adzerk::ChannelSiteMap.new(:client => self)
34
41
  @geotargetings = Adzerk::GeoTargeting.new(:client => self, :endpoint => 'geotargeting')
35
42
  @sitezonetargetings = Adzerk::SiteZoneTargeting.new(:client => self, :endpoint => 'sitezone')
36
43
  @categories = Adzerk::Category.new(:client => self, :endpoint => 'category')
37
-
44
+ @instant_counts = Adzerk::InstantCount.new(:client => self)
45
+ @creative_templates = Adzerk::CreativeTemplate.new(:client => self)
38
46
  end
39
47
 
40
- def get_request(url)
41
- uri = URI.parse(@config[:host] + url)
48
+ def get_request(url, version: 'v1')
49
+ uri = URI.parse("#{@config[:host]}#{version}/#{url}")
42
50
  request = Net::HTTP::Get.new(uri.request_uri)
43
51
  request.add_field(@config[:header], @api_key)
52
+ request.add_field(SDK_HEADER_NAME, SDK_HEADER_VALUE)
44
53
  send_request(request, uri)
45
54
  end
46
55
 
47
- def post_request(url, data)
48
- uri = URI.parse(@config[:host] + url)
56
+ def post_request(url, data, version: 'v1')
57
+ uri = URI.parse("#{@config[:host]}#{version}/#{url}")
49
58
  request = Net::HTTP::Post.new(uri.request_uri)
50
59
  request.add_field(@config[:header], @api_key)
60
+ request.add_field(SDK_HEADER_NAME, SDK_HEADER_VALUE)
51
61
  request.set_form_data(data)
52
62
  send_request(request, uri)
53
63
  end
54
64
 
55
- def put_request(url, data)
56
- uri = URI.parse(@config[:host] + url)
65
+ def post_json_request(url, data, version: 'v1')
66
+ uri = URI.parse("#{@config[:host]}#{version}/#{url}")
67
+ request = Net::HTTP::Post.new(uri.request_uri, 'Content-Type' => 'application/json')
68
+ request.add_field(@config[:header], @api_key)
69
+ request.add_field(SDK_HEADER_NAME, SDK_HEADER_VALUE)
70
+ request.body = data.to_json
71
+ send_request(request, uri)
72
+ end
73
+
74
+ def put_request(url, data, version: 'v1')
75
+ uri = URI.parse("#{@config[:host]}#{version}/#{url}")
57
76
  request = Net::HTTP::Put.new(uri.request_uri)
58
77
  request.add_field(@config[:header], @api_key)
78
+ request.add_field(SDK_HEADER_NAME, SDK_HEADER_VALUE)
59
79
  request.set_form_data(data)
60
80
  send_request(request, uri)
61
81
  end
62
82
 
63
- def create_creative(data={}, image_path='')
64
- response = RestClient.post(@config[:host] + 'creative',
83
+ def put_json_request(url, data, version: 'v1')
84
+ uri = URI.parse("#{@config[:host]}#{version}/#{url}")
85
+ request = Net::HTTP::Put.new(uri.request_uri, 'Content-Type' => 'application/json')
86
+ request.add_field(@config[:header], @api_key)
87
+ request.add_field(SDK_HEADER_NAME, SDK_HEADER_VALUE)
88
+ request.body = data.to_json
89
+ send_request(request, uri)
90
+ end
91
+
92
+ def create_creative(data={}, image_path='', version: 'v1')
93
+ response = RestClient.post(@config[:host] + version + '/creative',
65
94
  {:creative => camelize_data(data).to_json},
66
95
  :X_Adzerk_ApiKey => @api_key,
96
+ :X_Adzerk_Sdk_Version => SDK_HEADER_VALUE,
67
97
  :accept => :json)
68
98
  response = upload_creative(JSON.parse(response)["Id"], image_path) unless image_path.empty?
69
99
  response
70
100
  end
71
101
 
72
- def upload_creative(id, image_path, size_override: false)
102
+ def upload_creative(id, image_path, size_override: false, version: 'v1')
73
103
  image = File.new(image_path, 'rb')
74
- url = @config[:host] + 'creative/' + id.to_s + '/upload'
104
+ url = @config[:host] + version + '/creative/' + id.to_s + '/upload'
75
105
  url += '?sizeOverride=true' if size_override
76
106
  RestClient.post(url,
77
107
  {:image => image},
78
108
  "X-Adzerk-ApiKey" => @api_key,
109
+ SDK_HEADER_NAME => SDK_HEADER_VALUE,
79
110
  :accept => :mime)
80
111
  end
81
112
 
@@ -85,7 +116,7 @@ module Adzerk
85
116
  response = http.request(request)
86
117
  if response.kind_of? Net::HTTPClientError or response.kind_of? Net::HTTPServerError
87
118
  error_response = JSON.parse(response.body)
88
- msg = error_response["message"] || error_response["Error"]
119
+ msg = error_response["message"] || error_response["Error"] || response.body
89
120
  raise Adzerk::ApiError.new(msg)
90
121
  end
91
122
  response
@@ -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)
38
+ url = "instantcounts/#{endpoint}/#{creative_map_id}"
39
+ parse_response(client.get_request(url))
40
+ end
41
+
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
@@ -8,5 +8,18 @@ module Adzerk
8
8
  url = 'region/' + region
9
9
  parse_reponse(@client.get_request(url))
10
10
  end
11
+
12
+ def instant_counts(flight_id)
13
+ url = "instantcounts/#{endpoint}/#{flight_id}"
14
+ parse_response(client.get_request(url))
15
+ end
16
+
17
+ def list_for_campaign(campaign_id, is_active = nil)
18
+ url = "campaign/#{campaign_id}/flight"
19
+ if !is_active.nil?
20
+ url = "#{url}?isActive=#{is_active}"
21
+ end
22
+ parse_response(@client.get_request(url))
23
+ end
11
24
  end
12
25
  end
@@ -0,0 +1,15 @@
1
+ module Adzerk
2
+ class InstantCount
3
+ include Adzerk::Util
4
+
5
+ def initialize(args={})
6
+ @client = args[:client]
7
+ end
8
+
9
+ def bulk(data={})
10
+ url = "instantcounts/bulk"
11
+ response = @client.post_json_request(url, data)
12
+ parse_response(response)
13
+ end
14
+ end
15
+ end
@@ -13,5 +13,19 @@ module Adzerk
13
13
  parse_response(response)
14
14
  end
15
15
 
16
+ def create(opts={}, subid=nil)
17
+ e = (subid && subendpoint) ? "#{subendpoint}/#{subid}/#{endpoint}" : endpoint
18
+ data = { datakey => camelize_data(opts).to_json }
19
+ response = @client.post_request(e, data)
20
+ parse_response(response)
21
+ end
22
+
23
+ def update(opts={})
24
+ id = opts[:id].to_s
25
+ data = { datakey => camelize_data(opts).to_json }
26
+ response = @client.put_request("#{endpoint}/#{id}", data)
27
+ parse_response(response)
28
+ end
29
+
16
30
  end
17
31
  end
@@ -1,6 +1,6 @@
1
1
  module Adzerk
2
2
  module Util
3
- extend self
3
+ extend self
4
4
 
5
5
  def camelize_data(data)
6
6
  return data unless data.respond_to?(:reduce)
@@ -1,3 +1,3 @@
1
1
  module Adzerk
2
- VERSION = "0.14"
2
+ VERSION = "0.15"
3
3
  end
@@ -106,9 +106,13 @@ describe "Category API" do
106
106
  @category.create(bad_id, $new_category)
107
107
  }.to raise_error "Flight is not a part of your network"
108
108
 
109
- expect {
110
- @category.list(bad_id)
111
- }.to raise_error "Flight is not a part of your network"
109
+ # Disabling this assertion temporarily.
110
+ # The API is no longer returning an error bur rather an empty list.
111
+ # Once the bug in API is fixed, this needs to be re-enabled.
112
+ #
113
+ # expect {
114
+ # @category.list(bad_id)
115
+ # }.to raise_error "Flight is not a part of your network"
112
116
 
113
117
  expect {
114
118
  @category.delete(bad_id,$category_id)
@@ -0,0 +1,96 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Creative Template API" do
4
+
5
+ before do
6
+ @creative_templates = Adzerk::Client.new(API_KEY).creative_templates
7
+ end
8
+
9
+ it "should create a new creative template" do
10
+ expected = {
11
+ description: 'Creative Template Description',
12
+ name: 'API Test Creative Template Name 1',
13
+ is_archived: false,
14
+ fields: [{
15
+ name: 'Title',
16
+ description: 'The Creative Template Title',
17
+ type: 'String',
18
+ variable: 'ctTitle',
19
+ required: true,
20
+ }, {
21
+ name: 'Thumbnail',
22
+ description: 'The URL of a Thumbnail Image',
23
+ type: 'String',
24
+ variable: 'ctThumbnailUrl',
25
+ required: false,
26
+ }],
27
+ contents: [{
28
+ type: 'Raw',
29
+ body: '{"title": "{{ctTitle}}", "thumbnailUrl": "{{ctThumbnailUrl}}" }'
30
+ }]
31
+ }
32
+
33
+ result = @creative_templates.create(expected)
34
+
35
+ $creative_template_id = result[:id].to_s
36
+
37
+ expect(result).to include(:id)
38
+ expect(result[:description]).to eq(expected[:description])
39
+ expect(result[:name]).to eq(expected[:name])
40
+ expect(result[:is_archived]).to eq(expected[:is_archived])
41
+ expect(result[:fields]).to match_array(expected[:fields])
42
+ end
43
+
44
+ it "should list existing creative templates" do
45
+ result = @creative_templates.list
46
+
47
+ expect(result[:page]).to eq(1)
48
+ expect(result[:page_size]).to eq(100)
49
+ expect(result[:total_items]).to be >= 1
50
+ end
51
+
52
+ it "should get an existing creative template" do
53
+ expected = {
54
+ description: 'Creative Template Description',
55
+ name: 'API Test Creative Template Name 1',
56
+ is_archived: false,
57
+ fields: [{
58
+ name: 'Title',
59
+ description: 'The Creative Template Title',
60
+ type: 'String',
61
+ variable: 'ctTitle',
62
+ required: true,
63
+ }, {
64
+ name: 'Thumbnail',
65
+ description: 'The URL of a Thumbnail Image',
66
+ type: 'String',
67
+ variable: 'ctThumbnailUrl',
68
+ required: false,
69
+ }],
70
+ contents: [{
71
+ type: 'Raw',
72
+ body: '{"title": "{{ctTitle}}", "thumbnailUrl": "{{ctThumbnailUrl}}" }'
73
+ }]
74
+ }
75
+
76
+ result = @creative_templates.get($creative_template_id)
77
+
78
+ expect(result[:description]).to eq(expected[:description])
79
+ expect(result[:name]).to eq(expected[:name])
80
+ expect(result[:is_archived]).to eq(expected[:is_archived])
81
+ expect(result[:fields]).to match_array(expected[:fields])
82
+ end
83
+
84
+ it "should update an existing creative template" do
85
+ update = {
86
+ updates: [{
87
+ path: ['IsArchived'],
88
+ value: true
89
+ }]
90
+ }
91
+
92
+ result = @creative_templates.update($creative_template_id, update)
93
+
94
+ expect(result[:is_archived]).to eq(true)
95
+ end
96
+ end
@@ -112,7 +112,7 @@ describe "GeoTargeting API" do
112
112
  it "should error when deleting a geotargeting that does not exist" do
113
113
  expect {
114
114
  @geotargetings.delete($flight_id, 1)
115
- }.to raise_error "Couldn't find network for model: PassLocation, id: 1"
115
+ }.to raise_error "This PassLocation does not exist in your network."
116
116
  end
117
117
 
118
118
  it "should check if a flight is not a part of your network" do
@@ -0,0 +1,25 @@
1
+ require 'pp'
2
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
+
4
+ describe "Instant Count API" do
5
+ before(:all) do
6
+ client = Adzerk::Client.new(API_KEY)
7
+ @instant_counts = client.instant_counts
8
+ end
9
+
10
+ it "should fetch bulk instant counts" do
11
+ advertiser_id = 1065290
12
+ campaign_id = 1582611
13
+
14
+ counts = @instant_counts.bulk({
15
+ :advertisers => [advertiser_id],
16
+ :campaigns => [campaign_id]
17
+ })
18
+
19
+ expect(counts).to have_key(:advertisers)
20
+ expect(counts[:advertisers]).to have_key(advertiser_id.to_s.to_sym)
21
+
22
+ expect(counts).to have_key(:campaigns)
23
+ expect(counts[:campaigns]).to have_key(campaign_id.to_s.to_sym)
24
+ end
25
+ end
@@ -127,7 +127,7 @@ describe "SiteZoneTargeting API" do
127
127
  it "should error when deleting a sitezone targeting that does not exist" do
128
128
  expect {
129
129
  @sitezonetargeting.delete($flight_id,1)
130
- }.to raise_error "Couldn't find network for model: PassSiteMap, id: 1"
130
+ }.to raise_error "This PassSiteMap does not exist in your network."
131
131
  end
132
132
 
133
133
  it "should check if a flight is not a part of your network" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adzerk
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.14'
4
+ version: '0.15'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kacy Fortner
@@ -17,7 +17,7 @@ authors:
17
17
  autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
- date: 2020-07-06 00:00:00.000000000 Z
20
+ date: 2021-01-22 00:00:00.000000000 Z
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
23
23
  name: rspec
@@ -98,14 +98,17 @@ files:
98
98
  - lib/adzerk.rb
99
99
  - lib/adzerk/advertiser.rb
100
100
  - lib/adzerk/api_endpoint.rb
101
+ - lib/adzerk/campaign.rb
101
102
  - lib/adzerk/category.rb
102
103
  - lib/adzerk/channel_site_map.rb
103
104
  - lib/adzerk/client.rb
104
105
  - lib/adzerk/creative.rb
105
106
  - lib/adzerk/creative_map.rb
107
+ - lib/adzerk/creative_template.rb
106
108
  - lib/adzerk/errors.rb
107
109
  - lib/adzerk/flight.rb
108
110
  - lib/adzerk/geo_targeting.rb
111
+ - lib/adzerk/instant_count.rb
109
112
  - lib/adzerk/invitation.rb
110
113
  - lib/adzerk/priority.rb
111
114
  - lib/adzerk/publisher.rb
@@ -121,8 +124,10 @@ files:
121
124
  - test/channel_site_map_api_spec.rb
122
125
  - test/creative_api_spec.rb
123
126
  - test/creative_map_api_spec.rb
127
+ - test/creative_template_spec.rb
124
128
  - test/flight_api_spec.rb
125
129
  - test/geo_targeting_api_spec.rb
130
+ - test/instant_count_api_spec.rb
126
131
  - test/invitation_api_spec.rb
127
132
  - test/login_api_spec.rb
128
133
  - test/priority_api_spec.rb