audiobank-client 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +19 -0
- data/COPYING +674 -0
- data/COPYRIGHT +14 -0
- data/Gemfile +9 -0
- data/Guardfile +13 -0
- data/README.md +29 -0
- data/Rakefile +3 -0
- data/audiobank-client.gemspec +33 -0
- data/bin/audiobank +10 -0
- data/lib/audiobank-client.rb +30 -0
- data/lib/audiobank/account.rb +46 -0
- data/lib/audiobank/client/version.rb +5 -0
- data/lib/audiobank/document.rb +41 -0
- data/lib/audiobank/documents.rb +29 -0
- data/log/.gitkeep +0 -0
- data/spec/audiobank/account_spec.rb +56 -0
- data/spec/audiobank/document_spec.rb +61 -0
- data/spec/audiobank/documents_spec.rb +69 -0
- data/spec/spec_helper.rb +18 -0
- data/spec/support/fakeweb.rb +10 -0
- data/spec/support/log.rb +2 -0
- data/tasks/rspec.rake +2 -0
- metadata +261 -0
data/COPYRIGHT
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Copyright © 2013 Alban Peignier, Florent Peyraud
|
2
|
+
|
3
|
+
This program is free software: you can redistribute it and/or modify
|
4
|
+
it under the terms of the GNU General public License as published by
|
5
|
+
the Free Software Foundation, either version 3 of the License, or
|
6
|
+
(at your option) any later version.
|
7
|
+
|
8
|
+
This program is distributed in the hope that it will be useful,
|
9
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
GNU General public License for more details.
|
12
|
+
|
13
|
+
You should have received a copy of the GNU General public License
|
14
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec' do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
7
|
+
watch('spec/spec_helper.rb') { "spec" }
|
8
|
+
end
|
9
|
+
|
10
|
+
guard 'bundler' do
|
11
|
+
watch('Gemfile')
|
12
|
+
watch(/^.+\.gemspec/)
|
13
|
+
end
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Audiobank::Client
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'audiobank-client'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install audiobank-client
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'audiobank/client/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "audiobank-client"
|
8
|
+
gem.version = Audiobank::Client::VERSION
|
9
|
+
gem.authors = ["Alban Peignier", "Florent Peyraud"]
|
10
|
+
gem.email = ["alban@tryphon.eu", "florent@tryphon.eu" ]
|
11
|
+
gem.description = %q{Manage AudioBank documents from command-line or Ruby}
|
12
|
+
gem.summary = %q{AudioBank API client}
|
13
|
+
gem.homepage = "http://projects.tryphon.eu/projects/audiobank-client"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_runtime_dependency "httparty"
|
21
|
+
gem.add_runtime_dependency "activesupport", "< 4"
|
22
|
+
gem.add_runtime_dependency "json"
|
23
|
+
gem.add_runtime_dependency "virtus"
|
24
|
+
gem.add_runtime_dependency "null_logger"
|
25
|
+
|
26
|
+
gem.add_development_dependency "rake"
|
27
|
+
gem.add_development_dependency "simplecov"
|
28
|
+
gem.add_development_dependency "rspec"
|
29
|
+
gem.add_development_dependency "fakeweb"
|
30
|
+
gem.add_development_dependency "guard"
|
31
|
+
gem.add_development_dependency "guard-rspec"
|
32
|
+
gem.add_development_dependency "guard-bundler"
|
33
|
+
end
|
data/bin/audiobank
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require "audiobank/client/version"
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
require "virtus"
|
7
|
+
|
8
|
+
require "null_logger"
|
9
|
+
require "active_support/core_ext/module/attribute_accessors"
|
10
|
+
require "active_support/core_ext/class/attribute_accessors"
|
11
|
+
|
12
|
+
require "active_support/core_ext/module/delegation"
|
13
|
+
require "active_support/json"
|
14
|
+
require "active_support/core_ext/object/to_json"
|
15
|
+
|
16
|
+
require 'net/ftp'
|
17
|
+
|
18
|
+
module Audiobank
|
19
|
+
module Client
|
20
|
+
|
21
|
+
@@logger = NullLogger.instance
|
22
|
+
mattr_accessor :logger
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
require "audiobank/document"
|
29
|
+
require "audiobank/documents"
|
30
|
+
require "audiobank/account"
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
|
3
|
+
class Audiobank::Account
|
4
|
+
include HTTParty
|
5
|
+
base_uri 'audiobank.tryphon.eu'
|
6
|
+
headers "Content-Type" => "application/json"
|
7
|
+
format :json
|
8
|
+
|
9
|
+
attr_accessor :token
|
10
|
+
|
11
|
+
def initialize(token)
|
12
|
+
@token = token
|
13
|
+
end
|
14
|
+
|
15
|
+
def default_options
|
16
|
+
{ :query => { :auth_token => token } }
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(url, &block)
|
20
|
+
process_response self.class.get(url, default_options), &block
|
21
|
+
end
|
22
|
+
|
23
|
+
def post(url, attributes = {}, &block)
|
24
|
+
process_response self.class.post(url, default_options.merge(:body => attributes.to_json)), &block
|
25
|
+
end
|
26
|
+
|
27
|
+
def process_response(response, &block)
|
28
|
+
if block_given?
|
29
|
+
yield response
|
30
|
+
else
|
31
|
+
response
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def document(id)
|
36
|
+
Audiobank::Client.logger.info "Request document information : #{id}"
|
37
|
+
get "/documents/#{id}.json" do |response|
|
38
|
+
Audiobank::Document.new(response) if response.code == 200
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def documents
|
43
|
+
@documents ||= Audiobank::Documents.new(self)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Audiobank::Document
|
2
|
+
include Virtus
|
3
|
+
|
4
|
+
attribute :id, Integer
|
5
|
+
attribute :download_count, Integer
|
6
|
+
attribute :description, String
|
7
|
+
attribute :length, Integer
|
8
|
+
attribute :title, String
|
9
|
+
attribute :cast, String
|
10
|
+
attribute :upload, String
|
11
|
+
|
12
|
+
attr_accessor :account
|
13
|
+
attr_accessor :errors
|
14
|
+
|
15
|
+
def errors=(errors)
|
16
|
+
@errors = (String === errors ? JSON.parse(errors) : errors)
|
17
|
+
end
|
18
|
+
|
19
|
+
def valid?
|
20
|
+
errors.blank?
|
21
|
+
end
|
22
|
+
|
23
|
+
def upload_uri
|
24
|
+
@upload_uri ||= URI.parse(upload)
|
25
|
+
end
|
26
|
+
|
27
|
+
def upload!(file)
|
28
|
+
Net::FTP.open(upload_uri.host) do |ftp|
|
29
|
+
ftp.login
|
30
|
+
ftp.chdir upload_uri.path
|
31
|
+
ftp.putbinaryfile file
|
32
|
+
end
|
33
|
+
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
def confirm
|
38
|
+
account.post "/documents/#{id}/upload/confirm.json"
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Audiobank::Documents
|
2
|
+
|
3
|
+
attr_accessor :account
|
4
|
+
|
5
|
+
def initialize(account)
|
6
|
+
@account = account
|
7
|
+
end
|
8
|
+
|
9
|
+
delegate :post, :to => :account
|
10
|
+
|
11
|
+
def create(attributes)
|
12
|
+
Audiobank::Client.logger.debug "Create AudioBank document : #{attributes.inspect}"
|
13
|
+
post "/documents.json", :document => attributes do |response|
|
14
|
+
Audiobank::Document.new(response).tap do |document|
|
15
|
+
document.account = account
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def import(file, attributes = {})
|
21
|
+
attributes = {
|
22
|
+
:title => File.basename(file, File.extname(file)),
|
23
|
+
:description => "Uploaded at #{Time.now}"
|
24
|
+
}.merge(attributes)
|
25
|
+
|
26
|
+
create(attributes).upload!(file).confirm
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/log/.gitkeep
ADDED
File without changes
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Audiobank::Account do
|
4
|
+
|
5
|
+
subject { Audiobank::Account.new("secret") }
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
FakeWeb.allow_net_connect = false
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#get" do
|
12
|
+
|
13
|
+
it "should send get request to the specified url with auth_token" do
|
14
|
+
FakeWeb.register_uri :get, "http://audiobank.tryphon.eu/dummy?auth_token=secret", :body => 'dummy'
|
15
|
+
subject.get("/dummy").body.should == 'dummy'
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#post" do
|
21
|
+
|
22
|
+
it "should send post request to the specified url with auth_token" do
|
23
|
+
FakeWeb.register_uri :post, "http://audiobank.tryphon.eu/dummy?auth_token=secret", :body => 'dummy'
|
24
|
+
subject.post("/dummy", :key => "value")
|
25
|
+
FakeWeb.last_request.body.should == '{"key":"value"}'
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#document" do
|
31
|
+
|
32
|
+
let(:json_response) {
|
33
|
+
'{"download_count":5,"description":"Dummy","length":1744,"cast":"8a9cygzn","id":721,"upload":"ftp://audiobank.tryphon.eu/pqxijmcetmodn25s/","title":"Test"}'
|
34
|
+
}
|
35
|
+
|
36
|
+
it "should retrieve invoke http://audiobank.tryphon.eu/documents/<id>.json" do
|
37
|
+
FakeWeb.register_uri :get, "http://audiobank.tryphon.eu/documents/1.json?auth_token=secret", :body => json_response
|
38
|
+
subject.document(1).title.should == "Test"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should return nil if documet is not found" do
|
42
|
+
FakeWeb.register_uri :get, "http://audiobank.tryphon.eu/documents/1.json?auth_token=secret", :status => ["404", "Not Found"]
|
43
|
+
subject.document(1).should be_nil
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "#documents" do
|
49
|
+
|
50
|
+
it "should be associated to this account" do
|
51
|
+
subject.documents.account.should == subject
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Audiobank::Document do
|
4
|
+
|
5
|
+
subject { Audiobank::Document.new :id => 1, :account => account }
|
6
|
+
|
7
|
+
let(:account) { Audiobank::Account.new("secret") }
|
8
|
+
|
9
|
+
describe "#errors=" do
|
10
|
+
|
11
|
+
let(:errors) { %w{first second} }
|
12
|
+
|
13
|
+
it "should parse JSON array" do
|
14
|
+
subject.errors = errors.to_json
|
15
|
+
subject.errors.should == errors
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should accept errors array" do
|
19
|
+
subject.errors = errors
|
20
|
+
subject.errors.should == errors
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be valid when errors is blank" do
|
26
|
+
subject.errors = []
|
27
|
+
subject.should be_valid
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#upload_uri" do
|
31
|
+
|
32
|
+
it "should parse upload url" do
|
33
|
+
subject.upload = "ftp://audiobank.tryphon.eu/directory"
|
34
|
+
subject.upload_uri.host.should == "audiobank.tryphon.eu"
|
35
|
+
subject.upload_uri.path.should == "directory"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "confirm" do
|
41
|
+
|
42
|
+
it "should post to /documents/:id/upload/confirm.json" do
|
43
|
+
account.should_receive(:post).with "/documents/#{subject.id}/upload/confirm.json"
|
44
|
+
subject.confirm
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "upload!" do
|
50
|
+
|
51
|
+
it "should upload file in ftp" do
|
52
|
+
pending "Use fake_ftp"
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should return the document" do
|
56
|
+
pending
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Audiobank::Documents do
|
4
|
+
|
5
|
+
let(:account) { Audiobank::Account.new "secret" }
|
6
|
+
|
7
|
+
subject { Audiobank::Documents.new account }
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
FakeWeb.allow_net_connect = false
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#create" do
|
14
|
+
|
15
|
+
it "should post to /documents.json the document attributes" do
|
16
|
+
account.should_receive(:post).with("/documents.json", :document => { :title => "dummy" })
|
17
|
+
subject.create :title => "dummy"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should return a Document with received attributes" do
|
21
|
+
account.register_uri :post, "/documents.json", :body => {"title" => "dummy"}.to_json
|
22
|
+
subject.create({}).title.should == "dummy"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should return a Document associated to the account" do
|
26
|
+
account.register_uri :post, "/documents.json"
|
27
|
+
subject.create({}).account.should == account
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#import" do
|
33
|
+
|
34
|
+
let(:document) { mock }
|
35
|
+
let(:file) { "/path/to/file" }
|
36
|
+
|
37
|
+
before do
|
38
|
+
subject.stub :create => document
|
39
|
+
document.stub :upload! => document, :confirm => true
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should create a Document with specified attributes" do
|
43
|
+
subject.should_receive(:create).with(hash_including(:title => "dummy")).and_return(document)
|
44
|
+
subject.import file, :title => "dummy"
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should upload the specified file" do
|
48
|
+
document.should_receive(:upload!).with(file)
|
49
|
+
subject.import file
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should confirm the upload" do
|
53
|
+
document.should_receive(:confirm)
|
54
|
+
subject.import file
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should use the filename (without extension) as default title" do
|
58
|
+
subject.should_receive(:create).with(hash_including(:title => "filename")).and_return(document)
|
59
|
+
subject.import "/path/to/filename.flac"
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should use a default description" do
|
63
|
+
subject.should_receive(:create).with(hash_including(:description)).and_return(document)
|
64
|
+
subject.import file
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|