adzerk 0.1.4 → 0.2

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.
Files changed (51) hide show
  1. data/lib/adzerk.rb +15 -0
  2. data/lib/adzerk/advertiser.rb +9 -0
  3. data/lib/adzerk/api_endpoint.rb +41 -0
  4. data/lib/adzerk/channel_site_map.rb +53 -0
  5. data/lib/adzerk/client.rb +80 -0
  6. data/lib/adzerk/creative.rb +17 -0
  7. data/lib/adzerk/creative_map.rb +38 -0
  8. data/lib/adzerk/flight.rb +12 -0
  9. data/lib/adzerk/invitation.rb +23 -0
  10. data/lib/adzerk/publisher.rb +17 -0
  11. data/lib/adzerk/reporting.rb +21 -0
  12. data/lib/adzerk/util.rb +37 -0
  13. data/lib/adzerk/version.rb +3 -0
  14. data/test/advertiser_api_spec.rb +57 -82
  15. data/test/campaign_api_spec.rb +150 -271
  16. data/test/channel_api_spec.rb +72 -79
  17. data/test/channel_site_map_api_spec.rb +43 -94
  18. data/test/creative_api_spec.rb +82 -251
  19. data/test/creative_map_api_spec.rb +291 -375
  20. data/test/flight_api_spec.rb +165 -493
  21. data/test/invitation_api_spec.rb +18 -41
  22. data/test/login_api_spec.rb +24 -49
  23. data/test/priority_api_spec.rb +53 -83
  24. data/test/publisher_api_spec.rb +71 -142
  25. data/test/rakefile.rb +7 -7
  26. data/test/report_api_spec.rb +18 -24
  27. data/test/security_api_spec.rb +21 -0
  28. data/test/site_api_spec.rb +37 -51
  29. data/test/spec_helper.rb +4 -17
  30. data/test/zone_api_spec.rb +38 -64
  31. metadata +61 -23
  32. data/lib/Adzerk.rb +0 -55
  33. data/lib/adzerk/Advertiser.rb +0 -39
  34. data/lib/adzerk/Campaign.rb +0 -33
  35. data/lib/adzerk/Channel.rb +0 -33
  36. data/lib/adzerk/ChannelSiteMap.rb +0 -44
  37. data/lib/adzerk/Creative.rb +0 -43
  38. data/lib/adzerk/CreativeMap.rb +0 -33
  39. data/lib/adzerk/Flight.rb +0 -44
  40. data/lib/adzerk/Invitation.rb +0 -17
  41. data/lib/adzerk/Login.rb +0 -28
  42. data/lib/adzerk/Priority.rb +0 -34
  43. data/lib/adzerk/Publisher.rb +0 -47
  44. data/lib/adzerk/Reporting.rb +0 -16
  45. data/lib/adzerk/Site.rb +0 -35
  46. data/lib/adzerk/Zone.rb +0 -35
  47. data/test/channel_api_security_spec.rb +0 -51
  48. data/test/csv_export_spec.rb +0 -89
  49. data/test/delivery-test.rb +0 -132
  50. data/test/test.rb +0 -43
  51. data/test/test2.rb +0 -175
@@ -0,0 +1,15 @@
1
+ require "json"
2
+ require "net/http"
3
+ require "active_support/inflector"
4
+ require "rest_client"
5
+ require "adzerk/util"
6
+ require "adzerk/api_endpoint"
7
+ require "adzerk/advertiser"
8
+ require "adzerk/flight"
9
+ require "adzerk/creative"
10
+ require "adzerk/creative_map"
11
+ require "adzerk/publisher"
12
+ require "adzerk/invitation"
13
+ require "adzerk/reporting"
14
+ require "adzerk/channel_site_map"
15
+ require "adzerk/client"
@@ -0,0 +1,9 @@
1
+ module Adzerk
2
+ class Advertiser < ApiEndpoint
3
+ def search(advertiser_name)
4
+ url = 'advertiser/search'
5
+ data = { 'advertiserName' => advertiser_name }
6
+ parse_response(client.post_request(url, data))
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,41 @@
1
+ module Adzerk
2
+ class ApiEndpoint
3
+
4
+ include Adzerk::Util
5
+
6
+ attr_reader :client, :endpoint
7
+
8
+ def initialize(args= {})
9
+ @client = args[:client]
10
+ @endpoint = args[:endpoint]
11
+ end
12
+
13
+ def create(opts={})
14
+ data = { endpoint => camelize_data(opts).to_json }
15
+ response = @client.post_request(endpoint, data)
16
+ parse_response(response)
17
+ end
18
+
19
+ def get(id)
20
+ response = @client.get_request("#{endpoint}/#{id}")
21
+ parse_response(response)
22
+ end
23
+
24
+ def list
25
+ response = @client.get_request(endpoint)
26
+ parse_response(response)
27
+ end
28
+
29
+ def update(opts={})
30
+ id = opts[:id].to_s
31
+ data = { endpoint => camelize_data(opts).to_json }
32
+ response = @client.put_request("#{endpoint}/#{id}", data)
33
+ parse_response(response)
34
+ end
35
+
36
+ def delete(id)
37
+ url = "#{endpoint}/#{id}/delete"
38
+ @client.get_request(url)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,53 @@
1
+ module Adzerk
2
+ class ChannelSiteMap
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
+ data = { 'channelSite' => camelize_data(data).to_json }
14
+ response = client.post_request('channelSite', data)
15
+ parse_response(response)
16
+ end
17
+
18
+ def get(channel_id, site_id)
19
+ url = "channel/#{channel_id}/site/#{site_id}"
20
+ response = client.get_request(url)
21
+ response = parse_response(response)
22
+ end
23
+
24
+ def list
25
+ response = client.get_request('channelSite')
26
+ parse_response(response)
27
+ end
28
+
29
+ def update(data={})
30
+ data = { 'channelSite' => camelize_data(data).to_json }
31
+ response = client.put_request('channelSite', data)
32
+ parse_response(response)
33
+ end
34
+
35
+ def delete(channel_id, site_id)
36
+ url = "channel/#{channel_id}/site/#{site_id}/delete"
37
+ client.get_request(url)
38
+ end
39
+
40
+ def sites_in_channel(channel_id)
41
+ url = "sitesInChannel/#{channel_id}"
42
+ response = client.get_request(url)
43
+ parse_response(response)
44
+ end
45
+
46
+ def channels_in_site(site_id)
47
+ url = "channelsInSite/#{site_id}"
48
+ response = client.get_request(url)
49
+ parse_response(response)
50
+ end
51
+ end
52
+ end
53
+
@@ -0,0 +1,80 @@
1
+ module Adzerk
2
+ class Client
3
+
4
+ include Adzerk::Util
5
+
6
+ attr_reader :sites, :zones, :campaigns, :channels, :priorities,
7
+ :advertisers, :flights, :creatives, :creative_maps,
8
+ :publishers, :invitations, :reports, :channel_site_maps,
9
+ :logins
10
+
11
+ DEFAULTS = {
12
+ :host => ENV["ADZERK_API_HOST"] || 'http://api.adzerk.net/v1/',
13
+ :header => 'X-Adzerk-ApiKey'
14
+ }
15
+
16
+ def initialize(key, opts = {})
17
+ @api_key = key
18
+ @config = DEFAULTS.merge!(opts)
19
+ @sites = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'site')
20
+ @flights = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'flight')
21
+ @zones = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'zone')
22
+ @campaigns = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'campaign')
23
+ @channels = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'channel')
24
+ @priorities = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'priority')
25
+ @advertisers = Adzerk::Advertiser.new(:client => self, :endpoint => 'advertiser')
26
+ @publishers = Adzerk::Publisher.new(:client => self, :endpoint => 'publisher')
27
+ @creatives = Adzerk::Creative.new(:client => self, :endpoint => 'creative')
28
+ @creative_maps = Adzerk::CreativeMap.new(:client => self)
29
+ @invitations = Adzerk::Invitation.new(:client => self)
30
+ @reports = Adzerk::Reporting.new(:client => self)
31
+ @channel_site_maps = Adzerk::ChannelSiteMap.new(:client => self)
32
+ @logins = Adzerk::ApiEndpoint.new(:client => self, :endpoint => 'login')
33
+ end
34
+
35
+ def get_request(url)
36
+ uri = URI.parse(@config[:host] + url)
37
+ http = Net::HTTP.new(uri.host, uri.port)
38
+ request = Net::HTTP::Get.new(uri.request_uri)
39
+ request.add_field(@config[:header], @api_key)
40
+ http.request(request)
41
+ end
42
+
43
+ def post_request(url, data)
44
+ uri = URI.parse(@config[:host] + url)
45
+ http = Net::HTTP.new(uri.host, uri.port)
46
+ request = Net::HTTP::Post.new(uri.request_uri)
47
+ request.add_field(@config[:header], @api_key)
48
+ request.set_form_data(data)
49
+ http.request(request)
50
+ end
51
+
52
+ def put_request(url, data)
53
+ uri = URI.parse(@config[:host] + url)
54
+ http = Net::HTTP.new(uri.host, uri.port)
55
+ request = Net::HTTP::Put.new(uri.request_uri)
56
+ request.add_field(@config[:header], @api_key)
57
+ request.set_form_data(data)
58
+ http.request(request)
59
+ end
60
+
61
+ def create_creative(data={}, image_path='')
62
+ response = RestClient.post(@config[:host] + 'creative',
63
+ {:creative => camelize_data(data).to_json},
64
+ :X_Adzerk_ApiKey => @api_key,
65
+ :content_type => :json,
66
+ :accept => :json)
67
+ response = upload_creative(JSON.parse(response)["Id"], image_path) unless image_path.empty?
68
+ response
69
+ end
70
+
71
+ def upload_creative(id, image_path)
72
+ image = File.new(image_path, 'rb')
73
+ RestClient.post(@config[:host] + 'creative/' + id.to_s + '/upload',
74
+ {:image => image},
75
+ "X-Adzerk-ApiKey" => @api_key,
76
+ :accept => :mime)
77
+ end
78
+
79
+ end
80
+ end
@@ -0,0 +1,17 @@
1
+ require "rest_client"
2
+
3
+ module Adzerk
4
+ class Creative < ApiEndpoint
5
+
6
+ def create(data= {}, imagepath='')
7
+ response = @client.create_creative(data, imagepath)
8
+ uncamelize_data(JSON.parse(response))
9
+ end
10
+
11
+ def list(advertiserId)
12
+ url = 'advertiser/' + advertiserId.to_s + "/creatives"
13
+ parse_response(@client.get_request(url))
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,38 @@
1
+ module Adzerk
2
+ class CreativeMap
3
+
4
+ include Adzerk::Util
5
+
6
+ def initialize(args={})
7
+ @client = args[:client]
8
+ end
9
+
10
+ def create(data={})
11
+ url = "flight/#{data[:flight_id]}/creative"
12
+ data = { 'creative' => camelize_data(data).to_json }
13
+ parse_response(@client.post_request(url, data))
14
+ end
15
+
16
+ def get(id, flight_id)
17
+ url = "flight/#{flight_id}/creative/#{id}"
18
+ parse_response(@client.get_request(url))
19
+ end
20
+
21
+ def list(flight_id)
22
+ url = "flight/#{flight_id}/creatives"
23
+ parse_response(@client.get_request(url))
24
+ end
25
+
26
+ def update(data={})
27
+ url = "flight/#{data[:flight_id]}/creative/#{data[:id]}"
28
+ data = { 'creative' => camelize_data(data).to_json }
29
+ parse_response(@client.put_request(url, data))
30
+ end
31
+
32
+ def delete(id, flight_id)
33
+ url = "flight/#{flight_id}/creative/#{id}/delete"
34
+ @client.get_request(url)
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,12 @@
1
+ module Adzerk
2
+ class Flight < ApiEndpoint
3
+ def countries
4
+ parse_response(@client.get_request('countries'))
5
+ end
6
+
7
+ def regions(region)
8
+ url = 'region/' + region
9
+ parse_reponse(@client.get_request(url))
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,23 @@
1
+ module Adzerk
2
+ class Invitation
3
+
4
+ include Adzerk::Util
5
+
6
+ attr_reader :client
7
+
8
+ def initialize(args= {})
9
+ @client = args[:client]
10
+ end
11
+
12
+ def invite_publisher(data={})
13
+ data = { 'invitation' => camelize_data(data).to_json }
14
+ @client.post_request('invite-publisher', data)
15
+ end
16
+
17
+ def invite_advertiser(data={})
18
+ data = { 'invitation' => camelize_data(data).to_json }
19
+ @client.post_request('invite-advertiser', data)
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,17 @@
1
+ module Adzerk
2
+ class Publisher < ApiEndpoint
3
+
4
+ def earnings(data={})
5
+ data = { 'earnings' => camelize_data(data).to_json }
6
+ response = @client.post_request('/earnings', data)
7
+ parse_response(response)
8
+ end
9
+
10
+ def payments(data={})
11
+ data = { 'payments' => camelize_data(data).to_json }
12
+ response = @client.post_request('/payments', data)
13
+ parse_response(response)
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ module Adzerk
2
+ class Reporting
3
+ include Adzerk::Util
4
+
5
+ attr_accessor :client
6
+
7
+ def initialize(args = {})
8
+ @client = args.fetch(:client)
9
+ end
10
+
11
+ def create_report(data={})
12
+ data = { 'criteria' => camelize_data(data).to_json }
13
+ parse_response(client.post_request('report', data))
14
+ end
15
+
16
+ def retrieve_report(id)
17
+ url = 'report/' + id
18
+ client.get_request(url)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,37 @@
1
+ module Adzerk
2
+ module Util
3
+ extend self
4
+
5
+ def camelize_data(data)
6
+ return data unless data.respond_to?(:reduce)
7
+ data.reduce({}) do |acc, (sym, val)|
8
+ acc[sym.to_s.camelize] = case val
9
+ when Hash then camelize_data(val)
10
+ when Array then val.map { |elem| camelize_data(elem) }
11
+ else val
12
+ end
13
+ acc
14
+ end
15
+ end
16
+
17
+ def uncamelize_data(data)
18
+ # stop condition for the recursion
19
+ return data unless data.respond_to?(:reduce)
20
+ data.reduce({}) do |acc, (key, val)|
21
+ acc[key.underscore.to_sym] = case val
22
+ when Hash then uncamelize_data(val)
23
+ when Array then val.map {|elem| uncamelize_data(elem) }
24
+ else val
25
+ end
26
+ acc
27
+ end
28
+ end
29
+
30
+ def parse_response(response)
31
+ if response.code == "200" or response.code == "400"
32
+ uncamelize_data(JSON.parse(response.body))
33
+ else
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module Adzerk
2
+ VERSION = "0.2"
3
+ end
@@ -1,106 +1,81 @@
1
- require './spec_helper'
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "Advertiser API" do
4
-
5
- $advertiser_url = 'http://www.adzerk.com'
6
- @@advertiser = $adzerk::Advertiser.new
7
-
4
+
5
+ before do
6
+ @advertisers = Adzerk::Client.new(API_KEY).advertisers
7
+ end
8
+
8
9
  it "should create a new advertiser" do
