transmission-rpc-ruby-ext 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +22 -1
- data/LICENSE +4 -1
- data/README.md +92 -38
- data/lib/transmission.rb +1 -1
- data/lib/transmission/arguments.rb +1 -1
- data/lib/transmission/extensions.rb +2 -1
- data/lib/transmission/extensions/torrent_actions.rb +2 -0
- data/lib/transmission/extensions/torrent_attributes.rb +42 -2
- data/lib/transmission/extensions/torrent_prettify.rb +57 -0
- data/lib/transmission/extensions/torrent_status.rb +9 -1
- data/lib/transmission/extensions/{transmission.rb → transmission_selectors.rb} +17 -12
- data/lib/transmission/fields.rb +1 -1
- data/lib/transmission/model/torrent.rb +2 -7
- data/lib/transmission/utils.rb +1 -1
- data/spec/transmission/extensions_spec.rb +28 -0
- data/spec/transmission/model/torrent_spec.rb +31 -32
- data/spec/transmission/rpc/connector_spec.rb +17 -14
- data/spec/transmission/utils_spec.rb +10 -10
- data/transmission-rpc-ruby-ext.gemspec +23 -16
- metadata +19 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a17cf176257c2e0add6e0a68b10dcdb9b9453132
|
4
|
+
data.tar.gz: de082e8070b0d69044a764a5b628b6c2d67ef8cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28503d810fa4bba2b6fd8ad44ed9094519cd81f34aa6063e4100525451aeeb6788e5dccdfe88c303beb529aeb59130756e248abab6b114f6b751f61cd3ea0133
|
7
|
+
data.tar.gz: e6b65db7064efe047dfe72d325d5e69f8ea1de2680c5c18b078e40828b6f1b49960ae14939e9f0d59087d78fcb7f537c0a27ecdd6fdfdd03bd63d4826c250f58
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
-
|
1
|
+
# Change Log
|
2
2
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
6
|
+
and this project adheres to [Semantic Versioning](http://semver.org/).
|
7
|
+
|
8
|
+
## 0.1.1 - 2016-12-31
|
9
|
+
### Added
|
10
|
+
- Add `pretty_length`, `pretty_valid` and `pretty_eta` methods.
|
11
|
+
- Add `peers`, `peers_seeding` and `peers_leeching` methods.
|
12
|
+
- Add better documentation and comments.
|
13
|
+
- Add some specs for extensions.
|
14
|
+
|
15
|
+
### Changed
|
16
|
+
- Minimum ruby version is now `2.0`.
|
17
|
+
- Refactor `is_multi?` to `multi?` for best practice compliance.
|
18
|
+
- Refactor `is_valid_key?` to for best practice compliance
|
19
|
+
|
20
|
+
### Removed
|
21
|
+
- Remove `finished?` method (overridden in extensions)
|
22
|
+
|
23
|
+
## 0.1.0 - 2016-12-28
|
3
24
|
- Initial fork and basic additions.
|
data/LICENSE
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2016 Tommaso Barbato
|
4
|
+
Portions copyright (c) 2015 Max Hoffmann
|
2
5
|
|
3
6
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
7
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
# Transmission RPC Ruby Extended
|
2
2
|
|
3
|
-
[![Build Status](https://travis-ci.org/epistrephein/transmission-rpc-ruby-ext.svg?branch=master)](https://travis-ci.org/epistrephein/transmission-rpc-ruby-ext) [![Code Climate](https://codeclimate.com/github/epistrephein/transmission-rpc-ruby-ext/badges/gpa.svg)](https://codeclimate.com/github/epistrephein/transmission-rpc-ruby-ext) [![Coverage Status](https://coveralls.io/repos/github/epistrephein/transmission-rpc-ruby-ext/badge.svg?branch=master)](https://coveralls.io/github/epistrephein/transmission-rpc-ruby-ext?branch=master) [![Dependency Status](https://gemnasium.com/badges/github.com/epistrephein/transmission-rpc-ruby-ext.svg)](https://gemnasium.com/github.com/epistrephein/transmission-rpc-ruby-ext) [![Inline docs](http://inch-ci.org/github/epistrephein/transmission-rpc-ruby-ext.svg?branch=master)](http://inch-ci.org/github/epistrephein/transmission-rpc-ruby-ext)
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/transmission-rpc-ruby-ext.svg)](https://badge.fury.io/rb/transmission-rpc-ruby-ext) [![Build Status](https://travis-ci.org/epistrephein/transmission-rpc-ruby-ext.svg?branch=master)](https://travis-ci.org/epistrephein/transmission-rpc-ruby-ext) [![Code Climate](https://codeclimate.com/github/epistrephein/transmission-rpc-ruby-ext/badges/gpa.svg)](https://codeclimate.com/github/epistrephein/transmission-rpc-ruby-ext) [![Coverage Status](https://coveralls.io/repos/github/epistrephein/transmission-rpc-ruby-ext/badge.svg?branch=master)](https://coveralls.io/github/epistrephein/transmission-rpc-ruby-ext?branch=master) [![Dependency Status](https://gemnasium.com/badges/github.com/epistrephein/transmission-rpc-ruby-ext.svg)](https://gemnasium.com/github.com/epistrephein/transmission-rpc-ruby-ext) [![Inline docs](http://inch-ci.org/github/epistrephein/transmission-rpc-ruby-ext.svg?branch=master)](http://inch-ci.org/github/epistrephein/transmission-rpc-ruby-ext)
|
4
4
|
|
5
|
-
This is a fork of [transmission-
|
5
|
+
This is a fork of [transmission-rpc-ruby](https://github.com/transmission-rails/transmission-rpc-ruby) with some shortcut methods added and revised codebase.
|
6
|
+
|
7
|
+
Documentation for the original gem can be found in the [upstream repository](https://github.com/transmission-rails/transmission-rpc-ruby).
|
6
8
|
|
7
9
|
## Installation
|
8
10
|
|
@@ -16,9 +18,18 @@ Then require it
|
|
16
18
|
require 'transmission'
|
17
19
|
```
|
18
20
|
|
19
|
-
|
21
|
+
If both `transmission-rpc-ruby` and `transmission-rpc-ruby-ext` gems are installed, specify the gem to require to avoid namespace conflict.
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
gem 'transmission-rpc-ruby-ext'
|
25
|
+
require 'transmission'
|
26
|
+
```
|
27
|
+
|
28
|
+
## Extensions
|
29
|
+
|
30
|
+
### Transmission selectors
|
20
31
|
|
21
|
-
|
32
|
+
All torrents
|
22
33
|
|
23
34
|
```ruby
|
24
35
|
Transmission.all
|
@@ -49,7 +60,7 @@ Transmission.seeding # status 6
|
|
49
60
|
All torrents with error
|
50
61
|
|
51
62
|
```ruby
|
52
|
-
Transmission.
|
63
|
+
Transmission.errors
|
53
64
|
```
|
54
65
|
|
55
66
|
All hashes of all torrents
|
@@ -61,34 +72,17 @@ Transmission.hashes
|
|
61
72
|
Find torrents by name, hash, id or tracker
|
62
73
|
|
63
74
|
```ruby
|
64
|
-
Transmission.find_by_name('
|
65
|
-
Transmission.find_by_hash('
|
66
|
-
Transmission.find_by_id(
|
67
|
-
Transmission.find_by_tracker('
|
75
|
+
Transmission.find_by_name('ubuntu')
|
76
|
+
Transmission.find_by_hash('9f9165d9a281a9b8e782cd5176bbcc8256fd1871')
|
77
|
+
Transmission.find_by_id(1)
|
78
|
+
Transmission.find_by_tracker('torrent.ubuntu.com')
|
68
79
|
```
|
69
80
|
|
70
|
-
###
|
81
|
+
### Torrent status
|
71
82
|
|
72
83
|
```ruby
|
73
84
|
t = Transmission.all.first
|
74
|
-
```
|
75
|
-
|
76
|
-
Basic attributes
|
77
85
|
|
78
|
-
```ruby
|
79
|
-
t.name
|
80
|
-
# => "ubuntu-16.04-desktop-amd64.iso"
|
81
|
-
t.path
|
82
|
-
# => "/Users/epistrephein/Downloads/ubuntu-16.04-desktop-amd64.iso"
|
83
|
-
t.id
|
84
|
-
# => 13
|
85
|
-
t.hash
|
86
|
-
# => "4344503b7e797ebf31582327a5baae35b11bda01"
|
87
|
-
```
|
88
|
-
|
89
|
-
Status
|
90
|
-
|
91
|
-
```ruby
|
92
86
|
t.paused?
|
93
87
|
# => false
|
94
88
|
t.queued?
|
@@ -107,67 +101,127 @@ t.error?
|
|
107
101
|
# => false
|
108
102
|
```
|
109
103
|
|
104
|
+
### Torrent attributes
|
105
|
+
|
106
|
+
Basic attributes
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
t = Transmission.all.first
|
110
|
+
|
111
|
+
t.name
|
112
|
+
# => "ubuntu-16.04.1-desktop-amd64.iso"
|
113
|
+
t.path
|
114
|
+
# => "/Users/epistrephein/Downloads/ubuntu-16.04-desktop-amd64.iso"
|
115
|
+
t.id
|
116
|
+
# => 1
|
117
|
+
t.hash
|
118
|
+
# => "9f9165d9a281a9b8e782cd5176bbcc8256fd1871"
|
119
|
+
```
|
120
|
+
|
110
121
|
Size
|
111
122
|
|
112
123
|
```ruby
|
113
124
|
t.length
|
114
|
-
# =>
|
125
|
+
# => 1513308160
|
115
126
|
t.valid
|
116
|
-
# =>
|
127
|
+
# => 582696960
|
117
128
|
t.percent_downloaded
|
118
|
-
# =>
|
129
|
+
# => 0.39
|
119
130
|
t.percent_uploaded
|
120
|
-
# => 0.
|
131
|
+
# => 0.0
|
121
132
|
t.percent_ratio
|
122
|
-
# =>
|
123
|
-
t.ratio
|
124
|
-
# => -1.0
|
133
|
+
# => nil
|
125
134
|
```
|
126
135
|
|
127
136
|
Speed
|
128
137
|
|
129
138
|
```ruby
|
130
139
|
t.speed_download
|
131
|
-
# =>
|
140
|
+
# => 14477000
|
132
141
|
t.speed_upload
|
133
|
-
# =>
|
142
|
+
# => 0
|
134
143
|
```
|
135
144
|
|
136
145
|
Ratio & ETA
|
137
146
|
|
138
147
|
```ruby
|
139
148
|
t.ratio
|
140
|
-
# =>
|
149
|
+
# => 0.0
|
141
150
|
t.eta
|
151
|
+
# => 85
|
142
152
|
```
|
143
153
|
|
144
154
|
Files and folders
|
145
155
|
|
146
156
|
```ruby
|
147
157
|
t.file?
|
158
|
+
# => true
|
148
159
|
t.folder?
|
160
|
+
# => false
|
149
161
|
t.files
|
162
|
+
# => ["/Users/epistrephein/Downloads/ubuntu-16.04-desktop-amd64.iso"]
|
150
163
|
t.content
|
164
|
+
# => ["ubuntu-16.04.1-desktop-amd64.iso"]
|
151
165
|
t.biggest
|
166
|
+
# => ["ubuntu-16.04.1-desktop-amd64.iso", 1513308160]
|
152
167
|
t.smallest
|
168
|
+
# => ["ubuntu-16.04.1-desktop-amd64.iso", 1513308160]
|
169
|
+
```
|
170
|
+
|
171
|
+
Peers
|
172
|
+
|
173
|
+
```ruby
|
174
|
+
t.peers
|
175
|
+
# => 11
|
176
|
+
t.peers_seeding
|
177
|
+
# => 9
|
178
|
+
t.peers_leeching
|
179
|
+
# => 0
|
180
|
+
```
|
181
|
+
|
182
|
+
Errors
|
183
|
+
|
184
|
+
```ruby
|
185
|
+
t.error
|
186
|
+
# => nil
|
153
187
|
```
|
154
188
|
|
155
189
|
Magnet link
|
156
190
|
|
157
191
|
```ruby
|
158
192
|
t.magnet
|
193
|
+
# => "magnet:?xt=urn:btih:9f9165d9a281a9b8e782cd5176bbcc8256fd1871&dn=ubuntu-16.04.1-desktop-amd64.iso&tr=http%3A%2F%2Ftorrent.ubuntu.com%3A6969%2Fannounce&tr=http%3A%2F%2Fipv6.torrent.ubuntu.com%3A6969%2Fannounce"
|
159
194
|
```
|
160
195
|
|
161
196
|
Trackers
|
162
197
|
|
163
198
|
```ruby
|
164
199
|
t.trackers
|
200
|
+
# => ["torrent.ubuntu.com", "ipv6.torrent.ubuntu.com"]
|
165
201
|
```
|
166
202
|
|
167
|
-
|
203
|
+
### Torrent prettified attributes
|
204
|
+
|
205
|
+
```ruby
|
206
|
+
t.pretty_length
|
207
|
+
# => "1.51GB"
|
208
|
+
t.pretty_valid
|
209
|
+
# => "582.7MB"
|
210
|
+
t.pretty_eta
|
211
|
+
# => "1 minutes, 25 seconds"
|
212
|
+
```
|
213
|
+
|
214
|
+
### Torrent actions
|
168
215
|
|
169
216
|
```ruby
|
170
217
|
t.reload!
|
171
218
|
t.remove!
|
172
219
|
t.remove_data!
|
173
220
|
```
|
221
|
+
|
222
|
+
## Contributing
|
223
|
+
|
224
|
+
Contributions are welcome and encouraged. Feel free to open an issue or submit a pull request.
|
225
|
+
|
226
|
+
## License
|
227
|
+
[MIT License](LICENSE)
|
data/lib/transmission.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative 'extensions/torrent_actions'
|
2
2
|
require_relative 'extensions/torrent_attributes'
|
3
|
+
require_relative 'extensions/torrent_prettify'
|
3
4
|
require_relative 'extensions/torrent_status'
|
4
|
-
require_relative 'extensions/
|
5
|
+
require_relative 'extensions/transmission_selectors'
|
@@ -1,11 +1,13 @@
|
|
1
1
|
module Transmission
|
2
2
|
module Model
|
3
3
|
class Torrent
|
4
|
+
# Removes torrent.
|
4
5
|
def remove!
|
5
6
|
connector.remove_torrent @ids
|
6
7
|
@deleted = true
|
7
8
|
end
|
8
9
|
|
10
|
+
# Removes torrent and trashes data files.
|
9
11
|
def remove_data!
|
10
12
|
connector.remove_torrent @ids, true
|
11
13
|
@deleted = true
|
@@ -1,95 +1,135 @@
|
|
1
1
|
module Transmission
|
2
2
|
module Model
|
3
3
|
class Torrent
|
4
|
-
# torrent
|
4
|
+
# Returns torrent name.
|
5
5
|
def name
|
6
6
|
attributes['name']
|
7
7
|
end
|
8
8
|
|
9
|
+
# Returns torrent full download path.
|
9
10
|
def path
|
10
11
|
dir = File.expand_path(attributes['downloadDir'])
|
11
12
|
File.join(dir, name)
|
12
13
|
end
|
13
14
|
|
15
|
+
# Returns torrent id.
|
14
16
|
def id
|
15
17
|
attributes['id']
|
16
18
|
end
|
17
19
|
|
20
|
+
# Returns torrent hash.
|
18
21
|
def hash
|
19
22
|
attributes['hashString']
|
20
23
|
end
|
21
24
|
|
25
|
+
# Returns torrent size (in bytes).
|
22
26
|
def length
|
23
27
|
attributes['totalSize']
|
24
28
|
end
|
25
29
|
|
30
|
+
# Returns torrent downloaded files size (in bytes).
|
26
31
|
def valid
|
27
32
|
attributes['haveValid']
|
28
33
|
end
|
29
34
|
|
35
|
+
# Returns torrent downloaded files percent.
|
30
36
|
def percent_downloaded
|
31
37
|
(attributes['haveValid'] * 1.0 / attributes['totalSize']).round(2)
|
32
38
|
end
|
33
39
|
|
40
|
+
# Returns torrent uploaded files percent.
|
34
41
|
def percent_uploaded
|
35
42
|
(attributes['uploadedEver'] * 1.0 / attributes['totalSize']).round(2)
|
36
43
|
end
|
37
44
|
|
45
|
+
# Returns torrent ratio percent if session ratio is set.
|
38
46
|
def percent_ratio
|
39
47
|
session = Transmission::Model::Session.get
|
40
48
|
return unless session.seed_ratio_limited
|
41
49
|
(attributes['uploadRatio'] * 1.0 / session.seed_ratio_limit).round(2)
|
42
50
|
end
|
43
51
|
|
52
|
+
# Returns torrent download speed (in bytes).
|
44
53
|
def speed_download
|
45
54
|
attributes['rateDownload']
|
46
55
|
end
|
47
56
|
|
57
|
+
# Returns torrent upload speed (in bytes).
|
48
58
|
def speed_upload
|
49
59
|
attributes['rateUpload']
|
50
60
|
end
|
51
61
|
|
62
|
+
# Returns torrent ratio.
|
52
63
|
def ratio
|
53
64
|
(attributes['uploadRatio'] * 1.0).round(2)
|
54
65
|
end
|
55
66
|
|
67
|
+
# Returns torrent eta (in seconds).
|
56
68
|
def eta
|
57
|
-
|
69
|
+
attributes['eta']
|
58
70
|
end
|
59
71
|
|
72
|
+
# Returns true if torrent is a single file.
|
60
73
|
def file?
|
61
74
|
name = attributes['name']
|
62
75
|
files = attributes['files']
|
63
76
|
files.size == 1 && files.first['name'] == name
|
64
77
|
end
|
65
78
|
|
79
|
+
# Returns true if torrent is a folder.
|
66
80
|
def folder?
|
67
81
|
!file?
|
68
82
|
end
|
69
83
|
|
84
|
+
# Returns all torrent files full path.
|
70
85
|
def files
|
71
86
|
dir = File.absolute_path(attributes['downloadDir'])
|
72
87
|
attributes['files'].map { |f| File.join(dir, f['name']) }
|
73
88
|
end
|
74
89
|
|
90
|
+
# Returns torrent files names.
|
75
91
|
def content
|
76
92
|
files.map { |f| File.basename(f) }
|
77
93
|
end
|
78
94
|
|
95
|
+
# Returns torrent biggest file and size.
|
79
96
|
def biggest
|
80
97
|
b = attributes['files'].max_by { |f| f['length'] }
|
81
98
|
[File.basename(b['name']), b['length']]
|
82
99
|
end
|
83
100
|
|
101
|
+
# Returns torrent smallest file and size.
|
84
102
|
def smallest
|
85
103
|
b = attributes['files'].min_by { |f| f['length'] }
|
86
104
|
[File.basename(b['name']), b['length']]
|
87
105
|
end
|
88
106
|
|
107
|
+
# Returns torrent peers.
|
108
|
+
def peers
|
109
|
+
attributes['peersConnected'].size
|
110
|
+
end
|
111
|
+
|
112
|
+
# Returns torrent seeding peers.
|
113
|
+
def peers_seeding
|
114
|
+
attributes['peersSendingToUs']
|
115
|
+
end
|
116
|
+
|
117
|
+
# Returns torrent leeching peers.
|
118
|
+
def peers_leeching
|
119
|
+
attributes['peersGettingFromUs']
|
120
|
+
end
|
121
|
+
|
122
|
+
# Returns torrent error string.
|
123
|
+
def error
|
124
|
+
attributes['errorString'] if error?
|
125
|
+
end
|
126
|
+
|
127
|
+
# Returns torrent magnet link.
|
89
128
|
def magnet
|
90
129
|
attributes['magnetLink']
|
91
130
|
end
|
92
131
|
|
132
|
+
# Returns torrent trackers.
|
93
133
|
def trackers
|
94
134
|
url_regex = /([-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b)(?:[-a-zA-Z0-9@:%_\+.~#?&\/=]*)/i
|
95
135
|
attributes['trackers'].map do |r|
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Transmission
|
2
|
+
module Model
|
3
|
+
class Torrent
|
4
|
+
# Returns prettified torrent size.
|
5
|
+
def pretty_length
|
6
|
+
pretty_size(length)
|
7
|
+
end
|
8
|
+
|
9
|
+
# Returns prettified downloaded files size.
|
10
|
+
def pretty_valid
|
11
|
+
pretty_size(valid)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns prettified eta.
|
15
|
+
def pretty_eta
|
16
|
+
pretty_time(attributes['eta']) if attributes['eta'] > 0
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
# Converts filesize to proper units.
|
22
|
+
def pretty_size(size)
|
23
|
+
{
|
24
|
+
'B' => 1000**1,
|
25
|
+
'KB' => 1000**2,
|
26
|
+
'MB' => 1000**3,
|
27
|
+
'GB' => 1000**4,
|
28
|
+
'TB' => 1000**5
|
29
|
+
}.each_pair do |e, s|
|
30
|
+
return "#{(size.to_f / (s / 1000)).round(2)}#{e}" if size < s
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Convert seconds in seconds/minutes/hours.
|
35
|
+
def pretty_time(seconds)
|
36
|
+
mm, ss = seconds.divmod(60)
|
37
|
+
hh, mm = mm.divmod(60)
|
38
|
+
dd, hh = hh.divmod(24)
|
39
|
+
eta = {
|
40
|
+
days: dd, hours: hh, minutes: mm, seconds: ss
|
41
|
+
}.delete_if { |_k, v| v.zero? }
|
42
|
+
eta.to_a.map { |e| e.reverse.join(' ') }.join(', ')
|
43
|
+
end
|
44
|
+
|
45
|
+
# Converts status code in status name.
|
46
|
+
def status_name
|
47
|
+
['paused', 'check wait', 'check', 'download wait', 'download',
|
48
|
+
'seed wait', 'seed', 'isolated'].at(status)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Converts status code in status symbol.
|
52
|
+
def status_symbol
|
53
|
+
['❚❚', '~', '⟳', '⥥', '⬇', '⥣', '⬆', '✘'].at(status)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -1,39 +1,47 @@
|
|
1
1
|
module Transmission
|
2
2
|
module Model
|
3
3
|
class Torrent
|
4
|
-
# torrent
|
4
|
+
# Returns true if torrent is paused.
|
5
5
|
def paused?
|
6
6
|
attributes['status'] == 0
|
7
7
|
end
|
8
8
|
|
9
|
+
# Returns true if torrent is queued.
|
9
10
|
def queued?
|
10
11
|
attributes['status'] == 3
|
11
12
|
end
|
12
13
|
|
14
|
+
# Returns true if torrent is downloading.
|
13
15
|
def downloading?
|
14
16
|
attributes['status'] == 4
|
15
17
|
end
|
16
18
|
|
19
|
+
# Returns true if torrent is seeding.
|
17
20
|
def seeding?
|
18
21
|
attributes['status'] == 6
|
19
22
|
end
|
20
23
|
|
24
|
+
# Returns true if torrent is isolated.
|
21
25
|
def isolated?
|
22
26
|
attributes['status'] == 7
|
23
27
|
end
|
24
28
|
|
29
|
+
# Returns true if torrent is finished.
|
25
30
|
def finished?
|
26
31
|
attributes['isFinished']
|
27
32
|
end
|
28
33
|
|
34
|
+
# Returns true if torrent is completed.
|
29
35
|
def completed?
|
30
36
|
attributes['percentDone'] >= 1
|
31
37
|
end
|
32
38
|
|
39
|
+
# Returns true if torrent is not completed.
|
33
40
|
def incomplete?
|
34
41
|
attributes['percentDone'] < 1
|
35
42
|
end
|
36
43
|
|
44
|
+
# Returns true if torrent has errors.
|
37
45
|
def error?
|
38
46
|
attributes['error'] != 0
|
39
47
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Transmission
|
2
|
-
#
|
2
|
+
# Returns all torrents.
|
3
3
|
def self.all(connector = nil)
|
4
4
|
t = Transmission::Model::Torrent.all connector: connector
|
5
5
|
case t.ids.size
|
@@ -9,56 +9,69 @@ module Transmission
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
+
# Returns all finished torrents.
|
12
13
|
def self.finished
|
13
14
|
all.select { |t| t.attributes['isFinished'] }
|
14
15
|
end
|
15
16
|
|
17
|
+
# Returns all completed torrents.
|
16
18
|
def self.completed
|
17
19
|
all.select { |t| t.attributes['percentDone'] >= 1 }
|
18
20
|
end
|
19
21
|
|
22
|
+
# Returns all incomplete torrents.
|
20
23
|
def self.incomplete
|
21
24
|
all.select { |t| t.attributes['percentDone'] < 1 }
|
22
25
|
end
|
23
26
|
|
27
|
+
# Returns all paused torrents.
|
24
28
|
def self.paused
|
25
29
|
all.select { |t| t.attributes['status'] == 0 }
|
26
30
|
end
|
27
31
|
|
32
|
+
# Returns all queued torrents.
|
28
33
|
def self.queued
|
29
34
|
all.select { |t| t.attributes['status'] == 3 }
|
30
35
|
end
|
31
36
|
|
37
|
+
# Returns all downloading torrents.
|
32
38
|
def self.downloading
|
33
39
|
all.select { |t| t.attributes['status'] == 4 }
|
34
40
|
end
|
35
41
|
|
42
|
+
# Returns all seeding torrents.
|
36
43
|
def self.seeding
|
37
44
|
all.select { |t| t.attributes['status'] == 6 }
|
38
45
|
end
|
39
46
|
|
40
|
-
|
47
|
+
# Returns all torrents with errors.
|
48
|
+
def self.errors
|
41
49
|
all.select { |t| t.attributes['error'] != 0 }
|
42
50
|
end
|
43
51
|
|
52
|
+
# Returns the hash of every torrents.
|
44
53
|
def self.hashes
|
45
54
|
all.map { |t| t.attributes['hashString'] }
|
46
55
|
end
|
47
56
|
|
48
|
-
#
|
57
|
+
# Returns all torrents whose name matches +name+.
|
49
58
|
def self.find_by_name(name)
|
50
59
|
re = name.split(' ').join('.*')
|
51
60
|
all.select { |t| t.attributes['name'] =~ /#{re}/i }
|
52
61
|
end
|
53
62
|
|
63
|
+
# Returns all torrents whose hash matches +hash+.
|
54
64
|
def self.find_by_hash(hash)
|
55
|
-
all.select { |t| t.attributes['hashString'].casecmp(hash)
|
65
|
+
all.select { |t| t.attributes['hashString'].casecmp(hash).zero? }
|
56
66
|
end
|
57
67
|
|
68
|
+
# Returns all torrents whose id matches +id+.
|
58
69
|
def self.find_by_id(id)
|
59
70
|
all.select { |t| t.attributes['id'] == id }
|
60
71
|
end
|
61
72
|
|
73
|
+
# Returns all torrents whose trackers match +tracker+.
|
74
|
+
# FIXME: regex matching is not very precise.
|
62
75
|
def self.find_by_tracker(tracker)
|
63
76
|
url_regex = /([-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b)(?:[-a-zA-Z0-9@:%_\+.~#?&\/=]*)/i
|
64
77
|
re = tracker.split(' ').join('.*')
|
@@ -71,12 +84,4 @@ module Transmission
|
|
71
84
|
trackers.any? { |r| r =~ /#{re}/i }
|
72
85
|
end
|
73
86
|
end
|
74
|
-
|
75
|
-
# add torrents methods
|
76
|
-
def self.add(file, connector = nil)
|
77
|
-
Transmission::Model::Torrent.add(
|
78
|
-
connector: connector,
|
79
|
-
arguments: { filename: file }
|
80
|
-
)
|
81
|
-
end
|
82
87
|
end
|
data/lib/transmission/fields.rb
CHANGED
@@ -71,15 +71,10 @@ module Transmission
|
|
71
71
|
connector.torrent_set_location @ids, location: new_location, move: move
|
72
72
|
end
|
73
73
|
|
74
|
-
def
|
74
|
+
def multi?
|
75
75
|
@ids.size > 1
|
76
76
|
end
|
77
77
|
|
78
|
-
# Note: this is overidden by extensions.
|
79
|
-
# def finished?
|
80
|
-
# percent_done == 1
|
81
|
-
# end
|
82
|
-
|
83
78
|
def reload!
|
84
79
|
torrents = Torrent.find @ids, connector: @connector
|
85
80
|
@ids = torrents.ids
|
@@ -89,7 +84,7 @@ module Transmission
|
|
89
84
|
end
|
90
85
|
|
91
86
|
def to_json
|
92
|
-
if
|
87
|
+
if multi?
|
93
88
|
@torrents.inject([]) do |torrents, torrent|
|
94
89
|
torrents << torrent.to_json
|
95
90
|
end
|
data/lib/transmission/utils.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
describe Transmission::Model::Torrent do
|
2
|
+
describe 'extensions' do
|
3
|
+
let(:torrent) { Transmission::Model::Torrent.new([{
|
4
|
+
'name' => 'ubuntu-16.04.1-desktop-amd64.iso',
|
5
|
+
'downloadDir' => '/home/user/downloads',
|
6
|
+
'id' => 1,
|
7
|
+
'hashString' => '9f9165d9a281a9b8e782cd5176bbcc8256fd1871'
|
8
|
+
}], nil) }
|
9
|
+
|
10
|
+
describe 'with any torrent' do
|
11
|
+
it 'should have a name' do
|
12
|
+
expect(torrent.name).not_to be_nil
|
13
|
+
expect(torrent.name).to be_a(String)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should have a path' do
|
17
|
+
expect(torrent.path).not_to be_nil
|
18
|
+
expect(torrent.path).to eq(
|
19
|
+
'/home/user/downloads/ubuntu-16.04.1-desktop-amd64.iso'
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should have an hash' do
|
24
|
+
expect(torrent.hash).not_to be_nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -17,7 +17,7 @@ describe Transmission::Model::Torrent do
|
|
17
17
|
@rpc = Transmission::RPC.new
|
18
18
|
stub_rpc_request
|
19
19
|
.with(body: torrent_get_body)
|
20
|
-
.to_return(successful_response(
|
20
|
+
.to_return(successful_response(arguments: { torrents: [{ id: 1 }] }))
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'should return a Torrent model instance' do
|
@@ -193,7 +193,7 @@ describe Transmission::Model::Torrent do
|
|
193
193
|
stub_get_torrent({ ids: [1, 2] }, [{ id: 1 }, { id: 2 }])
|
194
194
|
stub_rpc_request
|
195
195
|
.with(body: torrent_remove_body(:ids => [1, 2], 'delete-local-data' => false))
|
196
|
-
|
196
|
+
.to_return(successful_response(arguments: { torrents: [{ id: 1 }, { id: 2 }] }))
|
197
197
|
end
|
198
198
|
|
199
199
|
it 'should remove the torrent files' do
|
@@ -204,19 +204,19 @@ describe Transmission::Model::Torrent do
|
|
204
204
|
end
|
205
205
|
end
|
206
206
|
|
207
|
-
describe '#
|
208
|
-
let(:torrents) { Transmission::Model::Torrent.new([{'id' => 1}, {'id' => 2}], nil) }
|
209
|
-
let(:torrent) { Transmission::Model::Torrent.new([{'id' => 1}], nil) }
|
207
|
+
describe '#multi?' do
|
208
|
+
let(:torrents) { Transmission::Model::Torrent.new([{ 'id' => 1 }, { 'id' => 2 }], nil) }
|
209
|
+
let(:torrent) { Transmission::Model::Torrent.new([{ 'id' => 1 }], nil) }
|
210
210
|
|
211
211
|
describe 'with multiple torrents' do
|
212
212
|
it 'should return true' do
|
213
|
-
expect(torrents.
|
213
|
+
expect(torrents.multi?).to eq(true)
|
214
214
|
end
|
215
215
|
end
|
216
216
|
|
217
217
|
describe 'with single torrent' do
|
218
218
|
it 'should return false' do
|
219
|
-
expect(torrent.
|
219
|
+
expect(torrent.multi?).to eq(false)
|
220
220
|
end
|
221
221
|
end
|
222
222
|
end
|
@@ -233,7 +233,7 @@ describe Transmission::Model::Torrent do
|
|
233
233
|
|
234
234
|
describe 'with single torrent' do
|
235
235
|
it 'should return false' do
|
236
|
-
expect(torrent.to_json).to eq(
|
236
|
+
expect(torrent.to_json).to eq('id' => 1)
|
237
237
|
end
|
238
238
|
end
|
239
239
|
end
|
@@ -256,11 +256,11 @@ describe Transmission::Model::Torrent do
|
|
256
256
|
end
|
257
257
|
|
258
258
|
describe '#method_missing' do
|
259
|
-
let(:torrent) { Transmission::Model::Torrent.new([{'id' => 1, 'name' => 'some name', 'some-key' => 'some-value'}], nil) }
|
259
|
+
let(:torrent) { Transmission::Model::Torrent.new([{ 'id' => 1, 'name' => 'some name', 'some-key' => 'some-value' }], nil) }
|
260
260
|
|
261
261
|
before :each do
|
262
|
-
stub_const(
|
263
|
-
stub_const(
|
262
|
+
stub_const('Transmission::Fields::TorrentGet::ATTRIBUTES', [{ field: 'id' }, { field: 'name' }, { field: 'some-key' }])
|
263
|
+
stub_const('Transmission::Arguments::TorrentSet::ATTRIBUTES', [{ field: 'name' }])
|
264
264
|
end
|
265
265
|
|
266
266
|
describe 'with existing attributes' do
|
@@ -292,14 +292,14 @@ describe Transmission::Model::Torrent do
|
|
292
292
|
end
|
293
293
|
|
294
294
|
describe '#save!' do
|
295
|
-
let(:rpc) {Transmission::RPC.new}
|
295
|
+
let(:rpc) { Transmission::RPC.new }
|
296
296
|
|
297
297
|
before :each do
|
298
|
-
stub_const(
|
299
|
-
stub_get_torrent({ids: [1]}, [{id: 1, name: 'test', comment: 'comment'}])
|
298
|
+
stub_const('Transmission::Arguments::TorrentSet::ATTRIBUTES', [{ field: 'name' }, { field: 'ids' }])
|
299
|
+
stub_get_torrent({ ids: [1] }, [{ id: 1, name: 'test', comment: 'comment' }])
|
300
300
|
stub_rpc_request
|
301
|
-
|
302
|
-
|
301
|
+
.with(body: torrent_set_body(name: 'new value', ids: [1]))
|
302
|
+
.to_return(successful_response)
|
303
303
|
end
|
304
304
|
|
305
305
|
it 'should send the right parameters' do
|
@@ -310,28 +310,28 @@ describe Transmission::Model::Torrent do
|
|
310
310
|
end
|
311
311
|
|
312
312
|
[
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
313
|
+
{ method: 'start!', rpc_method: 'torrent-start' },
|
314
|
+
{ method: 'start_now!', rpc_method: 'torrent-start-now' },
|
315
|
+
{ method: 'stop!', rpc_method: 'torrent-stop' },
|
316
|
+
{ method: 'verify!', rpc_method: 'torrent-verify' },
|
317
|
+
{ method: 're_announce!', rpc_method: 'torrent-reannounce' },
|
318
|
+
{ method: 'move_up!', rpc_method: 'queue-move-up' },
|
319
|
+
{ method: 'move_down!', rpc_method: 'queue-move-down' },
|
320
|
+
{ method: 'move_top!', rpc_method: 'queue-move-top' },
|
321
|
+
{ method: 'move_bottom!', rpc_method: 'queue-move-bottom' }
|
322
322
|
].each do |object|
|
323
323
|
describe "##{object[:method]}" do
|
324
|
-
let(:rpc) {Transmission::RPC.new}
|
324
|
+
let(:rpc) { Transmission::RPC.new }
|
325
325
|
|
326
326
|
[
|
327
|
-
|
328
|
-
|
327
|
+
{ ids: [1], response: [{ id: 1 }], text: '' },
|
328
|
+
{ ids: [1, 2], response: [{ id: 1 }, { id: 2 }], text: 'with multiple ids' }
|
329
329
|
].each do |args|
|
330
330
|
before :each do
|
331
|
-
stub_get_torrent({ids: args[:ids]}, args[:response])
|
331
|
+
stub_get_torrent({ ids: args[:ids] }, args[:response])
|
332
332
|
stub_rpc_request
|
333
|
-
|
334
|
-
|
333
|
+
.with(body: torrent_method_body(object[:rpc_method], ids: args[:ids]))
|
334
|
+
.to_return(successful_response)
|
335
335
|
end
|
336
336
|
|
337
337
|
it "should #{object[:method]} torrent #{args[:text]}" do
|
@@ -341,5 +341,4 @@ describe Transmission::Model::Torrent do
|
|
341
341
|
end
|
342
342
|
end
|
343
343
|
end
|
344
|
-
|
345
344
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
describe Transmission::RPC::Connector do
|
2
|
-
|
3
2
|
describe '#new' do
|
4
|
-
|
5
3
|
describe 'without parameters' do
|
6
4
|
before :each do
|
7
5
|
@connector = Transmission::RPC::Connector.new
|
@@ -18,7 +16,16 @@ describe Transmission::RPC::Connector do
|
|
18
16
|
|
19
17
|
describe 'with parameters' do
|
20
18
|
before :each do
|
21
|
-
@connector = Transmission::RPC::Connector.new
|
19
|
+
@connector = Transmission::RPC::Connector.new(
|
20
|
+
host: 'some.host',
|
21
|
+
port: 8888,
|
22
|
+
ssl: true,
|
23
|
+
path: '/path',
|
24
|
+
credentials: {
|
25
|
+
username: 'a',
|
26
|
+
password: 'b'
|
27
|
+
}
|
28
|
+
)
|
22
29
|
end
|
23
30
|
|
24
31
|
it 'should create an RPC object with given parameters' do
|
@@ -26,22 +33,20 @@ describe Transmission::RPC::Connector do
|
|
26
33
|
expect(@connector.port).to eq(8888)
|
27
34
|
expect(@connector.ssl).to eq(true)
|
28
35
|
expect(@connector.path).to eq('/path')
|
29
|
-
expect(@connector.credentials).to eq(
|
36
|
+
expect(@connector.credentials).to eq(username: 'a', password: 'b')
|
30
37
|
end
|
31
38
|
end
|
32
|
-
|
33
39
|
end
|
34
40
|
|
35
41
|
describe '#post' do
|
36
|
-
|
37
42
|
describe 'when session ID has not been acquired yet' do
|
38
43
|
before :each do
|
39
44
|
@connector = Transmission::RPC::Connector.new
|
40
45
|
stub_rpc_request
|
41
|
-
|
46
|
+
.to_return(conflict_response(headers: { 'x-transmission-session-id' => 'abc' }))
|
42
47
|
stub_rpc_request
|
43
|
-
|
44
|
-
|
48
|
+
.with(headers: { 'x-transmission-session-id' => 'abc' })
|
49
|
+
.to_return(successful_response)
|
45
50
|
end
|
46
51
|
|
47
52
|
it 'should save the transmission session ID' do
|
@@ -54,7 +59,7 @@ describe Transmission::RPC::Connector do
|
|
54
59
|
before :each do
|
55
60
|
@connector = Transmission::RPC::Connector.new
|
56
61
|
stub_rpc_request
|
57
|
-
|
62
|
+
.to_return(successful_response)
|
58
63
|
end
|
59
64
|
|
60
65
|
it 'should respond successfully' do
|
@@ -67,7 +72,7 @@ describe Transmission::RPC::Connector do
|
|
67
72
|
before :each do
|
68
73
|
@connector = Transmission::RPC::Connector.new
|
69
74
|
stub_rpc_request
|
70
|
-
|
75
|
+
.to_return(unauthorized_response)
|
71
76
|
end
|
72
77
|
|
73
78
|
it 'should raise auth error' do
|
@@ -76,7 +81,5 @@ describe Transmission::RPC::Connector do
|
|
76
81
|
}.to raise_error(Transmission::RPC::Connector::AuthError)
|
77
82
|
end
|
78
83
|
end
|
79
|
-
|
80
84
|
end
|
81
|
-
|
82
|
-
end
|
85
|
+
end
|
@@ -7,28 +7,28 @@ describe Transmission::Utils do
|
|
7
7
|
|
8
8
|
subject { utils.new }
|
9
9
|
|
10
|
-
describe '.
|
10
|
+
describe '.valid_key?' do
|
11
11
|
describe 'with dashes' do
|
12
|
-
let(:arguments) {[{field: 'test-me'}]}
|
12
|
+
let(:arguments) { [{ field: 'test-me' }] }
|
13
13
|
|
14
14
|
it 'should find valid key' do
|
15
|
-
expect(subject.
|
15
|
+
expect(subject.valid_key?('test_me', arguments)).to eq(true)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
describe 'with camelcase' do
|
20
|
-
let(:arguments) {[{field: 'testMe'}]}
|
20
|
+
let(:arguments) { [{ field: 'testMe' }] }
|
21
21
|
|
22
22
|
it 'should find valid key' do
|
23
|
-
expect(subject.
|
23
|
+
expect(subject.valid_key?('test_me', arguments)).to eq(true)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
describe 'with invalid key' do
|
28
|
-
let(:arguments) {[{field: 'testMe'}]}
|
28
|
+
let(:arguments) { [{ field: 'testMe' }] }
|
29
29
|
|
30
30
|
it 'should not find any key' do
|
31
|
-
expect(subject.
|
31
|
+
expect(subject.valid_key?('i_dont_exit', arguments)).to eq(false)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
@@ -43,7 +43,7 @@ describe Transmission::Utils do
|
|
43
43
|
|
44
44
|
describe '.option_key' do
|
45
45
|
describe 'with dashes' do
|
46
|
-
let(:arguments) {[{field: 'test-me'}]}
|
46
|
+
let(:arguments) { [{ field: 'test-me' }] }
|
47
47
|
|
48
48
|
it 'should return the correct key' do
|
49
49
|
expect(subject.option_key('test_me', arguments)).to eq('test-me')
|
@@ -51,7 +51,7 @@ describe Transmission::Utils do
|
|
51
51
|
end
|
52
52
|
|
53
53
|
describe 'with camelcase' do
|
54
|
-
let(:arguments) {[{field: 'testMe'}]}
|
54
|
+
let(:arguments) { [{ field: 'testMe' }] }
|
55
55
|
|
56
56
|
it 'should return the correct key' do
|
57
57
|
expect(subject.option_key('test_me', arguments)).to eq('testMe')
|
@@ -59,7 +59,7 @@ describe Transmission::Utils do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
describe 'with invalid key' do
|
62
|
-
let(:arguments) {[{field: 'testMe'}]}
|
62
|
+
let(:arguments) { [{ field: 'testMe' }] }
|
63
63
|
|
64
64
|
it 'should return nil' do
|
65
65
|
expect(subject.option_key('i_dont_exit', arguments)).to eq(nil)
|
@@ -1,17 +1,24 @@
|
|
1
|
-
Gem::Specification.new do |
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = 'transmission-rpc-ruby-ext'
|
3
|
+
spec.version = '0.1.1'
|
4
|
+
spec.date = '2016-12-31'
|
5
|
+
|
6
|
+
spec.authors = ['Tommaso Barbato']
|
7
|
+
spec.email = 'epistrephein@gmail.com'
|
8
|
+
|
9
|
+
spec.summary = 'Extended fork of transmission-rpc-ruby.'
|
10
|
+
spec.description = 'A fork of transmission-rpc-ruby with shortcut methods and revised codebase.'
|
11
|
+
spec.homepage = 'https://github.com/epistrephein/transmission-rpc-ruby-ext'
|
12
|
+
spec.license = 'MIT'
|
13
|
+
|
14
|
+
spec.files = `git ls-files -z`.split("\x0")
|
15
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
16
|
+
spec.require_paths = ['lib']
|
17
|
+
|
18
|
+
spec.required_ruby_version = '>= 2.0'
|
19
|
+
|
20
|
+
spec.add_dependency 'faraday', '~> 0.10'
|
21
|
+
spec.add_development_dependency 'rspec', '~> 3.5'
|
22
|
+
spec.add_development_dependency 'webmock', '~> 2.3'
|
23
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
17
24
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: transmission-rpc-ruby-ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tommaso Barbato
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '12.0'
|
69
|
-
description: A fork of transmission-rpc-ruby with
|
69
|
+
description: A fork of transmission-rpc-ruby with shortcut methods and revised codebase.
|
70
70
|
email: epistrephein@gmail.com
|
71
71
|
executables: []
|
72
72
|
extensions: []
|
@@ -91,8 +91,9 @@ files:
|
|
91
91
|
- lib/transmission/extensions.rb
|
92
92
|
- lib/transmission/extensions/torrent_actions.rb
|
93
93
|
- lib/transmission/extensions/torrent_attributes.rb
|
94
|
+
- lib/transmission/extensions/torrent_prettify.rb
|
94
95
|
- lib/transmission/extensions/torrent_status.rb
|
95
|
-
- lib/transmission/extensions/
|
96
|
+
- lib/transmission/extensions/transmission_selectors.rb
|
96
97
|
- lib/transmission/fields.rb
|
97
98
|
- lib/transmission/fields/session_get.rb
|
98
99
|
- lib/transmission/fields/session_stats.rb
|
@@ -107,6 +108,7 @@ files:
|
|
107
108
|
- spec/helpers/stubs.rb
|
108
109
|
- spec/spec_helper.rb
|
109
110
|
- spec/transmission/arguments_spec.rb
|
111
|
+
- spec/transmission/extensions_spec.rb
|
110
112
|
- spec/transmission/fields_spec.rb
|
111
113
|
- spec/transmission/model/session_spec.rb
|
112
114
|
- spec/transmission/model/torrent_spec.rb
|
@@ -126,7 +128,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
126
128
|
requirements:
|
127
129
|
- - ">="
|
128
130
|
- !ruby/object:Gem::Version
|
129
|
-
version: '0'
|
131
|
+
version: '2.0'
|
130
132
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
133
|
requirements:
|
132
134
|
- - ">="
|
@@ -137,5 +139,15 @@ rubyforge_project:
|
|
137
139
|
rubygems_version: 2.6.8
|
138
140
|
signing_key:
|
139
141
|
specification_version: 4
|
140
|
-
summary: Extended
|
141
|
-
test_files:
|
142
|
+
summary: Extended fork of transmission-rpc-ruby.
|
143
|
+
test_files:
|
144
|
+
- spec/helpers/stubs.rb
|
145
|
+
- spec/spec_helper.rb
|
146
|
+
- spec/transmission/arguments_spec.rb
|
147
|
+
- spec/transmission/extensions_spec.rb
|
148
|
+
- spec/transmission/fields_spec.rb
|
149
|
+
- spec/transmission/model/session_spec.rb
|
150
|
+
- spec/transmission/model/torrent_spec.rb
|
151
|
+
- spec/transmission/rpc/connector_spec.rb
|
152
|
+
- spec/transmission/rpc_spec.rb
|
153
|
+
- spec/transmission/utils_spec.rb
|