romniture 0.0.1
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 +6 -0
- data/Gemfile +4 -0
- data/README +9 -0
- data/ROmniture.gemspec +23 -0
- data/Rakefile +10 -0
- data/lib/romniture/client.rb +137 -0
- data/lib/romniture/version.rb +3 -0
- data/lib/romniture.rb +15 -0
- data/test/client_test.rb +41 -0
- metadata +101 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README
ADDED
data/ROmniture.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
require "romniture/version"
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "romniture"
|
6
|
+
s.version = ROmniture::VERSION
|
7
|
+
s.authors = ["Mike Sukmanowsky"]
|
8
|
+
s.email = ["mike.sukmanowsky@gmail.com"]
|
9
|
+
s.homepage = "http://github.com/msukmanowsky/ROmniture"
|
10
|
+
s.summary = "Use Omniture's REST API with ease."
|
11
|
+
s.description = "A library that allows access to Omniture's REST API libraries (developer.omniture.com)"
|
12
|
+
|
13
|
+
s.rubyforge_project = s.name
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.add_runtime_dependency("httpi")
|
21
|
+
s.add_runtime_dependency("json")
|
22
|
+
|
23
|
+
end
|
data/Rakefile
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
module ROmniture
|
2
|
+
|
3
|
+
class Client
|
4
|
+
|
5
|
+
DEFAULT_REPORT_WAIT_TIME = 5
|
6
|
+
|
7
|
+
ENVIRONMENTS = {
|
8
|
+
:san_jose => "https://api.omniture.com/admin/1.2/rest/",
|
9
|
+
:dallas => "https://api2.omniture.com/admin/1.2/rest/",
|
10
|
+
:london => "https://api3.omniture.com/admin/1.2/rest/",
|
11
|
+
:san_jose_beta => "https://beta-api.omniture.com/admin/1.2/rest/",
|
12
|
+
:dallas_beta => "https://beta-api2.omniture.com/admin/1.2/rest/",
|
13
|
+
:sandbox => "https://api-sbx1.omniture.com/admin/1.2/rest/"
|
14
|
+
}
|
15
|
+
|
16
|
+
def initialize(options={})
|
17
|
+
@username = options[:username]
|
18
|
+
@shared_secret = options[:shared_secret]
|
19
|
+
@base_uri = options[:environment].is_a?(Symbol) ? ENVIRONMENTS[options[:environment]] : options[:environment].to_s
|
20
|
+
HTTPI.log = false
|
21
|
+
end
|
22
|
+
|
23
|
+
def request(method, parameters = {})
|
24
|
+
response = send_request(method, parameters)
|
25
|
+
|
26
|
+
JSON.parse(response.body)
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_report(method, report_description)
|
30
|
+
response = send_request(method, report_description)
|
31
|
+
|
32
|
+
json = JSON.parse response.body
|
33
|
+
if json["status"] == "queued"
|
34
|
+
log(Logger::INFO, "Report with ID (" + json["reportID"].to_s + ") queued. Now fetching report...")
|
35
|
+
return get_queued_report json["reportID"]
|
36
|
+
else
|
37
|
+
log(Logger::ERROR, "Could not queue report. Omniture returned with error:\n#{response.body}")
|
38
|
+
raise "Could not queue report. Omniture returned with error:\n#{response.body}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
attr_writer :log
|
43
|
+
|
44
|
+
def log?
|
45
|
+
@log != false
|
46
|
+
end
|
47
|
+
|
48
|
+
def logger
|
49
|
+
@logger ||= ::Logger.new(STDOUT)
|
50
|
+
end
|
51
|
+
|
52
|
+
def log_level
|
53
|
+
@log_level ||= ::Logger::INFO
|
54
|
+
end
|
55
|
+
|
56
|
+
def log(*args)
|
57
|
+
level = args.first.is_a?(Numeric) || args.first.is_a?(Symbol) ? args.shift : log_level
|
58
|
+
logger.log(level, args.join(" ")) if log?
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def send_request(method, data)
|
64
|
+
log(Logger::INFO, "Requesting #{method}...")
|
65
|
+
generate_nonce
|
66
|
+
|
67
|
+
log(Logger::INFO, "Created new nonce: #{@password}")
|
68
|
+
|
69
|
+
request = HTTPI::Request.new
|
70
|
+
request.url = @base_uri + "?method=#{method}"
|
71
|
+
request.headers = request_headers
|
72
|
+
request.body = data.to_json
|
73
|
+
|
74
|
+
response = HTTPI.post(request)
|
75
|
+
|
76
|
+
if response.code >= 400
|
77
|
+
log(:error, "Request failed and returned with response code: #{response.code}\n\n#{response.body}")
|
78
|
+
raise "Request failed and returned with response code: #{response.code}\n\n#{response.body}"
|
79
|
+
end
|
80
|
+
|
81
|
+
log(Logger::INFO, "Server responded with response code #{response.code}.")
|
82
|
+
|
83
|
+
response
|
84
|
+
end
|
85
|
+
|
86
|
+
def generate_nonce
|
87
|
+
@nonce = Digest::MD5.new.hexdigest(rand().to_s)
|
88
|
+
@created = Time.now.strftime("%Y-%m-%dT%H:%M:%SZ")
|
89
|
+
combined_string = @nonce + @created + @shared_secret
|
90
|
+
sha1_string = Digest::SHA1.new.hexdigest(combined_string)
|
91
|
+
@password = Base64.encode64(sha1_string).to_s.chomp("\n")
|
92
|
+
end
|
93
|
+
|
94
|
+
def request_headers
|
95
|
+
{
|
96
|
+
"X-WSSE" => "UsernameToken Username=\"#{@username}\", PasswordDigest=\"#{@password}\", Nonce=\"#{@nonce}\", Created=\"#{@created}\""
|
97
|
+
}
|
98
|
+
end
|
99
|
+
|
100
|
+
def get_queued_report(report_id)
|
101
|
+
done = false
|
102
|
+
error = false
|
103
|
+
status = nil
|
104
|
+
start_time = Time.now
|
105
|
+
end_time = nil
|
106
|
+
|
107
|
+
begin
|
108
|
+
response = send_request("Report.GetStatus", {"reportID" => "#{report_id}"})
|
109
|
+
log(Logger::INFO, "Checking on status of report #{report_id}...")
|
110
|
+
|
111
|
+
json = JSON.parse(response.body)
|
112
|
+
status = json["status"]
|
113
|
+
|
114
|
+
if status == "done"
|
115
|
+
done = true
|
116
|
+
elsif status == "failed"
|
117
|
+
error = true
|
118
|
+
end
|
119
|
+
|
120
|
+
sleep DEFAULT_REPORT_WAIT_TIME if !done && !error
|
121
|
+
end while !done && !error
|
122
|
+
|
123
|
+
if error
|
124
|
+
log(:error, "Unable to get data for report #{report_id}. Omniture returned a status of #{status}.")
|
125
|
+
raise "Unable to get data for report #{report_id}. Omniture returned a status of #{status}."
|
126
|
+
end
|
127
|
+
|
128
|
+
response = send_request("Report.GetReport", {"reportID" => "#{report_id}"})
|
129
|
+
|
130
|
+
end_time = Time.now
|
131
|
+
log(Logger::INFO, "Report with ID #{report_id} has finished processing in #{((end_time - start_time)*1000).to_i} ms")
|
132
|
+
|
133
|
+
JSON.parse(response.body)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
data/lib/romniture.rb
ADDED
data/test/client_test.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
require 'romniture'
|
6
|
+
|
7
|
+
class ClientTest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
config = YAML::load(File.open("test/config.yml"))
|
11
|
+
@config = config["omniture"]
|
12
|
+
|
13
|
+
@client = ROmniture::Client.new({
|
14
|
+
:username => "#{@config["username"]}",
|
15
|
+
:shared_secret => "#{@config["shared_secret"]}",
|
16
|
+
:environment => "#{@config["environment"]}"
|
17
|
+
})
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_simple_request
|
21
|
+
response = @client.request('Company.GetReportSuites')
|
22
|
+
|
23
|
+
assert_instance_of Hash, response, "Returned object is not a hash."
|
24
|
+
assert(response.has_key?("report_suites"), "Returned hash does not contain any report suites.")
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_report_request
|
28
|
+
response = @client.get_report "Report.QueueOvertime", {
|
29
|
+
"reportDescription" => {
|
30
|
+
"reportSuiteID" => "#{@config["report_suite_id"]}",
|
31
|
+
"dateFrom" => "2011-01-01",
|
32
|
+
"dateTo" => "2011-01-10",
|
33
|
+
"metrics" => [{"id" => "pageviews"}]
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
assert_instance_of Hash, response, "Returned object is not a hash."
|
38
|
+
assert(response["report"].has_key?("data"), "Returned hash has no data!")
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: romniture
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Mike Sukmanowsky
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-09-12 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: httpi
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: json
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
48
|
+
description: A library that allows access to Omniture's REST API libraries (developer.omniture.com)
|
49
|
+
email:
|
50
|
+
- mike.sukmanowsky@gmail.com
|
51
|
+
executables: []
|
52
|
+
|
53
|
+
extensions: []
|
54
|
+
|
55
|
+
extra_rdoc_files: []
|
56
|
+
|
57
|
+
files:
|
58
|
+
- .gitignore
|
59
|
+
- Gemfile
|
60
|
+
- README
|
61
|
+
- ROmniture.gemspec
|
62
|
+
- Rakefile
|
63
|
+
- lib/romniture.rb
|
64
|
+
- lib/romniture/client.rb
|
65
|
+
- lib/romniture/version.rb
|
66
|
+
- test/client_test.rb
|
67
|
+
homepage: http://github.com/msukmanowsky/ROmniture
|
68
|
+
licenses: []
|
69
|
+
|
70
|
+
post_install_message:
|
71
|
+
rdoc_options: []
|
72
|
+
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
hash: 3
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
version: "0"
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
requirements: []
|
94
|
+
|
95
|
+
rubyforge_project: romniture
|
96
|
+
rubygems_version: 1.8.4
|
97
|
+
signing_key:
|
98
|
+
specification_version: 3
|
99
|
+
summary: Use Omniture's REST API with ease.
|
100
|
+
test_files:
|
101
|
+
- test/client_test.rb
|