trans-api 0.0.2 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: !binary |-
4
- YTE4YzBlYmRjN2Q1ZDQwZWYwNWM0MjA4ZDE2YmE0ZjNmNmYzMGI5MQ==
5
- data.tar.gz: !binary |-
6
- NDZhNjBkNTZjYmYyMjM4NDU5NzJmMDBmZWQzMzMwMjYwNTNmYjExYg==
3
+ metadata.gz: 4750d6488dcb9805c0bbd635509b4cc2b82f664e
4
+ data.tar.gz: 112eebe82c5696c795c38d311047cb6bc154d396
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- YWJkNjJiZTdlNzE4NjgxZDc2YjE0MWQzZGI1NzY5N2EzZjY3MDhiYWNjZjlh
10
- YTdjYTEwMTg5NGU2NjZkZDJjNTE4NjdkN2EzZmRiMTAzODljZTM3ZjZlNDlm
11
- YjY3ZTRlMTgzNjlhOWNkOThmMTViMzdhZGU2ZTY3ZmQ5YjMyZDc=
12
- data.tar.gz: !binary |-
13
- NDY5MjgyOGZmODQ1N2ZiYWNhMmMyMjUwMzg3MTMxYWU3OTRjNTJlMzYzMTUy
14
- ZWZiYjI0NmZjYjZjMDljNDgzNDVkZmZlYWQ1N2FlZmEzMmY3NzNkMWNmNGJm
15
- YjNiYTFiMjQ0N2UyNzhkYTVhNDNlM2VjNWYzODM1Nzc0YTU3Zjk=
6
+ metadata.gz: 2d6928aee4bdebfe1272677a7b88dbe56df591922aeaf38d175d5c109fbd8b149a7519259d8322e202223319601a61a0d82d73084becf8126019b45af12acea5
7
+ data.tar.gz: 6baef1393173ee402a8487bf7656702c399d39f0b490047ad306a4807546c28561ef23810ab49bd90316ffbe6bafb3132cd12eac69b787d6766ec3ade5b00a21
data/.gitignore CHANGED
@@ -17,3 +17,4 @@ capybara-*.html
17
17
  rerun.txt
18
18
  pickle-email-*.html
