picfisher 0.2.0 → 0.2.2
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 +4 -4
- data/.rubocop.yml +122 -0
- data/CHANGELOG.md +23 -0
- data/README.md +1 -1
- data/TODO.md +5 -3
- data/lib/picfisher/downloader.rb +16 -8
- data/lib/picfisher/fishing_boat.rb +10 -1
- data/lib/picfisher/log.rb +14 -11
- data/lib/picfisher/sanitizer.rb +12 -6
- data/lib/picfisher/url_extractor.rb +14 -5
- data/lib/picfisher/version.rb +1 -1
- data/lib/picfisher.rb +43 -16
- metadata +31 -30
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 54dd426f55d53a5b00b37c2b53ec9c942e473e4adf0efa72ba34aabe1b3d8ab1
|
|
4
|
+
data.tar.gz: 5e163219957bc33cdc08cfe9363038c75630113ce2916eff45465002ef61d1fa
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ca9a1f9a68b39298658df183f7691ea9980242f50200488ac8b9c864cc182540919085b6ffb16ce63a4749f83bfbae2d276c4d795fd19b0f9c1a7e3da359ef8a
|
|
7
|
+
data.tar.gz: 1672ef2e47030c7875d9900479bb50daf52c850af73fb6b505d72cb2f8aebe80d3908b38af6cf2ee7793a2230db61c016e3d2762f63ff9629209a28489000832
|
data/.rubocop.yml
CHANGED
|
@@ -6,3 +6,125 @@ Style/StringLiterals:
|
|
|
6
6
|
|
|
7
7
|
Style/StringLiteralsInInterpolation:
|
|
8
8
|
EnforcedStyle: double_quotes
|
|
9
|
+
|
|
10
|
+
Gemspec/DateAssignment: # new in 1.10
|
|
11
|
+
Enabled: true
|
|
12
|
+
Gemspec/RequireMFA: # new in 1.23
|
|
13
|
+
Enabled: true
|
|
14
|
+
Layout/LineEndStringConcatenationIndentation: # new in 1.18
|
|
15
|
+
Enabled: true
|
|
16
|
+
Layout/SpaceBeforeBrackets: # new in 1.7
|
|
17
|
+
Enabled: true
|
|
18
|
+
Lint/AmbiguousAssignment: # new in 1.7
|
|
19
|
+
Enabled: true
|
|
20
|
+
Lint/AmbiguousOperatorPrecedence: # new in 1.21
|
|
21
|
+
Enabled: true
|
|
22
|
+
Lint/AmbiguousRange: # new in 1.19
|
|
23
|
+
Enabled: true
|
|
24
|
+
Lint/DeprecatedConstants: # new in 1.8
|
|
25
|
+
Enabled: true
|
|
26
|
+
Lint/DuplicateBranch: # new in 1.3
|
|
27
|
+
Enabled: true
|
|
28
|
+
Lint/DuplicateRegexpCharacterClassElement: # new in 1.1
|
|
29
|
+
Enabled: true
|
|
30
|
+
Lint/EmptyBlock: # new in 1.1
|
|
31
|
+
Enabled: true
|
|
32
|
+
Lint/EmptyClass: # new in 1.3
|
|
33
|
+
Enabled: true
|
|
34
|
+
Lint/EmptyInPattern: # new in 1.16
|
|
35
|
+
Enabled: true
|
|
36
|
+
Lint/IncompatibleIoSelectWithFiberScheduler: # new in 1.21
|
|
37
|
+
Enabled: true
|
|
38
|
+
Lint/LambdaWithoutLiteralBlock: # new in 1.8
|
|
39
|
+
Enabled: true
|
|
40
|
+
Lint/NoReturnInBeginEndBlocks: # new in 1.2
|
|
41
|
+
Enabled: true
|
|
42
|
+
Lint/NumberedParameterAssignment: # new in 1.9
|
|
43
|
+
Enabled: true
|
|
44
|
+
Lint/OrAssignmentToConstant: # new in 1.9
|
|
45
|
+
Enabled: true
|
|
46
|
+
Lint/RedundantDirGlobSort: # new in 1.8
|
|
47
|
+
Enabled: true
|
|
48
|
+
Lint/RefinementImportMethods: # new in 1.27
|
|
49
|
+
Enabled: true
|
|
50
|
+
Lint/RequireRelativeSelfPath: # new in 1.22
|
|
51
|
+
Enabled: true
|
|
52
|
+
Lint/SymbolConversion: # new in 1.9
|
|
53
|
+
Enabled: true
|
|
54
|
+
Lint/ToEnumArguments: # new in 1.1
|
|
55
|
+
Enabled: true
|
|
56
|
+
Lint/TripleQuotes: # new in 1.9
|
|
57
|
+
Enabled: true
|
|
58
|
+
Lint/UnexpectedBlockArity: # new in 1.5
|
|
59
|
+
Enabled: true
|
|
60
|
+
Lint/UnmodifiedReduceAccumulator: # new in 1.1
|
|
61
|
+
Enabled: true
|
|
62
|
+
Lint/UselessRuby2Keywords: # new in 1.23
|
|
63
|
+
Enabled: true
|
|
64
|
+
Naming/BlockForwarding: # new in 1.24
|
|
65
|
+
Enabled: true
|
|
66
|
+
Security/IoMethods: # new in 1.22
|
|
67
|
+
Enabled: true
|
|
68
|
+
Style/ArgumentsForwarding: # new in 1.1
|
|
69
|
+
Enabled: true
|
|
70
|
+
Style/CollectionCompact: # new in 1.2
|
|
71
|
+
Enabled: true
|
|
72
|
+
Style/DocumentDynamicEvalDefinition: # new in 1.1
|
|
73
|
+
Enabled: true
|
|
74
|
+
Style/EndlessMethod: # new in 1.8
|
|
75
|
+
Enabled: true
|
|
76
|
+
Style/FileRead: # new in 1.24
|
|
77
|
+
Enabled: true
|
|
78
|
+
Style/FileWrite: # new in 1.24
|
|
79
|
+
Enabled: true
|
|
80
|
+
Style/HashConversion: # new in 1.10
|
|
81
|
+
Enabled: true
|
|
82
|
+
Style/HashExcept: # new in 1.7
|
|
83
|
+
Enabled: true
|
|
84
|
+
Style/IfWithBooleanLiteralBranches: # new in 1.9
|
|
85
|
+
Enabled: true
|
|
86
|
+
Style/InPatternThen: # new in 1.16
|
|
87
|
+
Enabled: true
|
|
88
|
+
Style/MapToHash: # new in 1.24
|
|
89
|
+
Enabled: true
|
|
90
|
+
Style/MultilineInPatternThen: # new in 1.16
|
|
91
|
+
Enabled: true
|
|
92
|
+
Style/NegatedIfElseCondition: # new in 1.2
|
|
93
|
+
Enabled: true
|
|
94
|
+
Style/NestedFileDirname: # new in 1.26
|
|
95
|
+
Enabled: true
|
|
96
|
+
Style/NilLambda: # new in 1.3
|
|
97
|
+
Enabled: true
|
|
98
|
+
Style/NumberedParameters: # new in 1.22
|
|
99
|
+
Enabled: true
|
|
100
|
+
Style/NumberedParametersLimit: # new in 1.22
|
|
101
|
+
Enabled: true
|
|
102
|
+
Style/OpenStructUse: # new in 1.23
|
|
103
|
+
Enabled: true
|
|
104
|
+
Style/QuotedSymbols: # new in 1.16
|
|
105
|
+
Enabled: true
|
|
106
|
+
Style/RedundantArgument: # new in 1.4
|
|
107
|
+
Enabled: true
|
|
108
|
+
Style/RedundantInitialize: # new in 1.27
|
|
109
|
+
Enabled: true
|
|
110
|
+
Style/RedundantSelfAssignmentBranch: # new in 1.19
|
|
111
|
+
Enabled: true
|
|
112
|
+
Style/SelectByRegexp: # new in 1.22
|
|
113
|
+
Enabled: true
|
|
114
|
+
Style/StringChars: # new in 1.12
|
|
115
|
+
Enabled: true
|
|
116
|
+
Style/SwapValues: # new in 1.1
|
|
117
|
+
Enabled: true
|
|
118
|
+
|
|
119
|
+
Metrics/MethodLength:
|
|
120
|
+
Max: 15
|
|
121
|
+
Exclude:
|
|
122
|
+
- 'test/**/*'
|
|
123
|
+
|
|
124
|
+
Metrics/AbcSize:
|
|
125
|
+
Exclude:
|
|
126
|
+
- 'test/**/*'
|
|
127
|
+
|
|
128
|
+
Layout/LineLength:
|
|
129
|
+
Exclude:
|
|
130
|
+
- 'test/**/*'
|
data/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,29 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.2.1] - 2024-05-30
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- Removed development gems from production dependencies
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## [0.2.1] - 2024-05-30
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- Show running version in the first log message
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- Rubocop cops application
|
|
24
|
+
- Update TODO.md
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
|
|
28
|
+
- Removed outdated comment
|
|
29
|
+
|
|
30
|
+
|
|
8
31
|
## [0.2.0] - 2024-05-30
|
|
9
32
|
|
|
10
33
|
### Added
|
data/README.md
CHANGED
data/TODO.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# TODO
|
|
2
2
|
|
|
3
|
-
-
|
|
3
|
+
- If the output directory doesn't exist, create it. We can also add a parameter to allow the user to decide on this.
|
|
4
4
|
- Check if the Downloader is going to overwrite a file that already exists. Add an option to `force` if not stop with an error.
|
|
5
5
|
- Add a progress bar for the downloading phase.
|
|
6
6
|
- Allow multiple concurrent downloads. Add an extra param to decide the number, default `5`
|
|
7
|
-
|
|
8
|
-
- Allow URLs without image extension. This requires the source
|
|
7
|
+
✔ Add error handling to the Downloader. Many things can be wrong when connecting to the internet.
|
|
8
|
+
- Allow URLs without image extension. This requires the URLs' source file to have a predictable structure. Or we request all the images and check the media type of the response.
|
|
9
|
+
- If we pass an URL instead of a file path, the script will detect it, download the URL, and extract the images from there.
|
|
10
|
+
- Pass Rubocop cops
|
data/lib/picfisher/downloader.rb
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require "open-uri"
|
|
2
4
|
|
|
3
5
|
module PicFisher
|
|
6
|
+
# Downloads an image from an URL
|
|
4
7
|
module Downloader
|
|
5
|
-
#
|
|
8
|
+
# Downloads an image from an URL
|
|
9
|
+
# @param url [String]
|
|
10
|
+
# @param output_path [String]
|
|
11
|
+
# @return [nil]
|
|
12
|
+
# @raise [PicFisher::Error]
|
|
13
|
+
# @example
|
|
14
|
+
# PicFisher::Downloader.download("https://example.com/image_in_internet.png", "OUTPUT_PATH")
|
|
15
|
+
# PicFisher::Downloader.download("https://example.com/not_existing.png", "OUTPUT_PATH")
|
|
6
16
|
def self.download(url, output_path)
|
|
7
17
|
PicFisher::Log.debug("Fishing #{url} to #{output_path}")
|
|
8
18
|
|
|
@@ -11,18 +21,16 @@ module PicFisher
|
|
|
11
21
|
rescue OpenURI::HTTPError => e
|
|
12
22
|
message = "Failed to fish #{url}: #{e}"
|
|
13
23
|
PicFisher::Log.error(message)
|
|
14
|
-
raise PicFisher::Error
|
|
24
|
+
raise PicFisher::Error, message
|
|
15
25
|
end
|
|
16
26
|
end
|
|
17
27
|
|
|
18
|
-
private
|
|
19
|
-
|
|
20
28
|
def self._dowload(url, output_path)
|
|
21
|
-
io_stream = OpenURI
|
|
29
|
+
io_stream = OpenURI.open_uri(url)
|
|
22
30
|
|
|
23
|
-
File.
|
|
24
|
-
f.write(io_stream.read)
|
|
25
|
-
end
|
|
31
|
+
File.binwrite(output_path, io_stream.read)
|
|
26
32
|
end
|
|
33
|
+
|
|
34
|
+
private_class_method :_dowload
|
|
27
35
|
end
|
|
28
36
|
end
|
|
@@ -1,6 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PicFisher
|
|
4
|
+
# Extracts the image urls from the given file and download them to the given directory
|
|
2
5
|
module FishingBoat
|
|
3
|
-
#
|
|
6
|
+
# Extracts the image urls from the given file and download them to the given directory
|
|
7
|
+
# @param images_file_path [String]
|
|
8
|
+
# @param output_directory_path [String]
|
|
9
|
+
# @return [nil]
|
|
10
|
+
# @raise [PicFisher::Error]
|
|
11
|
+
# @example
|
|
12
|
+
# PicFisher::FishingBoat.fish("images.txt","~/Downloads/fished_images")
|
|
4
13
|
def self.fish(images_file_path, output_directory_path)
|
|
5
14
|
PicFisher::Log.info("Fishing from #{images_file_path} to #{output_directory_path}")
|
|
6
15
|
|
data/lib/picfisher/log.rb
CHANGED
|
@@ -1,25 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PicFisher
|
|
4
|
+
# Print a message to the console
|
|
5
|
+
# @param debug_level [Symbol]
|
|
6
|
+
# @return [nil]
|
|
7
|
+
# @example
|
|
8
|
+
# PicFisher::Log.debug("message")
|
|
9
|
+
# PicFisher::Log.info("message")
|
|
10
|
+
# PicFisher::Log.error("message")
|
|
2
11
|
module Log
|
|
3
12
|
def self.debug(message)
|
|
4
|
-
if ["debug"].include? debug_level
|
|
5
|
-
output(:debug, message)
|
|
6
|
-
end
|
|
13
|
+
output(:debug, message) if ["debug"].include? debug_level
|
|
7
14
|
end
|
|
8
15
|
|
|
9
16
|
def self.info(message)
|
|
10
|
-
if [
|
|
11
|
-
output(:info, message)
|
|
12
|
-
end
|
|
17
|
+
output(:info, message) if %w[debug info].include? debug_level
|
|
13
18
|
end
|
|
14
19
|
|
|
15
20
|
def self.error(message)
|
|
16
|
-
if [
|
|
17
|
-
output(:error, message)
|
|
18
|
-
end
|
|
21
|
+
output(:error, message) if %w[debug info error].include? debug_level
|
|
19
22
|
end
|
|
20
23
|
|
|
21
|
-
private
|
|
22
|
-
|
|
23
24
|
def self.output(level, message)
|
|
24
25
|
final_message = "PicFisher [#{level.upcase}] #{message}"
|
|
25
26
|
Kernel.puts(final_message)
|
|
@@ -28,5 +29,7 @@ module PicFisher
|
|
|
28
29
|
def self.debug_level
|
|
29
30
|
ENV["DEBUG_LEVEL"] || "info" # default is info
|
|
30
31
|
end
|
|
32
|
+
|
|
33
|
+
private_class_method :debug_level
|
|
31
34
|
end
|
|
32
35
|
end
|
data/lib/picfisher/sanitizer.rb
CHANGED
|
@@ -1,19 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module PicFisher
|
|
4
|
+
# Sanitizes an image url
|
|
2
5
|
module Sanitizer
|
|
6
|
+
# Sanitizes an image url
|
|
7
|
+
# @param url [String]
|
|
8
|
+
# @return [String]
|
|
9
|
+
# @example
|
|
10
|
+
# PicFisher::Sanitizer.sanitize_image_url("https://example.com/image_in_internet.png")
|
|
3
11
|
def self.sanitize_image_url(url)
|
|
4
12
|
filename_extension = File.extname(url)
|
|
5
13
|
filename_extension_escaped = Regexp.escape(filename_extension) # to escape the dot "."
|
|
6
14
|
result =
|
|
7
15
|
url
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
16
|
+
.sub(/#{filename_extension_escaped}$/, "")
|
|
17
|
+
.gsub(/[^\w\s-]+/, "_")
|
|
18
|
+
.gsub(/(^|\b\s)\s+($|\s?\b)/, "\\1\\2")
|
|
19
|
+
.gsub(/\s+/, "_")
|
|
12
20
|
|
|
13
21
|
result = "#{result}#{filename_extension}"
|
|
14
|
-
|
|
15
22
|
PicFisher::Log.debug("Sanitizing url '#{url}': #{result}")
|
|
16
|
-
|
|
17
23
|
result
|
|
18
24
|
end
|
|
19
25
|
end
|
|
@@ -1,17 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require "uri"
|
|
2
4
|
|
|
3
5
|
module PicFisher
|
|
6
|
+
# Extracts image urls from a string
|
|
4
7
|
module URLExtractor
|
|
5
8
|
# NOTE: using URI.regexp(["http", "https"]) didn't work for me
|
|
6
|
-
URL_REGEX =
|
|
7
|
-
IMAGE_EXTENSITONS = %w
|
|
9
|
+
URL_REGEX = %r{https?://[^\s,]+}
|
|
10
|
+
IMAGE_EXTENSITONS = %w[.jpg .jpeg .png .gif .webp .bmp .ico .svg .tiff or .tif .psd .raw .cr2 .nrw .arw .dng .nef
|
|
11
|
+
.orf .sr2 .raf .tif .tiff .djvu].freeze
|
|
8
12
|
|
|
13
|
+
# Extracts image urls from a string
|
|
14
|
+
# @param string [String]
|
|
15
|
+
# @return [Array<String>]
|
|
16
|
+
# @example
|
|
17
|
+
# PicFisher::URLExtractor.extract("https://example.com/image_in_internet.png, https://example.com/another.png")
|
|
9
18
|
def self.extract(string)
|
|
10
19
|
result =
|
|
11
20
|
string
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
21
|
+
.scan(URL_REGEX)
|
|
22
|
+
.select { |url| url.end_with?(*IMAGE_EXTENSITONS) }
|
|
23
|
+
.uniq
|
|
15
24
|
|
|
16
25
|
PicFisher::Log.debug("Extracted urls: #{result.join("|")}")
|
|
17
26
|
|
data/lib/picfisher/version.rb
CHANGED
data/lib/picfisher.rb
CHANGED
|
@@ -7,32 +7,59 @@ require_relative "picfisher/downloader"
|
|
|
7
7
|
require_relative "picfisher/fishing_boat"
|
|
8
8
|
require_relative "picfisher/log"
|
|
9
9
|
|
|
10
|
+
# Extracts the image urls from the given file and download them to the given directory
|
|
10
11
|
module PicFisher
|
|
11
12
|
class Error < StandardError; end
|
|
12
13
|
|
|
13
|
-
#
|
|
14
|
+
# Extracts the image urls from the given file and download them to the given directory
|
|
15
|
+
# @param images_file_path [String]
|
|
16
|
+
# @param output_directory_path [String]
|
|
17
|
+
# @return [nil]
|
|
18
|
+
# @raise [PicFisher::Error]
|
|
19
|
+
# @example
|
|
20
|
+
# PicFisher.fish("images.txt","~/Downloads/fished_images")
|
|
14
21
|
def self.fish(images_file_path, output_directory_path)
|
|
15
|
-
PicFisher::Log.info "PicFisher is running..."
|
|
22
|
+
PicFisher::Log.info "PicFisher [#{PicFisher::VERSION}] is running..."
|
|
16
23
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
24
|
+
run_validations(images_file_path, output_directory_path)
|
|
25
|
+
|
|
26
|
+
PicFisher::FishingBoat.fish(images_file_path, output_directory_path)
|
|
27
|
+
PicFisher::Log.info "PicFisher is finished!"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class << self
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def run_validations(images_file_path, output_directory_path)
|
|
34
|
+
validate_paths(images_file_path, output_directory_path)
|
|
35
|
+
validate_origin_exists(images_file_path)
|
|
36
|
+
validate_output_exists(output_directory_path)
|
|
21
37
|
end
|
|
22
38
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
39
|
+
# rubocop:disable Style/GuardClause
|
|
40
|
+
def validate_paths(images_file_path, output_directory_path)
|
|
41
|
+
if images_file_path.nil? || output_directory_path.nil?
|
|
42
|
+
message = "Use: picfisher <images_file_path> <output_directory_path>"
|
|
43
|
+
PicFisher::Log.error(message)
|
|
44
|
+
raise PicFisher::Error, message
|
|
45
|
+
end
|
|
27
46
|
end
|
|
28
47
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
48
|
+
def validate_origin_exists(images_file_path)
|
|
49
|
+
unless File.exist?(images_file_path)
|
|
50
|
+
message = "File not found: #{images_file_path}"
|
|
51
|
+
PicFisher::Log.error(message)
|
|
52
|
+
raise PicFisher::Error, message
|
|
53
|
+
end
|
|
33
54
|
end
|
|
34
55
|
|
|
35
|
-
|
|
36
|
-
|
|
56
|
+
def validate_output_exists(output_directory_path)
|
|
57
|
+
unless Dir.exist?(output_directory_path)
|
|
58
|
+
message = "Directory not found: #{output_directory_path}"
|
|
59
|
+
PicFisher::Log.error(message)
|
|
60
|
+
raise PicFisher::Error, message
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
# rubocop:enable Style/GuardClause
|
|
37
64
|
end
|
|
38
65
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: picfisher
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Fernando Guillen
|
|
@@ -11,109 +11,109 @@ cert_chain: []
|
|
|
11
11
|
date: 2024-05-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name:
|
|
14
|
+
name: minitest
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
19
|
+
version: '5.16'
|
|
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:
|
|
26
|
+
version: '5.16'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: uri
|
|
28
|
+
name: open-uri
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: 0.
|
|
33
|
+
version: 0.4.1
|
|
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: 0.
|
|
40
|
+
version: 0.4.1
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
42
|
+
name: uri
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version:
|
|
47
|
+
version: 0.13.0
|
|
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:
|
|
54
|
+
version: 0.13.0
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
|
-
name:
|
|
56
|
+
name: mocha
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
59
|
- - "~>"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: '
|
|
62
|
-
type: :
|
|
61
|
+
version: '2.3'
|
|
62
|
+
type: :development
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
66
|
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: '
|
|
68
|
+
version: '2.3'
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
70
|
+
name: webmock
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements:
|
|
73
73
|
- - "~>"
|
|
74
74
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '
|
|
76
|
-
|
|
75
|
+
version: '3.23'
|
|
76
|
+
- - ">="
|
|
77
|
+
- !ruby/object:Gem::Version
|
|
78
|
+
version: 3.23.1
|
|
79
|
+
type: :development
|
|
77
80
|
prerelease: false
|
|
78
81
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
82
|
requirements:
|
|
80
83
|
- - "~>"
|
|
81
84
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '
|
|
85
|
+
version: '3.23'
|
|
86
|
+
- - ">="
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: 3.23.1
|
|
83
89
|
- !ruby/object:Gem::Dependency
|
|
84
|
-
name:
|
|
90
|
+
name: rubocop
|
|
85
91
|
requirement: !ruby/object:Gem::Requirement
|
|
86
92
|
requirements:
|
|
87
93
|
- - "~>"
|
|
88
94
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: '
|
|
90
|
-
- - ">="
|
|
91
|
-
- !ruby/object:Gem::Version
|
|
92
|
-
version: 3.23.1
|
|
95
|
+
version: '1.21'
|
|
93
96
|
type: :development
|
|
94
97
|
prerelease: false
|
|
95
98
|
version_requirements: !ruby/object:Gem::Requirement
|
|
96
99
|
requirements:
|
|
97
100
|
- - "~>"
|
|
98
101
|
- !ruby/object:Gem::Version
|
|
99
|
-
version: '
|
|
100
|
-
- - ">="
|
|
101
|
-
- !ruby/object:Gem::Version
|
|
102
|
-
version: 3.23.1
|
|
102
|
+
version: '1.21'
|
|
103
103
|
- !ruby/object:Gem::Dependency
|
|
104
|
-
name:
|
|
104
|
+
name: rake
|
|
105
105
|
requirement: !ruby/object:Gem::Requirement
|
|
106
106
|
requirements:
|
|
107
107
|
- - "~>"
|
|
108
108
|
- !ruby/object:Gem::Version
|
|
109
|
-
version: '
|
|
109
|
+
version: '13.0'
|
|
110
110
|
type: :development
|
|
111
111
|
prerelease: false
|
|
112
112
|
version_requirements: !ruby/object:Gem::Requirement
|
|
113
113
|
requirements:
|
|
114
114
|
- - "~>"
|
|
115
115
|
- !ruby/object:Gem::Version
|
|
116
|
-
version: '
|
|
116
|
+
version: '13.0'
|
|
117
117
|
description: Reading all the image URLs from a given text file and download them to
|
|
118
118
|
a given directory.
|
|
119
119
|
email:
|
|
@@ -145,6 +145,7 @@ metadata:
|
|
|
145
145
|
homepage_uri: https://github.com/fguillen/PicFisher
|
|
146
146
|
source_code_uri: https://github.com/fguillen/PicFisher
|
|
147
147
|
changelog_uri: https://github.com/fguillen/PicFisher/blob/main/CHANGELOG.md
|
|
148
|
+
rubygems_mfa_required: 'false'
|
|
148
149
|
post_install_message:
|
|
149
150
|
rdoc_options: []
|
|
150
151
|
require_paths:
|