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