panda 0.1.0 → 0.2.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.
@@ -0,0 +1,94 @@
1
+ # Panda
2
+
3
+ Panda gem provides an interface to access the [Panda](http://api.pandastream.com) API from Ruby.
4
+
5
+ ## Installation
6
+
7
+ sudo gem install panda -s http://gemcutter.org
8
+
9
+ ## How to use it
10
+
11
+
12
+ require 'panda'
13
+
14
+
15
+ ### Connecting to Panda
16
+
17
+ Panda.connect!({
18
+ :cloud_id => 'cloud_id',
19
+ :access_key => 'access_key',
20
+ :secret_key => 'secret_key',
21
+ :api_host => 'api.pandastream.com'
22
+ })
23
+
24
+ ### Posting a video
25
+
26
+ Panda.post('/videos.json', {:source_url => 'http://www.example.com/original_video.mp4'})
27
+ =>{"duration"=>nil,
28
+ "created_at"=>"2010/01/15 14:48:42 +0000",
29
+ "original_filename"=>"panda.mp4",
30
+ "updated_at"=>"2010/01/15 14:48:42 +0000",
31
+ "source_url"=>"http://www.example.com/original_video.mp4",
32
+ "id"=>"12fce296-01e5-11df-ae37-12313902cc92",
33
+ "extname"=>".mp4",
34
+ "thumbnail_position"=>nil,
35
+ "audio_codec"=>nil,
36
+ "height"=>nil,
37
+ "upload_redirect_url"=>nil,
38
+ "fps"=>nil,
39
+ "video_codec"=>nil,
40
+ "status"=>"processing",
41
+ "width"=>nil}
42
+
43
+ ### Getting all videos
44
+
45
+ Panda.get('/videos.json')
46
+ => [{"duration"=>14010,
47
+ "created_at"=>"2010/01/13 16:45:29 +0000",
48
+ "original_filename"=>"panda.mp4",
49
+ "updated_at"=>"2010/01/13 16:45:35 +0000",
50
+ "source_url"=>"http://www.example.com/original_video.mp4",
51
+ "id"=>"0ee6b656-0063-11df-a433-1231390041c1",
52
+ "extname"=>".mp4",
53
+ "thumbnail_position"=>nil,
54
+ "audio_codec"=>"aac",
55
+ "height"=>240,
56
+ "upload_redirect_url"=>nil,
57
+ "fps"=>29,
58
+ "video_codec"=>"h264",
59
+ "status"=>"success",
60
+ "width"=>300}]
61
+
62
+ ### Getting video encodings
63
+
64
+ Panda.get('/videos/0ee6b656-0063-11df-a433-1231390041c1/encodings.json')
65
+ => [{"encoder_id"=>nil,
66
+ "created_at"=>"2010/01/13 16:45:30 +0000",
67
+ "video_id"=>"0ee6b656-0063-11df-a433-1231390041c1",
68
+ "video_url"=>
69
+ "http://s3.amazonaws.com/panda-videos/0f815986-0063-11df-a433-1231390041c1.flv",
70
+ "started_encoding_at"=>"2010/01/13 16:47:35 +0000",
71
+ "updated_at"=>"2010/01/13 16:47:40 +0000",
72
+ "lock_version"=>7,
73
+ "extname"=>".flv",
74
+ "encoding_progress"=>87,
75
+ "encoding_time"=>3,
76
+ "id"=>"0f815986-0063-11df-a433-1231390041c1",
77
+ "height"=>240,
78
+ "status"=>"success",
79
+ "profile_id"=>"00182830-0063-11df-8c8a-1231390041c1",
80
+ "width"=>300}]
81
+
82
+ ### Deleting a video encoding
83
+
84
+ Panda.delete('/encodings/0f815986-0063-11df-a433-1231390041c1.json')
85
+
86
+ ### Deleting a video
87
+
88
+ Panda.delete('/videos/0ee6b656-0063-11df-a433-1231390041c1.json')
89
+
90
+
91
+ Copyright
92
+ ---------
93
+
94
+ Copyright (c) 2009-2010 New Bamboo. See LICENSE for details.
data/Rakefile CHANGED
@@ -11,9 +11,11 @@ begin
11
11
  gem.homepage = "http://github.com/newbamboo/panda_gem"
12
12
  gem.authors = ["New Bamboo"]
13
13
  gem.add_development_dependency "rspec", ">= 1.2.9"
14
+ gem.add_development_dependency "fakeweb"
15
+ gem.add_development_dependency "fakeweb-matcher"
14
16
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
17
  gem.add_dependency "ruby-hmac", ">= 0.3.2"
16
- gem.add_dependency "rest-client", ">= 1.0.3"
18
+ gem.add_dependency "rest-client", ">= 1.2"
17
19
  end
18
20
  Jeweler::GemcutterTasks.new
19
21
  rescue LoadError
@@ -35,13 +37,3 @@ end
35
37
  task :spec => :check_dependencies
36
38
 
37
39
  task :default => :spec
38
-
39
- require 'rake/rdoctask'
40
- Rake::RDocTask.new do |rdoc|
41
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
42
-
43
- rdoc.rdoc_dir = 'rdoc'
44
- rdoc.title = "panda #{version}"
45
- rdoc.rdoc_files.include('README*')
46
- rdoc.rdoc_files.include('lib/**/*.rb')
47
- end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -1,7 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'hmac'
3
+ require 'restclient'
3
4
 
4
- $:.unshift File.dirname(__FILE__) + '/panda'
5
-
6
- require 'api_authentication'
7
- require 'video'
5
+ require 'panda/api_authentication'
6
+ require 'panda/panda'
@@ -12,7 +12,7 @@ module Panda
12
12
 
13
13
  query_string = canonical_querystring(params)
14
14
 
15
- string_to_sign = verb + "\n" +
15
+ string_to_sign = verb.to_s.upcase + "\n" +
16
16
  host.downcase + "\n" +
17
17
  request_uri + "\n" +
18
18
  query_string
@@ -0,0 +1,59 @@
1
+ module Panda
2
+ class << self
3
+
4
+ def connect!(auth_params={})
5
+ params = {:api_host => 'api.pandastream.com', :api_port => 80 }.merge(auth_params)
6
+
7
+ @api_version = 2
8
+ @cloud_id = params["cloud_id"] || params[:cloud_id]
9
+ @access_key = params["access_key"] || params[:access_key]
10
+ @secret_key = params["secret_key"] || params[:secret_key]
11
+ @api_host = params["api_host"] || params[:api_host]
12
+ @api_port = params["api_port"] || params[:api_port]
13
+
14
+ @prefix = params["prefix_url"] || "v#{@api_version}"
15
+
16
+ @connection = RestClient::Resource.new(api_url)
17
+ end
18
+
19
+ def get(request_uri, params={})
20
+ append_authentication_params!("GET", request_uri, params)
21
+ @connection[ApiAuthentication.add_params_to_request_uri(request_uri, params)].get
22
+ end
23
+
24
+ def post(request_uri, params)
25
+ append_authentication_params!("POST", request_uri, params)
26
+ @connection[request_uri].post(params)
27
+ end
28
+
29
+ def put(request_uri, params)
30
+ append_authentication_params!("PUT", request_uri, params)
31
+ @connection[request_uri].put(params)
32
+ end
33
+
34
+ def delete(request_uri, params={})
35
+ append_authentication_params!("DELETE", request_uri, params)
36
+ @connection[ApiAuthentication.add_params_to_request_uri(request_uri, params)].delete
37
+ end
38
+
39
+ def authentication_params(verb, request_uri, params)
40
+ auth_params = {}
41
+ auth_params['cloud_id'] = @cloud_id
42
+ auth_params['access_key'] = @access_key
43
+ auth_params['timestamp'] = Time.now.iso8601
44
+ auth_params['signature'] = ApiAuthentication.authenticate(verb, request_uri, @api_host, @secret_key, params.merge(auth_params))
45
+ return auth_params
46
+ end
47
+
48
+ def api_url
49
+ "http://#{@api_host}:#{@api_port}/#{@prefix}"
50
+ end
51
+ private
52
+
53
+ def append_authentication_params!(verb, request_uri, params)
54
+ auth_params = authentication_params(verb, request_uri, params)
55
+ params.merge!(auth_params)
56
+ end
57
+
58
+ end
59
+ end
@@ -5,26 +5,26 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{panda}
8
- s.version = "0.1.0"
8
+ s.version = "0.2.0"
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{2009-11-04}
12
+ s.date = %q{2010-01-15}
13
13
  s.description = %q{Panda Client}
14
14
  s.email = %q{bambinos@new-bamboo.co.uk}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
- "README.rdoc"
17
+ "README.md"
18
18
  ]
