panda 0.4.4 → 0.4.5
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/VERSION +1 -1
- data/lib/panda/panda.rb +62 -29
- data/panda.gemspec +2 -2
- data/spec/panda_spec.rb +76 -61
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.5
|
data/lib/panda/panda.rb
CHANGED
@@ -3,19 +3,23 @@ require 'restclient'
|
|
3
3
|
class Panda
|
4
4
|
attr_reader :api_host, :api_port, :access_key, :secret_key, :api_version
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
DEFAULT_API_PORT=80
|
7
|
+
DEFAULT_API_HOST="api.pandastream.com"
|
8
|
+
|
9
|
+
def initialize(auth_params)
|
9
10
|
@api_version = 2
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
|
12
|
+
if auth_params.class == String
|
13
|
+
init_from_url(auth_params)
|
14
|
+
else
|
15
|
+
init_from_hash(auth_params)
|
16
|
+
end
|
17
|
+
|
16
18
|
@connection = RestClient::Resource.new(api_url)
|
17
19
|
end
|
18
|
-
|
20
|
+
|
21
|
+
|
22
|
+
|
19
23
|
def get(request_uri, params={})
|
20
24
|
rescue_restclient_exception do
|
21
25
|
query = signed_query("GET", request_uri, params)
|
@@ -41,7 +45,7 @@ class Panda
|
|
41
45
|
body_of @connection[request_uri + '?' + query].delete
|
42
46
|
end
|
43
47
|
end
|
44
|
-
|
48
|
+
|
45
49
|
def authentication_params(verb, request_uri, params)
|
46
50
|
auth_params = {}
|
47
51
|
auth_params['cloud_id'] = @cloud_id
|
@@ -50,43 +54,72 @@ class Panda
|
|
50
54
|
auth_params['signature'] = ApiAuthentication.authenticate(verb, request_uri, @api_host, @secret_key, params.merge(auth_params))
|
51
55
|
return auth_params
|
52
56
|
end
|
53
|
-
|
57
|
+
|
54
58
|
def signed_query(*args)
|
55
59
|
ApiAuthentication.hash_to_query(signed_params(*args))
|
56
60
|
end
|
57
|
-
|
61
|
+
|
58
62
|
def signed_params(verb, request_uri, params = {}, timestamp_str = nil)
|
59
63
|
auth_params = params
|
60
64
|
auth_params['cloud_id'] = @cloud_id
|
61
65
|
auth_params['access_key'] = @access_key
|
62
66
|
auth_params['timestamp'] = timestamp_str || Time.now.iso8601(6)
|
63
|
-
|
67
|
+
|
64
68
|
params_to_sign = auth_params.reject{|k,v| ['file'].include?(k)}
|
65
69
|
auth_params['signature'] = ApiAuthentication.generate_signature(verb, request_uri, @api_host, @secret_key, params_to_sign)
|
66
70
|
auth_params
|
67
71
|
end
|
68
|
-
|
72
|
+
|
69
73
|
def api_url
|
70
74
|
"http://#{@api_host}:#{@api_port}/#{@prefix}"
|
71
75
|
end
|
72
|
-
|
76
|
+
|
73
77
|
def setup_bucket(params={})
|
74
78
|
granting_params = { :s3_videos_bucket => params[:bucket], :user_aws_key => params[:access_key], :user_aws_secret => params[:secret_key] }
|
75
79
|
put("/clouds/#{@cloud_id}.json", granting_params)
|
76
80
|
end
|
77
|
-
|
81
|
+
|
78
82
|
private
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
83
|
+
|
84
|
+
def rescue_restclient_exception(&block)
|
85
|
+
begin
|
86
|
+
yield
|
87
|
+
rescue RestClient::Exception => e
|
88
|
+
e.http_body
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# API change on rest-client 1.4
|
93
|
+
def body_of(response)
|
94
|
+
response.respond_to?(:body) ? response.body : response
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
def init_from_url(url)
|
99
|
+
params = url.scan(/^([^:@]+):([^:@]+)@([^:@]+)(:[\d]+)?\/([^:@]+)$/).flatten
|
100
|
+
|
101
|
+
@access_key = params[0]
|
102
|
+
@secret_key = params[1]
|
103
|
+
@cloud_id = params[4]
|
104
|
+
@api_host = params[2]
|
105
|
+
|
106
|
+
if params[3]
|
107
|
+
@api_port = params[3][1..-1]
|
108
|
+
else
|
109
|
+
@api_port = DEFAULT_API_PORT
|
110
|
+
end
|
111
|
+
@prefix = "v#{@api_version}"
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
def init_from_hash(hash_params)
|
116
|
+
params = { :api_host => DEFAULT_API_HOST, :api_port => DEFAULT_API_PORT }.merge(hash_params)
|
117
|
+
|
118
|
+
@cloud_id = params["cloud_id"] || params[:cloud_id]
|
119
|
+
@access_key = params["access_key"] || params[:access_key]
|
120
|
+
@secret_key = params["secret_key"] || params[:secret_key]
|
121
|
+
@api_host = params["api_host"] || params[:api_host]
|
122
|
+
@api_port = params["api_port"] || params[:api_port]
|
123
|
+
@prefix = params["prefix_url"] || "v#{@api_version}"
|
85
124
|
end
|
86
|
-
end
|
87
|
-
|
88
|
-
# API change on rest-client 1.4
|
89
|
-
def body_of(response)
|
90
|
-
response.respond_to?(:body) ? response.body : response
|
91
|
-
end
|
92
125
|
end
|
data/panda.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{panda}
|
8
|
-
s.version = "0.4.
|
8
|
+
s.version = "0.4.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["New Bamboo"]
|
12
|
-
s.date = %q{2010-03-
|
12
|
+
s.date = %q{2010-03-11}
|
13
13
|
s.description = %q{Panda Client}
|
14
14
|
s.email = %q{info@pandastream.com}
|
15
15
|
s.extra_rdoc_files = [
|
data/spec/panda_spec.rb
CHANGED
@@ -3,74 +3,89 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
3
3
|
describe Panda do
|
4
4
|
before(:each) do
|
5
5
|
FakeWeb.allow_net_connect = false
|
6
|
-
@panda = Panda.new({"access_key" => "my_access_key", "secret_key" => "my_secret_key", "api_host" => "myapihost", "api_port" => 85, "cloud_id" => 'my_cloud_id' })
|
7
6
|
Time.stub!(:now).and_return(mock("time", :iso8601 => "2009-11-04T17:54:11+00:00"))
|
8
7
|
end
|
9
|
-
|
10
|
-
|
11
|
-
it "should make get request with signed request to panda server" do
|
12
|
-
FakeWeb.register_uri(:get, "http://myapihost:85/v2/videos?timestamp=2009-11-04T17%3A54%3A11%2B00%3A00&signature=CxSYPM65SeeWH4CE%2FLcq7Ny2NtwxlpS8QOXG2BKe4p8%3D&access_key=my_access_key&cloud_id=my_cloud_id", :body => "abc")
|
13
|
-
@panda.get("/videos").should == "abc"
|
14
|
-
end
|
15
8
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should create a signed version of the parameters" do
|
23
|
-
signed_params = @panda.signed_params('POST',
|
24
|
-
'/videos.json',
|
25
|
-
{"param1" => 'one', "param2" => 'two'}
|
26
|
-
)
|
27
|
-
signed_params.should == {
|
28
|
-
'access_key' => "my_access_key",
|
29
|
-
'timestamp' => "2009-11-04T17:54:11+00:00",
|
30
|
-
'cloud_id' => 'my_cloud_id',
|
31
|
-
'signature' => 'w66goW6Ve5CT9Ibbx3ryvq4XM8OfIfSZe5oapgZBaUs=',
|
32
|
-
'param1' => 'one',
|
33
|
-
'param2' => 'two'
|
34
|
-
}
|
35
|
-
end
|
9
|
+
describe "Connected with Hash" do
|
10
|
+
before(:each) do
|
11
|
+
@panda = Panda.new({"access_key" => "my_access_key", "secret_key" => "my_secret_key", "api_host" => "myapihost", "api_port" => 85, "cloud_id" => 'my_cloud_id' })
|
12
|
+
end
|
36
13
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
14
|
+
it "should make get request with signed request to panda server" do
|
15
|
+
FakeWeb.register_uri(:get, "http://myapihost:85/v2/videos?timestamp=2009-11-04T17%3A54%3A11%2B00%3A00&signature=CxSYPM65SeeWH4CE%2FLcq7Ny2NtwxlpS8QOXG2BKe4p8%3D&access_key=my_access_key&cloud_id=my_cloud_id", :body => "abc")
|
16
|
+
@panda.get("/videos").should == "abc"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should make delete request with signed request to panda server" do
|
20
|
+
FakeWeb.register_uri(:delete, "http://myapihost:85/v2/videos/1?timestamp=2009-11-04T17%3A54%3A11%2B00%3A00&signature=t0IYclDXgjZFRYaMf0Gbg%2B5vOqp7q8QQRN8tlQ3bk8Q%3D&access_key=my_access_key&cloud_id=my_cloud_id", :query => {})
|
21
|
+
@panda.delete("/videos/1").should
|
22
|
+
FakeWeb.should have_requested(:delete, "http://myapihost:85/v2/videos/1?timestamp=2009-11-04T17%3A54%3A11%2B00%3A00&signature=t0IYclDXgjZFRYaMf0Gbg%2B5vOqp7q8QQRN8tlQ3bk8Q%3D&access_key=my_access_key&cloud_id=my_cloud_id")
|
23
|
+
end
|
45
24
|
|
25
|
+
it "should create a signed version of the parameters" do
|
26
|
+
signed_params = @panda.signed_params('POST',
|
27
|
+
'/videos.json',
|
28
|
+
{"param1" => 'one', "param2" => 'two'}
|
29
|
+
)
|
30
|
+
signed_params.should == {
|
31
|
+
'access_key' => "my_access_key",
|
32
|
+
'timestamp' => "2009-11-04T17:54:11+00:00",
|
33
|
+
'cloud_id' => 'my_cloud_id',
|
34
|
+
'signature' => 'w66goW6Ve5CT9Ibbx3ryvq4XM8OfIfSZe5oapgZBaUs=',
|
35
|
+
'param1' => 'one',
|
36
|
+
'param2' => 'two'
|
37
|
+
}
|
38
|
+
end
|
46
39
|
|
47
|
-
|
48
|
-
|
49
|
-
'
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
40
|
+
it "should create a signed version of the parameters without additional arguments" do
|
41
|
+
@panda.signed_params('POST', '/videos.json').should == {
|
42
|
+
'access_key' => "my_access_key",
|
43
|
+
'timestamp' => "2009-11-04T17:54:11+00:00",
|
44
|
+
'cloud_id' => 'my_cloud_id',
|
45
|
+
'signature' => 'TI2n/dsSllxFhxcEShRGKWtDSqxu+kuJUPs335NavMo='
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
it "should create a signed version of the parameters and difficult characters" do
|
51
|
+
signed_params = @panda.signed_params('POST',
|
52
|
+
'/videos.json',
|
53
|
+
{"tilde" => '~', "space" => ' '}
|
54
|
+
)
|
55
|
+
signed_params.should == {
|
56
|
+
'access_key' => "my_access_key",
|
57
|
+
'timestamp' => "2009-11-04T17:54:11+00:00",
|
58
|
+
'cloud_id' => 'my_cloud_id',
|
59
|
+
'signature' => 'w5P9+xPpQpRlweTh0guFYqQOmF+ZuTKXCmaKpUP3sH0=',
|
60
|
+
'tilde' => '~',
|
61
|
+
'space' => ' '
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should return a json file for every http code" do
|
66
|
+
FakeWeb.register_uri(:get, "http://myapihost:85/v2/videos?timestamp=2009-11-04T17%3A54%3A11%2B00%3A00&signature=CxSYPM65SeeWH4CE%2FLcq7Ny2NtwxlpS8QOXG2BKe4p8%3D&access_key=my_access_key&cloud_id=my_cloud_id", :body => "abc")
|
67
|
+
|
68
|
+
resource = RestClient::Resource.new("http://myapihost:85/v2")
|
69
|
+
RestClient::Resource.stub!(:new).and_return(resource)
|
70
|
+
|
71
|
+
e = RestClient::Exception.new({:body => "abc", :code => 400})
|
72
|
+
e.stub!(:http_body).and_return("abc")
|
73
|
+
|
74
|
+
resource.stub!(:get).and_raise(e)
|
75
|
+
|
76
|
+
panda = Panda.new({"access_key" => "my_access_key", "secret_key" => "my_secret_key", "api_host" => "myapihost", "api_port" => 85, "cloud_id" => 'my_cloud_id' })
|
77
|
+
panda.get("/videos").should == "abc"
|
78
|
+
end
|
60
79
|
end
|
61
80
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
resource.stub!(:get).and_raise(e)
|
72
|
-
|
73
|
-
panda = Panda.new({"access_key" => "my_access_key", "secret_key" => "my_secret_key", "api_host" => "myapihost", "api_port" => 85, "cloud_id" => 'my_cloud_id' })
|
74
|
-
panda.get("/videos").should == "abc"
|
81
|
+
describe "Connected with a string url" do
|
82
|
+
before(:each) do
|
83
|
+
@panda2 = Panda.new("f4676630-0522-11df-8148-1231350015b1:1ucba5EDJGf9aIl3/ve1klCkRQqiYZ1bzI+Dpvl3@myhost:85/eefa5d2cbe74289a500e62e2789347f3")
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should make get request" do
|
87
|
+
FakeWeb.register_uri(:get, "http://myhost:85/v2/videos?timestamp=2009-11-04T17%3A54%3A11%2B00%3A00&signature=YcoBrpnRTwpgEpA%2FPO%2FMJr4d94suUqt5acQv67owUew%3D&access_key=f4676630-0522-11df-8148-1231350015b1&cloud_id=eefa5d2cbe74289a500e62e2789347f3", :body => "abc")
|
88
|
+
@panda2.get("/videos").should == "abc"
|
89
|
+
end
|
75
90
|
end
|
76
91
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: panda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- New Bamboo
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-03-
|
12
|
+
date: 2010-03-11 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|