comscore_ruby 0.0.13 → 0.0.20
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.
- data/.gitignore +2 -0
- data/Rakefile +9 -0
- data/comscore_ruby.gemspec +2 -1
- data/lib/comscore_ruby/client.rb +82 -111
- data/lib/comscore_ruby/constants.rb +1 -0
- data/lib/comscore_ruby/version.rb +1 -1
- data/lib/comscore_ruby.rb +2 -0
- data/test/client_test.rb +64 -0
- metadata +8 -9
data/.gitignore
CHANGED
data/Rakefile
CHANGED
data/comscore_ruby.gemspec
CHANGED
@@ -19,7 +19,8 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
21
|
s.add_runtime_dependency "savon", ">= 0.9.7"
|
22
|
-
s.add_runtime_dependency "activesupport", ">= 3.
|
22
|
+
#s.add_runtime_dependency "activesupport", ">= 3.0.0"
|
23
|
+
s.add_runtime_dependency "activesupport"
|
23
24
|
|
24
25
|
# specify any dependencies here; for example:
|
25
26
|
# s.add_development_dependency "rspec"
|
data/lib/comscore_ruby/client.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module ComScore
|
2
2
|
class Client
|
3
3
|
BASE_URI = "https://api.comscore.com/"
|
4
|
+
DEFAULT_REPORT_WAIT_TIME = 5
|
4
5
|
SERVICES = {
|
5
6
|
:key_measures => {:wsdl => "#{BASE_URI}KeyMeasures.asmx?WSDL"},
|
6
7
|
:audience_duplication => {:wsdl => "#{BASE_URI}DigitalCalc.asmx?WSDL"},
|
@@ -19,142 +20,112 @@ module ComScore
|
|
19
20
|
|
20
21
|
def initialize(uname, pw)
|
21
22
|
@username, @password = [uname, pw]
|
23
|
+
@client = Savon::Client.new
|
24
|
+
@client.http.auth.basic(@username, @password)
|
22
25
|
end
|
23
26
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
27
|
+
# Executes a request against ComScore's SOAP API. Service name should correspond to one of the available services you've subscribed to:
|
28
|
+
# - +:key_measures+
|
29
|
+
# - +:audience_duplication+
|
30
|
+
# - +:percent_media_trend+
|
31
|
+
# - etc... see http://api.comscore.com for more information
|
32
|
+
# You can (and should) pass a block to build the details of the request you're sending to the method. See the examples below.
|
33
|
+
#
|
34
|
+
# == Examples
|
35
|
+
#
|
36
|
+
# # Find the media property named "The Globe And Mail" within the Canadian dictionary from two months ago.
|
37
|
+
# client = ComScore::Client.new(username, password)
|
38
|
+
# client.request(:key_measures, :fetch_media) do |xml|
|
39
|
+
# xml.parameterId("media")
|
40
|
+
# xml.fetchMediaQuery("xmlns" => "http://comscore.com/FetchMedia") {
|
41
|
+
# xml.SearchCritera(:ExactMatch => "false", :Critera => "The Globe And Mail")
|
42
|
+
# }
|
43
|
+
# xml.reportQuery("xmlns" => "http://comscore.com/ReportQuery") {
|
44
|
+
# xml.Parameter(:KeyId => "geo", :Value => ComScore::GEOGRAPHIES["Canada"])
|
45
|
+
# xml.Parameter(:KeyId => "loc", :Value => ComScore::LOCATIONS["Home and Work"])
|
46
|
+
# xml.Parameter(:KeyId => "timeType", :Value => ComScore::TIME_TYPES["Months"])
|
47
|
+
# xml.Parameter(:KeyId => "timePeriod", :Value => DateTime.now.to_date.to_comscore_time_period - 2)
|
48
|
+
# xml.Parameter(:KeyId => "mediaSetType", :Value => ComScore::MEDIA_SET_TYPES["Ranked Categories"])
|
49
|
+
# }
|
50
|
+
# end
|
51
|
+
def request(service_name, method)
|
52
|
+
@client.wsdl.document = SERVICES[service_name][:wsdl]
|
41
53
|
|
42
|
-
|
54
|
+
@client.request(method) do
|
43
55
|
soap.xml do |xml|
|
44
56
|
xml.soap(:Envelope, "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xmlns:xsd" => "http://www.w3.org/2001/XMLSchema", "xmlns:soap" => "http://schemas.xmlsoap.org/soap/envelope/") {
|
45
57
|
xml.soap(:Body) {
|
46
|
-
xml.
|
47
|
-
xml
|
48
|
-
xml.query(:xmlns => "http://comscore.com/ReportQuery") {
|
49
|
-
xml.Parameter(:KeyId => "geo", :Value => "124")
|
50
|
-
xml.Parameter(:KeyId => "timeType", :Value => "1")
|
51
|
-
xml.Parameter(:KeyId => "timePeriod", :Value => DateTime.now.to_date.to_comscore_time_period - 2)
|
52
|
-
xml.Parameter(:KeyId => "mediaSetType", :Value => "1")
|
53
|
-
}
|
58
|
+
xml.tag!(method.to_s.camelize, :xmlns => "http://comscore.com/") {
|
59
|
+
yield xml if block_given?
|
54
60
|
}
|
55
61
|
}
|
56
62
|
}
|
57
63
|
end
|
58
64
|
end
|
59
|
-
|
60
|
-
response.to_hash()[:discover_parameter_values_response][:discover_parameter_values_result][:enum_value]
|
61
65
|
end
|
62
66
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
# Requires: geo, loc, timeType, timePeriod, mediaSetType
|
94
|
-
# Usage: find_media(:geo => "Canada", :loc => "")
|
95
|
-
def get_report(report_type, opts = {})
|
96
|
-
@client = Savon::Client.new(SERVICES[report_type][:wsdl])
|
97
|
-
@client.http.auth.basic(@username, @password)
|
98
|
-
job_queue_response = @client.request(:submit_report) do
|
99
|
-
soap.xml do |xml|
|
100
|
-
xml.soap(:Envelope, "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xmlns:xsd" => "http://www.w3.org/2001/XMLSchema", "xmlns:soap" => "http://schemas.xmlsoap.org/soap/envelope/") {
|
101
|
-
xml.soap(:Body) {
|
102
|
-
xml.SubmitReport("xmlns" => "http://comscore.com/") {
|
103
|
-
xml.query("xmlns" => "http://comscore.com/ReportQuery") {
|
104
|
-
opts.each { |key, value|
|
105
|
-
if value.is_a?(Array)
|
106
|
-
value.each do |v|
|
107
|
-
xml.Parameter(:KeyId => key, :Value => v)
|
108
|
-
end
|
109
|
-
elsif value.is_a?(Date)
|
110
|
-
xml.Parameter(:KeyId => key, :Value => value.to_comscore_time_period)
|
111
|
-
else
|
112
|
-
xml.Parameter(:KeyId => key, :Value => value)
|
113
|
-
end
|
114
|
-
}
|
115
|
-
}
|
116
|
-
}
|
117
|
-
}
|
67
|
+
# Fetches report data against a given comScore +service+ (e.g. KeyMeasures, MediaTrend, etc).
|
68
|
+
#
|
69
|
+
# == Examples
|
70
|
+
#
|
71
|
+
# # Get a Key Measures report for a given media set ID
|
72
|
+
# client.get_report(:key_measures,
|
73
|
+
# :geo => ComScore::GEOGRAPHIES["Canada"],
|
74
|
+
# :loc => ComScore::LOCATIONS["Home and Work"],
|
75
|
+
# :timeType => ComScore::TIME_TYPES["Months"],
|
76
|
+
# :timePeriod => Date.new(2011, 8),
|
77
|
+
# :mediaSet => 778226,
|
78
|
+
# :mediaSetType => ComScore::MEDIA_SET_TYPES["Ranked Categories"],
|
79
|
+
# :targetType => ComScore::TARGET_TYPES["Simple"],
|
80
|
+
# :targetGroup => ComScore::TARGET_GROUPS["Total Audience"],
|
81
|
+
# :measure => [ComScore::MEASURES["Total Unique Visitors (000)"]]
|
82
|
+
# )
|
83
|
+
def get_report(service, opts = {})
|
84
|
+
job_queue_response = self.request(service, :submit_report) do |xml|
|
85
|
+
xml.query("xmlns" => "http://comscore.com/ReportQuery") {
|
86
|
+
opts.each { |key, value|
|
87
|
+
if value.is_a?(Array)
|
88
|
+
value.each do |v|
|
89
|
+
xml.Parameter(:KeyId => key, :Value => v)
|
90
|
+
end
|
91
|
+
elsif value.is_a?(Date)
|
92
|
+
xml.Parameter(:KeyId => key, :Value => value.to_comscore_time_period)
|
93
|
+
else
|
94
|
+
xml.Parameter(:KeyId => key, :Value => value)
|
95
|
+
end
|
118
96
|
}
|
119
|
-
|
97
|
+
}
|
120
98
|
end
|
121
99
|
|
122
100
|
job_id = job_queue_response.to_hash()[:submit_report_response][:submit_report_result][:job_id]
|
101
|
+
job_status = ""
|
123
102
|
|
124
|
-
job_status = "Starting"
|
125
103
|
begin
|
126
|
-
sleep(
|
127
|
-
job_status_response =
|
128
|
-
|
129
|
-
xml.soap(:Envelope, "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xmlns:xsd" => "http://www.w3.org/2001/XMLSchema", "xmlns:soap" => "http://schemas.xmlsoap.org/soap/envelope/") {
|
130
|
-
xml.soap(:Body) {
|
131
|
-
xml.PingReportStatus("xmlns" => "http://comscore.com/") {
|
132
|
-
xml.jobId(job_id)
|
133
|
-
}
|
134
|
-
}
|
135
|
-
}
|
136
|
-
end
|
137
|
-
end
|
138
|
-
job_status = job_status_response.to_hash()[:ping_report_status_response][:ping_report_status_result][:status]
|
104
|
+
sleep(DEFAULT_REPORT_WAIT_TIME) if job_status != ""
|
105
|
+
job_status_response = self.request(service, :ping_report_status) { |xml| xml.jobId(job_id) }.to_hash
|
106
|
+
job_status = job_status_response[:ping_report_status_response][:ping_report_status_result][:status]
|
139
107
|
end while (job_status != "Completed" && job_status != "Failed")
|
140
108
|
|
141
|
-
if
|
142
|
-
|
143
|
-
soap.xml do |xml|
|
144
|
-
xml.soap(:Envelope, "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xmlns:xsd" => "http://www.w3.org/2001/XMLSchema", "xmlns:soap" => "http://schemas.xmlsoap.org/soap/envelope/") {
|
145
|
-
xml.soap(:Body) {
|
146
|
-
xml.FetchReport("xmlns" => "http://comscore.com/") {
|
147
|
-
xml.jobId(job_id)
|
148
|
-
}
|
149
|
-
}
|
150
|
-
}
|
151
|
-
end
|
152
|
-
end
|
153
|
-
return result.to_hash()[:fetch_report_response][:fetch_report_result]
|
109
|
+
if job_status == "Completed"
|
110
|
+
return self.request(service, :fetch_report) {|xml| xml.jobId(job_id) }
|
154
111
|
else
|
155
112
|
raise "The job with id #{job_id} failed to complete. Last known status was #{job_status}."
|
156
113
|
end
|
157
114
|
end
|
158
115
|
|
116
|
+
def log=(value)
|
117
|
+
raise ArgumentError, "Parameter must be of type Boolean." unless !!value == value
|
118
|
+
@log = value
|
119
|
+
Savon.configure do |config|
|
120
|
+
config.log = value
|
121
|
+
config.log_level = :info if value == false
|
122
|
+
end
|
123
|
+
HTTPI.log = value
|
124
|
+
end
|
125
|
+
|
126
|
+
def log
|
127
|
+
@log
|
128
|
+
end
|
129
|
+
|
159
130
|
end
|
160
131
|
end
|
data/lib/comscore_ruby.rb
CHANGED
data/test/client_test.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
require 'comscore_ruby'
|
6
|
+
|
7
|
+
class ClientTest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@config = YAML::load(File.open("test/config.yml"))["comscore"]
|
11
|
+
|
12
|
+
@client = ComScore::Client.new(@config["username"], @config["password"])
|
13
|
+
@client.log = false
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_fetch_media
|
17
|
+
response = @client.request(:key_measures, :fetch_media) do |xml|
|
18
|
+
xml.parameterId("media")
|
19
|
+
xml.fetchMediaQuery("xmlns" => "http://comscore.com/FetchMedia") {
|
20
|
+
xml.SearchCritera(:ExactMatch => "false", :Critera => "The Globe And Mail")
|
21
|
+
}
|
22
|
+
xml.reportQuery("xmlns" => "http://comscore.com/ReportQuery") {
|
23
|
+
xml.Parameter(:KeyId => "geo", :Value => ComScore::GEOGRAPHIES["Canada"])
|
24
|
+
xml.Parameter(:KeyId => "loc", :Value => ComScore::LOCATIONS["Home and Work"])
|
25
|
+
xml.Parameter(:KeyId => "timeType", :Value => ComScore::TIME_TYPES["Months"])
|
26
|
+
xml.Parameter(:KeyId => "timePeriod", :Value => DateTime.now.to_date.to_comscore_time_period - 2)
|
27
|
+
xml.Parameter(:KeyId => "mediaSetType", :Value => ComScore::MEDIA_SET_TYPES["Ranked Categories"])
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
assert_equal("The Globe And Mail", response.to_hash[:fetch_media_response][:fetch_media_result][:media_item][:@name])
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_category_list
|
35
|
+
response = @client.request(:key_measures, :discover_parameter_values) do |xml|
|
36
|
+
xml.parameterId("mediaSet")
|
37
|
+
xml.query(:xmlns => "http://comscore.com/ReportQuery") {
|
38
|
+
xml.Parameter(:KeyId => "geo", :Value => ComScore::GEOGRAPHIES["Canada"])
|
39
|
+
xml.Parameter(:KeyId => "timeType", :Value => ComScore::TIME_TYPES["Months"])
|
40
|
+
xml.Parameter(:KeyId => "timePeriod", :Value => DateTime.now.to_date.to_comscore_time_period - 2)
|
41
|
+
xml.Parameter(:KeyId => "mediaSetType", :Value => ComScore::MEDIA_SET_TYPES["Ranked Categories"])
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
assert_instance_of(Array, response.to_hash[:discover_parameter_values_response][:discover_parameter_values_result][:enum_value])
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_key_measures
|
49
|
+
response = @client.get_report(:key_measures,
|
50
|
+
:geo => ComScore::GEOGRAPHIES["Canada"],
|
51
|
+
:loc => ComScore::LOCATIONS["Home and Work"],
|
52
|
+
:timeType => ComScore::TIME_TYPES["Months"],
|
53
|
+
:timePeriod => Date.new(2011, 8),
|
54
|
+
:mediaSet => 778226,
|
55
|
+
:mediaSetType => ComScore::MEDIA_SET_TYPES["Ranked Categories"],
|
56
|
+
:targetType => ComScore::TARGET_TYPES["Simple"],
|
57
|
+
:targetGroup => ComScore::TARGET_GROUPS["Total Audience"],
|
58
|
+
:measure => [ComScore::MEASURES["Total Unique Visitors (000)"]]
|
59
|
+
)
|
60
|
+
|
61
|
+
assert_instance_of(Array, response.to_hash[:fetch_report_response][:fetch_report_result][:report][:table][:tbody][:tr])
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: comscore_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 55
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 20
|
10
|
+
version: 0.0.20
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Mike Sukmanowsky
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-09-
|
18
|
+
date: 2011-09-16 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: savon
|
@@ -43,10 +43,8 @@ dependencies:
|
|
43
43
|
- !ruby/object:Gem::Version
|
44
44
|
hash: 3
|
45
45
|
segments:
|
46
|
-
- 3
|
47
|
-
- 1
|
48
46
|
- 0
|
49
|
-
version:
|
47
|
+
version: "0"
|
50
48
|
type: :runtime
|
51
49
|
version_requirements: *id002
|
52
50
|
description: Basic support for things like finding media, media sets (AKA categories), and fetching reports. Documentation is...well...missing so far.
|
@@ -68,6 +66,7 @@ files:
|
|
68
66
|
- lib/comscore_ruby/constants.rb
|
69
67
|
- lib/comscore_ruby/core_ext/date.rb
|
70
68
|
- lib/comscore_ruby/version.rb
|
69
|
+
- test/client_test.rb
|
71
70
|
homepage: https://github.com/msukmanowsky/comscore_ruby/wiki
|
72
71
|
licenses: []
|
73
72
|
|
@@ -101,5 +100,5 @@ rubygems_version: 1.8.4
|
|
101
100
|
signing_key:
|
102
101
|
specification_version: 3
|
103
102
|
summary: Use comScore's SOAP API in a manner that does not require you to bang your head against a wall.
|
104
|
-
test_files:
|
105
|
-
|
103
|
+
test_files:
|
104
|
+
- test/client_test.rb
|