9
10
  $title = 'Test advertiser ' + rand(1000000).to_s
10
- $isActive = true
11
- $isDeleted = false
12
-
13
- new_advertiser = {
14
- 'Title' => $title,
15
- 'IsActive' => $isActive,
16
- 'IsDeleted' => $isDeleted
17
- }
18
-
19
- response = @@advertiser.create(new_advertiser)
20
- $advertiser_id = JSON.parse(response.body)["Id"].to_s
21
- $title.should == JSON.parse(response.body)["Title"]
22
- $isActive.should == JSON.parse(response.body)["IsActive"]
23
- $isDeleted.should == JSON.parse(response.body)["IsDeleted"]
11
+ $is_active = true
12
+ $is_deleted = false
13
+
14
+ advertiser = @advertisers.create(:title => $title,
15
+ :is_active => $is_active,
16
+ :is_deleted => $is_deleted)
17
+ $advertiser_id = advertiser[:id].to_s
18
+ $title.should == advertiser[:title]
19
+ $is_active.should == advertiser[:is_active]
20
+ $is_deleted.should == advertiser[:is_deleted]
24
21
  end
25
-
22
+
26
23
  it "should list a specific advertiser" do
27
- response = @@advertiser.get($advertiser_id)
28
- response.body.should == '{"Id":' + $advertiser_id + ',"Title":"' + $title + '","IsActive":' + $isActive.to_s + ',"IsDeleted":' + $isDeleted.to_s + '}'
24
+ advertiser = @advertisers.get($advertiser_id)
25
+ $title.should == advertiser[:title]
26
+ $is_active.should == advertiser[:is_active]
27
+ $is_deleted.should == advertiser[:is_deleted]
29
28
  end
