web_loader 1.8.0 → 2.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1434106ba64ce88a81a2c382b330d92d82525162638d02ee0cd8a11958f50acd
4
- data.tar.gz: c55bafdbea2ae8fda51272087683e4a0f157c275a001cdcc357a086add410afc
3
+ metadata.gz: 7bd0d0702828cbd7f4150c4dbf5f89144a1b5794a2e393fa9c6c9b0768e0577b
4
+ data.tar.gz: ddd8af0a7a5827b9da3d12cb60e7fbb55841c5b7ed29d1668c0ba5507987c4ac
5
5
  SHA512:
6
- metadata.gz: 7139ac3325dd3daaf23bc6aed6d0b645c65df7fc943ace0ccf730c70ec3e30b7f6aa6e677198697b2414e334279a43a06669fc21d8b40b8bcebf215d0689e5f6
7
- data.tar.gz: bad9b7b7e4fce6a6f5c2d9947c0ac44072556a5cdcbf8205a689e2240e34bb5562f69a7dcbd09412ca89cbd5249530eb6806a978aecb82a455fa77a5eddbe5f6
6
+ metadata.gz: 1b65f8df8b55fe2340cc6a7dd50885c7223aa3246748599b55eb28903ca09c97af854b8861a53973ffb37a2e81b3faaf9b837dc23f77c9ddd543bbe70aa8693c
7
+ data.tar.gz: 4464a9fba104605f4658f912c6910a16341410a511dc441e78357e6ab17a892c42286e465dc51e876ed4bb1334fe3a28418fac381afaf1e5d6aaf961a864a4e1
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AskMigrationStateService">
4
+ <option name="migrationStatus" value="COMPLETED" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Ask2AgentMigrationStateService">
4
+ <option name="migrationStatus" value="COMPLETED" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="EditMigrationStateService">
4
+ <option name="migrationStatus" value="COMPLETED" />
5
+ </component>
6
+ </project>
data/Gemfile CHANGED
@@ -2,9 +2,11 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- # Specify your gem's dependencies in web_loader.gemspec
5
+ # Specify your gem's dependencies in wl.gemspec
6
6
  gemspec
7
7
 
8
8
  gem "rake", "~> 13.0"
9
9
 
10
10
  gem "minitest", "~> 5.0"
