trans-api 0.0.2 → 0.0.4

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.
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
-