19
19
  /pkg/*
20
+
data/Gemfile.lock CHANGED
@@ -1,17 +1,20 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- trans-api (0.0.1)
5
- json
6
- nokogiri
4
+ trans-api (0.0.3)
5
+ json (> 1.6.1)
6
+ nokogiri (> 1.5.0)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- json (1.7.5)
12
- json (1.7.5-java)
13
- nokogiri (1.5.5)
14
- nokogiri (1.5.5-java)
11
+ json (1.8.1)
12
+ json (1.8.1-java)
13
+ mini_portile (0.5.2)
14
+ nokogiri (1.6.1)
15
+ mini_portile (~> 0.5.0)
16
+ nokogiri (1.6.1-java)
17
+ mini_portile (~> 0.5.0)
15
18
  test-unit (2.5.2)
16
19
 
17
20
  PLATFORMS
@@ -19,5 +22,5 @@ PLATFORMS
19
22
  ruby
20
23
 
21
24
  DEPENDENCIES
22
- test-unit
25
+ test-unit (> 2.0.0)
23
26
  trans-api!
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012 Dennis Blommesteijn
1
+ Copyright (c) 2012-2014 Dennis Blommesteijn
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Trans::Api
2
2
 
3
- Trans::Api is an ruby implementation for Transmission RPC. Based on RPC spec 13328
3
+ Trans::Api is an ruby implementation for Transmission RPC (bittorrent client). Based on RPC spec 13328
4
4
  https://trac.transmissionbt.com/browser/trunk/extras/rpc-spec.txt
5
5
 
6
6
  It required for the Transmission RPC to run the 'remote access':
@@ -10,22 +10,22 @@ OSX:
10
10
  Transmission > Preferences > Remote (tab) > Enable remote access
11
11
 
12
12
 
13
- ### Platforms
13
+ ### Platforms (tested)
14
14
 
15
15
  This gem is (build and) tested with:
16
16
 
17
- OSX Lion, Mountain Lion
17
+ OSX Lion, Mountain Lion, Mavericks
18
18
 
19
- Ruby 1.9.3
19
+ Ruby 1.9.3, 2.1.0
20
20
 
21
- Rails: 3.2.8, 3.2.9
21
+ Rails: 3.2.8, 3.2.9, 4.0.3
22
22
 
23
- Transmission 2.73 (13589)
23
+ Transmission 2.73 (13589) - 2.82 (14160)
24
24
 
25
25
 
26
26
  ### Roadmap
27
27
 
28
- * Version (0.0.1) (current)
28
+ * Version (0.0.1)
29
29
 
30
30
  Initial project import.
31
31
 
@@ -39,26 +39,48 @@ This gem is (build and) tested with:
39
39
 
40
40
  Torrent object 'waitfor' helper to check for lambda after/before calling it's chained cousin
41
41
 
42
+ * Version (0.0.3)
43
+
44
+ Querying name before add (duplicate detect), not hammering torrent-add (due to a transmission BUG)
45
+
46
+ Added some File internal fields (total and completed transfer)
47
+
48
+ * Version (0.0.4)
49
+
50
+ Added Session.alt_speed_time_day_options, returns a list of values to set `alt_speed_time_day`
51
+
52
+ Added Session.reload!, that reconnects to the client (for example using alternate configs)
53
+
54
+ Added Session.update_blocklist!, updating the current set blocklist
55
+
56
+
57
+ ### Changelog
58
+
59
+ * Version (0.0.3)
60
+
61
+ Torrent.add_metainfo(base64, filename, options={}) -> requires a filename parameter
62
+
63
+ * Version (0.0.4)
64
+
65
+ TBA
42
66
 
43
67
  ### Known Issues
44
68
 
45
69
  The Transmission RPC call 'torrent-remove' (implemented as torrent.delete! and Torrent::delete_all!) will crash the daemon! This is NOT a known Transmission issue.
46
70
 
71
+ Due to a Transmission bug (https://trac.transmissionbt.com/ticket/5614) duplicate torrents are accepted by the RPC call. The GUI will eventually crash the daemon, when interacting with these duplicate files (or instances). Torrent.add_file/ add_metainfo queries for duplicates to omit this bug.
72
+
47
73
 
48
74
  ## Installation
49
75
 
50
76
  Add this line to your application's Gemfile:
51
77
 
52
- gem 'trans-api', git: "git://github.com/dblommesteijn/trans-api.git"
78
+ gem 'trans-api', github: "dblommesteijn/trans-api"
53
79
 
54
80
  And then execute:
55
81
 
56
82
  $ bundle
57
83
 
58
- Or install it yourself as:
59
-
60
- $ gem install trans-api
61
-
62
84
 
63
85
  ## Setup
64
86
 
@@ -157,8 +179,19 @@ Trans::Api::Torrent.delete_all torrents
157
179
  Add torrent file
158
180
 
159
181
  ```ruby
182
+ file = File.open('some file here')
160
183
  options = {paused: true}
161
- Trans::Api::Torrent.add_file filename, options
184
+ Trans::Api::Torrent.add_file file, options
185
+ ```
186
+
187
+ Add torrent file (via base64)
188
+
189
+ ```ruby
190
+ file = File.open('some file here')
191
+ file_name = File.basename(file, ".*") # required >= 0.0.3/ master
192
+ options = {paused: true}
193
+ base64_file_contents = Base64.encode64 file.read
194
+ Trans::Api::Torrent.add_metainfo base64_file_contents, file_name, options
162
195
  ```
163
196
 
164
197
  Get all fields
@@ -284,6 +317,29 @@ Reset (reload object, request information and not saving changes)
284
317
  session.reset!
285
318
  ```
286
319
 
320
+ Reload (reload the client connection, and configuration)
321
+
322
+ ```ruby
323
+ session.reload!
324
+ ```
325
+
326
+ Enable set and update blocklist
327
+
328
+ ```ruby
329
+ # set an url
330
+ session.blocklist_url = "http://list.iblocklist.com/?list=bt_level3&fileformat=p2p&archiveformat=gz"
331
+ # enable blocklist
332
+ session.blocklist_enable = true
333
+ # save changes
334
+ session.save!
335
+ # force update
336
+ begin
337
+ session.update_blocklist!
338
+ rescue Exception => e
339
+ # handle http exceptions here!
340
+ end
341
+ ```
342
+
287
343
  NOTE: defined session fields are defined as instance methods to the Session object
288
344
 
289
345
 
@@ -332,3 +388,6 @@ file.stat
332
388
 
333
389
  NOTE: changed preferences (want, unwant) set options on the linked Torrent object, after saving torrent (torrent.save!) file mutations are stored.
334
390
 
391
+
392
+
393
+
data/lib/trans-api.rb CHANGED
@@ -5,8 +5,15 @@ require File.expand_path(File.dirname(__FILE__) + "/trans-api/session")
5
5
  require File.expand_path(File.dirname(__FILE__) + "/trans-api/torrent")
6
6
  require File.expand_path(File.dirname(__FILE__) + "/trans-api/file")
7
7
 
8
+ # boolean helper
9
+ if Boolean.nil?
10
+ module Boolean; end
11
+ class TrueClass; include Boolean; end
12
+ class FalseClass; include Boolean; end
13
+ end
14
+
15
+ # trans api placeholder
8
16
  module Trans
9
17
  module Api
10
- # placeholder
11
18
  end
12
19
  end
@@ -152,8 +152,11 @@ module Trans
152
152
  data = METHODS[:torrent_add]
153
153
  data[:arguments] = argument_name_to_api arguments
154
154
  ret = self.do(:post, data)
155
+ # puts JSON.parse(ret[:response].body).inspect
155
156
  torrents = JSON.parse ret[:response].body.gsub("-","_"), {symbolize_names: true}
156
157
  raise torrents[:result] unless valid? torrents, data[:tag]
158
+ # omiting BUG: https://trac.transmissionbt.com/ticket/5614
159
+ return torrents[:arguments][:torrent_duplicate] if torrents[:arguments].include?(:torrent_duplicate)
157
160
  torrents[:arguments][:torrent_added]
158
161
  end
159
162
 
@@ -1,56 +1,68 @@
1
1
 
2
2
 
3
3
  module Trans
4
- module Api
5
-
6
- class File
7
-
8
- def initialize(options={})
9
- @torrent = options.delete :torrent
10
- @torrent_fields = options.delete :fields
11
- @fields = options[:file]
12
-
13
- # set default stats
14
- @torrent_fields[:files_unwanted] ||= []
15
- @torrent_fields[:files_wanted] ||= []
16
- # if @fields[:fileStat][:wanted] == false
17
- # @torrent_fields[:files_unwanted] << self.id
18
- # else
19
- # @torrent_fields[:files_wanted] << self.id
20
- # end
21
-
22
- @client = Client.new
23
- end
24
-
25
- def id
26
- @fields[:id]
27
- end
28
-
29
- def name
30
- @fields[:name]
31
- end
32
-
33
- def stat
34
- @fields[:fileStat]
35
- end
36
-
37
- def unwant
38
- @torrent_fields[:files_wanted].delete self.id if @torrent_fields[:files_wanted].include? self.id
39
- @torrent_fields[:files_unwanted] << self.id unless @torrent_fields[:files_unwanted].include? self.id
40
- @fields[:fileStat][:wanted] = false
41
- end
42
-
43
- def want
44
- @torrent_fields[:files_wanted] << self.id unless @torrent_fields[:files_wanted].include? self.id
45
- @torrent_fields[:files_unwanted].delete self.id if @torrent_fields[:files_unwanted].include? self.id
46
- @fields[:fileStat][:wanted] = true
47
- end
48
-
49
- def wanted?
50
- @fields[:fileStat][:wanted]
51
- end
52
-
53
- end
54
-
55
- end
4
+ module Api
5
+
6
+ class File
7
+
8
+ def initialize(options={})
9
+ @torrent = options.delete :torrent
10
+ @torrent_fields = options.delete :fields
11
+ @fields = options[:file]
12
+
13
+ # set default stats
14
+ @torrent_fields[:files_unwanted] ||= []
15
+ @torrent_fields[:files_wanted] ||= []
16
+ # if @fields[:fileStat][:wanted] == false
17
+ # @torrent_fields[:files_unwanted] << self.id
18
+ # else
19
+ # @torrent_fields[:files_wanted] << self.id
20
+ # end
21
+
22
+ @client = Client.new
23
+ end
24
+
25
+ def id
26
+ @fields[:id]
27
+ end
28
+
29
+ def name
30
+ @fields[:name]
31
+ end
32
+
33
+ def stat
34
+ @fields[:fileStat]
35
+ end
36
+
37
+ def bytes_completed
38
+ @fields[:bytesCompleted]
39
+ end
40
+
41
+ def bytes_total
42
+ @fields[:length]
43
+ end
44
+
45
+ def priority
46
+ @fields[:fileStat][:priority]
47
+ end
48
+
49
+ def unwant
50
+ @torrent_fields[:files_wanted].delete self.id if @torrent_fields[:files_wanted].include? self.id
51
+ @torrent_fields[:files_unwanted] << self.id unless @torrent_fields[:files_unwanted].include? self.id
52
+ @fields[:fileStat][:wanted] = false
53
+ end
54
+
55
+ def want
56
+ @torrent_fields[:files_wanted] << self.id unless @torrent_fields[:files_wanted].include? self.id
57
+ @torrent_fields[:files_unwanted].delete self.id if @torrent_fields[:files_unwanted].include? self.id
58
+ @fields[:fileStat][:wanted] = true
59
+ end
60
+
61
+ def wanted?
62
+ @fields[:fileStat][:wanted]
63
+ end
64
+
65
+ end
66
+
67
+ end
56
68
  end
@@ -16,27 +16,7 @@ module Trans
16
16
 
17
17
 
18
18
  def initialize
19
- @client = Client.new
20
- self.reset!
21
-
22
- # map fields to accessors
23
- @fields.each do |k, v|
24
- # setter
25
- self.metaclass.send(:define_method, "#{k}=") do |value|
26
- if v.class == value.class
27
- @fields[k] = value
28
- else
29
- msg = "invalid type: #{value.class}, expected: #{v.class}"
30
- @last_error[:message] = msg
31
- raise msg
32
- end
33
- end
34
- # getter
35
- self.metaclass.send(:define_method, "#{k}") do
36
- @fields[k]
37
- end
38
- end
39
-
19
+ self.reload!
40
20
  end
41
21
 
42
22
  def fields
@@ -71,12 +51,64 @@ module Trans
71
51
  @fields = @client.connect.session_get
72
52
  @old_fields = @fields.clone
73
53
  @last_error = {error: "", message: ""}
54
+ nil
55
+ end
56
+
57
+ def reload!
58
+ @client = Client.new
59
+ self.reset!
60
+
61
+ # map fields to accessors
62
+ @fields.each do |k, v|
63
+ # setter
64
+ self.metaclass.send(:define_method, "#{k}=") do |value|
65
+ if v.class == value.class || value.is_a?(::Boolean)
66
+ @fields[k] = value
67
+ else
68
+ msg = "invalid type: #{value.class}, expected: #{v.class}"
69
+ @last_error[:message] = msg
70
+ raise msg
71
+ end
72
+ end
73
+ # getter
74
+ self.metaclass.send(:define_method, "#{k}") do
75
+ @fields[k]
76
+ end
77
+ end
74
78
  end
75
79
 
80
+ def update_blocklist!
81
+ @client.connect.blocklist_update
82
+ end
83
+
84
+
85
+ # blocklist-update
86
+
76
87
 
77
88
  def metaclass
78
89
  class << self; self; end
79
90
  end
91
+
92
+ class << self
93
+ def alt_speed_time_day_options
94
+ ret = []
95
+ ret << ["Sunday", 1]
96
+ ret << ["Monday", 2]
97
+ ret << ["Tuesday", 4]
98
+ ret << ["Wednesday", 8]
99
+ ret << ["Thursday", 16]
100
+ ret << ["Friday", 32]
101
+ ret << ["Weekdays", 62]
102
+ ret << ["Saturday", 64]
103
+ ret << ["Weekends", 65]
104
+ ret << ["Every Day", 127]
105
+ ret.sort{|a,b| a.last <=> b.last}
106
+ end
107
+
108
+ def encryption_levels
109
+ ["required", "preferred", "tolerated"].map{|t| [t.humanize, t]}
110
+ end
111
+ end
80
112
  end
81
113
 
82
114
  end
@@ -1,6 +1,8 @@
1
1
  module Trans
2
2
  module Api
3
3
 
4
+ require 'pathname'
5
+
4
6
  #
5
7
  # Torrent class
6
8
  #
@@ -86,8 +88,10 @@ module Trans
86
88
  torrent = @client.connect.torrent_get([:files, :fileStats], [self.id]).first
87
89
  @fields[:files] = torrent[:files]
88
90
  @fields[:fileStatus] = torrent[:fileStats]
89
- @fields[:files].each_with_index{ |f,i| ret << Trans::Api::File.new( torrent: self, fields: @fields,
90
- file: f.merge(id: i).merge(fileStat: torrent[:fileStats][i])) }
91
+ @fields[:files].each_with_index do |f,i|
92
+ ret << Trans::Api::File.new( torrent: self, fields: @fields,
93
+ file: f.merge(id: i).merge(fileStat: torrent[:fileStats][i]))
94
+ end
91
95
  ret
92
96
  end
93
97
 
@@ -199,6 +203,9 @@ module Trans
199
203
 
200
204
  def add_file(filename, options={})
201
205
  raise "file not found: #{filename}" unless ::File.exists? filename
206
+ # filter duplicates
207
+ find = Trans::Api::Torrent.find_by_field_value(:name, ::File.basename(filename, ".*"))
208
+ return find unless find.nil?
202
209
  client = Client.new
203
210
  options[:filename] = filename
204
211
  torrent = client.connect.torrent_add options
@@ -206,8 +213,12 @@ module Trans
206
213
  Torrent.new torrent: torrent
207
214
  end
208
215
 
209
- def add_metainfo(metainfo, options={})
216
+ def add_metainfo(metainfo, name, options={})
217
+ raise "name empty" if name.nil? || name == ""
210
218
  options[:metainfo] = metainfo
219
+ # filter duplicates
220
+ find = Trans::Api::Torrent.find_by_field_value(:name, name)
221
+ return find unless find.nil?
211
222
  client = Client.new
212
223
  torrent = client.connect.torrent_add options
213
224
  torrent = client.connect.torrent_get( @@default_fields, [torrent[:id]]).first
@@ -1,5 +1,5 @@
1
1
  module Trans
2
2
  module Api
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.4"
4
4
  end
5
5
  end
@@ -2,7 +2,8 @@ require 'rubygems'
2
2
  require 'test/unit'
3
3
  require File.expand_path(File.dirname(__FILE__) + "/../../lib/trans-api")
4
4
 
5
-
5
+ # run with config options
6
+ #CONFIG="{\"host\":\"localhost\",\"port\":9091,\"user\":\"admin\",\"pass\":\"admin\",\"path\":\"/transmission/rpc\"}" ruby -I test test/unit/trans_connect.rb
6
7
 
7
8
  #
8
9
  # Unit test for Transmission RPC+json
@@ -12,10 +13,11 @@ require File.expand_path(File.dirname(__FILE__) + "/../../lib/trans-api")
12
13
 
13
14
  class TransConnect < Test::Unit::TestCase
14
15
 
15
- CONFIG = { host: "localhost", port: 9091, user: "admin", pass: "admin", path: "/transmission/rpc" }
16
-
17
16
  def setup
18
- Trans::Api::Client.config = CONFIG
17
+ @CONFIG = { host: "localhost", port: 9091, user: "admin", pass: "admin", path: "/transmission/rpc" }
18
+ @CONFIG = JSON.parse(ENV["CONFIG"], symbolize_names: true) if ENV.include? "CONFIG"
19
+
20
+ Trans::Api::Client.config = @CONFIG
19
21
 
20
22
  # add a testing torrent
21
23
  file = File.expand_path(File.dirname(__FILE__) + "/torrents/debian-6.0.6-amd64-CD-1.iso.torrent")
@@ -24,7 +26,7 @@ class TransConnect < Test::Unit::TestCase
24
26
  end
25
27
 
26
28
  def teardown
27
- Trans::Api::Client.config = CONFIG
29
+ Trans::Api::Client.config = @CONFIG
28
30
 
29
31
  # remove the testing torrent
30
32
  id = @torrent.id
@@ -39,19 +41,19 @@ class TransConnect < Test::Unit::TestCase
39
41
  # SESSIONS
40
42
 
41
43
  def test_session_get
42
- tc = Trans::Api::Connect.new CONFIG
44
+ tc = Trans::Api::Connect.new @CONFIG
43
45
  session = tc.session_get
44
46
  assert session.size > 0, "no arguments found"
45
47
  end
46
48
 
47
49
  def test_session_stats
48
- tc = Trans::Api::Connect.new CONFIG
50
+ tc = Trans::Api::Connect.new @CONFIG
49
51
  session = tc.session_stats
50
52
  assert session.size > 0, "no arguments found"
51
53
  end
52
54
 
53
55
  def test_session_set
54
- tc = Trans::Api::Connect.new CONFIG
56
+ tc = Trans::Api::Connect.new @CONFIG
55
57
 
56
58
  # get session
57
59
  session_get = tc.session_get
@@ -91,7 +93,7 @@ class TransConnect < Test::Unit::TestCase
91
93
  end
92
94
 
93
95
  def test_session_close
94
- tc = Trans::Api::Connect.new CONFIG
96
+ tc = Trans::Api::Connect.new @CONFIG
95
97
  session_get = tc.session_get
96
98
  #NOTE: will shut the daemon down!!
97
99
  # session_close = tc.session_close
@@ -101,7 +103,7 @@ class TransConnect < Test::Unit::TestCase
101
103
  # TORRENTS
102
104
 
103
105
  def test_torrent_get
104
- tc = Trans::Api::Connect.new CONFIG
106
+ tc = Trans::Api::Connect.new @CONFIG
105
107
 
106
108
  # receive torrent list
107
109
  torrents = tc.torrent_get([:id, :name, :status])
@@ -126,7 +128,7 @@ class TransConnect < Test::Unit::TestCase
126
128
  end
127
129
 
128
130
  def test_torrent_set
129
- tc = Trans::Api::Connect.new CONFIG
131
+ tc = Trans::Api::Connect.new @CONFIG
130
132
 
131
133
  # get torrent list
132
134
  torrents = tc.torrent_get([:id, :name, :bandwidthPriority])
@@ -156,7 +158,7 @@ class TransConnect < Test::Unit::TestCase
156
158
 
157
159
 
158
160
  def test_torrent_start_stop_single
159
- tc = Trans::Api::Connect.new CONFIG
161
+ tc = Trans::Api::Connect.new @CONFIG
160
162
 
161
163
  torrents = tc.torrent_get([:id, :name, :status])
162
164
 
@@ -202,7 +204,7 @@ class TransConnect < Test::Unit::TestCase
202
204
  end
203
205
 
204
206
  def test_torrent_start_stop_multi
205
- tc = Trans::Api::Connect.new CONFIG
207
+ tc = Trans::Api::Connect.new @CONFIG
206
208
  torrents = tc.torrent_get([:id, :name, :status])
207
209
 
208
210
 
@@ -241,7 +243,7 @@ class TransConnect < Test::Unit::TestCase
241
243
  end
242
244
 
243
245
  def test_torrent_add_remove_single
244
- tc = Trans::Api::Connect.new CONFIG
246
+ tc = Trans::Api::Connect.new @CONFIG
245
247
 
246
248
  # add test file
247
249
  file = File.expand_path(File.dirname(__FILE__) + "/torrents/debian-6.0.6-amd64-CD-2.iso.torrent")
@@ -266,7 +268,7 @@ class TransConnect < Test::Unit::TestCase
266
268
 
267
269
 
268
270
  def test_torrent_files_unwatched
269
- tc = Trans::Api::Connect.new CONFIG
271
+ tc = Trans::Api::Connect.new @CONFIG
270
272
  torrents = tc.torrent_get([:id, :name, :status, :files, :fileStats])
271
273
 
272
274
  torrents.each do |torrent|
@@ -278,7 +280,7 @@ class TransConnect < Test::Unit::TestCase
278
280
 
279
281
 
280
282
  def test_torrent_start_now
281
- tc = Trans::Api::Connect.new CONFIG
283
+ tc = Trans::Api::Connect.new @CONFIG
282
284
  # get first torrent
283
285
  torrent = tc.torrent_get([:id, :name, :status]).first
284
286
  # start now
@@ -290,7 +292,7 @@ class TransConnect < Test::Unit::TestCase
290
292
  end
291
293
 
292
294
  def test_torrent_verify
293
- tc = Trans::Api::Connect.new CONFIG
295
+ tc = Trans::Api::Connect.new @CONFIG
294
296
  torrents = tc.torrent_get([:id, :name, :status])
295
297
 
296
298
  torrents.each do |torrent|
@@ -302,7 +304,7 @@ class TransConnect < Test::Unit::TestCase
302
304
  end
303
305
 
304
306
  def test_torrent_reannounce
305
- tc = Trans::Api::Connect.new CONFIG
307
+ tc = Trans::Api::Connect.new @CONFIG
306
308
  torrents = tc.torrent_get([:id, :name, :status])
307
309
 
308
310
  torrents.each do |torrent|
@@ -314,7 +316,7 @@ class TransConnect < Test::Unit::TestCase
314
316
 
315
317
 
316
318
  def test_torrent_set_location
317
- tc = Trans::Api::Connect.new CONFIG
319
+ tc = Trans::Api::Connect.new @CONFIG
318
320
 
319
321
  # new target
320
322
  file = File.expand_path(File.dirname(__FILE__) + "/torrents/download_tmp/")
@@ -341,14 +343,14 @@ class TransConnect < Test::Unit::TestCase
341
343
  # MISC
342
344
 
343
345
  def test_blocklist_update
344
- tc = Trans::Api::Connect.new CONFIG
346
+ tc = Trans::Api::Connect.new @CONFIG
345
347
  response = tc.blocklist_update
346
348
  assert response.include? :blocklist_size
347
349
  assert response[:blocklist_size].class == Fixnum
348
350
  end
349
351
 
350
352
  def test_port_test
351
- tc = Trans::Api::Connect.new CONFIG
353
+ tc = Trans::Api::Connect.new @CONFIG
352
354
  response = tc.port_test
353
355
  assert response.include? :port_is_open
354
356
  assert response[:port_is_open].class == FalseClass || response[:port_is_open].class == TrueClass
@@ -358,7 +360,7 @@ class TransConnect < Test::Unit::TestCase
358
360
  # QUEUE
359
361
 
360
362
  def test_queue_movement
361
- tc = Trans::Api::Connect.new CONFIG
363
+ tc = Trans::Api::Connect.new @CONFIG
362
364
 
363
365
  torrents = []
364
366
 
@@ -4,6 +4,8 @@ require 'test/unit'
4
4
  require File.expand_path(File.dirname(__FILE__) + "/../../lib/trans-api")
5
5
 
6
6
 
7
+ # run with config options
8
+ #CONFIG="{\"host\":\"localhost\",\"port\":9091,\"user\":\"admin\",\"pass\":\"admin\",\"path\":\"/transmission/rpc\"}" ruby -I test test/unit/trans_session_object.rb
7
9
 
8
10
  #
9
11
  # Unit test for Transmission RPC+json
@@ -13,10 +15,14 @@ require File.expand_path(File.dirname(__FILE__) + "/../../lib/trans-api")
13
15
 
14
16
  class TransSessionObject < Test::Unit::TestCase
15
17
 
16
- CONFIG = { host: "localhost", port: 9091, user: "admin", pass: "admin", path: "/transmission/rpc" }
18
+ BLOCKLIST = "http://list.iblocklist.com/?list=bt_level3&fileformat=p2p&archiveformat=gz"
19
+
17
20
 
18
21
  def setup
19
- Trans::Api::Client.config = CONFIG
22
+ @CONFIG = { host: "localhost", port: 9091, user: "admin", pass: "admin", path: "/transmission/rpc" }
23
+ @CONFIG = JSON.parse(ENV["CONFIG"], symbolize_names: true) if ENV.include? "CONFIG"
24
+
25
+ Trans::Api::Client.config = @CONFIG
20
26
  end
21
27
 
22
28
 
@@ -79,4 +85,55 @@ class TransSessionObject < Test::Unit::TestCase
79
85
  end
80
86
 
81
87
 
88
+ def test_swap_configs
89
+ # test default operation
90
+ session = Trans::Api::Session.instance
91
+ assert session.fields_and_values.size > 0, "no fields and values loaded"
92
+
93
+ # insert a broken config
94
+ broken_config = { host: "localhost", port: 9091, user: "akdljflkasjdlfk", pass: "alskdfjlkajsdfl", path: "/transmission/rpc" }
95
+ Trans::Api::Client.config = broken_config
96
+ session.reload!
97
+ assert session.stats!.nil?, "stat should be broken!"
98
+ end
99
+
100
+
101
+ def test_set_blocklist
102
+ session = Trans::Api::Session.instance
103
+ session.blocklist_enabled = false
104
+ session.blocklist_url = ""
105
+ session.save!
106
+ # verify
107
+ session.reload!
108
+ assert session.blocklist_url == "", "url not updated"
109
+ assert session.blocklist_enabled == false, "boolean not toggled"
110
+ # save blocklist to session
111
+ session = Trans::Api::Session.instance
112
+ session.blocklist_url = BLOCKLIST
113
+ session.blocklist_enabled = true
114
+ session.save!
115
+ # verify
116
+ session.reload!
117
+ assert session.blocklist_url == BLOCKLIST, "blocklist not saved!"
118
+ # force blocklist update
119
+ response = session.update_blocklist!
120
+ session.reload!
121
+ assert session.blocklist_size == response[:blocklist_size], "blocklist not updated"
122
+ end
123
+
124
+ def test_set_wrong_blocklist
125
+ session = Trans::Api::Session.instance
126
+ session.blocklist_enabled = false
127
+ session.blocklist_url = ""
128
+ session.save!
129
+ session.reload!
130
+ begin
131
+ session.update_blocklist!
132
+ assert false, "should not be possible without an url"
133
+ rescue Exception => e
134
+ assert true
135
+ end
136
+ end
137
+
138
+
82
139
  end
@@ -3,6 +3,8 @@ require 'rubygems'
3
3
  require 'test/unit'
4
4
  require File.expand_path(File.dirname(__FILE__) + "/../../lib/trans-api")
5
5
 
6
+ # run with config options
7
+ #CONFIG="{\"host\":\"localhost\",\"port\":9091,\"user\":\"admin\",\"pass\":\"admin\",\"path\":\"/transmission/rpc\"}" ruby -I test test/unit/trans_torrent_object.rb
6
8
 
7
9
 
8
10
  #
@@ -13,10 +15,11 @@ require File.expand_path(File.dirname(__FILE__) + "/../../lib/trans-api")
13
15
 
14
16
  class TransTorrentObject < Test::Unit::TestCase
15
17
 
16
- CONFIG = { host: "localhost", port: 8078, user: "pinguin", pass: "100110", path: "/transmission/rpc" }
17
-
18
18
  def setup
19
- Trans::Api::Client.config = CONFIG
19
+ @CONFIG = { host: "localhost", port: 9091, user: "admin", pass: "admin", path: "/transmission/rpc" }
20
+ @CONFIG = JSON.parse(ENV["CONFIG"], symbolize_names: true) if ENV.include? "CONFIG"
21
+
22
+ Trans::Api::Client.config = @CONFIG
20
23
  Trans::Api::Torrent.default_fields = [ :id, :status, :name ]
21
24
 
22
25
  # add a testing torrent
@@ -250,6 +253,15 @@ class TransTorrentObject < Test::Unit::TestCase
250
253
  assert torrent.downloadDir == file
251
254
  end
252
255
 
256
+ def test_duplicate_file_upload
257
+ # add test torrents
258
+ file = File.expand_path(File.dirname(__FILE__) + "/torrents/debian-6.0.6-amd64-CD-2.iso.torrent")
259
+ # hammer duplicate torrent
260
+ torrent = nil
261
+ 10.times { |t| torrent = Trans::Api::Torrent.add_file(file, paused: true) }
262
+ assert Trans::Api::Torrent.all.size == 2
263
+ torrent.delete!
264
+ end
253
265
 
254
266
  def test_queue_movement
255
267
  # get queueposition as well
@@ -350,7 +362,12 @@ class TransTorrentObject < Test::Unit::TestCase
350
362
  torrent = Trans::Api::Torrent.add_metainfo(metainfo, paused: true)
351
363
  assert torrent.name == "debian-6.0.6-amd64-CD-5.iso"
352
364
  torrent.delete!
365
+ end
353
366
 
367
+ def test_find_torrent_by_value_name
368
+ torrent = Trans::Api::Torrent.find_by_field_value(:name, "debian-6.0.6-amd64-CD-1.iso")
369
+ assert !torrent.nil?
370
+ assert torrent.name == "debian-6.0.6-amd64-CD-1.iso"
354
371
  end
355
372
 
356
373
 
data/trans-api.gemspec CHANGED
@@ -8,14 +8,14 @@ Gem::Specification.new do |gem|
8
8
  gem.version = Trans::Api::VERSION
9
9
  gem.authors = ["Dennis Blommesteijn"]
10
10
  gem.email = ["dennis@blommesteijn.com"]
11
- gem.description = %q{Transmission RPC API for Ruby on Rails (gem).}
12
- gem.summary = %q{Transmission RPC API for Ruby on Rails (gem)}
13
- gem.homepage = ""
11
+ gem.description = %q{Transmission (bittorrent client) RPC API for Ruby on Rails (gem)}
12
+ gem.summary = %q{Transmission (bittorrent client) RPC API for Ruby on Rails (gem)}
13
+ gem.homepage = "https://github.com/dblommesteijn/trans-api"
14
14
 
15
15
  # dependencies
16
- gem.add_dependency 'nokogiri'
17
- gem.add_dependency 'json'
18
- gem.add_development_dependency "test-unit"
16
+ gem.add_dependency 'nokogiri', "> 1.5.0"
17
+ gem.add_dependency 'json', "> 1.6.1"
18
+ gem.add_development_dependency "test-unit", "> 2.0.0"
19
19
 
20
20
  gem.files = `git ls-files`.split($/)
21
21
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
metadata CHANGED
@@ -1,58 +1,58 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trans-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dennis Blommesteijn
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-07 00:00:00.000000000 Z
11
+ date: 2014-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
15
- version_requirements: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
15
  requirement: !ruby/object:Gem::Requirement
21
16
  requirements:
22
- - - ">="
17
+ - - ">"
23
18
  - !ruby/object:Gem::Version
24
- version: '0'
25
- prerelease: false
19
+ version: 1.5.0
26
20
  type: :runtime
27
- - !ruby/object:Gem::Dependency
28
- name: json
21
+ prerelease: false
29
22
  version_requirements: !ruby/object:Gem::Requirement
30
23
  requirements:
31
- - - ">="
24
+ - - ">"
32
25
  - !ruby/object:Gem::Version
33
- version: '0'
26
+ version: 1.5.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
34
29
  requirement: !ruby/object:Gem::Requirement
35
30
  requirements:
36
- - - ">="
31
+ - - ">"
37
32
  - !ruby/object:Gem::Version
38
- version: '0'
39
- prerelease: false
33
+ version: 1.6.1
40
34
  type: :runtime
41
- - !ruby/object:Gem::Dependency
42
- name: test-unit
35
+ prerelease: false
43
36
  version_requirements: !ruby/object:Gem::Requirement
44
37
  requirements:
45
- - - ">="
38
+ - - ">"
46
39
  - !ruby/object:Gem::Version
47
- version: '0'
40
+ version: 1.6.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: test-unit
48
43
  requirement: !ruby/object:Gem::Requirement
49
44
  requirements:
50
- - - ">="
45
+ - - ">"
51
46
  - !ruby/object:Gem::Version
52
- version: '0'
53
- prerelease: false
47
+ version: 2.0.0
54
48
  type: :development
55
- description: Transmission RPC API for Ruby on Rails (gem).
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">"
53
+ - !ruby/object:Gem::Version
54
+ version: 2.0.0
55
+ description: Transmission (bittorrent client) RPC API for Ruby on Rails (gem)
56
56
  email:
57
57
  - dennis@blommesteijn.com
58
58
  executables: []
@@ -65,8 +65,6 @@ files:
65
65
  - LICENSE.txt
66
66
  - README.md
67
67
  - Rakefile
68
- - examples/basic_setup.rb
69
- - examples/torrents/debian-6.0.6-amd64-CD-10.iso.torrent
70
68
  - lib/trans-api.rb
71
69
  - lib/trans-api/client.rb
72
70
  - lib/trans-api/connect.rb
@@ -74,7 +72,6 @@ files:
74
72
  - lib/trans-api/session.rb
75
73
  - lib/trans-api/torrent.rb
76
74
  - lib/trans-api/version.rb
77
- - test/test_helper.rb
78
75
  - test/unit/torrents/debian-6.0.6-amd64-CD-1.iso.torrent
79
76
  - test/unit/torrents/debian-6.0.6-amd64-CD-2.iso.torrent
80
77
  - test/unit/torrents/debian-6.0.6-amd64-CD-3.iso.torrent
@@ -86,10 +83,10 @@ files:
86
83
  - test/unit/trans_session_object.rb
87
84
  - test/unit/trans_torrent_object.rb
88
85
  - trans-api.gemspec
89
- homepage: ''
86
+ homepage: https://github.com/dblommesteijn/trans-api
90
87
  licenses: []
91
88
  metadata: {}
92
- post_install_message:
89
+ post_install_message:
93
90
  rdoc_options: []
94
91
  require_paths:
95
92
  - lib
@@ -104,13 +101,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
101
  - !ruby/object:Gem::Version
105
102
  version: '0'
106
103
  requirements: []
107
- rubyforge_project:
108
- rubygems_version: 2.0.3
109
- signing_key:
104
+ rubyforge_project:
105
+ rubygems_version: 2.2.2
106
+ signing_key:
110
107
  specification_version: 4
111
- summary: Transmission RPC API for Ruby on Rails (gem)
108
+ summary: Transmission (bittorrent client) RPC API for Ruby on Rails (gem)
112
109
  test_files:
113
- - test/test_helper.rb
114
110
  - test/unit/torrents/debian-6.0.6-amd64-CD-1.iso.torrent
115
111
  - test/unit/torrents/debian-6.0.6-amd64-CD-2.iso.torrent
116
112
  - test/unit/torrents/debian-6.0.6-amd64-CD-3.iso.torrent
@@ -1,78 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # setup
4
- require 'rubygems'
5
- require "bundler/setup"
6
- require 'trans-api'
7
-
8
-
9
- class BasicSetup
10
-
11
- include Trans::Api
12
-
13
- CONFIG = { host: "localhost", port: 9091, user: "admin", pass: "admin", path: "/transmission/rpc" }
14
- FIELDS = [ :id, :status, :name ]
15
-
16
- def initialize
17
-
18
- # connection information (rpc location)
19
- Client.config = CONFIG
20
-
21
- # default loading torrent fields
22
- Torrent.default_fields = FIELDS
23
-
24
- #TODO: add a section for session here!!
25
-
26
- end
27
-
28
-
29
- def add_torrent
30
-
31
- # selecting a file to add (debian demo file)
32
- file = ::File.expand_path(::File.dirname(__FILE__) + "/torrents/debian-6.0.6-amd64-CD-10.iso.torrent")
33
-
34
- # adding a torrent using static call on Torrent object (paused transfer)
35
- @torrent = Torrent.add_file file, paused: true
36
- # return variable is an instance of the torrent file
37
- # an exception can be raised on invalid request
38
-
39
- # NOTE: we will store it for later use (removing this torrent, not the whole list)
40
-
41
- end
42
-
43
- def remove_torrent
44
-
45
- #TODO: remove torrent here!
46
-
47
- end
48
-
49
- def iterating_torrents
50
-
51
- torrents = Torrent.all
52
-
53
- torrents.each do |torrent|
54
-
55
- puts "#{torrent.name} -> #{torrent.status_name}"
56
-
57
- end
58
-
59
- end
60
-
61
- end
62
-
63
-
64
-
65
- # initiate BasicSetup object, and run its methods
66
- begin
67
-
68
- bs = BasicSetup.new
69
- bs.add_torrent
70
- bs.iterating_torrents
71
-
72
- rescue Exception => e
73
- puts e
74
- end
75
-
76
-
77
-
78
-
data/test/test_helper.rb DELETED
@@ -1,8 +0,0 @@
1
-
2
- class ActiveSupport::TestCase
3
- setup :global_setup
4
-
5
- def global_setup
6
- end
7
- end
8
-