rarbg 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.hound.yml +5 -0
- data/.rubocop.yml +9 -0
- data/.travis.yml +1 -1
- data/CHANGELOG.md +19 -0
- data/CONTRIBUTING.md +2 -1
- data/README.md +3 -1
- data/lib/rarbg.rb +3 -3
- data/lib/rarbg/api.rb +36 -15
- data/lib/rarbg/version.rb +1 -1
- data/spec/rarbg/search_spec.rb +15 -0
- data/spec/rarbg/token_spec.rb +22 -0
- data/spec/stubs.rb +7 -3
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bdc20e4ab04f39d219c9144799d7ffddba69c0dd316c1ed41d239e286967714
|
4
|
+
data.tar.gz: ebe32eb45fcd60fb2d21f78c7d3ea1c3115875e36039f82c7f6b29643f4cc4f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ad332920510625f62afb67c6f81eb016f8c2f2654ee34ac5669b5c282925fb098b6b31bdcf6bcfcebc10aa6067883814c8b863b479ea22d252e818ad2dc0eb7
|
7
|
+
data.tar.gz: e1e2e06a31ad858b5ab4c4fa7f92e326d69add29e5e88fae6c28e707132b472e89bd6c2bc4d040351bb93a32c46beb174f0749a5973aae18a89b267969fb61bb
|
data/.hound.yml
ADDED
data/.rubocop.yml
CHANGED
@@ -13,6 +13,12 @@ Layout/AlignHash:
|
|
13
13
|
Layout/FirstParameterIndentation:
|
14
14
|
EnforcedStyle: consistent
|
15
15
|
|
16
|
+
Layout/IndentArray:
|
17
|
+
EnforcedStyle: consistent
|
18
|
+
|
19
|
+
Layout/IndentHash:
|
20
|
+
EnforcedStyle: consistent
|
21
|
+
|
16
22
|
Metrics/BlockLength:
|
17
23
|
Exclude:
|
18
24
|
- '*.gemspec'
|
@@ -20,6 +26,9 @@ Metrics/BlockLength:
|
|
20
26
|
- 'describe'
|
21
27
|
- 'context'
|
22
28
|
|
29
|
+
Metrics/ClassLength:
|
30
|
+
Enabled: false
|
31
|
+
|
23
32
|
Metrics/LineLength:
|
24
33
|
Max: 90
|
25
34
|
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,25 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/).
|
6
6
|
|
7
|
+
## 1.3.0 - 2019-02-07
|
8
|
+
[RubyGems](https://rubygems.org/gems/rarbg/versions/1.3.0) |
|
9
|
+
[Release](https://github.com/epistrephein/rarbg/releases/tag/v1.3.0) |
|
10
|
+
[Diff](https://github.com/epistrephein/rarbg/compare/v1.2.0...v1.3.0)
|
11
|
+
|
12
|
+
#### Fixed
|
13
|
+
- Return an empty array when endpoint responds with a `Can't find` error on
|
14
|
+
`imdb`/`themoviedb`/`tvdb` search ([#6](https://github.com/epistrephein/rarbg/pull/6)).
|
15
|
+
- Parse JSON only for responses with `application/json` Content-Type, preventing
|
16
|
+
error responses to raise a `ParsingError` ([#4](https://github.com/epistrephein/rarbg/pull/4)).
|
17
|
+
|
18
|
+
#### Added
|
19
|
+
- Add `token!` public method for standalone token generation
|
20
|
+
([#3](https://github.com/epistrephein/rarbg/pull/3)).
|
21
|
+
|
22
|
+
#### Changed
|
23
|
+
- Reduce Faraday connection timeout to 30 seconds.
|
24
|
+
|
25
|
+
|
7
26
|
## 1.2.0 - 2019-01-02
|
8
27
|
[RubyGems](https://rubygems.org/gems/rarbg/versions/1.2.0) |
|
9
28
|
[Release](https://github.com/epistrephein/rarbg/releases/tag/v1.2.0) |
|
data/CONTRIBUTING.md
CHANGED
@@ -48,7 +48,8 @@ changes with `rake spec`.
|
|
48
48
|
|
49
49
|
We also use [RuboCop](https://docs.rubocop.org/en/latest/) to enforce code style.
|
50
50
|
The configuration file used for this project lives in `.rubocop.yml`. You can check
|
51
|
-
the code style of your changes with `rake rubocop`.
|
51
|
+
the code style of your changes with `rake rubocop`.
|
52
|
+
Pull Requests on GitHub are automatically linted with RuboCop via [Hound](https://houndci.com/).
|
52
53
|
|
53
54
|
The default Rake task, runnable using `rake`, performs code linting via Rubocop
|
54
55
|
and then runs the RSpec tests.
|
data/README.md
CHANGED
@@ -20,7 +20,7 @@ $ gem install rarbg
|
|
20
20
|
Or add it to your Gemfile and execute `bundle install`
|
21
21
|
|
22
22
|
```ruby
|
23
|
-
gem 'rarbg', '~> 1.
|
23
|
+
gem 'rarbg', '~> 1.3'
|
24
24
|
```
|
25
25
|
|
26
26
|
## Usage
|
@@ -31,6 +31,8 @@ An authentication token is automatically generated on first request, stored with
|
|
31
31
|
|
32
32
|
Rate limit (1req/2s) is automatically enforced.
|
33
33
|
|
34
|
+
Check out the [full documentation](https://epistrephein.github.io/rarbg) for details on all methods and parameters.
|
35
|
+
|
34
36
|
#### Getting started
|
35
37
|
|
36
38
|
Require the gem and initialize a new `RARBG::API` object.
|
data/lib/rarbg.rb
CHANGED
@@ -7,10 +7,10 @@ require 'rarbg/api'
|
|
7
7
|
# Module namespace shortcut methods.
|
8
8
|
module RARBG
|
9
9
|
class << self
|
10
|
-
%i[list search].each do |
|
11
|
-
define_method(
|
10
|
+
%i[list search token!].each do |method|
|
11
|
+
define_method(method) do |*args|
|
12
12
|
@rarbg ||= RARBG::API.new
|
13
|
-
@rarbg.send(
|
13
|
+
@rarbg.send(method, *args)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
data/lib/rarbg/api.rb
CHANGED
@@ -38,6 +38,13 @@ module RARBG
|
|
38
38
|
SEARCH_KEYS = %w[string imdb tvdb themoviedb].freeze
|
39
39
|
private_constant :SEARCH_KEYS
|
40
40
|
|
41
|
+
# Endpoint error strings to return as no results.
|
42
|
+
NO_RESULTS_ERRORS_REGEXPS = Regexp.union([
|
43
|
+
/no results found/i,
|
44
|
+
/can'?t find .+? in database/i
|
45
|
+
])
|
46
|
+
private_constant :NO_RESULTS_ERRORS_REGEXPS
|
47
|
+
|
41
48
|
# Initialize a new instance of `RARBG::API`.
|
42
49
|
#
|
43
50
|
# @example
|
@@ -45,11 +52,11 @@ module RARBG
|
|
45
52
|
def initialize
|
46
53
|
@conn = Faraday.new(url: API_ENDPOINT) do |conn|
|
47
54
|
conn.request :json
|
48
|
-
conn.response :json
|
55
|
+
conn.response :json, content_type: /\bjson$/
|
49
56
|
conn.response :logger if $VERBOSE
|
50
57
|
conn.adapter Faraday.default_adapter
|
51
58
|
|
52
|
-
conn.options.timeout
|
59
|
+
conn.options.timeout = 30
|
53
60
|
conn.options.open_timeout = 10
|
54
61
|
|
55
62
|
conn.headers[:user_agent] = APP_ID
|
@@ -63,22 +70,23 @@ module RARBG
|
|
63
70
|
#
|
64
71
|
# @option params [Array<Integer>] :category Filter results by category.
|
65
72
|
# @option params [Symbol] :format Format results.
|
66
|
-
#
|
73
|
+
# Accepted values: `:json`, `:json_extended`. Default: `:json`.
|
67
74
|
# @option params [Integer] :limit Limit results number.
|
68
|
-
#
|
75
|
+
# Accepted values: `25`, `50`, `100`. Default: `25`.
|
69
76
|
# @option params [Integer] :min_seeders Filter results by minimum seeders.
|
70
77
|
# @option params [Integer] :min_leechers Filter results by minimum leechers.
|
71
78
|
# @option params [Boolean] :ranked Include/exclude unranked torrents.
|
72
79
|
# Default: `true`.
|
73
80
|
# @option params [Symbol] :sort Sort results.
|
74
|
-
#
|
81
|
+
# Accepted values: `:last`, `:seeders`, `:leechers`. Default: `:last`.
|
75
82
|
#
|
76
83
|
# @return [Array<Hash>] Return torrents that match the specified parameters.
|
77
84
|
#
|
78
85
|
# @raise [ArgumentError] Exception raised if `params` is not an `Hash`.
|
79
|
-
# @raise [RARBG::APIError] Exception raised when request fails or
|
80
|
-
# responds with an error.
|
81
|
-
# @raise [Faraday::Error] Exception raised on low-level connection errors
|
86
|
+
# @raise [RARBG::APIError] Exception raised when the request fails or the
|
87
|
+
# endpoint responds with an error.
|
88
|
+
# @raise [Faraday::Error] Exception raised on low-level connection errors
|
89
|
+
# (e.g. timeouts).
|
82
90
|
#
|
83
91
|
# @example List last 100 ranked torrents in `Movies/x264/1080`
|
84
92
|
# rarbg = RARBG::API.new
|
@@ -107,24 +115,25 @@ module RARBG
|
|
107
115
|
# @option params [String] :themoviedb Search by The Movie DB id.
|
108
116
|
# @option params [Array<Integer>] :category Filter results by category.
|
109
117
|
# @option params [Symbol] :format Format results.
|
110
|
-
#
|
118
|
+
# Accepted values: `:json`, `:json_extended`. Default: `:json`.
|
111
119
|
# @option params [Integer] :limit Limit results number.
|
112
|
-
#
|
120
|
+
# Accepted values: `25`, `50`, `100`. Default: `25`.
|
113
121
|
# @option params [Integer] :min_seeders Filter results by minimum seeders.
|
114
122
|
# @option params [Integer] :min_leechers Filter results by minimum leechers.
|
115
123
|
# @option params [Boolean] :ranked Include/exclude unranked torrents.
|
116
124
|
# Default: `true`.
|
117
125
|
# @option params [Symbol] :sort Sort results.
|
118
|
-
#
|
126
|
+
# Accepted values: `:last`, `:seeders`, `:leechers`. Default: `:last`.
|
119
127
|
#
|
120
128
|
# @return [Array<Hash>] Return torrents that match the specified parameters.
|
121
129
|
#
|
122
130
|
# @raise [ArgumentError] Exception raised if `params` is not an `Hash`.
|
123
131
|
# @raise [ArgumentError] Exception raised if no search type param is passed
|
124
132
|
# (among `string`, `imdb`, `tvdb`, `themoviedb`).
|
125
|
-
# @raise [RARBG::APIError] Exception raised when request fails or
|
126
|
-
# responds with an error.
|
127
|
-
# @raise [Faraday::Error] Exception raised on low-level connection errors
|
133
|
+
# @raise [RARBG::APIError] Exception raised when the request fails or the
|
134
|
+
# endpoint responds with an error.
|
135
|
+
# @raise [Faraday::Error] Exception raised on low-level connection errors
|
136
|
+
# (e.g. timeouts).
|
128
137
|
#
|
129
138
|
# @example Search by IMDb ID, sorted by leechers and in extended format.
|
130
139
|
# rarbg = RARBG::API.new
|
@@ -143,13 +152,25 @@ module RARBG
|
|
143
152
|
call(params)
|
144
153
|
end
|
145
154
|
|
155
|
+
# Generate the authentication token.
|
156
|
+
#
|
157
|
+
# @return [String] Return the currently valid token.
|
158
|
+
#
|
159
|
+
# @example Generate the token immediately after object instantiation.
|
160
|
+
# rarbg = RARBG::API.new
|
161
|
+
# rarbg.token!
|
162
|
+
|
163
|
+
def token!
|
164
|
+
token?
|
165
|
+
end
|
166
|
+
|
146
167
|
private
|
147
168
|
|
148
169
|
# Wrap requests for error handling.
|
149
170
|
def call(params)
|
150
171
|
response = request(validate(params))
|
151
172
|
|
152
|
-
return [] if response['error']
|
173
|
+
return [] if response['error'] =~ NO_RESULTS_ERRORS_REGEXPS
|
153
174
|
raise APIError, response['error'] if response.key?('error')
|
154
175
|
|
155
176
|
response.fetch('torrent_results', [])
|
data/lib/rarbg/version.rb
CHANGED
data/spec/rarbg/search_spec.rb
CHANGED
@@ -52,6 +52,21 @@ RSpec.describe 'RARBG::API#search' do
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
+
context 'when search request returns an id error' do
|
56
|
+
let(:type) { %i[imdb themoviedb tvdb].sample }
|
57
|
+
|
58
|
+
before(:example) do
|
59
|
+
stub_search(
|
60
|
+
@token, {},
|
61
|
+
{ error: "Cant find #{type} in database. Are you sure this #{type} exists?" }
|
62
|
+
)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'returns an empty array' do
|
66
|
+
expect(@rarbg.search(type => '9999999')).to eq([])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
55
70
|
context 'when search request parameters is not an hash' do
|
56
71
|
before(:example) do
|
57
72
|
stub_search(
|
data/spec/rarbg/token_spec.rb
CHANGED
@@ -51,4 +51,26 @@ RSpec.describe RARBG::API do
|
|
51
51
|
expect { @rarbg.list }.to raise_error(Faraday::ConnectionFailed)
|
52
52
|
end
|
53
53
|
end
|
54
|
+
|
55
|
+
context 'when forcing the token generation' do
|
56
|
+
before(:example) do
|
57
|
+
stub_token(
|
58
|
+
@token
|
59
|
+
)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'returns the currently valid token' do
|
63
|
+
expect(@rarbg.token!).to eq(@token)
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'when called from top level namespace' do
|
67
|
+
let(:rarbg_module) { RARBG.clone }
|
68
|
+
|
69
|
+
it 'instantiates an API object' do
|
70
|
+
expect { rarbg_module.token! }
|
71
|
+
.to change { rarbg_module.instance_variable_get(:@rarbg).class }
|
72
|
+
.to(RARBG::API)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
54
76
|
end
|
data/spec/stubs.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# WebMock stubs for RSpec.
|
3
4
|
module Stubs
|
4
5
|
API_ENDPOINT = RARBG::API::API_ENDPOINT
|
5
6
|
|
6
7
|
def stub_token(token)
|
7
8
|
stub_request(:get, API_ENDPOINT)
|
8
9
|
.with(query: hash_including('get_token' => 'get_token'))
|
9
|
-
.to_return(status: 200, body: { token: token }.to_json
|
10
|
+
.to_return(status: 200, body: { token: token }.to_json,
|
11
|
+
headers: { 'Content-Type' => 'application/json' })
|
10
12
|
end
|
11
13
|
|
12
14
|
def stub_list(token, params = {}, result = {})
|
@@ -15,7 +17,8 @@ module Stubs
|
|
15
17
|
mode: 'list',
|
16
18
|
token: token
|
17
19
|
)))
|
18
|
-
.to_return(status: 200, body: result.to_json
|
20
|
+
.to_return(status: 200, body: result.to_json,
|
21
|
+
headers: { 'Content-Type' => 'application/json' })
|
19
22
|
end
|
20
23
|
|
21
24
|
def stub_search(token, params = {}, result = {})
|
@@ -24,7 +27,8 @@ module Stubs
|
|
24
27
|
mode: 'search',
|
25
28
|
token: token
|
26
29
|
)))
|
27
|
-
.to_return(status: 200, body: result.to_json
|
30
|
+
.to_return(status: 200, body: result.to_json,
|
31
|
+
headers: { 'Content-Type' => 'application/json' })
|
28
32
|
end
|
29
33
|
|
30
34
|
def stub_error(status, error)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rarbg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tommaso Barbato
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -162,6 +162,7 @@ files:
|
|
162
162
|
- ".github/ISSUE_TEMPLATE/FEATURE_REQUEST.md"
|
163
163
|
- ".github/PULL_REQUEST_TEMPLATE.md"
|
164
164
|
- ".gitignore"
|
165
|
+
- ".hound.yml"
|
165
166
|
- ".rspec"
|
166
167
|
- ".rubocop.yml"
|
167
168
|
- ".travis.yml"
|