util 0.2.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +177 -24
- data/lib/util.rb +4 -0
- data/lib/util/args.rb +138 -0
- data/lib/util/console_logger.rb +11 -11
- data/lib/util/downloader.rb +157 -0
- data/lib/util/i18n.rb +8 -9
- data/lib/util/lists/iso639.rb +6 -6
- data/lib/util/result.rb +175 -0
- data/test/unit/args.rb +22 -0
- data/test/unit/downloader.rb +145 -0
- data/test/unit/downloader/orig/simple.html +7 -0
- data/test/unit/result.rb +180 -0
- metadata +9 -3
- data/lib/util/arg.rb +0 -90
@@ -0,0 +1,157 @@
|
|
1
|
+
module Util
|
2
|
+
# A helper to safely dowload a file. Can be dowloaded to an actual file,
|
3
|
+
# or directly parsed by another gem (e. g. +Nokogiri+).
|
4
|
+
# @example
|
5
|
+
# require 'oga' # Must be required by the user, `Util` will not do it
|
6
|
+
# url = 'https://www.perdu.com/'
|
7
|
+
# html = Util::Downloader.new(url).set_dest(Oga)
|
8
|
+
# html.download # => Util::Result.ok
|
9
|
+
# html.data.at_css('h1').text # 'Perdu sur l\'Internet ?'
|
10
|
+
#
|
11
|
+
# url = 'https://gitlab.com/uploads/-/system/user/avatar/5582173/avatar.png'
|
12
|
+
# Util::Downloader.new(url).set_name('guillel.png').set_force.download
|
13
|
+
class Downloader
|
14
|
+
attr_reader :data
|
15
|
+
attr_reader :dest
|
16
|
+
attr_reader :force
|
17
|
+
attr_reader :name
|
18
|
+
attr_reader :ref
|
19
|
+
attr_reader :url
|
20
|
+
|
21
|
+
# @no_doc
|
22
|
+
ALLOWED = [:data, :force, :url]
|
23
|
+
# @no_doc
|
24
|
+
DEFAULT_OPTIONS = {
|
25
|
+
:dest => '.',
|
26
|
+
:name => '',
|
27
|
+
:ref => '',
|
28
|
+
}
|
29
|
+
|
30
|
+
# Create a new helper to safely download a file.
|
31
|
+
# @param url [String] URL of the page to download
|
32
|
+
# @param opts [#to_h] download options
|
33
|
+
# @option opts [String, Class] :dest the directory in which to download,
|
34
|
+
# or the class with which to parse it
|
35
|
+
# @option opts [Boolean] :force whether to replace an existing file
|
36
|
+
# @option opts [String] :name name under which to save the file
|
37
|
+
# @option opts [String] :ref referer to use while downloading
|
38
|
+
# @return [self]
|
39
|
+
def initialize url, opts={}
|
40
|
+
require 'util/args'
|
41
|
+
@url, opts = Util::Args.check url, String, '', opts, Hash, {}
|
42
|
+
opts[:force] === true ? set_force : unset_force
|
43
|
+
|
44
|
+
DEFAULT_OPTIONS.each_pair do |k, v|
|
45
|
+
self.method('set_' + k.to_s).call (opts[k].nil? ? v : opts[k])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Actually download the file, according to the given options.
|
50
|
+
# @return [Util::Result]
|
51
|
+
def download
|
52
|
+
require 'open-uri'
|
53
|
+
require 'util/result'
|
54
|
+
|
55
|
+
return Util::Result.err :no_url, self if @url.empty?
|
56
|
+
@name = File.basename URI(@url).path if @name.empty?
|
57
|
+
@name = 'index.html' if @name.empty? or @name == '/'
|
58
|
+
|
59
|
+
if @dest.is_a?(String) then
|
60
|
+
return Util::Result.err :no_dir, self unless File.directory? @dest
|
61
|
+
return Util::Result.err :file_exists, self if not @force \
|
62
|
+
and File.exists?(File.join @dest, @name)
|
63
|
+
end
|
64
|
+
|
65
|
+
begin
|
66
|
+
io = @ref.empty? ? URI.open(@url) : URI.open(@url, 'Referer' => @ref)
|
67
|
+
case @dest.to_s
|
68
|
+
when 'Magick' then @data = Magick::Image.from_blob io.read
|
69
|
+
when 'Nokogiri' then @data = Nokogiri::HTML io
|
70
|
+
when 'Nokogiri::HTML' then @data = Nokogiri::HTML io
|
71
|
+
when 'Nokogiri::XML' then @data = Nokogiri::XML io
|
72
|
+
when 'Oga' then @data = Oga.parse_html io
|
73
|
+
when 'Oga::HTML' then @data = Oga.parse_html io
|
74
|
+
when 'Oga::XML' then @data = Oga.parse_xml io
|
75
|
+
when 'REXML' then @data = REXML::Document.new io
|
76
|
+
else
|
77
|
+
if @dest.respond_to? :parse then
|
78
|
+
@data = @dest.parse io
|
79
|
+
elsif @dest.respond_to? :read then
|
80
|
+
@data = @dest.read io
|
81
|
+
else
|
82
|
+
IO.copy_stream(io, File.join(@dest, @name))
|
83
|
+
end
|
84
|
+
end
|
85
|
+
rescue Exception => e
|
86
|
+
return Util::Result.err e, self
|
87
|
+
end
|
88
|
+
|
89
|
+
Util::Result.ok
|
90
|
+
end
|
91
|
+
|
92
|
+
# Return the value of one of the options, the URL, or the parsed web page.
|
93
|
+
# @param key [#to_sym] the attribute to read
|
94
|
+
# @return [Object] if succesfull
|
95
|
+
# @return [nil] if +key+ cannot be converted to a symbol, or is not part
|
96
|
+
# of the allowed attributes to read
|
97
|
+
def [] key
|
98
|
+
require 'util/args'
|
99
|
+
key = Util::Args.check key, Symbol, nil
|
100
|
+
return nil if key.nil?
|
101
|
+
return nil unless (DEFAULT_OPTIONS.keys + ALLOWED).include? key
|
102
|
+
instance_variable_get('@' + key.to_s)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Set the directory in which to download the file, or the class with
|
106
|
+
# which to parse it. Currently accepted class are the following.
|
107
|
+
# - +Magick+ (will try to parse a +Magick::Image+).
|
108
|
+
# - +Nokogiri::HTML+ or its alias +Nokogiri+.
|
109
|
+
# - +Nokogiri::XML+.
|
110
|
+
# - +Oga::HTML+ or its alias +Oga+.
|
111
|
+
# - +Oga::XML+.
|
112
|
+
# - +REXML+.
|
113
|
+
# - Any class that responds to +parse+.
|
114
|
+
# - Any class that responds to +read+.
|
115
|
+
# Please note that with the last two, the methods are tried in this
|
116
|
+
# order, and the result might not be what would be expected, especially
|
117
|
+
# if the given method does not accept an +IO+ object.
|
118
|
+
# @param dir [Module] path to the directory, or if the file shall not
|
119
|
+
# be saved, the class that shall parse it
|
120
|
+
# @return [self]
|
121
|
+
def set_dest dir=DEFAULT_OPTIONS[:dest]
|
122
|
+
@dest = dir.is_a?(Module) ? dir : dir.to_s
|
123
|
+
self
|
124
|
+
end
|
125
|
+
|
126
|
+
# Set {download} to replace the destination file if it already exists.
|
127
|
+
# @return [self]
|
128
|
+
def set_force
|
129
|
+
@force = true
|
130
|
+
self
|
131
|
+
end
|
132
|
+
|
133
|
+
# Set {download} to not replace the destination file if it already exists.
|
134
|
+
# @return [self]
|
135
|
+
def unset_force
|
136
|
+
@force = false
|
137
|
+
self
|
138
|
+
end
|
139
|
+
|
140
|
+
# Set the name under which to save the file. If the given name is
|
141
|
+
# empty, defaults to the same name as in the remote location.
|
142
|
+
# @param n [String] the file name
|
143
|
+
# @return [self]
|
144
|
+
def set_name n=DEFAULT_OPTIONS[:name]
|
145
|
+
@name = n.to_s
|
146
|
+
self
|
147
|
+
end
|
148
|
+
|
149
|
+
# Set the referer to use while downloading.
|
150
|
+
# @param r [String] the referer
|
151
|
+
# @return [self]
|
152
|
+
def set_ref r=DEFAULT_OPTIONS[:ref]
|
153
|
+
@ref = r.to_s
|
154
|
+
self
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
data/lib/util/i18n.rb
CHANGED
@@ -53,10 +53,10 @@ module Util
|
|
53
53
|
return ''
|
54
54
|
end
|
55
55
|
|
56
|
-
require 'util/
|
57
|
-
id
|
58
|
-
o_lang, o_mod =
|
59
|
-
|
56
|
+
require 'util/args'
|
57
|
+
id = Util::Args.check id, String, ''
|
58
|
+
o_lang, o_mod = Util::Opts.check opts, :lang, Symbol, @default_lang, \
|
59
|
+
:mod, String, @last_used_mod
|
60
60
|
|
61
61
|
mod = o_mod.empty? ? @last_used_mod : o_mod
|
62
62
|
mod = @messages.keys[0] if mod.empty?
|
@@ -194,12 +194,11 @@ module Util
|
|
194
194
|
# @return [String, String, Boolean, Boolean] success
|
195
195
|
# @return [false] failure
|
196
196
|
def self.register_check_args o_name, path, relative, recursive
|
197
|
-
require 'util/
|
197
|
+
require 'util/args'
|
198
198
|
init unless initialized?
|
199
|
-
name, path, relative, recursive =
|
200
|
-
|
201
|
-
|
202
|
-
]
|
199
|
+
name, path, relative, recursive = Util::Args.check \
|
200
|
+
o_name, String, '', path, String, '', \
|
201
|
+
relative, FalseClass, true, recursive, TrueClass, false
|
203
202
|
return false if check_t name.empty?, :reg_no_name, o_name
|
204
203
|
|
205
204
|
path = relative ? './temp.rb' : '.' if path.empty?
|
data/lib/util/lists/iso639.rb
CHANGED
@@ -79,8 +79,8 @@ module Util
|
|
79
79
|
# @return [:dep, :priv, :val, nil]
|
80
80
|
def self.category code
|
81
81
|
init if @complete.nil?
|
82
|
-
require 'util/
|
83
|
-
code =
|
82
|
+
require 'util/args'
|
83
|
+
code = Util::Args.check code, Symbol, false
|
84
84
|
return nil unless code
|
85
85
|
|
86
86
|
info = @complete[code]
|
@@ -129,8 +129,8 @@ module Util
|
|
129
129
|
# @return [Symbol]
|
130
130
|
def self.from1 code
|
131
131
|
init if @complete.nil?
|
132
|
-
require 'util/
|
133
|
-
code =
|
132
|
+
require 'util/args'
|
133
|
+
code = Util::Args.check code, Symbol, false
|
134
134
|
@from1[code]
|
135
135
|
end
|
136
136
|
|
@@ -139,8 +139,8 @@ module Util
|
|
139
139
|
# @return [Symbol]
|
140
140
|
def self.from2 code
|
141
141
|
init if @complete.nil?
|
142
|
-
require 'util/
|
143
|
-
code =
|
142
|
+
require 'util/args'
|
143
|
+
code = Util::Args.check code, Symbol, false
|
144
144
|
@from2[code]
|
145
145
|
end
|
146
146
|
end
|
data/lib/util/result.rb
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
module Util
|
2
|
+
# An object representing the result of a computation, whether if be a success
|
3
|
+
# or a failure. Similar to +Result+ in Rust and OCaml and +Maybe+ in
|
4
|
+
# Haskell.
|
5
|
+
# @example
|
6
|
+
# def divide num, denom
|
7
|
+
# return Util::Result.err 'Division by zero.', self if denom == 0
|
8
|
+
# Util::Result.ok num / denom
|
9
|
+
# end
|
10
|
+
# No exception is ever raised, except when the value is retrieved
|
11
|
+
class Result
|
12
|
+
private_class_method :new
|
13
|
+
# The function in which the error happened, if defined.
|
14
|
+
# @return [String, nil]
|
15
|
+
attr_reader :where
|
16
|
+
|
17
|
+
# Create an error +Result+.
|
18
|
+
# @param [Object] content return value
|
19
|
+
# @param [Object] caller must be set to +self+ so that the +Result+
|
20
|
+
# can store the function in which the error happened.
|
21
|
+
# @return [Result]
|
22
|
+
def self.err content=nil, caller=nil
|
23
|
+
self.send :new, :err, content, caller
|
24
|
+
end
|
25
|
+
|
26
|
+
# Create a success +Result+.
|
27
|
+
# @param [Object] content return value
|
28
|
+
# @return [Result]
|
29
|
+
def self.ok content=nil
|
30
|
+
self.send :new, :ok, content
|
31
|
+
end
|
32
|
+
|
33
|
+
# Create a +Result+.
|
34
|
+
# @param [:err, :ok] type type of +Result+
|
35
|
+
# @param [Object] content return value
|
36
|
+
# @param [Object] caller must be set to +self+ so that the +Result+
|
37
|
+
# can store the function in which the error happened.
|
38
|
+
# @return [Result]
|
39
|
+
def initialize type, content, caller=nil
|
40
|
+
@type, @content = type, content
|
41
|
+
return if caller.nil?
|
42
|
+
|
43
|
+
fn = caller_locations(3).first.base_label
|
44
|
+
@where = (fn == '<main>') ? fn : (caller.is_a?(Class) \
|
45
|
+
? "#{caller}.#{fn}" : "#{caller.class}##{fn}")
|
46
|
+
end
|
47
|
+
|
48
|
+
# Compare two +Result+s. Will return true if both are of the same
|
49
|
+
# type, and if their contents are equal.
|
50
|
+
# @param [Result] other other +Result+
|
51
|
+
# @return [Boolean]
|
52
|
+
def == other
|
53
|
+
return false if other.instance_variable_get('@type') != @type
|
54
|
+
other_content = other.instance_variable_get('@content')
|
55
|
+
return false if @content.class != other_content.class
|
56
|
+
return true unless @content.respond_to? '=='
|
57
|
+
@content == other_content
|
58
|
+
end
|
59
|
+
|
60
|
+
# Call a method from the toplevel namespace on the value of
|
61
|
+
# the result, if it is a success. Otherwise, does nothing.
|
62
|
+
#
|
63
|
+
# If the method being called does not return a +Result+, the return
|
64
|
+
# value will be wrapped in a success +Result+. Any raised exception
|
65
|
+
# will be wrapped in an error +Result+.
|
66
|
+
# @param name [Symbol, String] Name of the method to call. If a String
|
67
|
+
# is provided, will convert it to a symbol.
|
68
|
+
# @return [Result]
|
69
|
+
def bind name, *args
|
70
|
+
bind_common Object, name, *args
|
71
|
+
end
|
72
|
+
|
73
|
+
# Call a class method on the value of the result if it is a success.
|
74
|
+
# Otherwise, does nothing.
|
75
|
+
#
|
76
|
+
# If the method being called does not return a +Result+, the return
|
77
|
+
# value will be wrapped in a success +Result+. Any raised exception
|
78
|
+
# will be wrapped in an error +Result+.
|
79
|
+
# @param (see #bind)
|
80
|
+
# @return [Result]
|
81
|
+
def bindcm name, *args
|
82
|
+
bind_common @content.class, name, *args
|
83
|
+
end
|
84
|
+
|
85
|
+
# Call an instance method on the value of the result if it is a success.
|
86
|
+
# Otherwise, does nothing.
|
87
|
+
#
|
88
|
+
# If the method being called does not return a +Result+, the return
|
89
|
+
# value will be wrapped in a success +Result+. Any raised exception
|
90
|
+
# will be wrapped in an error +Result+.
|
91
|
+
# @param (see #bind)
|
92
|
+
# @return [Result]
|
93
|
+
def bindm name, *args
|
94
|
+
bind_common @content, name, *args
|
95
|
+
end
|
96
|
+
|
97
|
+
# Indicate whether the result is an error.
|
98
|
+
# @return [Boolean]
|
99
|
+
def err?
|
100
|
+
@type == :err
|
101
|
+
end
|
102
|
+
|
103
|
+
# Retrieve the error value.
|
104
|
+
# @return [Object]
|
105
|
+
# @raise [ArgumentError] if the result is not an error.
|
106
|
+
def error
|
107
|
+
return @content if @type == :err
|
108
|
+
raise ArgumentError
|
109
|
+
end
|
110
|
+
|
111
|
+
# Retrieve the error value or a placeholder.
|
112
|
+
# @param [Object] alt placeholder
|
113
|
+
# @return [Object]
|
114
|
+
def error_or alt
|
115
|
+
@type == :err ? @content : alt
|
116
|
+
end
|
117
|
+
|
118
|
+
# Indicate whether the result is a success.
|
119
|
+
# @return [Boolean]
|
120
|
+
def ok?
|
121
|
+
@type == :ok
|
122
|
+
end
|
123
|
+
|
124
|
+
# Respresent the value as a string.
|
125
|
+
# @return [String]
|
126
|
+
# @note This functions “prettyfies” the +Result+. To actually
|
127
|
+
# see its state, use +inspect+.
|
128
|
+
def to_s
|
129
|
+
return '[+] ' + @content.to_s if @type == :ok
|
130
|
+
(@where.nil? ? '[-] ' : "[- #{@where}] ") + @content.to_s
|
131
|
+
end
|
132
|
+
|
133
|
+
# Retrieve the success value.
|
134
|
+
# @return [Object]
|
135
|
+
# @raise [ArgumentError] if the result is not a success.
|
136
|
+
def value
|
137
|
+
return @content if @type == :ok
|
138
|
+
raise ArgumentError
|
139
|
+
end
|
140
|
+
|
141
|
+
# Retrieve the success value or a placeholder.
|
142
|
+
# @param [Object] alt placeholder
|
143
|
+
# @return [Object]
|
144
|
+
def value_or alt
|
145
|
+
@type == :ok ? @content : alt
|
146
|
+
end
|
147
|
+
|
148
|
+
private
|
149
|
+
|
150
|
+
# Call a method of a given base on the value of the result,
|
151
|
+
# if it is a success. Otherwise, does nothing.
|
152
|
+
#
|
153
|
+
# If the method being called does not return a +Result+, the return
|
154
|
+
# value will be wrapped in a success +Result+. Any raised exception
|
155
|
+
# will be wrapped in an error +Result+.
|
156
|
+
# @param base [Object] The base from which to call the method. Can be
|
157
|
+
# a class, an instance or the main object.
|
158
|
+
# @param name [Symbol, String] Name of the method to call. If a String
|
159
|
+
# is provided, will convert it to a symbol.
|
160
|
+
# @return [Result]
|
161
|
+
def bind_common base, name, *args
|
162
|
+
return self if @type == :err
|
163
|
+
name = name.to_s.to_sym unless name.is_a? Symbol
|
164
|
+
begin
|
165
|
+
method = base.method name
|
166
|
+
res = base.is_a?(Class) \
|
167
|
+
? method.call(@content, *args)
|
168
|
+
: method.call(*args)
|
169
|
+
return res.is_a?(Result) ? res : Result.ok(res)
|
170
|
+
rescue Exception => e
|
171
|
+
Result.err e, self
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
data/test/unit/args.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
results = [nil, '', true, 42, 42.0, :nil, true, true, Util, NilClass, 'tata']
|
2
|
+
$test.register 'args-check', results do ||
|
3
|
+
require 'util/args'
|
4
|
+
[ Util::Args.check,
|
5
|
+
Util::Args.check(nil, String, '', nil, FalseClass),
|
6
|
+
Util::Args.check(42, Integer, 0, 42, Float, 0.0, 42, Symbol, :nil),
|
7
|
+
Util::Args.check(true, 'Boolean', false, 42, 'Boolean'),
|
8
|
+
Util::Args.check(Util, Module, Kernel, Util, Class, NilClass),
|
9
|
+
Util::Args.check('toto', 'NotAClass', 'tata')
|
10
|
+
].flatten
|
11
|
+
end
|
12
|
+
|
13
|
+
results = [nil, 'toto', 'tata', 42.0, NilClass]
|
14
|
+
$test.register 'opts-check', results do ||
|
15
|
+
require 'util/args'
|
16
|
+
opts = { :toto => 'tata', :titi => 42, 'tutu' => TrueClass }
|
17
|
+
[ Util::Opts.check(nil),
|
18
|
+
Util::Opts.check(nil, :toto, String),
|
19
|
+
Util::Opts.check(opts, :toto, String, '', :titi, Float, 0.0, \
|
20
|
+
:tutu, Class, NilClass),
|
21
|
+
].flatten
|
22
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
results = [nil, __dir__, false, 'fake.html', 'http://www.qwant.com']
|
5
|
+
results += ['http://www.fake.info', nil, __dir__, false, 'fake.html']
|
6
|
+
results += ['http://www.qwant.com', 'http://www.fake.info', nil, nil, __dir__]
|
7
|
+
results += ['.', true, 'drop.htm', '42']
|
8
|
+
$test.register 'downloader-setters-getters', results do ||
|
9
|
+
require 'util/downloader'
|
10
|
+
dl = Util::Downloader.new 'http://www.fake.info', dest: __dir__, \
|
11
|
+
name: 'fake.html', ref: 'http://www.qwant.com', force: 'true'
|
12
|
+
res = [dl.data, dl.dest, dl.force, dl.name, dl.ref, dl.url,
|
13
|
+
dl[:data], dl[:dest], dl[:force], dl[:name], dl[:ref], dl[:url],
|
14
|
+
dl[42], dl[:io], dl['dest']
|
15
|
+
]
|
16
|
+
dl.set_force.set_ref(42).unset_force.set_dest.set_name('drop.htm').set_force
|
17
|
+
res += [dl.dest, dl.force, dl.name, dl.ref]
|
18
|
+
res
|
19
|
+
end
|
20
|
+
|
21
|
+
results = [:no_url, :no_dir, :no_dir, :file_exists]
|
22
|
+
$test.register 'downloader-normal-errors', results do ||
|
23
|
+
require 'util/downloader'
|
24
|
+
path = File.join __dir__, 'downloader'
|
25
|
+
fake_path = File.join path, 'fake'
|
26
|
+
true_path = File.join path, 'orig'
|
27
|
+
not_a_dir = File.join path, 'orig', 'simple.html'
|
28
|
+
url = 'https://gitlab.com/uploads/-/system/user/avatar/5582173/avatar.png'
|
29
|
+
[ Util::Downloader.new('').download.error,
|
30
|
+
Util::Downloader.new(url).set_dest(fake_path).download.error,
|
31
|
+
Util::Downloader.new(url).set_dest(not_a_dir).download.error,
|
32
|
+
Util::Downloader.new(url).set_dest(true_path).set_name('simple.html')\
|
33
|
+
.download.error
|
34
|
+
]
|
35
|
+
end
|
36
|
+
|
37
|
+
$test.register 'downloader-404', OpenURI::HTTPError, '404' do ||
|
38
|
+
require 'util/downloader'
|
39
|
+
path = File.join __dir__, 'downloader'
|
40
|
+
url = 'https://www.perdu.com/404'
|
41
|
+
Util::Downloader.new(url).set_dest(path).download.error
|
42
|
+
end
|
43
|
+
|
44
|
+
$test.register 'downloader-success' do ||
|
45
|
+
require 'util/downloader'
|
46
|
+
path = File.join __dir__, 'downloader'
|
47
|
+
url = 'https://www.perdu.com/'
|
48
|
+
Util::Downloader.new(url).set_dest(path).download.value.nil?
|
49
|
+
end
|
50
|
+
|
51
|
+
$test.register 'downloader-second-download', :file_exists do ||
|
52
|
+
require 'util/downloader'
|
53
|
+
path = File.join __dir__, 'downloader'
|
54
|
+
url = 'https://www.perdu.com/'
|
55
|
+
Util::Downloader.new(url).set_dest(path).download.error
|
56
|
+
end
|
57
|
+
|
58
|
+
$test.register 'downloader-third-download' do ||
|
59
|
+
require 'util/downloader'
|
60
|
+
path = File.join __dir__, 'downloader'
|
61
|
+
url = 'https://www.perdu.com/'
|
62
|
+
dl = Util::Downloader.new(url).set_dest(path).set_force.download.value.nil?
|
63
|
+
end
|
64
|
+
|
65
|
+
results = [204, '<html>', 'Perdu sur l\'Internet ?']
|
66
|
+
$test.register 'downloader-right-download', results do ||
|
67
|
+
path = File.join __dir__, 'downloader', 'index.html'
|
68
|
+
content = File.read path
|
69
|
+
File.delete path
|
70
|
+
[content.length, content[0..5], content[61..82]]
|
71
|
+
end
|
72
|
+
|
73
|
+
begin
|
74
|
+
require 'rmagick'
|
75
|
+
|
76
|
+
results = [nil, 5798, 'PNG', 200, 200, '#D4D400001C1C']
|
77
|
+
$test.register 'downloader-rmagick', results do ||
|
78
|
+
require 'util/downloader'
|
79
|
+
url = 'https://gitlab.com/uploads/-/system/user/avatar/5582173/avatar.png'
|
80
|
+
dl = Util::Downloader.new(url).set_dest(Magick)
|
81
|
+
[ dl.download.value,
|
82
|
+
dl.data[0].filesize,
|
83
|
+
dl.data[0].format,
|
84
|
+
dl.data[0].rows,
|
85
|
+
dl.data[0].columns,
|
86
|
+
dl.data[0].pixel_color(79, 142).to_color,
|
87
|
+
]
|
88
|
+
end
|
89
|
+
rescue LoadError
|
90
|
+
$test.register 'downloader-RMAGICK-NOT-INSTALLED' do || true end
|
91
|
+
end
|
92
|
+
|
93
|
+
begin
|
94
|
+
require 'nokogiri'
|
95
|
+
|
96
|
+
results = [nil, 'Vous Etes Perdu ?', 'Perdu sur l\'Internet ?']
|
97
|
+
$test.register 'downloader-nokogiri', results do ||
|
98
|
+
require 'util/downloader'
|
99
|
+
url = 'https://www.perdu.com/'
|
100
|
+
dl = Util::Downloader.new(url).set_dest(Nokogiri::HTML)
|
101
|
+
[ dl.download.value,
|
102
|
+
dl.data.title,
|
103
|
+
dl.data.at_css('h1').text
|
104
|
+
]
|
105
|
+
end
|
106
|
+
rescue LoadError
|
107
|
+
$test.register 'downloader-NOKOGIRI-NOT-INSTALLED' do || true end
|
108
|
+
end
|
109
|
+
|
110
|
+
begin
|
111
|
+
require 'oga'
|
112
|
+
|
113
|
+
results = [nil, :html, 'Perdu sur l\'Internet ?']
|
114
|
+
$test.register 'downloader-oga', results do ||
|
115
|
+
require 'util/downloader'
|
116
|
+
url = 'https://www.perdu.com/'
|
117
|
+
dl = Util::Downloader.new(url).set_dest(Oga::HTML)
|
118
|
+
[ dl.download.value,
|
119
|
+
dl.data.type,
|
120
|
+
dl.data.at_css('h1').text
|
121
|
+
]
|
122
|
+
end
|
123
|
+
rescue LoadError
|
124
|
+
$test.register 'downloader-OGA-NOT-INSTALLED', nil do || end
|
125
|
+
end
|
126
|
+
|
127
|
+
results = [nil, 'Browse the first website']
|
128
|
+
results += ['http://info.cern.ch/hypertext/WWW/TheProject.html']
|
129
|
+
$test.register 'downloader-rexml', results do ||
|
130
|
+
require 'util/downloader'
|
131
|
+
require 'rexml/document'
|
132
|
+
url = 'http://info.cern.ch'
|
133
|
+
dl = Util::Downloader.new(url).set_dest(REXML)
|
134
|
+
[ dl.download.value,
|
135
|
+
dl.data.root.get_elements('//ul/li/a')[0].text,
|
136
|
+
dl.data.root.get_elements('//ul/li/a')[0]['href'],
|
137
|
+
]
|
138
|
+
end
|
139
|
+
|
140
|
+
$test.register 'dowloader-yaml', YAML::SyntaxError, 'mapping values' do ||
|
141
|
+
require 'util/downloader'
|
142
|
+
url = 'https://gitlab.com/guillel/util-gem/-/blob/master' \
|
143
|
+
'/share/lists/iso639-3.yml'
|
144
|
+
Util::Downloader.new(url).set_dest(YAML).download.error
|
145
|
+
end
|