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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0af344f4051e44370b806095d5a573b1c9ad0f70
4
- data.tar.gz: ba293acfaf6a23b77dad996ec57cc2e67457bde8
3
+ metadata.gz: f35190ca5128d6c9d0e73b9fd5c12748e82671d8
4
+ data.tar.gz: 9c08274df6aae769b71c77af55f1f66cd2050bcc
5
5
  SHA512:
6
- metadata.gz: 0492d633cc8671044fdc0444036d4a74e405712ab20ebc838d38acb88b68bdaa6c741f8445317c7a5eb925465b9eaf51a526c8667350c9574a9ad279e466b8b6
7
- data.tar.gz: 7ce8c558693b36a29717e25d589439c9d907f4f2ae8c4dd931675fa2f8286c37b158929af0f286980cddb58909d024b1f67936c4be8da0b9ce76c32d72949cb2
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
@@ -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
- require 'faraday'
2
- require 'nokogiri'
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
- def series_dashboard(manga)
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
- private
27
- def doc(url)
28
- Nokogiri::HTML(@conn.get(url).body)
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
- def series_description(info)
54
- info[0].text
55
- end
12
+ def self.absolute_url(url)
13
+ url = ROOT + url if url =~ %r{^/}
14
+ url
15
+ end
56
16
 
57
- def series_genres(info)
58
- info[14].css('a')[0..-2].map {|a| a.text}
59
- end
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
- def match_names(name, other)
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
+
@@ -0,0 +1,2 @@
1
+ require 'minitest/autorun'
2
+ require_relative '../lib/buapi'
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.2
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-06-24 00:00:00.000000000 Z
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