30
-
31
-
29
+
32
30
  it "should list all advertisers" do
33
- result = @@advertiser.list()
31
+ result = @advertisers.list
34
32
  result.length.should > 0
35
- result["Items"].last["Id"].to_s.should == $advertiser_id
36
- result["Items"].last["Title"].should == $title
37
- result["Items"].last["IsDeleted"].should == $isDeleted
38
- result["Items"].last["IsActive"].should == $isActive
33
+ advertiser = result[:items].last
34
+ $title.should == advertiser[:title]
35
+ $is_active.should == advertiser[:is_active]
36
+ $is_deleted.should == advertiser[:is_deleted]
37
+ $advertiser_id.should == advertiser[:id].to_s
39
38
  end
40
-
39
+
41
40
  it "should update a advertiser" do
42
- $title << "test"
43
- $isActive = false
44
- $isDeleted = false
45
-
46
- updated_advertiser = {
47
- 'Id' => $advertiser_id.to_i,
48
- 'Title' => $title,
49
- 'IsDeleted' => $IsDeleted,
50
- 'IsActive' => $IsActive
51
- }
52
- response = @@advertiser.update(updated_advertiser)
53
- $advertiser_id = JSON.parse(response.body)["Id"].to_s
54
- $title.should == JSON.parse(response.body)["Title"]
55
- $isActive.should == JSON.parse(response.body)["IsActive"]
56
- $isDeleted.should == JSON.parse(response.body)["IsDeleted"]
41
+ advertiser = @advertisers.update(:id => $advertiser_id,
42
+ :title => "Cocacola",
43
+ :is_active => false)
44
+ advertiser[:title].should eq("Cocacola")
45
+ advertiser[:is_active].should eq(false)
46
+ end
47
+
48
+ it "should search advertiser based on name" do
49
+ advertiser = @advertisers.search("Cocacola")
50
+ advertiser[:total_items].should > 0
57
51
  end
