buapi 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/bu/api.rb +51 -0
- data/lib/bu/dashboard.rb +55 -0
- data/lib/buapi.rb +14 -64
- data/test/lib/bu/api_test.rb +18 -0
- data/test/lib/bu/dashboard_test.rb +29 -0
- data/test/lib/buapi_test.rb +19 -0
- data/test/test_helper.rb +2 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f35190ca5128d6c9d0e73b9fd5c12748e82671d8
|
4
|
+
data.tar.gz: 9c08274df6aae769b71c77af55f1f66cd2050bcc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e78840db21c6dba4257f7b8ea91d42067cf69051ea039175507d989e2d3702f75515d96cd3b4614a9d69a63c01b10b28956600134406bf814077542213ee921
|
7
|
+
data.tar.gz: 5e3810e5c6a6ef6fd5c0ebe63dd2b0939dca04dda6489f046134ceee8f50aadbb808639b9b2155bffaad709003085e000a2487bab3201247f61dd49bf0d6e6dc
|
data/lib/bu/api.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
module BU
|
5
|
+
class Api
|
6
|
+
def initialize
|
7
|
+
@conn = Faraday.new(url: BU::ROOT) do |f|
|
8
|
+
f.request(:url_encoded)
|
9
|
+
# f.response(:logger) # for debugging
|
10
|
+
f.adapter(Faraday.default_adapter)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def dashboard(manga)
|
15
|
+
url = series_url(manga)
|
16
|
+
BU::Dashboard.new(url, doc(url))
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def doc(url)
|
21
|
+
Nokogiri::HTML(@conn.get(url).body)
|
22
|
+
end
|
23
|
+
|
24
|
+
def search(target, post_options)
|
25
|
+
Nokogiri::HTML(@conn.post(target, post_options).body)
|
26
|
+
end
|
27
|
+
|
28
|
+
def releases(term)
|
29
|
+
search('/search.html', {search: term})
|
30
|
+
end
|
31
|
+
|
32
|
+
def manga(term, type: 'title')
|
33
|
+
search('/series.html', {stype: type, search: term})
|
34
|
+
end
|
35
|
+
|
36
|
+
def match_names(name, other)
|
37
|
+
name = name.clone.gsub(/\W/, '')
|
38
|
+
other = other.clone.gsub(/\W/, '')
|
39
|
+
name.downcase == other.downcase
|
40
|
+
end
|
41
|
+
|
42
|
+
def series_url(manga)
|
43
|
+
doc = manga(manga)
|
44
|
+
link = doc.css('a').find do |a|
|
45
|
+
a[:alt] == "Series Info" && match_names(a.text, manga)
|
46
|
+
end
|
47
|
+
raise BU::NotFound unless link
|
48
|
+
link[:href].sub(BU::ROOT, '')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/bu/dashboard.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
module BU
|
2
|
+
class Dashboard
|
3
|
+
|
4
|
+
attr_reader :url, :doc
|
5
|
+
def initialize(url, doc)
|
6
|
+
@url = url
|
7
|
+
@doc = doc
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_h
|
11
|
+
{
|
12
|
+
url: url,
|
13
|
+
title: title,
|
14
|
+
id: id,
|
15
|
+
genres: genres,
|
16
|
+
description: description,
|
17
|
+
scanlators: scanlators,
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
to_h.each_with_object('') do |(key,value),out|
|
23
|
+
column = key.to_s.upcase
|
24
|
+
spaces = 13 - column.length
|
25
|
+
out << "\s\s#{column}:#{ " " * spaces}#{value}\n"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def info
|
30
|
+
@info ||= doc.css('.sMember div.sContent')
|
31
|
+
end
|
32
|
+
|
33
|
+
def title
|
34
|
+
@doc.css('span.releasestitle.tabletitle').first.text
|
35
|
+
end
|
36
|
+
|
37
|
+
def id
|
38
|
+
Integer(url.sub(/.+id=/, ''))
|
39
|
+
end
|
40
|
+
|
41
|
+
def description
|
42
|
+
info[0].text
|
43
|
+
end
|
44
|
+
|
45
|
+
def genres
|
46
|
+
info[14].css('a')[0..-2].map {|a| a.text}
|
47
|
+
end
|
48
|
+
|
49
|
+
def scanlators
|
50
|
+
info[4].css('a')
|
51
|
+
.select {|a| a.text != "Less..." && a.text != "More..." }
|
52
|
+
.map {|a| {url: a[:href], name: a.text} }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/buapi.rb
CHANGED
@@ -1,74 +1,24 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require_relative 'bu/dashboard'
|
2
|
+
require_relative 'bu/api'
|
3
3
|
|
4
4
|
module BU
|
5
|
-
class Api
|
6
|
-
def initialize
|
7
|
-
@root = 'http://www.mangaupdates.com'
|
8
|
-
@conn = Faraday.new(url: @root) do |f|
|
9
|
-
f.request(:url_encoded)
|
10
|
-
f.response(:logger)
|
11
|
-
f.adapter(Faraday.default_adapter)
|
12
|
-
end
|
13
|
-
end
|
14
5
|
|
15
|
-
|
16
|
-
url = series_url(manga)
|
17
|
-
info = doc(url).css('.sMember div.sContent')
|
18
|
-
{
|
19
|
-
id: Integer(url.sub(/.+id=/, '')),
|
20
|
-
description: series_description(info),
|
21
|
-
genres: series_genres(info),
|
22
|
-
scanlators: series_scanlators(info),
|
23
|
-
}
|
24
|
-
end
|
6
|
+
ROOT = "http://www.mangaupdates.com"
|
25
7
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
def search(target, post_options)
|
32
|
-
Nokogiri::HTML(
|
33
|
-
@conn.post(target, post_options).body
|
34
|
-
)
|
35
|
-
end
|
36
|
-
|
37
|
-
def releases(term)
|
38
|
-
search('/search.html', {search: term})
|
39
|
-
end
|
40
|
-
|
41
|
-
def manga(term, type: 'title')
|
42
|
-
search('/series.html', {stype: type, search: term})
|
43
|
-
end
|
44
|
-
|
45
|
-
def series_url(manga)
|
46
|
-
doc = manga(manga)
|
47
|
-
link = doc.css('a').find do |a|
|
48
|
-
a[:alt] == "Series Info" && match_names(a.text, manga)
|
49
|
-
end
|
50
|
-
link ? link[:href].sub(@root, '') : :no_match
|
51
|
-
end
|
8
|
+
def self.series_url_from_id(id)
|
9
|
+
absolute_url("/series.html?id=#{id}")
|
10
|
+
end
|
52
11
|
|
53
|
-
|
54
|
-
|
55
|
-
|
12
|
+
def self.absolute_url(url)
|
13
|
+
url = ROOT + url if url =~ %r{^/}
|
14
|
+
url
|
15
|
+
end
|
56
16
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
def series_scanlators(info)
|
62
|
-
info[4].css('a')
|
63
|
-
.select {|a| a.text != "Less..." && a.text != "More..." }
|
64
|
-
.map {|a| {uri: a[:href], name: a.text} }
|
65
|
-
end
|
17
|
+
def self.relative_url(url)
|
18
|
+
url.gsub(ROOT, '')
|
19
|
+
end
|
66
20
|
|
67
|
-
|
68
|
-
name = name.clone.gsub(/\W/, '')
|
69
|
-
other = other.clone.gsub(/\W/, '')
|
70
|
-
name.downcase == other.downcase
|
71
|
-
end
|
21
|
+
class NotFound < Exception
|
72
22
|
end
|
73
23
|
end
|
74
24
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
class ApiTest < Minitest::Test
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@api = BU::Api.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_returns_dashboard
|
10
|
+
assert_kind_of BU::Dashboard, @api.dashboard('one piece')
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_fails_if_no_series_dashboard_is_found
|
14
|
+
assert_raises(BU::NotFound) do
|
15
|
+
@api.dashboard('no way that this is a manga title')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
require 'open-uri'
|
4
|
+
|
5
|
+
class DashboardTest < Minitest::Test
|
6
|
+
def setup
|
7
|
+
uri = 'http://www.mangaupdates.com/series.html?id=34771'
|
8
|
+
doc = Nokogiri::HTML(open(uri).read)
|
9
|
+
@dashboard = BU::Dashboard.new(uri, doc)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_to_h
|
13
|
+
keys = %w( title id url description genres scanlators ).map(&:to_sym)
|
14
|
+
assert_equal keys.sort, @dashboard.to_h.keys.sort
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_to_s
|
18
|
+
assert_includes @dashboard.to_s, "TITLE:"
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_access_keys_directly
|
22
|
+
assert @dashboard.id, 'access id'
|
23
|
+
assert @dashboard.url, 'access url'
|
24
|
+
assert @dashboard.description, 'access description'
|
25
|
+
assert @dashboard.title, 'access title'
|
26
|
+
assert @dashboard.genres, 'access genres'
|
27
|
+
assert @dashboard.scanlators, 'access scanlators'
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class BuTest < Minitest::Test
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@relative_url = '/series.html?id=42466'
|
7
|
+
@absolute_url = 'http://www.mangaupdates.com/series.html?id=42466'
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_urls
|
11
|
+
assert_equal @relative_url, BU.relative_url(@absolute_url), "abs to rel"
|
12
|
+
assert_equal @absolute_url, BU.absolute_url(@relative_url), "rel to abs"
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_series_url_from_id
|
16
|
+
assert_equal @absolute_url, BU.series_url_from_id(42466)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
data/test/test_helper.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: buapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jphager2
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-22 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Useful interface BakaUpdates
|
14
14
|
email: jphager2@gmail.com
|
@@ -17,7 +17,13 @@ extensions: []
|
|
17
17
|
extra_rdoc_files: []
|
18
18
|
files:
|
19
19
|
- LICENSE
|
20
|
+
- lib/bu/api.rb
|
21
|
+
- lib/bu/dashboard.rb
|
20
22
|
- lib/buapi.rb
|
23
|
+
- test/lib/bu/api_test.rb
|
24
|
+
- test/lib/bu/dashboard_test.rb
|
25
|
+
- test/lib/buapi_test.rb
|
26
|
+
- test/test_helper.rb
|
21
27
|
homepage: https://github.com/jphager2/bakaupdatesapi
|
22
28
|
licenses:
|
23
29
|
- MIT
|