mangdown 0.20.8 → 0.21.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +15 -10
- data/db/migrate/001_create_manga_table.rb +12 -0
- data/lib/mangdown.rb +68 -20
- data/lib/mangdown/adapter/manga_bat.rb +148 -0
- data/lib/mangdown/adapter/mangareader.rb +119 -91
- data/lib/mangdown/chapter.rb +27 -57
- data/lib/mangdown/client.rb +30 -53
- data/lib/mangdown/db.rb +27 -0
- data/lib/mangdown/db/manga.rb +9 -0
- data/lib/mangdown/manga.rb +25 -29
- data/lib/mangdown/page.rb +17 -13
- data/lib/mangdown/support/cbz.rb +1 -2
- data/lib/mangdown/support/logging.rb +1 -0
- data/lib/mangdown/support/tools.rb +18 -10
- data/lib/mangdown/version.rb +1 -1
- data/test/lib/mangdown/chapter_test.rb +18 -74
- data/test/lib/mangdown/manga_test.rb +11 -115
- data/test/lib/mangdown/support/cbz_test.rb +21 -9
- data/test/lib/mangdown/support/equality_test.rb +9 -2
- data/test/lib/mangdown/support/logging_test.rb +5 -2
- data/test/lib/mangdown/support/tools_test.rb +19 -6
- data/test/lib/mangdown_test.rb +35 -22
- data/test/support/test_adapter.rb +63 -83
- data/test/test_helper.rb +49 -1
- metadata +66 -14
- data/lib/mangdown/adapter.rb +0 -87
- data/lib/mangdown/adapter/proxy.rb +0 -44
- data/lib/mangdown/manga_list.rb +0 -43
- data/lib/mangdown/md_hash.rb +0 -73
- data/lib/mangdown/support/properties.rb +0 -50
- data/test/lib/mangdown/adapter_test.rb +0 -117
- data/test/lib/mangdown/manga_list_test.rb +0 -50
- data/test/lib/mangdown/support/properties_test.rb +0 -59
data/lib/mangdown/adapter.rb
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Mangdown
|
4
|
-
module Adapter
|
5
|
-
# Abstract Adapter class
|
6
|
-
class Base
|
7
|
-
# Returns something truthy if this adapter should be used for the
|
8
|
-
# given url or adapter name
|
9
|
-
def self.for?(url_or_adapter_name)
|
10
|
-
url_or_adapter_name[site.to_s]
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.site(site = nil)
|
14
|
-
site ? @_site = site : @_site
|
15
|
-
end
|
16
|
-
|
17
|
-
attr_reader :uri, :name
|
18
|
-
def initialize(uri, doc, name)
|
19
|
-
@uri = uri
|
20
|
-
@doc = doc
|
21
|
-
@name = name
|
22
|
-
end
|
23
|
-
|
24
|
-
def site
|
25
|
-
self.class.site
|
26
|
-
end
|
27
|
-
|
28
|
-
def hydra_opts
|
29
|
-
{}
|
30
|
-
end
|
31
|
-
|
32
|
-
# Overwrite if you want to check the uri if it belongs to a manga list
|
33
|
-
def is_manga_list?(_uri = @uri)
|
34
|
-
raise Adapter::NotImplementedError
|
35
|
-
end
|
36
|
-
|
37
|
-
# Must return true/false if uri represents a manga for adapter
|
38
|
-
def is_manga?(_uri = @uri)
|
39
|
-
raise Adapter::NotImplementedError
|
40
|
-
end
|
41
|
-
|
42
|
-
# Must return true/false if uri represents a chapter for adapter
|
43
|
-
def is_chapter?(_uri = @uri)
|
44
|
-
raise Adapter::NotImplementedError
|
45
|
-
end
|
46
|
-
|
47
|
-
# Must return true/false if uri represents a page for adapter
|
48
|
-
def is_page?(_uri = @uri)
|
49
|
-
raise Adapter::NotImplementedError
|
50
|
-
end
|
51
|
-
|
52
|
-
# Return Array of Hash with keys: :uri, :name, :site
|
53
|
-
def manga_list
|
54
|
-
raise Adapter::NotImplementedError
|
55
|
-
end
|
56
|
-
|
57
|
-
# Return Hash with keys: :uri, :name, :site
|
58
|
-
def manga
|
59
|
-
raise Adapter::NotImplementedError
|
60
|
-
end
|
61
|
-
|
62
|
-
# Return Array of Hash with keys: :uri, :name, :site
|
63
|
-
def chapter_list
|
64
|
-
raise Adapter::NotImplementedError
|
65
|
-
end
|
66
|
-
|
67
|
-
# Return Hash with keys: :uri, :name, :chapter, :manga, :site
|
68
|
-
def chapter
|
69
|
-
raise Adapter::NotImplementedError
|
70
|
-
end
|
71
|
-
|
72
|
-
# Return Array of Hash with keys: :uri, :name, :site
|
73
|
-
def page_list
|
74
|
-
raise Adapter::NotImplementedError
|
75
|
-
end
|
76
|
-
|
77
|
-
# Return Hash with keys: :uri, :name, :site
|
78
|
-
def page
|
79
|
-
raise Adapter::NotImplementedError
|
80
|
-
end
|
81
|
-
|
82
|
-
def doc
|
83
|
-
@doc ||= Tools.get_doc(uri)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Mangdown
|
4
|
-
module Adapter
|
5
|
-
# Wraps Adapters to provide error reporting
|
6
|
-
class Proxy
|
7
|
-
include Logging
|
8
|
-
|
9
|
-
attr_reader :adapter
|
10
|
-
|
11
|
-
def initialize(adapter)
|
12
|
-
@adapter = adapter
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
def method_missing(method, *args, &block)
|
18
|
-
return super unless @adapter.respond_to?(method)
|
19
|
-
|
20
|
-
adapter.public_send(method, *args, &block)
|
21
|
-
rescue StandardError => error
|
22
|
-
logger.error(debug_error(method, error))
|
23
|
-
raise Mangdown::Error, "Adapter failed: #{error.message}"
|
24
|
-
end
|
25
|
-
|
26
|
-
def respond_to_missing?(method, include_all)
|
27
|
-
@adapter.respond_to?(method, include_all)
|
28
|
-
end
|
29
|
-
|
30
|
-
def debug_error(method, error)
|
31
|
-
{
|
32
|
-
msg: 'Adapter method failed',
|
33
|
-
adapter: adapter.class,
|
34
|
-
uri: adapter.uri,
|
35
|
-
doc: adapter.doc.to_s,
|
36
|
-
method: method,
|
37
|
-
error: error,
|
38
|
-
error_msg: error.message,
|
39
|
-
backtrace: error.backtrace
|
40
|
-
}.to_s
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
data/lib/mangdown/manga_list.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Mangdown
|
4
|
-
# Mangdown manga list, which holds manga
|
5
|
-
class MangaList
|
6
|
-
include Enumerable
|
7
|
-
|
8
|
-
def self.from_data(manga)
|
9
|
-
new(manga)
|
10
|
-
end
|
11
|
-
|
12
|
-
attr_reader :manga
|
13
|
-
|
14
|
-
alias to_a manga
|
15
|
-
alias to_ary manga
|
16
|
-
|
17
|
-
def initialize(manga = [])
|
18
|
-
@manga = manga.map! { |hash| MDHash.new(hash) }
|
19
|
-
end
|
20
|
-
|
21
|
-
def each(&block)
|
22
|
-
manga.each(&block)
|
23
|
-
end
|
24
|
-
|
25
|
-
def to_yaml
|
26
|
-
@manga.map(&:to_hash).to_yaml
|
27
|
-
end
|
28
|
-
|
29
|
-
def load_manga(uri)
|
30
|
-
adapter = Mangdown.adapter!(uri)
|
31
|
-
|
32
|
-
manga = adapter.manga_list.map { |m| MDHash.new(m) }
|
33
|
-
|
34
|
-
merge(manga)
|
35
|
-
end
|
36
|
-
|
37
|
-
def merge(other)
|
38
|
-
@manga += other.to_ary
|
39
|
-
|
40
|
-
self
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
data/lib/mangdown/md_hash.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Mangdown
|
4
|
-
# Mangdown hash like object that can be converted to other Mangdown objects.
|
5
|
-
class MDHash
|
6
|
-
include Equality
|
7
|
-
include Properties
|
8
|
-
|
9
|
-
attr_reader :adapter
|
10
|
-
|
11
|
-
properties :name, :uri, :manga, :chapter, :site
|
12
|
-
|
13
|
-
def initialize(options = {})
|
14
|
-
uri = options.fetch(:uri)
|
15
|
-
site = options[:site]
|
16
|
-
|
17
|
-
@name = options[:name]
|
18
|
-
@manga = options[:manga]
|
19
|
-
@chapter = options[:chapter]
|
20
|
-
|
21
|
-
@adapter = Mangdown.adapter!(uri, site, nil, name)
|
22
|
-
|
23
|
-
@uri = Addressable::URI.escape(uri)
|
24
|
-
@site = adapter.site
|
25
|
-
end
|
26
|
-
|
27
|
-
def to_manga_list
|
28
|
-
type_error('manga_list') unless adapter.is_manga_list?
|
29
|
-
|
30
|
-
list = MangaList.new
|
31
|
-
list.load_manga(uri)
|
32
|
-
list
|
33
|
-
end
|
34
|
-
|
35
|
-
def to_manga
|
36
|
-
type_error('manga') unless adapter.is_manga?
|
37
|
-
|
38
|
-
fill_properties(adapter.manga) if name.to_s.empty?
|
39
|
-
|
40
|
-
manga = Manga.new(uri, name)
|
41
|
-
manga.adapter = adapter
|
42
|
-
manga.load_chapters
|
43
|
-
manga
|
44
|
-
end
|
45
|
-
|
46
|
-
def to_chapter
|
47
|
-
type_error('chapter') unless adapter.is_chapter?
|
48
|
-
|
49
|
-
if name.to_s.empty? || manga.to_s.empty? || chapter.to_s.empty?
|
50
|
-
fill_properties(adapter.chapter)
|
51
|
-
end
|
52
|
-
|
53
|
-
number = chapter
|
54
|
-
|
55
|
-
chapter = Chapter.new(uri, name, manga, number)
|
56
|
-
chapter.adapter = adapter
|
57
|
-
chapter.load_pages
|
58
|
-
chapter
|
59
|
-
end
|
60
|
-
|
61
|
-
def to_page
|
62
|
-
type_error('page') unless adapter.is_page?
|
63
|
-
|
64
|
-
Page.new(uri, name, manga, chapter)
|
65
|
-
end
|
66
|
-
|
67
|
-
private
|
68
|
-
|
69
|
-
def type_error(type)
|
70
|
-
raise Mangdown::Error, "This is not a known #{type} type"
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Mangdown
|
4
|
-
# Provide hash-like access for object attributes
|
5
|
-
module Properties
|
6
|
-
def self.included(base)
|
7
|
-
base.extend(ClassMethods)
|
8
|
-
end
|
9
|
-
|
10
|
-
def properties
|
11
|
-
keys = self.class.properties
|
12
|
-
values = keys.map { |name| self[name] }
|
13
|
-
Hash[keys.zip(values)]
|
14
|
-
end
|
15
|
-
alias to_hash properties
|
16
|
-
|
17
|
-
def fill_properties(other)
|
18
|
-
other.each do |property, value|
|
19
|
-
self[property] = value if self[property].to_s.empty?
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def [](key)
|
24
|
-
instance_variable_get("@#{key}")
|
25
|
-
end
|
26
|
-
|
27
|
-
def []=(key, value)
|
28
|
-
instance_variable_set("@#{key}", value)
|
29
|
-
end
|
30
|
-
|
31
|
-
def inspect
|
32
|
-
properties.inspect
|
33
|
-
end
|
34
|
-
|
35
|
-
def to_s
|
36
|
-
properties.to_s
|
37
|
-
end
|
38
|
-
|
39
|
-
# Macro for setting property names
|
40
|
-
module ClassMethods
|
41
|
-
def properties(*names)
|
42
|
-
@properties ||= []
|
43
|
-
return @properties if names.empty?
|
44
|
-
|
45
|
-
@properties.concat(names).uniq!
|
46
|
-
attr_accessor(*names)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,117 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
module Mangdown
|
4
|
-
class AdapterTest < Minitest::Test
|
5
|
-
def bogus_adapter(&block)
|
6
|
-
Class.new(Mangdown::Adapter::Base, &block)
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_adapter
|
10
|
-
TestAdapter.new(:uri, :doc, :name)
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_public_api
|
14
|
-
class_methods = %w{ for? site }
|
15
|
-
instance_methods = %w{ uri name doc site is_manga_list? is_manga? is_chapter? is_page? manga_list manga chapter_list chapter page_list page }
|
16
|
-
|
17
|
-
adapter = bogus_adapter
|
18
|
-
class_methods.each do |method|
|
19
|
-
assert adapter.respond_to?(method, false)
|
20
|
-
end
|
21
|
-
|
22
|
-
instance = adapter.new(:uri, :doc, :name)
|
23
|
-
instance_methods.each do |method|
|
24
|
-
assert instance.respond_to?(method, false)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_set_site
|
29
|
-
adapter = bogus_adapter do
|
30
|
-
site "test site"
|
31
|
-
end
|
32
|
-
|
33
|
-
assert_equal "test site", adapter.site
|
34
|
-
end
|
35
|
-
|
36
|
-
# Test the test adapter?
|
37
|
-
def test_for_accepts_anything
|
38
|
-
assert TestAdapter.for?(:anything)
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_methods_that_always_respond_true
|
42
|
-
adapter = test_adapter
|
43
|
-
|
44
|
-
assert adapter.is_manga_list?
|
45
|
-
assert adapter.is_manga?
|
46
|
-
assert adapter.is_chapter?
|
47
|
-
assert adapter.is_page?
|
48
|
-
|
49
|
-
assert adapter.is_manga_list?(:anything)
|
50
|
-
assert adapter.is_manga?(:anything)
|
51
|
-
assert adapter.is_chapter?(:anything)
|
52
|
-
assert adapter.is_page?(:anything)
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_manga_list_returns_array_of_hashes
|
56
|
-
adapter = test_adapter
|
57
|
-
|
58
|
-
list = adapter.manga_list
|
59
|
-
|
60
|
-
assert_respond_to list, :to_ary
|
61
|
-
assert_respond_to list.first, :to_hash
|
62
|
-
assert_equal [:uri, :name, :site].sort, list.first.keys.sort
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_manga_returns_a_hash
|
66
|
-
adapter = test_adapter
|
67
|
-
|
68
|
-
manga = adapter.manga
|
69
|
-
|
70
|
-
assert_respond_to manga, :to_hash
|
71
|
-
assert_equal [:uri, :name, :site].sort, manga.keys.sort
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_chapter_list_returns_array_of_hashes
|
75
|
-
adapter = test_adapter
|
76
|
-
|
77
|
-
list = adapter.chapter_list
|
78
|
-
|
79
|
-
assert_respond_to list, :to_ary
|
80
|
-
assert_respond_to list.first, :to_hash
|
81
|
-
assert_equal [:uri, :name, :site].sort, list.first.keys.sort
|
82
|
-
end
|
83
|
-
|
84
|
-
def test_chapter_returns_a_hash
|
85
|
-
adapter = test_adapter
|
86
|
-
|
87
|
-
chapter = adapter.chapter
|
88
|
-
keys = [:uri, :name, :site, :manga, :chapter].sort
|
89
|
-
|
90
|
-
assert_respond_to chapter, :to_hash
|
91
|
-
assert_equal keys, chapter.keys.sort
|
92
|
-
end
|
93
|
-
|
94
|
-
def test_page_list_returns_array_of_hashes
|
95
|
-
adapter = test_adapter
|
96
|
-
|
97
|
-
list = adapter.page_list
|
98
|
-
|
99
|
-
assert_respond_to list, :to_ary
|
100
|
-
assert_respond_to list.first, :to_hash
|
101
|
-
assert_equal [:uri, :name, :site].sort, list.first.keys.sort
|
102
|
-
end
|
103
|
-
|
104
|
-
def test_page_returns_a_hash
|
105
|
-
adapter = test_adapter
|
106
|
-
|
107
|
-
page = adapter.page
|
108
|
-
|
109
|
-
assert_respond_to page, :to_hash
|
110
|
-
assert_equal [:uri, :name, :site].sort, page.keys.sort
|
111
|
-
end
|
112
|
-
|
113
|
-
def test_doc
|
114
|
-
assert_equal :doc, test_adapter.doc
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
module Mangdown
|
4
|
-
class MangaListTest < Minitest::Test
|
5
|
-
def setup
|
6
|
-
hashes = Array.new(5, { uri: '' })
|
7
|
-
@list = MangaList.new(hashes)
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_manga_list_manga
|
11
|
-
assert_equal 5, @list.manga.length
|
12
|
-
assert @list.manga.all? { |manga| manga.is_a?(MDHash) }
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_each
|
16
|
-
count = 0
|
17
|
-
@list.manga.each do |manga|
|
18
|
-
count += 1
|
19
|
-
assert manga.is_a?(MDHash)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_to_yaml
|
24
|
-
yaml = @list.to_yaml
|
25
|
-
hashes = YAML.load(yaml)
|
26
|
-
|
27
|
-
assert_equal 5, hashes.length
|
28
|
-
assert hashes.all? { |hash| hash.is_a?(Hash) }
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_load_manga
|
32
|
-
count = @list.manga.length
|
33
|
-
@list.load_manga('uri')
|
34
|
-
|
35
|
-
assert @list.manga.length > count
|
36
|
-
assert @list.manga.all? { |manga| manga.is_a?(MDHash) }
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_array_conversions
|
40
|
-
assert_equal @list.to_a, @list.to_ary
|
41
|
-
assert_equal @list.manga, @list.to_a
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_merge
|
45
|
-
assert_equal @list.to_a.length * 2, @list.merge(@list).to_a.length
|
46
|
-
assert_instance_of MangaList, @list.merge(MangaList.new)
|
47
|
-
assert @list.manga.all? { |manga| manga.is_a?(MDHash) }
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|