11
+
12
+ gem 'selenium-webdriver'
data/Gemfile.lock CHANGED
@@ -1,13 +1,24 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- web_loader (1.8.0)
4
+ web_loader (2.1.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- minitest (5.26.1)
9
+ base64 (0.3.0)
10
+ logger (1.7.0)
11
+ minitest (5.26.2)
10
12
  rake (13.3.1)
13
+ rexml (3.4.4)
14
+ rubyzip (3.2.2)
15
+ selenium-webdriver (4.38.0)
16
+ base64 (~> 0.2)
17
+ logger (~> 1.4)
18
+ rexml (~> 3.2, >= 3.2.5)
19
+ rubyzip (>= 1.2.2, < 4.0)
20
+ websocket (~> 1.0)
21
+ websocket (1.2.11)
11
22
 
12
23
  PLATFORMS
13
24
  arm64-darwin-24
@@ -16,6 +27,7 @@ PLATFORMS
16
27
  DEPENDENCIES
17
28
  minitest (~> 5.0)
18
29
  rake (~> 13.0)
30
+ selenium-webdriver
19
31
  web_loader!
20
32
 
21
33
  BUNDLED WITH
data/exe/wl ADDED
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "web_loader"
4
+ require 'web_loader/drivers/selenium_driver'
5
+ require 'optparse'
6
+
7
+ class Wl
8
+ def self.run(argv)
9
+ STDOUT.sync = true
10
+ opts = {}
11
+ opt = OptionParser.new(argv)
12
+ opt.banner = "Usage: #{opt.program_name} [-h|--help] [Options] <URL> "
13
+ opt.version = WebLoader::VERSION
14
+ opt.separator('')
15
+ opt.separator("Options:")
16
+ opt.on_head('-h', '--help', 'Show this message') do |v|
17
+ puts opt.help
18
+ exit
19
+ end
20
+ opt.on('-v', '--verbose', 'Verbose message') {|v| opts[:v] = v}
21
+ drivers = ['pureruby', 'selenium']
22
+ opt.on('-d DRIVER', '--driver=DRIVER', drivers, drivers.join("|") + "(default pureruby)") {|v| opts[:d] = v }
23
+ opt.on("--disable-cache", "Disable cache") {|v| opts[:disable_cache] = v }
24
+ opt.parse!(argv)
25
+ if argv.empty?
26
+ puts "Error: URL is required."
27
+ puts opt.help
28
+ exit
29
+ end
30
+ command = Wl.new(opts)
31
+ url = argv[0]
32
+ command.execute(url)
33
+ end
34
+
35
+ def initialize(opts)
36
+ @opts = opts
37
+ end
38
+
39
+ def execute(url)
40
+ driver = create_driver
41
+ loader = WebLoader::Command.new(driver)
42
+ if @opts[:disable_cache]
43
+ loader.use_cache = false
44
+ end
45
+ result = loader.load(url)
46
+ puts result
47
+ end
48
+
49
+ private
50
+ def create_driver
51
+ case @opts[:d]
52
+ when 'selenium'
53
+ driver = WebLoader::Drivers::SeleniumDriver.new
54
+ else
55
+ driver = WebLoader::Drivers::HttpDriver.new
56
+ end
57
+ driver
58
+ end
59
+ end
60
+
61
+ Wl.run(ARGV)
@@ -1,7 +1,6 @@
1
1
  require 'open-uri'
2
2
  require 'net/http'
3
3
  require 'uri'
4
- require 'kconv'
5
4
 
6
5
  module WebLoader
7
6
  class Command
@@ -23,7 +22,7 @@ module WebLoader
23
22
  File.binwrite(file, content)
24
23
  end
25
24
 
26
- def initialize
25
+ def initialize(driver = ::WebLoader::Drivers::HttpDriver.new)
27
26
  @use_cache = true
28
27
  @load_cache_page = false #キャッシュを読み込んだかどうか
29
28
  @cache_dir = File.expand_path(CACHE_DIR)
@@ -34,12 +33,18 @@ module WebLoader
34
33
  @always_write_cache = false
35
34
  @response = nil
36
35
  @logger = nil
36
+
37
+ # ドライバーのセットアップ
38
+ @driver = driver
39
+ @driver.user_agent = @user_agent
40
+ @driver.binary = @binary
37
41
  end
38
42
 
39
43
  attr_reader :load_cache_page
40
44
  attr_accessor :use_cache, :cache_dir, :binary, :user_agent, :verbose
41
45
  attr_accessor :cache_limit
42
46
  attr_accessor :always_write_cache
47
+ attr_accessor :driver
43
48
  attr_reader :response
44
49
  attr_accessor :logger
45
50
 
@@ -62,15 +67,16 @@ module WebLoader
62
67
 
63
68
  ##### サーバーからロード
64
69
  log("Load server: #{url}")
65
- uri = URI.parse(url)
66
- http = Net::HTTP.new(uri.host, uri.port)
67
- if uri.scheme == 'https'
68
- http.use_ssl = true
69
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
70
- end
71
- @response = nil
70
+ # uri = URI.parse(url)
71
+ # http = Net::HTTP.new(uri.host, uri.port)
72
+ # if uri.scheme == 'https'
73
+ # http.use_ssl = true
74
+ # http.verify_mode = OpenSSL::SSL::VERIFY_NONE
75
+ # end
76
+ # @response = nil
72
77
  begin
73
- @response = http.get(uri.request_uri, 'User-Agent' => @user_agent) # request_uri=path + '?' + query
78
+ # @response = http.get(uri.request_uri, 'User-Agent' => @user_agent) # request_uri=path + '?' + query
79
+ @response = @driver.fetch(url)
74
80
  rescue Net::ReadTimeout
75
81
  # タイムアウトした場合リトライ可能ならばsleepした後に再度ロード実行
76
82
  log("Read timeout: #{url}")
@@ -82,38 +88,21 @@ module WebLoader
82
88
 
83
89
  ##### レスポンスの処理
84
90
  result = nil
85
- case @response
86
- when Net::HTTPSuccess
87
- # @responseがNet::HTTPSuccessのサブクラスの場合成功とみなし読み込んだ内容を返す
91
+ if response.ok?
88
92
  body = @response.body
89
- unless @binary
90
- # デフォルトでは ASCII-8BITが帰ってくる。
91
- # Content-Typeのcharsetとみなす。
92
- # https://bugs.ruby-lang.org/issues/2567
93
- encoding = @response.type_params['charset']
94
- body = toutf8(body, encoding)
95
- end
96
-
97
93
  if @use_cache || @always_write_cache
98
94
  log("Write cache: #{url}")
99
- Cache.write(@cache_dir, url, @response.code, body)
95
+ Cache.write(@cache_dir, url, @response.status, body)
100
96
  end
101
97
  result = body
102
- when Net::HTTPRedirection
103
- result = load(to_redirect_url(uri, @response['location']), redirect_count - 1)
104
- # when Net::HTTPNotFound
105
- # result = nil
106
- when Net::HTTPTooManyRequests, Net::ReadTimeout
98
+ elsif response.redirect?
99
+ result = load(to_redirect_url(URI.parse(url), @response.headers['location']), redirect_count - 1)
100
+ elsif response.rate_limited?
107
101
  # 上記以外のレスポンスの場合、リトライ可能ならばsleepした後に再度ロード実行
108
102
  if retry_count > 0
109
- sleep_for = 10
110
- if @response.is_a?(Net::HTTPTooManyRequests)
111
- # HTTPTooManyRequestsならばretry-afterで指定された値を取得。
112
- sleep_for = @response.header['retry-after'].to_i + 10
113
- log("Rate limit: #{uri} #{@response.header.to_hash} (429 Too Many Requests). Sleeping #{sleep_for} seconds and retry (##{retry_count}).")
114
- else
115
- log("Unknown response: #{uri} #{@response.inspect}. Sleeping #{sleep_for} seconds and retry (##{retry_count}).")
116
- end
103
+ # HTTPTooManyRequestsならばretry-afterで指定された値を取得。
104
+ sleep_for = @response.header['retry-after'].to_i + 10
105
+ log("Rate limit: #{uri} #{@response.header.to_hash} (429 Too Many Requests). Sleeping #{sleep_for} seconds and retry (##{retry_count}).")
117
106
  sleep sleep_for
118
107
  result = load(url, redirect_count , retry_count - 1)
119
108
  end
@@ -121,7 +110,51 @@ module WebLoader
121
110
  # それ以外は対応した例外を発生
122
111
  log("error #{url}", true)
123
112
  end
113
+
124
114
  result
115
+
116
+ # ##### レスポンスの処理
117
+ # result = nil
118
+ # case @response
119
+ # when Net::HTTPSuccess
120
+ # # @responseがNet::HTTPSuccessのサブクラスの場合成功とみなし読み込んだ内容を返す
121
+ # body = @response.body
122
+ # unless @binary
123
+ # # デフォルトでは ASCII-8BITが帰ってくる。
124
+ # # Content-Typeのcharsetとみなす。
125
+ # # https://bugs.ruby-lang.org/issues/2567
126
+ # encoding = @response.type_params['charset']
127
+ # body = toutf8(body, encoding)
128
+ # end
129
+ #
130
+ # if @use_cache || @always_write_cache
131
+ # log("Write cache: #{url}")
132
+ # Cache.write(@cache_dir, url, @response.code, body)
133
+ # end
134
+ # result = body
135
+ # when Net::HTTPRedirection
136
+ # result = load(to_redirect_url(uri, @response['location']), redirect_count - 1)
137
+ # # when Net::HTTPNotFound
138
+ # # result = nil
139
+ # when Net::HTTPTooManyRequests, Net::ReadTimeout
140
+ # # 上記以外のレスポンスの場合、リトライ可能ならばsleepした後に再度ロード実行
141
+ # if retry_count > 0
142
+ # sleep_for = 10
143
+ # if @response.is_a?(Net::HTTPTooManyRequests)
144
+ # # HTTPTooManyRequestsならばretry-afterで指定された値を取得。
145
+ # sleep_for = @response.header['retry-after'].to_i + 10
146
+ # log("Rate limit: #{uri} #{@response.header.to_hash} (429 Too Many Requests). Sleeping #{sleep_for} seconds and retry (##{retry_count}).")
147
+ # else
148
+ # log("Unknown response: #{uri} #{@response.inspect}. Sleeping #{sleep_for} seconds and retry (##{retry_count}).")
149
+ # end
150
+ # sleep sleep_for
151
+ # result = load(url, redirect_count , retry_count - 1)
152
+ # end
153
+ # else
154
+ # # それ以外は対応した例外を発生
155
+ # log("error #{url}", true)
156
+ # end
157
+ # result
125
158
  end
126
159
 
127
160
  private
@@ -0,0 +1,17 @@
1
+ module WebLoader
2
+ module Drivers
3
+ class BaseDriver
4
+ def initialize
5
+ @user_agent = nil
6
+ @binary = false
7
+ end
8
+
9
+ attr_accessor :user_agent, :binary
10
+
11
+ def fetch(url)
12
+ raise NotImplementedError, 'Subclasses must implement the fetch method'
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,40 @@
1
+ require 'open-uri'
2
+ require 'net/http'
3
+ require 'uri'
4
+ require 'kconv'
5
+
6
+
7
+ module WebLoader
8
+ module Drivers
9
+ class HttpDriver < WebLoader::Drivers::BaseDriver
10
+
11
+ def fetch(url)
12
+ uri = URI.parse(url)
13
+ http = Net::HTTP.new(uri.host, uri.port)
14
+ if uri.scheme == 'https'
15
+ http.use_ssl = true
16
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
17
+ end
18
+ response = http.get(uri.request_uri, 'User-Agent' => @user_agent) # request_uri=path + '?' + query
19
+ create_response(response)
20
+ end
21
+
22
+ private
23
+ def create_response(response)
24
+ body = response.body
25
+ unless @binary
26
+ # デフォルトでは ASCII-8BITが帰ってくる。
27
+ # Content-Typeのcharsetとみなす。
28
+ # https://bugs.ruby-lang.org/issues/2567
29
+ encoding = response.type_params['charset']
30
+ body = ::WebLoader::Utils.toutf8(body, encoding)
31
+ end
32
+ ::WebLoader::Response.new(
33
+ status: response.code.to_i,
34
+ headers: response.each_header.to_h,
35
+ body: body
36
+ )
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,62 @@
1
+ module WebLoader
2
+ module Drivers
3
+ class SeleniumDriver < ::WebLoader::Drivers::BaseDriver
4
+
5
+ def initialize
6
+ super
7
+ @wait_proc = nil
8
+ @wait_seconds = 3
9
+ end
10
+
11
+ attr_accessor :wait_proc
12
+ attr_accessor :wait_seconds
13
+
14
+ def fetch(url)
15
+ require 'selenium-webdriver'
16
+
17
+ # puts "SeleniumDriver fetching URL: #{url}"
18
+
19
+ options = Selenium::WebDriver::Chrome::Options.new
20
+ options.add_argument("--headless")
21
+ options.add_argument("--disable-gpu")
22
+ options.add_argument("--no-sandbox")
23
+ options.add_argument("--user-agent=#{@user_agent}") if @user_agent
24
+
25
+ begin
26
+
27
+ driver = Selenium::WebDriver.for(:chrome, options: options)
28
+ driver.navigate.to url
29
+
30
+ wait = Selenium::WebDriver::Wait.new(timeout: 10)
31
+
32
+ # ページ全体のロード完了を待つ
33
+ if @wait_proc
34
+ wait.until { @wait_proc.call(driver) }
35
+ else
36
+ sleep @wait_seconds
37
+ end
38
+
39
+ content_type = driver.execute_script("return document.contentType;")
40
+
41
+ body = @binary ? page_source.b : driver.page_source
42
+ response = WebLoader::Response.new(status: 200,
43
+ headers: {
44
+ 'Content-Type' => content_type
45
+ }, body: body)
46
+ response
47
+ ensure
48
+ driver.quit if driver
49
+ end
50
+ end
51
+
52
+ private
53
+ def create_response(body)
54
+ # デフォルトは成功200
55
+ status = 200
56
+ # redirected = driver.current_url != original_url
57
+ # status = 300 if redirected # 簡易的にリダイレクト扱い
58
+ new(status: status, headers: {}, body: body)
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,22 @@
1
+ module WebLoader
2
+ class Response
3
+ include WebLoader::Utils
4
+
5
+
6
+ def self.from_selenium(driver, original_url)
7
+
8
+ end
9
+
10
+ def initialize(status:, headers: {}, body: nil)
11
+ @status = status.to_i
12
+ @headers = headers || {}
13
+ @body = body
14
+ end
15
+
16
+ attr_reader :status, :headers, :body
17
+
18
+ def ok?; (200..299).include?(@status); end
19
+ def redirect?; (300..399).include?(@status); end
20
+ def rate_limited?; @status == 429; end
21
+ end
22
+ end
@@ -67,6 +67,7 @@ module WebLoader
67
67
  end
68
68
  result
69
69
  end
70
+ module_function :toutf8
70
71
 
71
72
  def to_redirect_url(orig_uri, location)
72
73
  redirect_url = location
@@ -75,5 +76,6 @@ module WebLoader
75
76
  end
76
77
  redirect_url
77
78
  end
79
+ module_function :to_redirect_url
78
80
  end
79
81
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WebLoader
4
- VERSION = "1.8.0"
4
+ VERSION = "2.1.0"
5
5
  end
data/lib/web_loader.rb CHANGED
@@ -4,6 +4,10 @@ require_relative "web_loader/version"
4
4
  require_relative "web_loader/utils"
5
5
  require_relative "web_loader/cache"
6
6
  require_relative "web_loader/command"
7
+ require_relative "web_loader/response"
8
+ require_relative "web_loader/drivers/base_driver"
9
+ require_relative "web_loader/drivers/http_driver"
10
+ require_relative "web_loader/drivers/selenium_driver"
7
11
 
8
12
  module WebLoader
9
13
  class Error < StandardError; end
data/test_wl.sh ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec ruby exe/wl "$@"
data/web_loader.iml CHANGED
@@ -10,6 +10,285 @@
10
10
  </content>
11
11
  <orderEntry type="jdk" jdkName="rbenv: 3.2.6" jdkType="RUBY_SDK" />
12
12
  <orderEntry type="sourceFolder" forTests="false" />
13
+ <orderEntry type="module-library">
14
+ <library name="base64 (v0.3.0) [path][gem]" type="rubylib">
15
+ <properties>
16
+ <option name="additionalInfo">
17
+ <AdditionalInfo>
18
+ <option name="authors" value="該当なし" />
19
+ <option name="email" value="該当なし" />
20
+ <option name="homepage" value="該当なし" />
21
+ <option name="summary" value="該当なし" />
22
+ </AdditionalInfo>
23
+ </option>
24
+ <option name="fromPath" value="true" />
25
+ <option name="name" value="base64" />
26
+ <option name="requirePaths">
27
+ <list>
28
+ <option value="lib" />
29
+ </list>
30
+ </option>
31
+ <option name="url" value="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/base64-0.3.0" />
32
+ <option name="version" value="0.3.0" />
33
+ </properties>
34
+ <CLASSES>
35
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/base64-0.3.0/lib" />
36
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/base64-0.3.0/sig" />
37
+ </CLASSES>
38
+ <JAVADOC />
39
+ <SOURCES>
40
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/base64-0.3.0/lib" />
41
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/base64-0.3.0/sig" />
42
+ </SOURCES>
43
+ </library>
44
+ </orderEntry>
45
+ <orderEntry type="module-library">
46
+ <library name="logger (v1.7.0) [path][gem]" type="rubylib">
47
+ <properties>
48
+ <option name="additionalInfo">
49
+ <AdditionalInfo>
50
+ <option name="authors" value="該当なし" />
51
+ <option name="email" value="該当なし" />
52
+ <option name="homepage" value="該当なし" />
53
+ <option name="summary" value="該当なし" />
54
+ </AdditionalInfo>
55
+ </option>
56
+ <option name="fromPath" value="true" />
57
+ <option name="name" value="logger" />
58
+ <option name="requirePaths">
59
+ <list>
60
+ <option value="lib" />
61
+ </list>
62
+ </option>
63
+ <option name="url" value="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/logger-1.7.0" />
64
+ <option name="version" value="1.7.0" />
65
+ </properties>
66
+ <CLASSES>
67
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/logger-1.7.0/lib" />
68
+ </CLASSES>
69
+ <JAVADOC />
70
+ <SOURCES>
71
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/logger-1.7.0/lib" />
72
+ </SOURCES>
73
+ </library>
74
+ </orderEntry>
75
+ <orderEntry type="module-library">
76
+ <library name="minitest (v5.26.2) [path][gem]" type="rubylib">
77
+ <properties>
78
+ <option name="additionalInfo">
79
+ <AdditionalInfo>
80
+ <option name="authors" value="該当なし" />
81
+ <option name="email" value="該当なし" />
82
+ <option name="homepage" value="該当なし" />
83
+ <option name="summary" value="該当なし" />
84
+ </AdditionalInfo>
85
+ </option>
86
+ <option name="fromPath" value="true" />
87
+ <option name="name" value="minitest" />
88
+ <option name="requirePaths">
89
+ <list>
90
+ <option value="lib" />
91
+ </list>
92
+ </option>
93
+ <option name="url" value="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/minitest-5.26.2" />
94
+ <option name="version" value="5.26.2" />
95
+ </properties>
96
+ <CLASSES>
97
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/minitest-5.26.2/lib" />
98
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/minitest-5.26.2/test" />
99
+ </CLASSES>
100
+ <JAVADOC />
101
+ <SOURCES>
102
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/minitest-5.26.2/lib" />
103
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/minitest-5.26.2/test" />
104
+ </SOURCES>
105
+ <excluded>
106
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/minitest-5.26.2/test" />
107
+ </excluded>
108
+ </library>
109
+ </orderEntry>
110
+ <orderEntry type="module-library">
111
+ <library name="rake (v13.3.1) [path][gem]" type="rubylib">
112
+ <properties>
113
+ <option name="additionalInfo">
114
+ <AdditionalInfo>
115
+ <option name="authors" value="該当なし" />
116
+ <option name="email" value="該当なし" />
117
+ <option name="homepage" value="該当なし" />
118
+ <option name="summary" value="該当なし" />
119
+ </AdditionalInfo>
120
+ </option>
121
+ <option name="fromPath" value="true" />
122
+ <option name="name" value="rake" />
123
+ <option name="requirePaths">
124
+ <list>
125
+ <option value="lib" />
126
+ </list>
127
+ </option>
128
+ <option name="url" value="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rake-13.3.1" />
129
+ <option name="version" value="13.3.1" />
130
+ </properties>
131
+ <CLASSES>
132
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rake-13.3.1/doc" />
133
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rake-13.3.1/exe" />
134
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rake-13.3.1/lib" />
135
+ </CLASSES>
136
+ <JAVADOC />
137
+ <SOURCES>
138
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rake-13.3.1/doc" />
139
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rake-13.3.1/exe" />
140
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rake-13.3.1/lib" />
141
+ </SOURCES>
142
+ <excluded>
143
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rake-13.3.1/doc" />
144
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rake-13.3.1/exe" />
145
+ </excluded>
146
+ </library>
147
+ </orderEntry>
148
+ <orderEntry type="module-library">
149
+ <library name="rexml (v3.4.4) [path][gem]" type="rubylib">
150
+ <properties>
151
+ <option name="additionalInfo">
152
+ <AdditionalInfo>
153
+ <option name="authors" value="該当なし" />
154
+ <option name="email" value="該当なし" />
155
+ <option name="homepage" value="該当なし" />
156
+ <option name="summary" value="該当なし" />
157
+ </AdditionalInfo>
158
+ </option>
159
+ <option name="fromPath" value="true" />
160
+ <option name="name" value="rexml" />
161
+ <option name="requirePaths">
162
+ <list>
163
+ <option value="lib" />
164
+ </list>
165
+ </option>
166
+ <option name="url" value="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4" />
167
+ <option name="version" value="3.4.4" />
168
+ </properties>
169
+ <CLASSES>
170
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc" />
171
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib" />
172
+ </CLASSES>
173
+ <JAVADOC />
174
+ <SOURCES>
175
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc" />
176
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib" />
177
+ </SOURCES>
178
+ <excluded>
179
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc" />
180
+ </excluded>
181
+ </library>
182
+ </orderEntry>
183
+ <orderEntry type="module-library">
184
+ <library name="rubyzip (v3.2.2) [path][gem]" type="rubylib">
185
+ <properties>
186
+ <option name="additionalInfo">
187
+ <AdditionalInfo>
188
+ <option name="authors" value="該当なし" />
189
+ <option name="email" value="該当なし" />
190
+ <option name="homepage" value="該当なし" />
191
+ <option name="summary" value="該当なし" />
192
+ </AdditionalInfo>
193
+ </option>
194
+ <option name="fromPath" value="true" />
195
+ <option name="name" value="rubyzip" />
196
+ <option name="requirePaths">
197
+ <list>
198
+ <option value="lib" />
199
+ </list>
200
+ </option>
201
+ <option name="url" value="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rubyzip-3.2.2" />
202
+ <option name="version" value="3.2.2" />
203
+ </properties>
204
+ <CLASSES>
205
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rubyzip-3.2.2/lib" />
206
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rubyzip-3.2.2/samples" />
207
+ </CLASSES>
208
+ <JAVADOC />
209
+ <SOURCES>
210
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rubyzip-3.2.2/lib" />
211
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rubyzip-3.2.2/samples" />
212
+ </SOURCES>
213
+ <excluded>
214
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/rubyzip-3.2.2/samples" />
215
+ </excluded>
216
+ </library>
217
+ </orderEntry>
218
+ <orderEntry type="module-library">
219
+ <library name="selenium-webdriver (v4.38.0) [path][gem]" type="rubylib">
220
+ <properties>
221
+ <option name="additionalInfo">
222
+ <AdditionalInfo>
223
+ <option name="authors" value="該当なし" />
224
+ <option name="email" value="該当なし" />
225
+ <option name="homepage" value="該当なし" />
226
+ <option name="summary" value="該当なし" />
227
+ </AdditionalInfo>
228
+ </option>
229
+ <option name="fromPath" value="true" />
230
+ <option name="name" value="selenium-webdriver" />
231
+ <option name="requirePaths">
232
+ <list>
233
+ <option value="lib" />
234
+ </list>
235
+ </option>
236
+ <option name="url" value="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/selenium-webdriver-4.38.0" />
237
+ <option name="version" value="4.38.0" />
238
+ </properties>
239
+ <CLASSES>
240
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/selenium-webdriver-4.38.0/bin" />
241
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/selenium-webdriver-4.38.0/lib" />
242
+ </CLASSES>
243
+ <JAVADOC />
244
+ <SOURCES>
245
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/selenium-webdriver-4.38.0/bin" />
246
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/selenium-webdriver-4.38.0/lib" />
247
+ </SOURCES>
248
+ <excluded>
249
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/selenium-webdriver-4.38.0/bin" />
250
+ </excluded>
251
+ </library>
252
+ </orderEntry>
253
+ <orderEntry type="module-library">
254
+ <library name="websocket (v1.2.11) [path][gem]" type="rubylib">
255
+ <properties>
256
+ <option name="additionalInfo">
257
+ <AdditionalInfo>
258
+ <option name="authors" value="該当なし" />
259
+ <option name="email" value="該当なし" />
260
+ <option name="homepage" value="該当なし" />
261
+ <option name="summary" value="該当なし" />
262
+ </AdditionalInfo>
263
+ </option>
264
+ <option name="fromPath" value="true" />
265
+ <option name="name" value="websocket" />
266
+ <option name="requirePaths">
267
+ <list>
268
+ <option value="lib" />
269
+ </list>
270
+ </option>
271
+ <option name="url" value="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/websocket-1.2.11" />
272
+ <option name="version" value="1.2.11" />
273
+ </properties>
274
+ <CLASSES>
275
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/websocket-1.2.11/lib" />
276
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/websocket-1.2.11/spec" />
277
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/websocket-1.2.11/.github" />
278
+ </CLASSES>
279
+ <JAVADOC />
280
+ <SOURCES>
281
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/websocket-1.2.11/lib" />
282
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/websocket-1.2.11/spec" />
283
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/websocket-1.2.11/.github" />
284
+ </SOURCES>
285
+ <excluded>
286
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/websocket-1.2.11/spec" />
287
+ <root url="file://$MODULE_DIR$/vendor/bundle/ruby/3.2.0/gems/websocket-1.2.11/.github" />
288
+ </excluded>
289
+ </library>
290
+ </orderEntry>
291
+ <orderEntry type="library" scope="PROVIDED" name="bundler (v2.6.3, rbenv: 3.2.6) [gem]" level="application" />
13
292
  </component>
14
293
  <component name="RakeTasksCache">
15
294
  <option name="myRootTask">
metadata CHANGED
@@ -1,26 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: web_loader
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - src
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-11-12 00:00:00.000000000 Z
11
+ date: 2025-11-28 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Web loader.
14
14
  email:
15
15
  - src@srcw.net
16
16
  executables:
17
- - web_loader
17
+ - wl
18
18
  extensions: []
19
19
  extra_rdoc_files: []
20
20
  files:
21
21
  - ".DS_Store"
22
22
  - ".idea/.gitignore"
23
23
  - ".idea/copilot.data.migration.agent.xml"
24
+ - ".idea/copilot.data.migration.ask.xml"
25
+ - ".idea/copilot.data.migration.ask2agent.xml"
26
+ - ".idea/copilot.data.migration.edit.xml"
24
27
  - ".idea/inspectionProfiles/Project_Default.xml"
25
28
  - ".idea/misc.xml"
26
29
  - ".idea/modules.xml"
@@ -32,14 +35,19 @@ files:
32
35
  - README.md
33
36
  - Rakefile
34
37
  - build.sh
35
- - exe/web_loader
38
+ - exe/wl
36
39
  - lib/web_loader.rb
37
40
  - lib/web_loader/cache.rb
38
41
  - lib/web_loader/command.rb
42
+ - lib/web_loader/drivers/base_driver.rb
43
+ - lib/web_loader/drivers/http_driver.rb
44
+ - lib/web_loader/drivers/selenium_driver.rb
45
+ - lib/web_loader/response.rb
39
46
  - lib/web_loader/utils.rb
40
47
  - lib/web_loader/version.rb
41
48
  - sig/web_loader.rbs
42
49
  - test.sh
50
+ - test_wl.sh
43
51
  - web_loader.iml
44
52
  homepage: https://srcw.net
45
53
  licenses:
data/exe/web_loader DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "web_loader"