buapi 0.0.2 → 0.0.3
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 +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
|