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 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