58
52
 
59
53
  it "should delete a new advertiser" do
60
- response = @@advertiser.delete($advertiser_id)
61
- response.body.should == 'OK'
54
+ response = @advertisers.delete($advertiser_id)
55
+ response.body.should == '"Successfully deleted."'
62
56
  end
63
-
57
+
64
58
  it "should not list deleted advertisers" do
65
- result = @@advertiser.list()
66
- result["Items"].each do |r|
67
- r["Id"].to_s.should_not == $advertiser_id
59
+ response = @advertisers.list
60
+ response[:items].each do |r|
61
+ r["Id"].should_not == $advertiser_id
68
62
  end
69
63
  end
70
-
64
+
71
65
  it "should not get individual deleted advertiser" do
72
- response = @@advertiser.get($advertiser_id)
73
- true.should == !response.body.scan(/Exception/).empty?
66
+ response = @advertisers.get $advertiser_id
67
+ response[:message].should eq("This advertiser is deleted.")
74
68
  end
75
-
76
- it "should not update deleted advertisers" do
77
- updated_advertiser = {
78
- 'Id' => $advertiser_id,
79
- 'Title' => "test"
80
- }
81
- response = @@advertiser.update(updated_advertiser)
82
- JSON.parse(response.body)["Id"].should == 0
83
- end
84
-
85
- it "should create a new advertiser without IsActive or IsDeleted" do
86
- new_advertiser = {
87
- 'Title' => $title
88
- }
89
- response = @@advertiser.create(new_advertiser)
90
- $title.should == JSON.parse(response.body)["Title"]
91
- JSON.parse(response.body)["IsActive"].should == false
92
- JSON.parse(response.body)["IsDeleted"].should == false
69
+
70
+ it "should not update a deleted advertiser" do
71
+ advertiser = @advertisers.update(:id => $advertiser_id,
72
+ :title => "Cocacola")
73
+ advertiser[:message].should eq("This advertiser is deleted.")
93
74
  end
94
-
75
+
95
76
  it "should require a title" do
96
- new_advertiser = {}
97
- response = @@advertiser.create(new_advertiser)
98
- true.should == !response.body.scan(/Exception/).empty?
77
+ response = @advertisers.create()
78
+ response[:message].should eq("A title is required.")
99
79
  end
100
80
 
101
- it "should search advertiser based on name" do
102
- response = @@advertiser.search("test")
103
-
104
- JSON.parse(response.body)["TotalItems"].should > 0
105
- end
106
- end
81
+ end