19
19
  s.files = [
20
20
  ".gitignore",
21
21
  "LICENSE",
22
- "README.rdoc",
22
+ "README.md",
23
23
  "Rakefile",
24
24
  "VERSION",
25
25
  "lib/panda.rb",
26
26
  "lib/panda/api_authentication.rb",
27
- "lib/panda/video.rb",
27
+ "lib/panda/panda.rb",
28
28
  "log/debug.log",
29
29
  "panda.gemspec",
30
30
  "spec/panda_spec.rb",
@@ -47,17 +47,23 @@ Gem::Specification.new do |s|
47
47
 
48
48
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
49
49
  s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
50
+ s.add_development_dependency(%q<fakeweb>, [">= 0"])
51
+ s.add_development_dependency(%q<fakeweb-matcher>, [">= 0"])
50
52
  s.add_runtime_dependency(%q<ruby-hmac>, [">= 0.3.2"])
51
- s.add_runtime_dependency(%q<rest-client>, [">= 1.0.3"])
53
+ s.add_runtime_dependency(%q<rest-client>, [">= 1.2"])
52
54
  else
53
55
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
56
+ s.add_dependency(%q<fakeweb>, [">= 0"])
57
+ s.add_dependency(%q<fakeweb-matcher>, [">= 0"])
54
58
  s.add_dependency(%q<ruby-hmac>, [">= 0.3.2"])
55
- s.add_dependency(%q<rest-client>, [">= 1.0.3"])
59
+ s.add_dependency(%q<rest-client>, [">= 1.2"])
56
60
  end
57
61
  else
58
62
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
63
+ s.add_dependency(%q<fakeweb>, [">= 0"])
64
+ s.add_dependency(%q<fakeweb-matcher>, [">= 0"])
59
65
  s.add_dependency(%q<ruby-hmac>, [">= 0.3.2"])
60
- s.add_dependency(%q<rest-client>, [">= 1.0.3"])
66
+ s.add_dependency(%q<rest-client>, [">= 1.2"])
61
67
  end
62
68
  end
63
69
 
@@ -1,7 +1,23 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
- describe "Panda" do
4
- it "fails" do
5
- fail "hey buddy, you should probably rename this file and start specing for real"
3
+ describe Panda do
4
+ before(:each) do
5
+ FakeWeb.allow_net_connect = false
6
+ Panda.connect!({"access_key" => "my_access_key", "secret_key" => "my_secret_key", "api_host" => "myapihost", "api_port" => 85, "cloud_id" => 'my_cloud_id' })
7
+ Time.stub!(:now).and_return(mock("time", :iso8601 => "2009-11-04T17:54:11+00:00"))
6
8
  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
+
16
+ it "should make delete request with signed request to panda server" do
17
+ 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 => {})
18
+ Panda.delete("/videos/1").should
19
+ 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")
20
+ end
21
+
22
+
7
23
  end
