perfecta 0.3.3 → 0.4.0

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
  SHA1:
3
- metadata.gz: d8bc2ccc98888f9c26d9a750b41dacf938df86e1
4
- data.tar.gz: cbca3c664ff86f7c070da5f3cef9d362502f15ab
3
+ metadata.gz: 46ddcaccb8c6c33dbf919009621b431d3cbd9df7
4
+ data.tar.gz: 36f0ecbd458731641ff6161fd53403d5eacd79e0
5
5
  SHA512:
6
- metadata.gz: 994bee046cc159f924d1ee3d67ec328c28284b3fe0472d4496bafa34804abdd35002a5eae2f08067446f2b2c8cae2574be094ffb574de148bde31eb288f71dba
7
- data.tar.gz: 34c0eaa6454f20c84978e69b7c6fb420b5d5019c2d26d15ba29f5c6662ddd00d81fe29f38aaade5c13113c4f23906cf31f4e3bbb5bfba476c01bbba2f9794727
6
+ metadata.gz: acde9279ce53006f813da63a8dc86342c200cac4d727b1afdcf2fd78d9d14dc1403f12d6d87d3bec0c418727c4df99c9131492719d6cbcd3779fe03feef6d4ec
7
+ data.tar.gz: f87634944a373b41dc12e4527dad78e894a5ffd65444d3bf0fa02b15a5e10a711e084e2c486f5e371ddd7fcdafe41a4bc3c2378036bebf17db47215c308ad37c
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.3.0
data/.travis.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
- - "1.8.7"
4
- - "1.9.3"
5
- - "2.0.0"
3
+ - "2.1"
4
+ - "2.2"
5
+ - "2.3"
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  [![Code Climate](https://codeclimate.com/github/gary-rafferty/perfecta.png)](https://codeclimate.com/github/gary-rafferty/perfecta)
6
6
 
7
7
  Ruby client for the Perfect Audience [reporting
8
- api](https://www.perfectaudience.com/docs#data_api_autoopen)
8
+ api](http://support.perfectaudience.com/knowledgebase/articles/233919-reporting-api)
9
9
 
10
10
  ## Installation
11
11
 
@@ -1,3 +1,3 @@
1
1
  module Perfecta
2
- VERSION = "0.3.3"
2
+ VERSION = "0.4.0"
3
3
  end
data/lib/perfecta.rb CHANGED
@@ -35,7 +35,7 @@ module Perfecta
35
35
  def campaign_reports params = {}
36
36
  url, params = build_report_url_and_params_for('campaign', params)
37
37
 
38
- resp = JSON.parse(RestClient.get(url, params))
38
+ resp = make_request url, params
39
39
 
40
40
  build_collection_of 'CampaignReport', resp
41
41
  end
@@ -43,7 +43,7 @@ module Perfecta
43
43
  def ad_reports params = {}
44
44
  url, params = build_report_url_and_params_for('ad', params)
45
45
 
46
- resp = JSON.parse(RestClient.get(url, params))
46
+ resp = make_request url, params
47
47
 
48
48
  build_collection_of 'AdReport', resp
49
49
  end
@@ -51,7 +51,7 @@ module Perfecta
51
51
  def conversion_reports params = {}
52
52
  url, params = build_report_url_and_params_for('conversion', params)
53
53
 
54
- resp = JSON.parse(RestClient.get(url, params))
54
+ resp = make_request url, params
55
55
 
56
56
  build_collection_of 'ConversionReport', resp
57
57
  end
@@ -116,22 +116,17 @@ module Perfecta
116
116
  end
117
117
 
118
118
  def build_collection_of klass, data
119
- retval = []
120
-
121
119
  raise BadResponse unless data['status'] == 200
122
120
 
123
- data['report'].each do |d|
124
- obj = Perfecta.const_get(klass.to_sym).new d
125
- retval << obj
121
+ data['report'].map do |d|
122
+ Perfecta.const_get(klass.to_sym).new d
126
123
  end
127
-
128
- retval
129
124
  end
130
125
 
131
126
  def get_one type, id
132
127
  url = "#{BASE_API_PATH}/#{type.pluralize}/#{id}"
133
128
 
134
- resp = JSON.parse(RestClient.get(url, "Authorization".to_sym => @token))
129
+ resp = make_request url, "Authorization".to_sym => @token
135
130
 
136
131
  klass_name = type.capitalize
137
132
  klass = Perfecta.const_get(klass_name.to_sym)
@@ -144,18 +139,14 @@ module Perfecta
144
139
  def get_many type
145
140
  url = "#{BASE_API_PATH}/#{type}"
146
141
 
147
- resp = JSON.parse(RestClient.get(url, "Authorization".to_sym => @token))
142
+ resp = make_request url, "Authorization".to_sym => @token
148
143
 
149
144
  klass_name = type.capitalize.singularize
150
145
  klass = Perfecta.const_get(klass_name.to_sym)
151
146
 
152
- retval = []
153
-
154
- resp[type].each do |obj|
155
- retval << klass.new(obj)
147
+ resp[type].map do |obj|
148
+ klass.new(obj)
156
149
  end
157
-
158
- retval
159
150
  end
160
151
 
161
152
  def build_report_url_and_params_for type, params
@@ -167,6 +158,10 @@ module Perfecta
167
158
 
168
159
  [url, params]
169
160
  end
161
+
162
+ def make_request url, params = nil
163
+ JSON.parse(RestClient.get(url, params))
164
+ end
170
165
  end
171
166
 
172
167
  class BadResponse < Exception; end
@@ -26,5 +26,171 @@ class PerfectaTest < Minitest::Test
26
26
  @client.token.wont_be_nil
27
27
  @client.token.must_equal 'token'
28
28
  end
29
+
30
+ it "can retrieve and return campaign_reports" do
31
+ @client.stubs(:make_request).returns({
32
+ 'status' => 200,
33
+ 'report' => [{
34
+ 'campaign_id' => '5074bc89d7a67f0002000026',
35
+ 'campaign_name' => 'My campaign',
36
+ 'impressions' => 25000,
37
+ 'clicks' => 750,
38
+ 'costs' => 25.2,
39
+ 'click_conversions' => 10,
40
+ 'view_conversions' => 20,
41
+ 'conversions' => 30,
42
+ 'cpm' => 1.008,
43
+ 'ctr' => 0.03,
44
+ 'cpc' => 0.0336,
45
+ 'conversion_rate' => 0.04
46
+ }]
47
+ })
48
+
49
+ campaign_report = @client.campaign_reports.first
50
+ campaign_report.must_be_instance_of Perfecta::CampaignReport
51
+ campaign_report.impressions.must_equal 25000
52
+ end
53
+
54
+ it "can retrieve and return ad_reports" do
55
+ @client.stubs(:make_request).returns({
56
+ 'status' => 200,
57
+ 'report' => [{
58
+ 'ad_id' => '5074bc89d7a67f0002000026',
59
+ 'ad_name' => 'My ad',
60
+ 'impressions' => 25000,
61
+ 'clicks' => 750,
62
+ 'costs' => 25.2,
63
+ 'click_conversions' => 10,
64
+ 'view_conversions' => 20,
65
+ 'conversions' => 30,
66
+ 'cpm' => 1.008,
67
+ 'ctr' => 0.03,
68
+ 'cpc' => 0.0336,
69
+ 'conversion_rate' => 0.04
70
+ }]
71
+ })
72
+
73
+ ad_report = @client.ad_reports.first
74
+ ad_report.must_be_instance_of Perfecta::AdReport
75
+ ad_report.impressions.must_equal 25000
76
+ end
77
+
78
+ it "can retrieve and return conversion_reports" do
79
+ @client.stubs(:make_request).returns({
80
+ 'status' => 200,
81
+ 'report' => [{
82
+ 'conversion_id' => '5074bc89d7a67f0002000026',
83
+ 'conversion_name' => 'Sale',
84
+ 'click_conversions' => 10,
85
+ 'view_conversions' => 20,
86
+ 'conversions' => 30,
87
+ }]
88
+ })
89
+
90
+ conversion_report = @client.conversion_reports.first
91
+ conversion_report.must_be_instance_of Perfecta::ConversionReport
92
+ conversion_report.conversions.must_equal 30
93
+ end
94
+
95
+ it "can retrieve and return site objects" do
96
+ @client.stubs(:make_request).returns({
97
+ 'status' => 200,
98
+ 'sites' => [{
99
+ '_id' => '5074bc89d7a67f0002000026',
100
+ 'name' => 'My Site',
101
+ 'url' => 'https://www.perfectaudience.com',
102
+ 'created_at' => '2013-01-11T16:38:32+00:00',
103
+ 'view_conversion_window' => 30,
104
+ 'click_conversion_window' => 30,
105
+ 'domain_blacklist' => 'http://blacklist.com,http://donotserve.com'
106
+ }]
107
+ })
108
+
109
+ site_obj = @client.sites.first
110
+ site_obj.must_be_instance_of Perfecta::Site
111
+ site_obj.name.must_equal 'My Site'
112
+ end
113
+
114
+ it "can retrieve and return campaign objects" do
115
+ @client.stubs(:make_request).returns({
116
+ 'status' => 200,
117
+ 'campaigns' => [{
118
+ '_id' => '5074bc89d7a67f0002000026',
119
+ 'site_id' => '4ff6ade4361ed500020111a5',
120
+ 'name' => 'My Campaign',
121
+ 'created_at' => '2013-01-11T16:38:32+00:00',
122
+ 'state' => 'active',
123
+ 'start_date' => '2012-12-18T00:00:00+00:00',
124
+ 'end_date' => '2013-03-18T00:00:00+00:00',
125
+ 'cpm_max_bid' => 0.5,
126
+ 'weekly_budget' => 500
127
+ }]
128
+ })
129
+
130
+ campaign_obj = @client.campaigns.first
131
+ campaign_obj.must_be_instance_of Perfecta::Campaign
132
+ campaign_obj.weekly_budget.must_equal 500
133
+ end
134
+
135
+ it "can retrieve and return ad objects" do
136
+ @client.stubs(:make_request).returns({
137
+ 'status' => 200,
138
+ 'ads' => [{
139
+ '_id' => '5074bc89d7a67f0002000026',
140
+ 'site_id' => '4ff6ade4361ed500020111a5',
141
+ 'name' => 'My ad',
142
+ 'state' => 'active',
143
+ 'click_url' => 'https://www.perfectaudience.com',
144
+ 'created_at' => '2013-01-11T16:38:32+00:00',
145
+ 'dimensions' => '99x72',
146
+ 'type' => 'facebook',
147
+ 'facebook_title' => 'title',
148
+ 'facebook_body' => 'body'
149
+ }]
150
+ })
151
+
152
+ ad_obj = @client.ads.first
153
+ ad_obj.must_be_instance_of Perfecta::Ad
154
+ ad_obj.type.must_equal 'facebook'
155
+ end
156
+
157
+ it "can retrieve and return segment objects" do
158
+ @client.stubs(:make_request).returns({
159
+ 'status' => 200,
160
+ 'segments' => [{
161
+ '_id' => '5074bc89d7a67f0002000026',
162
+ 'site_id' => '4ff6ade4361ed500020111a5',
163
+ 'name' => 'My Segment',
164
+ 'created_at' => '2013-01-11T16:38:32+00:00',
165
+ 'duration' => 45,
166
+ 'goal' => 'path',
167
+ 'target_text' => '/trial*'
168
+ }]
169
+ })
170
+
171
+ segment_obj = @client.segments.first
172
+ segment_obj.must_be_instance_of Perfecta::Segment
173
+ segment_obj.duration.must_equal 45
174
+ end
175
+
176
+ it "can retrieve and return conversion objects" do
177
+ @client.stubs(:make_request).returns({
178
+ 'status' => 200,
179
+ 'conversions' => [{
180
+ '_id' => '5074bc89d7a67f0002000026',
181
+ 'site_id' => '4ff6ade4361ed500020111a5',
182
+ 'name' => 'Signup',
183
+ 'created_at' => '2013-01-11T16:38:32+00:00',
184
+ 'conversion_frequency' => 'every',
185
+ 'last_fired' => '2013-03-19T21:29:02+00:00',
186
+ 'goal' => 'path',
187
+ 'target_text' => '/orderSuccess'
188
+ }]
189
+ })
190
+
191
+ conv_obj = @client.conversions.first
192
+ conv_obj.must_be_instance_of Perfecta::Conversion
193
+ conv_obj.goal.must_equal 'path'
194
+ end
29
195
  end
30
196
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: perfecta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gary Rafferty
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-08 00:00:00.000000000 Z
11
+ date: 2016-04-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mime-types
@@ -103,6 +103,7 @@ extra_rdoc_files: []
103
103
  files:
104
104
  - ".coveralls.yml"
105
105
  - ".gitignore"
106
+ - ".ruby-version"
106
107
  - ".travis.yml"
107
108
  - Gemfile
108
109
  - LICENSE.txt
@@ -146,7 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
146
147
  version: '0'
147
148
  requirements: []
148
149
  rubyforge_project:
149
- rubygems_version: 2.0.3
150
+ rubygems_version: 2.5.1
150
151
  signing_key:
151
152
  specification_version: 4
152
153
  summary: Ruby client for the PerfectAudience Reporting API
@@ -158,4 +159,3 @@ test_files:
158
159
  - test/perfecta_test.rb
159
160
  - test/site_test.rb
160
161
  - test/test_helper.rb
161
- has_rdoc: