mangdown 0.14.0 → 0.14.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,109 @@
1
+ require 'test_helper'
2
+ require 'webmock/minitest'
3
+
4
+ module Mangdown
5
+ class ToolsTest < Minitest::Test
6
+ UriStruct = Struct.new(:uri)
7
+
8
+ def test_get_doc
9
+ url = 'http://www.anything.com/'
10
+ stub_request(:get, url).to_return(body: '<html><body>Body</body>')
11
+
12
+ doc = Tools.get_doc(url)
13
+ assert_equal 'Body', doc.css('body').text
14
+ end
15
+
16
+ def test_get
17
+ url = 'http://www.anything.com/'
18
+ stub_request(:get, url).to_return(body: 'Body')
19
+
20
+ body = Tools.get(url)
21
+ assert_equal 'Body', body
22
+ end
23
+
24
+ def test_get_root
25
+ url_with_path = 'http://www.anything.com/path/to/something'
26
+ url_with_slash = 'http://www.anything.com/'
27
+ url = 'http://www.anything.com'
28
+
29
+ assert_equal url, Tools.get_root(url)
30
+ assert_equal url, Tools.get_root(url_with_slash)
31
+ assert_equal url, Tools.get_root(url_with_path)
32
+ end
33
+
34
+ def test_relative_or_absolute_path
35
+ absolute = %w(/root to this path)
36
+ relative = %w(relative path from here)
37
+
38
+ absolute_path = Tools.relative_or_absolute_path(*absolute)
39
+ relative_path = Tools.relative_or_absolute_path(*relative)
40
+
41
+ assert_equal '/root/to/this/path', absolute_path.to_s
42
+ assert_equal Dir.pwd + '/relative/path/from/here', relative_path.to_s
43
+ end
44
+
45
+ def test_valid_path_name
46
+ assert_equal 'Name 00001.ext', Tools.valid_path_name('Name 001.ext')
47
+ assert_equal 'Name 00001', Tools.valid_path_name('Name 001')
48
+ assert_equal 'Name 00001', Tools.valid_path_name('Name 1')
49
+ assert_equal 'Name 00001', Tools.valid_path_name('Name 00000000001')
50
+ assert_equal '100 Name', Tools.valid_path_name('100 Name')
51
+ assert_equal 'Name 100 Name', Tools.valid_path_name('Name 100 Name')
52
+ assert_equal 'Name', Tools.valid_path_name('Name')
53
+ assert_equal(
54
+ 'Name 10000000000', Tools.valid_path_name('Name 10000000000')
55
+ )
56
+ assert_equal(
57
+ '/path/to/Name 00001', Tools.valid_path_name('/path/to/Name 001')
58
+ )
59
+ end
60
+
61
+ def test_file_type
62
+ image_dir = Pathname.new(
63
+ File.expand_path('../../../fixtures/images', __dir__)
64
+ )
65
+
66
+ assert_equal 'jpeg', Tools.image_extension(image_dir.join('naruto.jpg'))
67
+ assert_equal 'png', Tools.image_extension(image_dir.join('naruto.png'))
68
+ assert_equal 'gif', Tools.image_extension(image_dir.join('naruto.gif'))
69
+ end
70
+
71
+ def test_hydra_streaming
72
+ objects = 3.times.map do |i|
73
+ url = "http://www.anything-#{i}.com/"
74
+ stub_request(:get, url).to_return(
75
+ body: "<html><body>Body-#{i}</body>"
76
+ )
77
+ UriStruct.new(url)
78
+ end
79
+
80
+ url = 'http://www.fail.com/'
81
+ objects << UriStruct.new(url)
82
+ stub_request(:get, url).to_return(status: 404)
83
+
84
+ bodies = []
85
+ fails = []
86
+ complete = []
87
+
88
+ Tools.hydra_streaming(objects) do |status, object, data=nil|
89
+ case status
90
+ when :before
91
+ return true unless objects.index(object) == 1
92
+ when :succeeded
93
+ # Do nothing
94
+ when :failed
95
+ fails << object
96
+ when :complete
97
+ complete << object
98
+ when :body
99
+ bodies << data
100
+ end
101
+ end
102
+
103
+ assert_equal ['Body-0', 'Body-2'], bodies.sort
104
+ assert_equal [objects.delete(3)], fails
105
+ refute_includes complete, objects.delete(1)
106
+ assert_equal objects, complete
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,41 @@
1
+ require 'test_helper'
2
+
3
+ class MangdownTest < Minitest::Test
4
+
5
+ def doc
6
+ Nokogiri::HTML("<html></html>")
7
+ end
8
+
9
+ def test_register_adapter
10
+ adapters_before = Mangdown::ADAPTERS.length
11
+
12
+ bogus = Class.new(Mangdown::Adapter::Base)
13
+
14
+ Mangdown.register_adapter(:bogus_adapter, bogus)
15
+
16
+ assert Mangdown::ADAPTERS.length == adapters_before + 1
17
+
18
+ Mangdown::ADAPTERS.delete(:bogus_adapter)
19
+ end
20
+
21
+ def test_adapter
22
+ assert_equal TestAdapter, Mangdown.adapter(:test)
23
+ end
24
+
25
+ def test_adapter!
26
+ assert_instance_of TestAdapter, Mangdown.adapter!("test")
27
+ assert_instance_of TestAdapter, Mangdown.adapter!(nil, "test")
28
+ assert_instance_of TestAdapter, Mangdown.adapter!(
29
+ "test", nil, doc, "test"
30
+ )
31
+
32
+ adapters = Mangdown::ADAPTERS.dup
33
+ Mangdown::ADAPTERS.clear
34
+
35
+ assert_raises(Mangdown::Adapter::NoAdapterError) {
36
+ Mangdown.adapter!(nil)
37
+ }
38
+
39
+ Mangdown::ADAPTERS.merge!(adapters)
40
+ end
41
+ end
@@ -0,0 +1,105 @@
1
+ class TestAdapter < Mangdown::Adapter::Base
2
+
3
+ site :test
4
+
5
+ def self.for?(url_or_site)
6
+ true
7
+ end
8
+
9
+ # Overwrite if you want to check the uri if it belongs to a manga list
10
+ def is_manga_list?(uri = @uri)
11
+ true
12
+ end
13
+
14
+ # Must return true/false if uri represents a manga for adapter
15
+ def is_manga?(uri = @uri)
16
+ true
17
+ end
18
+
19
+ # Must return true/false if uri represents a chapter for adapter
20
+ def is_chapter?(uri = @uri)
21
+ true
22
+ end
23
+
24
+ # Must return true/false if uri represents a page for adapter
25
+ def is_page?(uri = @uri)
26
+ true
27
+ end
28
+
29
+ # Return Array of Hash with keys: :uri, :name, :site
30
+ def manga_list
31
+ [
32
+ { uri: "http://www.manga.com/naruto", name: "Naruto", site: site },
33
+ { uri: "http://www.manga.com/bleach", name: "Bleach", site: site },
34
+ { uri: "http://www.manga.com/one-piece", name: "One Piece", site: site }
35
+ ]
36
+ end
37
+
38
+ # Return Hash with keys: :uri, :name, :site
39
+ def manga
40
+ { uri: "http://www.manga.com/naruto", name: "Naruto", site: site }
41
+ end
42
+
43
+ # Return Array of Hash with keys: :uri, :name, :site
44
+ def chapter_list
45
+ [
46
+ { uri: "http://www.manga.com/naruto/1", name: "Naruto", site: site },
47
+ { uri: "http://www.manga.com/naruto/2", name: "Naruto", site: site },
48
+ { uri: "http://www.manga.com/naruto/3", name: "Naruto", site: site },
49
+ { uri: "http://www.manga.com/naruto/4", name: "Naruto", site: site },
50
+ { uri: "http://www.manga.com/naruto/5", name: "Naruto", site: site }
51
+ ]
52
+ end
53
+
54
+ # Return Hash with keys: :uri, :name, :chapter, :manga, :site
55
+ def chapter
56
+ { uri: "http://www.manga.com/naruto/2",
57
+ name: "Naruto - Chapter 2",
58
+ chapter: 2,
59
+ manga: "Naruto",
60
+ site: site
61
+ }
62
+ end
63
+
64
+ # Return Array of Hash with keys: :uri, :name, :site
65
+ def page_list
66
+ [
67
+ {
68
+ uri: "http://www.manga.com/naruto/2/page/1",
69
+ name: "Naruto - Chapter 2 - page 1",
70
+ site: site
71
+ },
72
+ {
73
+ uri: "http://www.manga.com/naruto/2/page/2",
74
+ name: "Naruto - Chapter 2 - page 2",
75
+ site: site
76
+ },
77
+ {
78
+ uri: "http://www.manga.com/naruto/2/page/3",
79
+ name: "Naruto - Chapter 2 - page 3",
80
+ site: site
81
+ },
82
+ {
83
+ uri: "http://www.manga.com/naruto/2/page/4",
84
+ name: "Naruto - Chapter 2 - page 4",
85
+ site: site
86
+ },
87
+ {
88
+ uri: "http://www.manga.com/naruto/2/page/5",
89
+ name: "Naruto - Chapter 2 - page 5",
90
+ site: site
91
+ }
92
+ ]
93
+ end
94
+
95
+ # Return Hash with keys: :uri, :name, :site
96
+ def page
97
+ path = File.expand_path("../fixtures/images/naruto.jpg", __FILE__)
98
+ { uri: path, name: "Naruto - Chapter 2 - page 2", site: site }
99
+ end
100
+
101
+ def doc
102
+ @doc
103
+ end
104
+ end
105
+
@@ -0,0 +1,8 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/pride'
3
+
4
+ require 'mangdown'
5
+
6
+ require_relative 'support/test_adapter'
7
+
8
+ Mangdown.register_adapter(:test, TestAdapter)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mangdown
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.14.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - jphager2
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-14 00:00:00.000000000 Z
11
+ date: 2017-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: typhoeus
@@ -16,56 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.7.1
19
+ version: '0.7'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.7.1
26
+ version: '0.7'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: nokogiri
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.6.0
33
+ version: '1.6'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.6.0
40
+ version: '1.6'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rubyzip
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.1.0
47
+ version: '1.1'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.1.0
55
- - !ruby/object:Gem::Dependency
56
- name: progress_bar
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: 1.0.3
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: 1.0.3
54
+ version: '1.1'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: ruby-filemagic
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -95,7 +81,7 @@ dependencies:
95
81
  - !ruby/object:Gem::Version
96
82
  version: '0'
97
83
  - !ruby/object:Gem::Dependency
98
- name: vcr
84
+ name: rake
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - ">="
@@ -109,20 +95,20 @@ dependencies:
109
95
  - !ruby/object:Gem::Version
110
96
  version: '0'
111
97
  - !ruby/object:Gem::Dependency
112
- name: rake
98
+ name: minitest
113
99
  requirement: !ruby/object:Gem::Requirement
114
100
  requirements:
115
- - - ">="
101
+ - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: '0'
103
+ version: '5.0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
- - - ">="
108
+ - - "~>"
123
109
  - !ruby/object:Gem::Version
124
- version: '0'
125
- description: A gem to download Manga
110
+ version: '5.0'
111
+ description: Download Manga
126
112
  email: jphager2@gmail.com
127
113
  executables: []
128
114
  extensions: []
@@ -134,18 +120,30 @@ files:
134
120
  - lib/mangdown/adapter.rb
135
121
  - lib/mangdown/adapter/mangareader.rb
136
122
  - lib/mangdown/adapter/no_adapter_error.rb
137
- - lib/mangdown/cbz.rb
138
123
  - lib/mangdown/chapter.rb
139
124
  - lib/mangdown/client.rb
140
- - lib/mangdown/equality.rb
141
125
  - lib/mangdown/manga.rb
142
126
  - lib/mangdown/manga_list.rb
143
127
  - lib/mangdown/md_hash.rb
144
128
  - lib/mangdown/page.rb
145
- - lib/mangdown/properties.rb
146
- - lib/mangdown/tools.rb
147
- - lib/mangdown/uri.rb
129
+ - lib/mangdown/support/cbz.rb
130
+ - lib/mangdown/support/equality.rb
131
+ - lib/mangdown/support/logging.rb
132
+ - lib/mangdown/support/properties.rb
133
+ - lib/mangdown/support/tools.rb
148
134
  - lib/mangdown/version.rb
135
+ - test/lib/mangdown/adapter_test.rb
136
+ - test/lib/mangdown/chapter_test.rb
137
+ - test/lib/mangdown/manga_list_test.rb
138
+ - test/lib/mangdown/manga_test.rb
139
+ - test/lib/mangdown/support/cbz_test.rb
140
+ - test/lib/mangdown/support/equality_test.rb
141
+ - test/lib/mangdown/support/logging_test.rb
142
+ - test/lib/mangdown/support/properties_test.rb
143
+ - test/lib/mangdown/support/tools_test.rb
144
+ - test/lib/mangdown_test.rb
145
+ - test/support/test_adapter.rb
146
+ - test/test_helper.rb
149
147
  homepage: https://github.com/jphager2/mangdown
150
148
  licenses:
151
149
  - MIT
@@ -166,8 +164,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
164
  version: '0'
167
165
  requirements: []
168
166
  rubyforge_project:
169
- rubygems_version: 2.2.2
167
+ rubygems_version: 2.5.1
170
168
  signing_key:
171
169
  specification_version: 4
172
- summary: Downloads Manga
170
+ summary: Download Manga
173
171
  test_files: []
data/lib/mangdown/cbz.rb DELETED
@@ -1,60 +0,0 @@
1
- module Mangdown
2
- module CBZ
3
- extend self
4
- extend ::Mangdown::Tools
5
-
6
- def all(main_dir)
7
- main_dir = String(main_dir)
8
- # Make sure all sub dirs are checked
9
- validate_file_or_dir_names(main_dir)
10
- # Make sure all sub dirs have files checked
11
- each_dir_or_page(main_dir) { |dir| validate_file_or_dir_names(dir)}
12
- # Create cbz files for all sub dirs
13
- cbz_sub_dirs(main_dir)
14
- end
15
-
16
- def one(dir)
17
- dir = String(dir)
18
- validate_file_or_dir_names(dir)
19
- cbz_dir(dir)
20
- end
21
-
22
- private
23
- def cbz_dir(dir)
24
- dir = dir.to_s.sub(/\/*$/, "")
25
-
26
- zip_file_name = dir + '.cbz'
27
- return if File.exist?(zip_file_name)
28
-
29
- ::Zip::File.open(zip_file_name, ::Zip::File::CREATE) do |zip|
30
- file_matcher = File.join(dir, '**', '**')
31
- dir << "/"
32
-
33
- Dir.glob(file_matcher).each do |file|
34
- filename = file.sub(dir, '')
35
- zip.add(filename, file)
36
- end
37
- end
38
- end
39
-
40
- def cbz_sub_dirs(dir)
41
- each_dir_or_page(dir) do |sub_dir|
42
- cbz_dir(sub_dir)
43
- end
44
- end
45
-
46
- def each_dir_or_page(dir)
47
- Dir.glob(dir + '/*').each do |filename|
48
- next if filename.include?('.cbz')
49
- yield(filename)
50
- end
51
- end
52
-
53
- def validate_file_or_dir_names(dir)
54
- each_dir_or_page(dir) do |file_name|
55
- checked_name = Tools.valid_path_name(file_name)
56
- File.rename(file_name, checked_name)
57
- end
58
- end
59
- end
60
- end
@@ -1,38 +0,0 @@
1
- module Mangdown
2
- module Properties
3
-
4
- def self.included(base)
5
- base.extend(ClassMethods)
6
- end
7
-
8
- def properties
9
- @_properties ||= {}
10
- end
11
-
12
- def [](key)
13
- properties[key]
14
- end
15
-
16
- def inspect
17
- properties.inspect
18
- end
19
-
20
- def to_s
21
- properties.to_s
22
- end
23
-
24
- module ClassMethods
25
- def properties(*names)
26
- names.each do |name|
27
- define_method(name) do
28
- properties[name]
29
- end
30
-
31
- define_method("#{name}=") do |other|
32
- properties[name] = other
33
- end
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,97 +0,0 @@
1
- require 'pathname'
2
- require 'typhoeus'
3
-
4
- module Mangdown
5
- module Tools
6
- extend self
7
-
8
- def get_doc(uri)
9
- data = get(uri)
10
- @doc = ::Nokogiri::HTML(data)
11
- end
12
-
13
- def get(uri)
14
- Typhoeus.get(uri).body
15
- end
16
-
17
- def get_root(uri)
18
- @root = ::URI::join(uri, "/").to_s[0..-2]
19
- end
20
-
21
- def relative_or_absolute_path(*sub_paths)
22
- root = (sub_paths.first.to_s =~ /^\// ? sub_paths.shift : Dir.pwd)
23
- Pathname.new(root).join(*sub_paths)
24
- end
25
-
26
- def valid_path_name(name)
27
- number_matcher = /(\d+)(\.\w+)*\Z/
28
- num = name.to_s.slice(number_matcher, 1)
29
-
30
- if num
31
- num = num.rjust(5, "0")
32
- name.sub(number_matcher, num + '\2')
33
- else
34
- name
35
- end
36
- end
37
-
38
- def file_type(path)
39
- FileMagic.new.file(path.to_s).slice(/^\w+/).downcase
40
- end
41
-
42
- def hydra_streaming(objects)
43
- hydra = Typhoeus::Hydra.hydra
44
-
45
- requests = objects.map { |obj|
46
- next unless yield(:before, obj)
47
-
48
- request = Typhoeus::Request.new(obj.uri)
49
- request.on_headers do |response|
50
- status = response.success? ? :succeeded : :failed
51
- yield(status, obj)
52
- end
53
- request.on_body do |chunk|
54
- yield(:body, obj, chunk)
55
- end
56
- request.on_complete do |response|
57
- yield(:complete, obj)
58
- end
59
-
60
- hydra.queue(request)
61
- request
62
- }.compact
63
-
64
- hydra.run
65
- requests
66
- end
67
-
68
- def hydra(objects)
69
- hydra = Typhoeus::Hydra.hydra
70
-
71
- requests = objects.map {|obj|
72
- request = Typhoeus::Request.new(obj.uri)
73
- request.on_complete do |response|
74
- if response.success?
75
- yield(obj, response.body) if block_given?
76
- elsif response.timed_out?
77
- STDERR.puts "#{obj.uri}: got a time out"
78
- elsif response.code == 0
79
- STDERR.puts "#{obj.uri}: #{response.return_message}"
80
- else
81
- STDERR.puts "#{obj.uri}: " +
82
- "HTTP request failed: #{response.code.to_s} \n" +
83
- "But maybe it succeeded..."
84
- if response.body
85
- yield(obj, response.body) if block_given?
86
- end
87
- end
88
- end
89
- hydra.queue(request)
90
- request
91
- }
92
-
93
- hydra.run
94
- requests
95
- end
96
- end
97
- end
data/lib/mangdown/uri.rb DELETED
@@ -1,8 +0,0 @@
1
- module Mangdown::Uri
2
-
3
- extend self
4
-
5
- def new(uri)
6
- URI.encode(uri, '[]')
7
- end
8
- end