perfecta 0.3.3 → 0.4.0

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: 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: