saber 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ /rfrom/
2
+ /*.gem
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile CHANGED
@@ -1,14 +1,17 @@
1
1
  source :rubygems
2
2
 
3
- gem "optimism", :path => "/home/guten/dev/one/optimism"
4
- gem "pa", :path => "/home/guten/dev/one/pa"
5
- gem "retort"
6
- gem "thor"
3
+ gem "tagen", "~>1.1.5"
4
+ gem "optimism", "~>3.1.2"
5
+ gem "pa", "~>1.2.2"
6
+ gem "retort", "~>0.0.6"
7
+ gem "thor", "~>0.14.6"
8
+ gem "net-ssh", "~>2.3.0", :require => "net/ssh"
9
+ gem "xmpp4r", "~>0.5"
7
10
 
8
11
  group :development do
9
12
  gem "rspec"
10
13
  gem "watchr"
11
- #gem "rag"
14
+ gem "rag"
12
15
  end
13
16
 
14
17
  # gemspec
data/Gemfile.lock CHANGED
@@ -1,19 +1,21 @@
1
- PATH
2
- remote: /home/guten/dev/one/optimism
3
- specs:
4
- optimism (3.0.4)
5
- hike (~> 1.2.0)
6
-
7
- PATH
8
- remote: /home/guten/dev/one/pa
9
- specs:
10
- pa (1.1.4)
11
-
12
1
  GEM
13
2
  remote: http://rubygems.org/
14
3
  specs:
4
+ activesupport (3.1.3)
5
+ multi_json (~> 1.0)
15
6
  diff-lcs (1.1.3)
16
7
  hike (1.2.1)
8
+ i18n (0.6.0)
9
+ multi_json (1.0.4)
10
+ net-ssh (2.3.0)
11
+ optimism (3.1.2)
12
+ hike (~> 1.2.0)
13
+ pa (1.2.2)
14
+ rag (1.2.1)
15
+ optimism (~> 3.1.0)
16
+ pa (~> 1.2.0)
17
+ tagen (~> 1.1.0)
18
+ thor
17
19
  retort (0.0.6)
18
20
  rspec (2.8.0)
19
21
  rspec-core (~> 2.8.0)
@@ -23,16 +25,24 @@ GEM
23
25
  rspec-expectations (2.8.0)
24
26
  diff-lcs (~> 1.1.2)
25
27
  rspec-mocks (2.8.0)
28
+ tagen (1.1.5)
29
+ activesupport (~> 3.1.0)
30
+ i18n
26
31
  thor (0.14.6)
27
32
  watchr (0.7)
33
+ xmpp4r (0.5)
28
34
 
29
35
  PLATFORMS
30
36
  ruby
31
37
 
32
38
  DEPENDENCIES
33
- optimism!
34
- pa!
35
- retort
39
+ net-ssh (~> 2.3.0)
40
+ optimism (~> 3.1.2)
41
+ pa (~> 1.2.2)
42
+ rag
43
+ retort (~> 0.0.6)
36
44
  rspec
37
- thor
45
+ tagen (~> 1.1.5)
46
+ thor (~> 0.14.6)
38
47
  watchr
48
+ xmpp4r (~> 0.5)
data/README.md CHANGED
@@ -1,30 +1,45 @@
1
- Foo, a very good library
2
- ========================
1
+ Saber, a complete solution for PT users.
2
+ ========================================
3
3
 
4
4
  | Homepage: | https://github.com/GutenYe/saber |
5
- |----------------|------------------------------------------------------ |
6
- | Author: | Guten Ye |
7
- | License: | MIT-LICENSE |
8
- | Documentation: | http://rubydoc.info/gems/saber/frames |
5
+ |----------------|-----------------------------------------|
6
+ | Author: | Guten Ye |
7
+ | License: | MIT-LICENSE |
8
+ | Documentation: | http://rubydoc.info/gems/saber/frames |
9
9
  | Issue Tracker: | https://github.com/GutenYe/saber/issues |
10
10
 
11
- Overview
12
- --------
11
+ the saber.
13
12
 
14
- still under very early development.
13
+ ### Is It Good?
15
14
 
16
- Features
17
- --------
15
+ Yes.
16
+
17
+ ### Is It "Production Ready™"?
18
18
 
19
- a clearly list of features.
19
+ No.
20
20
 
21
21
  Usage
22
22
  -----
23
23
 
24
- how to use
24
+ Task: manually download file from server.
25
+
26
+ # start aria2 user daemon
27
+ $ ~/etc/rc.d/aria2 start
28
+ $ saber download "Prison Break"
29
+ # aria2 will begin download.
30
+
31
+ Task: clean up undownload files, all files remains in disk, but don't in rtorrent client.
32
+
33
+ $ saber clean
25
34
 
26
35
  Install
27
- ----------
36
+ --------
37
+
38
+ server side
39
+
40
+ begin ssh
41
+
42
+ client side
28
43
 
29
44
  gem install saber
30
45
 
data/bin/saber CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
-
3
2
  require_relative "../lib/saber"
4
3
 
5
4
  begin
data/bin/saber-drb_add ADDED
@@ -0,0 +1,6 @@
1
+ #!/bin/bash
2
+
3
+ saber drb_add $* &
4
+
5
+ # event.download.finishied debug
6
+ #saber drb_add $* 2>&1 >/dev/pts/6 &
data/extconf.rb ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ require "fileutils"
3
+ require "mkmf"
4
+
5
+ FileUtils.install File.expand_path("../bin/saber-drb_add", __FILE__), Gem.bindir
6
+
7
+ create_makefile("saber")
data/lib/saber.rb CHANGED
@@ -5,15 +5,24 @@ ENV["BUNDLE_GEMFILE"] = File.expand_path("../../Gemfile", __FILE__)
5
5
  require "bundler/setup"
6
6
  Bundler.require
7
7
 
8
+ Retort::Service.configure do |c|
9
+ c.url = "http://localhost/RPC2"
10
+ end
11
+
8
12
  module Saber
9
13
  autoload :VERSION, "saber/version"
14
+ autoload :CLI, "saber/cli"
10
15
  autoload :UI, "saber/ui"
11
16
  autoload :Task, "saber/task"
12
- autoload :CLI, "saber/cli"
17
+ autoload :Downloader, "saber/downloader"
18
+ autoload :Server, "saber/server"
19
+ autoload :Client, "saber/client"
20
+ autoload :DRbServer, "saber/server"
21
+ autoload :DRbClient, "saber/client"
13
22
 
14
23
  Error = Class.new Exception
15
24
  FatalError = Class.new Exception
16
- Rc = Optimism.require "saber/rc", "~/.saberrc"
25
+ Rc = Optimism.require "saber/rc", "/etc/saber"
17
26
 
18
27
  class << self
19
28
  attr_accessor :ui
data/lib/saber/cli.rb CHANGED
@@ -1,27 +1,47 @@
1
+ require "xmlrpc/client"
2
+
1
3
  module Saber
2
4
  class CLI < Thor
3
5
  include Thor::Actions
4
6
 
5
- # check_unknown_options!
6
-
7
- # default_task :install
8
7
  class_option "no-color", :type => :boolean, :banner => "Disable colorization in output"
9
8
  class_option "verbose", :aliases => "-V", :type => :boolean, :banner => "Enable verbose output mode"
10
9
 
11
10
  def initialize(*)
12
11
  super
13
12
  the_shell = (options["no-color"] ? Thor::Shell::Basic.new : shell)
14
- Bundler.ui = UI::Shell.new(the_shell)
15
- Bundler.ui.debug! if options["verbose"]
13
+ Saber.ui = UI::Shell.new(the_shell)
14
+ Saber.ui.debug! if options["verbose"]
16
15
  end
17
16
 
18
17
  desc "clean", "clean up files doesn't in rtorrent client"
19
18
  def clean
20
- Task.new.clean
19
+ Task.clean
20
+ end
21
+
22
+ desc "add <file ..>", "begin download file or directory via aria2 daemon."
23
+ def add(*names)
24
+ Downloader.new.add_names(*names)
25
+ end
26
+
27
+ desc "server", "start saber-server daemon"
28
+ def server
29
+ Server.start
30
+ end
31
+
32
+ desc "client", "start saber-client daemon"
33
+ def client
34
+ Client.start
21
35
  end
22
36
 
23
- private
24
- # helper methods
37
+ desc "drb_add <ids> [label]", "add a file to saber-server daemon via drb"
38
+ # drb_add "id1,id2", "foo"
39
+ def drb_add(ids_str, label=Rc.label)
40
+ return if label != Rc.label
25
41
 
42
+ names = ids_str.split(",").map{|v| Retort::Torrent.action("name", v)}
43
+
44
+ DRbClient.new.add(*names)
45
+ end
26
46
  end
27
47
  end
@@ -0,0 +1,51 @@
1
+ require "xmpp4r/client"
2
+ require "drb"
3
+
4
+ module Saber
5
+ class Client
6
+ class << self
7
+ def start
8
+ Client.new.start
9
+ sleep
10
+ end
11
+ end
12
+
13
+ attr_reader :client, :downloader
14
+
15
+ def initialize
16
+ @client = Jabber::Client.new(Jabber::JID.new(Rc.client.xmpp.jid))
17
+ @downloader = Downloader.new
18
+ end
19
+
20
+ def start
21
+ client.connect Rc.client.xmpp.host, Rc.client.xmpp.port
22
+ client.auth Rc.client.xmpp.password
23
+
24
+ client.add_message_callback { |msg|
25
+ pd msg.from.bare
26
+ if msg.from.bare == Rc.server.xmpp.jid
27
+ files = msg.body.split("\n")
28
+ Saber.ui.say "::recv files::\n #{files.join("\n")}\n\n"
29
+ #downloader.add *files
30
+ end
31
+ }
32
+
33
+ client.send Jabber::Presence.new
34
+ Saber.ui.say ">> Connected to xmpp with #{Rc.client.xmpp.jid}"
35
+ end
36
+ end
37
+
38
+ class DRbClient
39
+ attr_reader :server
40
+
41
+ def initialize
42
+ DRb.start_service
43
+ @server = DRbObject.new_with_uri(Rc.drb_uri)
44
+ Saber.ui.debug "DRbClient connected to #{Rc.drb_uri}"
45
+ end
46
+
47
+ def add(*names)
48
+ server.add(*names)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,47 @@
1
+ require "xmlrpc/client"
2
+
3
+ module Saber
4
+ class Downloader
5
+ def initialize
6
+ @aria2 = XMLRPC::Client.new2(Rc.aria2.rpc)
7
+ end
8
+
9
+ def aria2_add(uris, o={}, &blk)
10
+ @aria2.call("aria2.addUri", uris, o, &blk)
11
+ end
12
+
13
+ def add(*files)
14
+ files.each { |file|
15
+ uri = "#{Rc.server.ftp}/#{file}"
16
+ gid = aria2_add([uri], :dir => Pa.dir2("#{Rc.p.download}/#{file}"))
17
+ Saber.ui.say "DOWNLOAD #{gid}:: #{uri}"
18
+ }
19
+ end
20
+
21
+ def add_names(*names)
22
+ files = retrive_files(*names)
23
+ add(*files)
24
+ end
25
+
26
+ private
27
+
28
+ def retrive_files(*names)
29
+ files = []
30
+ Net::SSH.start(Rc.server.host, Rc.server.user) do |s|
31
+ name = "'#{names.join("' '")}'"
32
+ cmd = "cd #{Rc.server.download.p} && find #{name} -type f"
33
+
34
+ rst = s.exec!(cmd)
35
+ if rst =~ /^find: `|^cd:cd:/
36
+ raise Error, rst
37
+ elsif rst.nil?
38
+ raise Error, "remote `#{name}' is an empty directory."
39
+ end
40
+
41
+ files = rst.split("\n")
42
+ end
43
+
44
+ files
45
+ end
46
+ end
47
+ end
data/lib/saber/rc.rb CHANGED
@@ -1,3 +1,31 @@
1
1
  scgi_server = "http://localhost/RPC2"
2
2
 
3
- download_dir = Pa.join(ENV["HOME"], "bt")
3
+ p:
4
+ download = Pa("~/download") # local download directory.
5
+
6
+ aria2:
7
+ rpc = "http://localhost:6800/rpc"
8
+
9
+ label = "saber" # default auto-download label.
10
+ port = 3014
11
+ token = "641a16655dad688ab681c0279a4369b5"
12
+ drb_uri = "druby://localhost:3015"
13
+
14
+ server:
15
+ download = Pa("/home/foo/download") # remote download directory.
16
+ ftp = "ftp://seedbox/download" # download from "#{ftp}/<file>"
17
+ host = "seedbox"
18
+ user = "foo"
19
+
20
+ xmpp:
21
+ jid = "foo@jabber.org"
22
+ password = "y"
23
+ host = nil
24
+ port = nil
25
+
26
+ client:
27
+ xmpp:
28
+ jid = "bar@jabber.org"
29
+ password = "y"
30
+ host = nil
31
+ port = nil
@@ -0,0 +1,69 @@
1
+ require "xmpp4r/client"
2
+ require "drb"
3
+
4
+ module Saber
5
+ class Server
6
+ def self.start
7
+ # register on_finished event.
8
+ Retort::Service.call("system.method.set_key", "event.download.closed", "saber-download", "execute= /usr/bin/saber-drb_add, $d.get_hash=, $d.get_custom1=")
9
+
10
+ s = Server.new
11
+ s.start
12
+ DRbServer.start(s)
13
+ DRb.thread.join
14
+ end
15
+
16
+ attr_reader :client
17
+
18
+ def initialize
19
+ @client = Jabber::Client.new(Jabber::JID.new(Rc.server.xmpp.jid))
20
+ end
21
+
22
+ def start
23
+ client.connect Rc.server.xmpp.host, Rc.server.xmpp.port
24
+ client.auth Rc.server.xmpp.password
25
+ client.send Jabber::Presence.new
26
+ Saber.ui.say ">> Connected to xmpp with #{Rc.server.xmpp.jid}"
27
+ end
28
+
29
+ def send(files)
30
+ Saber.ui.say %~::send::\n #{files.join("\n")}\n\n~
31
+ client.send Jabber::Message.new(Rc.client.xmpp.jid, files.join("\n"))
32
+ end
33
+ end
34
+
35
+ class DRbServer
36
+ class << self
37
+ def start(saber_server)
38
+ DRbServer.new(saber_server).start
39
+ end
40
+ end
41
+
42
+ attr_reader :saber_server
43
+
44
+ # @params [Server] server
45
+ def initialize(saber_server)
46
+ @saber_server = saber_server
47
+ end
48
+
49
+ def start
50
+ DRb.start_service Rc.drb_uri, self
51
+ Saber.ui.say ">> DRbSever listening on #{Rc.drb_uri}"
52
+ end
53
+
54
+ # drb. add a complete torrent.
55
+ def add(*names)
56
+ Saber.ui.debug "::DRbServer add:: #{names.inspect}"
57
+ files = build_files(*names)
58
+
59
+ saber_server.send(files)
60
+ end
61
+
62
+ private
63
+
64
+ # ["filea", "foo/filea", "foo/fileb"]
65
+ def build_files(*names)
66
+ Pa.ls2_r(*names, :base_dir => Rc.server.download, :file => true, :include => true) { |path| not Pa.directory?(path) }
67
+ end
68
+ end
69
+ end
data/lib/saber/task.rb CHANGED
@@ -1,18 +1,18 @@
1
1
  module Saber
2
2
  class Task
3
- def initialize
4
- Retort::Service.configure do |c|
5
- c.url = Rc.scgi_server
6
- end
7
- end
3
+ class << self
4
+ def clean
5
+ Retort::Service.configure do |c|
6
+ c.url = Rc.scgi_server
7
+ end
8
8
 
9
- def clean
10
- disk_files = Rc.download_dir.ls2(:absolute => true)
11
- bt_files = Retort::Torrent.all.map{|t| Retort::Torrent.action("name", t.info_hash) }.map{|n| Rc.download_dir.join2(n)}
9
+ disk_files = Rc.p.download.ls2(:absolute => true)
10
+ bt_files = Retort::Torrent.all.map{|t| Retort::Torrent.action("name", t.info_hash) }.map{|n| Rc.p.download.join2(n)}
12
11
 
13
- (disk_files - bt_files).each { |file|
14
- Pa.rm_r file, :verbose => true
15
- }
12
+ (disk_files - bt_files).each { |file|
13
+ Pa.rm_r file, :verbose => true
14
+ }
15
+ end
16
16
  end
17
17
  end
18
18
  end
data/lib/saber/ui.rb CHANGED
@@ -15,6 +15,11 @@ module Saber
15
15
  def confirm(message)
16
16
  end
17
17
 
18
+ # alias to info
19
+ def say(message)
20
+ info(message)
21
+ end
22
+
18
23
  class Shell < UI
19
24
  attr_writer :shell
20
25
 
data/lib/saber/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Saber
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.3"
3
3
  end
data/saber.gemspec CHANGED
@@ -1,7 +1,7 @@
1
- $: << "."
2
- require "lib/saber/version"
1
+ $: << "lib"
2
+ require "saber/version"
3
3
 
4
- Gem::Specification.new do |s|
4
+ spec = Gem::Specification.new do |s|
5
5
  s.name = "saber"
6
6
  s.version = Saber::VERSION
7
7
  s.summary = "the saber"
@@ -15,7 +15,14 @@ the saber
15
15
  s.rubyforge_project = "xx"
16
16
 
17
17
  s.files = `git ls-files`.split("\n")
18
- #s.executables = ["x"]
18
+ s.executables = ["saber"]
19
+ s.extensions << "extconf.rb"
19
20
 
20
- #s.add_dependency "x"
21
+ s.add_dependency "tagen", "~>1.1.5"
22
+ s.add_dependency "optimism", "~>3.1.2"
23
+ s.add_dependency "pa", "~>1.2.2"
24
+ s.add_dependency "retort","~>0.0.6"
25
+ s.add_dependency "thor", "~>0.14.6"
26
+ s.add_dependency "net-ssh", "~>2.3.0"
27
+ s.add_dependency "xmpp4r", "~>0.5"
21
28
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+
4
+
5
+
6
+
7
+
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ Downloader = Saber::Downloader
4
+
5
+ describe Downloader do
6
+ describe "test everyting" do
7
+ it "works" do
8
+ XMLRPC::Client.stub(:new2)
9
+
10
+ d = Downloader.new
11
+
12
+ d.should_receive(:aria2_add).with(["ftp://seedbox/bt/foo/bar.mkv"], {dir: "#{$spec_data}/download/foo"})
13
+ d.add("foo/bar.mkv")
14
+ end
15
+ end
16
+ end
17
+
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ Server = Saber::Server
4
+ DRbServer = Saber::DRbServer
5
+ class DRbServer
6
+ public :build_files
7
+ end
8
+
9
+ describe DRbServer do
10
+ describe "#build_files" do
11
+ it "works" do
12
+ s = DRbServer.new(nil)
13
+ s.build_files("prison.break", "terra.nova.mkv").sort.should == %w[prison.break/01.prison.break.mkv prison.break/02.prison.break.mkv terra.nova.mkv]
14
+ end
15
+ end
16
+ end
17
+
18
+
data/spec/spec_helper.rb CHANGED
@@ -0,0 +1,60 @@
1
+ require "saber"
2
+
3
+ $spec_dir = File.expand_path("..", __FILE__)
4
+ $spec_data = File.expand_path("../data", __FILE__)
5
+
6
+ Saber::Rc._merge! Optimism <<EOF
7
+ p:
8
+ download = Pa("#{$spec_data}/download")
9
+
10
+ server:
11
+ download = Pa("#{$spec_data}/bt")
12
+ ftp = "ftp://seedbox/bt"
13
+ host = "localhost"
14
+ user = "foo"
15
+
16
+ port = 8914
17
+ token = "token"
18
+ drb_uri = "druby://localhost:8915"
19
+ EOF
20
+
21
+ RSpec.configure do |config|
22
+ def capture(stream)
23
+ begin
24
+ stream = stream.to_s
25
+ eval "$#{stream} = StringIO.new"
26
+ yield
27
+ result = eval("$#{stream}").string
28
+ ensure
29
+ eval("$#{stream} = #{stream.upcase}")
30
+ end
31
+
32
+ result
33
+ end
34
+
35
+ alias :silence :capture
36
+ end
37
+
38
+ module Kernel
39
+ private
40
+
41
+ def xdescribe(*args, &blk)
42
+ describe *args do
43
+ pending "xxxxxxxxx"
44
+ end
45
+ end
46
+
47
+ def xcontext(*args, &blk)
48
+ context *args do
49
+ pending "xxxxxxxxx"
50
+ end
51
+ end
52
+
53
+ def xit(*args, &blk)
54
+ it *args do
55
+ pending "xxxxxxxx"
56
+ end
57
+ end
58
+ end
59
+
60
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saber
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,29 +9,127 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-30 00:00:00.000000000 Z
13
- dependencies: []
12
+ date: 2012-02-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: tagen
16
+ requirement: &17018160 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.1.5
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *17018160
25
+ - !ruby/object:Gem::Dependency
26
+ name: optimism
27
+ requirement: &17031380 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 3.1.2
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *17031380
36
+ - !ruby/object:Gem::Dependency
37
+ name: pa
38
+ requirement: &17028780 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 1.2.2
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *17028780
47
+ - !ruby/object:Gem::Dependency
48
+ name: retort
49
+ requirement: &17516180 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 0.0.6
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *17516180
58
+ - !ruby/object:Gem::Dependency
59
+ name: thor
60
+ requirement: &17510260 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: 0.14.6
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *17510260
69
+ - !ruby/object:Gem::Dependency
70
+ name: net-ssh
71
+ requirement: &17528700 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: 2.3.0
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *17528700
80
+ - !ruby/object:Gem::Dependency
81
+ name: xmpp4r
82
+ requirement: &17526300 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: '0.5'
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: *17526300
14
91
  description: ! 'the saber
15
92
 
16
93
  '
17
94
  email: ywzhaifei@gmail.com
18
- executables: []
19
- extensions: []
95
+ executables:
96
+ - saber
97
+ extensions:
98
+ - extconf.rb
20
99
  extra_rdoc_files: []
21
100
  files:
101
+ - .gitignore
102
+ - .rspec
22
103
  - Gemfile
23
104
  - Gemfile.lock
24
105
  - README.md
25
106
  - Ragfile
26
107
  - bin/saber
108
+ - bin/saber-drb_add
109
+ - extconf.rb
27
110
  - lib/saber.rb
28
111
  - lib/saber/cli.rb
112
+ - lib/saber/client.rb
113
+ - lib/saber/downloader.rb
29
114
  - lib/saber/rc.rb
115
+ - lib/saber/server.rb
30
116
  - lib/saber/task.rb
31
117
  - lib/saber/ui.rb
32
118
  - lib/saber/version.rb
33
119
  - saber.gemspec
34
120
  - saber.watchr
121
+ - spec/data/bt/lost.mkv
122
+ - spec/data/bt/lost/01.lost.mkv
123
+ - spec/data/bt/lost/02.lost.mkv
124
+ - spec/data/bt/prison.break.mkv
125
+ - spec/data/bt/prison.break/01.prison.break.mkv
126
+ - spec/data/bt/prison.break/02.prison.break.mkv
127
+ - spec/data/bt/terra.nova.mkv
128
+ - spec/data/bt/terra.nova/01.terra.nova.mkv
129
+ - spec/data/bt/terra.nova/02.terra.nova.mkv
130
+ - spec/saber/client_spec.rb
131
+ - spec/saber/downloader_spec.rb
132
+ - spec/saber/server_spec.rb
35
133
  - spec/spec_helper.rb
36
134
  homepage: http://github.com/GutenYe/saber
37
135
  licenses: []