@@ -4,6 +4,9 @@ require 'panda'
4
4
  require 'spec'
5
5
  require 'spec/autorun'
6
6
 
7
+ require 'fakeweb'
8
+ require 'fakeweb_matcher'
9
+
7
10
  Spec::Runner.configure do |config|
8
11
 
9
12
  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.1.0
4
+ version: 0.2.0
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: 2009-11-04 00:00:00 +00:00
12
+ date: 2010-01-15 00:00:00 +00:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -22,6 +22,26 @@ dependencies:
22
22
  - !ruby/object:Gem::Version
23
23
  version: 1.2.9
24
24
  version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: fakeweb
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: fakeweb-matcher
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
25
45
  - !ruby/object:Gem::Dependency
26
46
  name: ruby-hmac
27
47
  type: :runtime
@@ -40,7 +60,7 @@ dependencies:
40
60
  requirements:
41
61
  - - ">="
42
62
  - !ruby/object:Gem::Version
43
- version: 1.0.3
63
+ version: "1.2"
44
64
  version:
45
65
  description: Panda Client
46
66
  email: bambinos@new-bamboo.co.uk
@@ -50,16 +70,16 @@ extensions: []
50
70
 
51
71
  extra_rdoc_files:
52
72
  - LICENSE
53
- - README.rdoc
73
+ - README.md
54
74
  files:
55
75
  - .gitignore
56
76
  - LICENSE
57
- - README.rdoc
77
+ - README.md
58
78
  - Rakefile
59
79
  - VERSION
60
80
  - lib/panda.rb
61
81
  - lib/panda/api_authentication.rb
62
- - lib/panda/video.rb
82
+ - lib/panda/panda.rb
63
83
  - log/debug.log
64
84
  - panda.gemspec
65
85
  - spec/panda_spec.rb
@@ -1,13 +0,0 @@
1
- = Panda
2
-
3
- == Usage
4
-
5
- sudo gem install panda
6
-
7
- require 'panda'
8
- Panda.connect!('access_key', 'secret_key', 'localhost', 5678)
9
- Panda.get('/videos')
10
-
11
- == Copyright
12
-
13
- Copyright (c) 2009 New Bamboo. See LICENSE for details.
@@ -1,86 +0,0 @@
1
- require 'rubygems'
2
- require 'rest_client'
3
- require 'api_authentication'
4
-
5
- module Panda
6
- class << self
7
- attr_writer :rest_client_options
8
- attr_reader :connection
9
-
10
- def connect!(access_key, secret_key, api_host='api.pandastream.com', api_port=80)
11
- @api_version = 2
12
- @access_key = access_key
13
- @secret_key = secret_key
14
- @api_host = api_host
15
- @api_port = api_port
16
- @rest_client_options = {}
17
-
18
- # raise Exception.new("You must supply a :secret_key") unless @secret_key
19
-
20
- @connection = RestClient::Resource.new(api_url)
21
- end
22
-
23
- def api_url
24
- "http://#{@api_host}:#{@api_port}/v#{@api_version}"
25
- end
26
-
27
- # NOTE: get params, MUST be given as the params hash, not as part of the url string
28
- def get(request_uri, params={})
29
- params = authenticate("GET", request_uri, params)
30
- puts ApiAuthentication.add_params_to_request_uri(request_uri, params)
31
- RestClient::Resource.new(concat_urls(api_url, ApiAuthentication.add_params_to_request_uri(request_uri, params))).get
32
- end
33
-
34
- def post(request_uri, params)
35
- params = authenticate("POST", request_uri, params)
36
- RestClient::Resource.new(concat_urls(api_url, request_uri)).post(params)
37
- end
38
-
39
- def put(request_uri, params)
40
- params = authenticate("PUT", request_uri, params)
41
- RestClient::Resource.new(concat_urls(api_url, request_uri)).put(params)
42
- end
43
-
44
- def delete(request_uri, params={})
45
- params = authenticate("DELETE", request_uri, params)
46
- puts ApiAuthentication.add_params_to_request_uri(request_uri, params)
47
- RestClient::Resource.new(concat_urls(api_url, ApiAuthentication.add_params_to_request_uri(request_uri, params))).delete
48
- end
49
-
50
- # From rest-client/lib/restclient/resource.rb
51
-
52
- def concat_urls(url, suburl) # :nodoc:
53
- url = url.to_s
54
- suburl = suburl.to_s
55
- if url.slice(-1, 1) == '/' or suburl.slice(0, 1) == '/'
56
- url + suburl
57
- else
58
- "#{url}/#{suburl}"
59
- end
60
- end
61
-
62
- # Authentication
63
-
64
- def authenticate(verb, request_uri, params)
65
- params['access_key'] = @access_key
66
- params['timestamp'] = Time.now.iso8601
67
- params['signature'] = ApiAuthentication.authenticate(verb, request_uri, @api_host, @secret_key, params)
68
- return params
69
- end
70
-
71
- end
72
-
73
- # class AccountKeyNotSet < PandaError; end
74
- #
75
- # # 4xx Client Error
76
- # class ClientError < ConnectionError; end # :nodoc:
77
- #
78
- # # 401 Unauthorized
79
- # class UnauthorizedAccess < ClientError; end # :nodoc
80
- #
81
- # # 404 Not Found
82
- # class VideoNotFound < ClientError; end # :nodoc:
83
- #
84
- # # 5xx Server Error
85
- # class ServerError < ConnectionError; end # :nodoc:
86
- end