wayfarer 0.4.5 → 0.4.7

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.
Files changed (175) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/lint.yaml +25 -0
  3. data/.github/workflows/release.yaml +29 -0
  4. data/.github/workflows/tests.yaml +30 -0
  5. data/.gitignore +4 -0
  6. data/.rubocop.yml +5 -0
  7. data/.vale.ini +5 -0
  8. data/.yardopts +1 -3
  9. data/Dockerfile +5 -4
  10. data/Gemfile +3 -0
  11. data/Gemfile.lock +107 -102
  12. data/Rakefile +5 -56
  13. data/bin/wayfarer +1 -1
  14. data/docker-compose.yml +20 -9
  15. data/docs/cookbook/consent_screen.md +2 -2
  16. data/docs/cookbook/executing_javascript.md +3 -3
  17. data/docs/cookbook/navigation.md +12 -12
  18. data/docs/cookbook/querying_html.md +3 -3
  19. data/docs/cookbook/screenshots.md +2 -2
  20. data/docs/cookbook/user_agent.md +1 -1
  21. data/docs/design.md +36 -0
  22. data/docs/guides/callbacks.md +24 -126
  23. data/docs/guides/configuration.md +8 -8
  24. data/docs/guides/handlers.md +60 -0
  25. data/docs/guides/index.md +1 -0
  26. data/docs/guides/jobs/error_handling.md +40 -0
  27. data/docs/guides/jobs.md +99 -31
  28. data/docs/guides/navigation.md +1 -1
  29. data/docs/guides/networking/capybara.md +13 -22
  30. data/docs/guides/networking/custom_adapters.md +82 -41
  31. data/docs/guides/networking/ferrum.md +4 -4
  32. data/docs/guides/networking/http.md +9 -13
  33. data/docs/guides/networking/selenium.md +10 -11
  34. data/docs/guides/pages.md +76 -10
  35. data/docs/guides/redis.md +10 -0
  36. data/docs/guides/routing.md +74 -0
  37. data/docs/guides/tasks.md +33 -9
  38. data/docs/guides/tutorial.md +60 -0
  39. data/docs/guides/user_agents.md +113 -0
  40. data/docs/index.md +17 -40
  41. data/docs/reference/cli.md +35 -25
  42. data/docs/reference/configuration.md +36 -0
  43. data/lib/wayfarer/base.rb +124 -46
  44. data/lib/wayfarer/batch_completion.rb +56 -0
  45. data/lib/wayfarer/callbacks.rb +22 -48
  46. data/lib/wayfarer/cli/route_printer.rb +71 -57
  47. data/lib/wayfarer/cli.rb +121 -0
  48. data/lib/wayfarer/gc.rb +13 -6
  49. data/lib/wayfarer/handler.rb +15 -7
  50. data/lib/wayfarer/logging.rb +38 -0
  51. data/lib/wayfarer/middleware/base.rb +2 -0
  52. data/lib/wayfarer/middleware/batch_completion.rb +19 -0
  53. data/lib/wayfarer/middleware/content_type.rb +54 -0
  54. data/lib/wayfarer/middleware/controller.rb +19 -15
  55. data/lib/wayfarer/middleware/dedup.rb +16 -13
  56. data/lib/wayfarer/middleware/dispatch.rb +12 -4
  57. data/lib/wayfarer/middleware/normalize.rb +12 -11
  58. data/lib/wayfarer/middleware/redis.rb +15 -0
  59. data/lib/wayfarer/middleware/router.rb +33 -35
  60. data/lib/wayfarer/middleware/stage.rb +5 -5
  61. data/lib/wayfarer/middleware/uri_parser.rb +30 -0
  62. data/lib/wayfarer/middleware/user_agent.rb +49 -0
  63. data/lib/wayfarer/networking/capybara.rb +1 -1
  64. data/lib/wayfarer/networking/context.rb +2 -2
  65. data/lib/wayfarer/networking/ferrum.rb +2 -2
  66. data/lib/wayfarer/networking/follow.rb +12 -6
  67. data/lib/wayfarer/networking/http.rb +1 -1
  68. data/lib/wayfarer/networking/pool.rb +17 -12
  69. data/lib/wayfarer/networking/selenium.rb +3 -3
  70. data/lib/wayfarer/networking/strategy.rb +2 -2
  71. data/lib/wayfarer/page.rb +36 -14
  72. data/lib/wayfarer/parsing/xml.rb +6 -6
  73. data/lib/wayfarer/parsing.rb +24 -0
  74. data/lib/wayfarer/redis/barrier.rb +13 -21
  75. data/lib/wayfarer/redis/counter.rb +19 -9
  76. data/lib/wayfarer/redis/pool.rb +1 -1
  77. data/lib/wayfarer/redis/resettable.rb +19 -0
  78. data/lib/wayfarer/routing/dsl.rb +1 -0
  79. data/lib/wayfarer/routing/matchers/path.rb +4 -2
  80. data/lib/wayfarer/routing/root_route.rb +5 -1
  81. data/lib/wayfarer/routing/route.rb +4 -14
  82. data/lib/wayfarer/stringify.rb +22 -30
  83. data/lib/wayfarer/task.rb +12 -18
  84. data/lib/wayfarer.rb +29 -2
  85. data/mkdocs.yml +52 -7
  86. data/rake/docs.rake +26 -0
  87. data/rake/lint.rake +105 -0
  88. data/rake/release.rake +29 -0
  89. data/rake/tests.rake +28 -0
  90. data/requirements.txt +1 -1
  91. data/spec/base_spec.rb +140 -160
  92. data/spec/batch_completion_spec.rb +104 -0
  93. data/spec/cli/job_spec.rb +19 -23
  94. data/spec/cli/routing_spec.rb +101 -0
  95. data/spec/cli/version_spec.rb +1 -1
  96. data/spec/factories/task.rb +7 -1
  97. data/spec/fixtures/dummy_job.rb +5 -3
  98. data/spec/gc_spec.rb +8 -50
  99. data/spec/handler_spec.rb +1 -1
  100. data/spec/integration/callbacks_spec.rb +157 -45
  101. data/spec/integration/content_type_spec.rb +145 -0
  102. data/spec/integration/gc_spec.rb +44 -0
  103. data/spec/integration/handler_spec.rb +66 -0
  104. data/spec/integration/page_spec.rb +44 -29
  105. data/spec/integration/params_spec.rb +33 -25
  106. data/spec/integration/parsing_spec.rb +125 -0
  107. data/spec/integration/routing_spec.rb +18 -0
  108. data/spec/integration/stage_spec.rb +27 -20
  109. data/spec/middleware/batch_completion_spec.rb +34 -0
  110. data/spec/middleware/chain_spec.rb +8 -8
  111. data/spec/middleware/content_type_spec.rb +86 -0
  112. data/spec/middleware/controller_spec.rb +5 -5
  113. data/spec/middleware/dedup_spec.rb +38 -55
  114. data/spec/middleware/dispatch_spec.rb +23 -7
  115. data/spec/middleware/normalize_spec.rb +44 -13
  116. data/spec/middleware/router_spec.rb +29 -30
  117. data/spec/middleware/stage_spec.rb +8 -8
  118. data/spec/middleware/uri_parser_spec.rb +53 -0
  119. data/spec/middleware/{fetch_spec.rb → user_agent_spec.rb} +28 -27
  120. data/spec/networking/context_spec.rb +17 -0
  121. data/spec/networking/follow_spec.rb +2 -2
  122. data/spec/networking/pool_spec.rb +5 -5
  123. data/spec/networking/strategy.rb +2 -2
  124. data/spec/page_spec.rb +42 -20
  125. data/spec/parsing/xml_spec.rb +11 -12
  126. data/spec/redis/barrier_spec.rb +8 -48
  127. data/spec/redis/counter_spec.rb +13 -1
  128. data/spec/redis/pool_spec.rb +1 -1
  129. data/spec/spec_helpers.rb +27 -16
  130. data/spec/support/test_app.rb +8 -0
  131. data/spec/task_spec.rb +3 -24
  132. data/spec/wayfarer_spec.rb +1 -1
  133. data/wayfarer.gemspec +4 -3
  134. metadata +61 -51
  135. data/.github/workflows/ci.yaml +0 -32
  136. data/docs/guides/error_handling.md +0 -31
  137. data/docs/guides/networking.md +0 -94
  138. data/docs/guides/performance.md +0 -130
  139. data/docs/guides/reliability.md +0 -41
  140. data/docs/guides/routing/steering.md +0 -30
  141. data/docs/reference/api/base.md +0 -48
  142. data/docs/reference/configuration_keys.md +0 -42
  143. data/docs/reference/environment_variables.md +0 -83
  144. data/lib/wayfarer/cli/base.rb +0 -45
  145. data/lib/wayfarer/cli/generate.rb +0 -17
  146. data/lib/wayfarer/cli/job.rb +0 -56
  147. data/lib/wayfarer/cli/route.rb +0 -29
  148. data/lib/wayfarer/cli/runner.rb +0 -34
  149. data/lib/wayfarer/cli/templates/Gemfile.tt +0 -5
  150. data/lib/wayfarer/cli/templates/job.rb.tt +0 -10
  151. data/lib/wayfarer/config/capybara.rb +0 -10
  152. data/lib/wayfarer/config/ferrum.rb +0 -11
  153. data/lib/wayfarer/config/networking.rb +0 -26
  154. data/lib/wayfarer/config/redis.rb +0 -14
  155. data/lib/wayfarer/config/root.rb +0 -11
  156. data/lib/wayfarer/config/selenium.rb +0 -21
  157. data/lib/wayfarer/config/strconv.rb +0 -45
  158. data/lib/wayfarer/config/struct.rb +0 -72
  159. data/lib/wayfarer/middleware/fetch.rb +0 -56
  160. data/lib/wayfarer/redis/connection.rb +0 -13
  161. data/lib/wayfarer/redis/version.rb +0 -19
  162. data/lib/wayfarer/routing/router.rb +0 -28
  163. data/spec/callbacks_spec.rb +0 -102
  164. data/spec/cli/generate_spec.rb +0 -39
  165. data/spec/config/capybara_spec.rb +0 -18
  166. data/spec/config/ferrum_spec.rb +0 -24
  167. data/spec/config/networking_spec.rb +0 -73
  168. data/spec/config/redis_spec.rb +0 -32
  169. data/spec/config/root_spec.rb +0 -31
  170. data/spec/config/selenium_spec.rb +0 -56
  171. data/spec/config/strconv_spec.rb +0 -58
  172. data/spec/config/struct_spec.rb +0 -66
  173. data/spec/integration/steering_spec.rb +0 -57
  174. data/spec/redis/version_spec.rb +0 -13
  175. data/spec/routing/router_spec.rb +0 -24
@@ -17,7 +17,7 @@ describe Wayfarer::Networking::Pool do
17
17
  end
18
18
 
19
19
  context "when using Ferrum", ferrum: true do
20
- before { Wayfarer.config.network.agent = :ferrum }
20
+ before { Wayfarer.config[:network][:agent] = :ferrum }
21
21
 
22
22
  it "yields Ferrum" do
23
23
  pool.with do |context|
@@ -27,7 +27,7 @@ describe Wayfarer::Networking::Pool do
27
27
  end
28
28
 
29
29
  context "when using Selenium", selenium: true do
30
- before { Wayfarer.config.network.agent = :selenium }
30
+ before { Wayfarer.config[:network][:agent] = :selenium }
31
31
 
32
32
  it "yields Selenium" do
33
33
  pool.with do |context|
@@ -38,8 +38,8 @@ describe Wayfarer::Networking::Pool do
38
38
 
39
39
  context "when using Capybara", ferrum: true do
40
40
  before do
41
- Wayfarer.config.network.agent = :capybara
42
- Wayfarer.config.capybara.driver = :cuprite
41
+ Wayfarer.config[:network][:agent] = :capybara
42
+ Wayfarer.config[:capybara][:driver] = :cuprite
43
43
  end
44
44
 
45
45
  it "yields Capybara" do
@@ -55,7 +55,7 @@ describe Wayfarer::Networking::Pool do
55
55
 
56
56
  before do
57
57
  pool.class.registry[:foobar] = double(new: strategy)
58
- Wayfarer.config.network.agent = :foobar
58
+ Wayfarer.config[:network][:agent] = :foobar
59
59
  end
60
60
 
61
61
  it "destroys the strategy" do
@@ -76,7 +76,7 @@ RSpec.shared_examples "Network strategy" do |options|
76
76
 
77
77
  describe "HTTP headers" do
78
78
  before do
79
- Wayfarer.config.network.http_headers = { "User-Agent" => "Foobar" }
79
+ Wayfarer.config[:network][:http_headers] = { "User-Agent" => "Foobar" }
80
80
  context.renew
81
81
  end
82
82
 
@@ -158,7 +158,7 @@ RSpec.shared_examples "Network strategy" do |options|
158
158
 
159
159
  describe "Client timeout" do
160
160
  before do
161
- Wayfarer.config.selenium.client_timeout = 42
161
+ Wayfarer.config[:selenium][:client_timeout] = 42
162
162
  context.renew
163
163
  end
164
164
 
data/spec/page_spec.rb CHANGED
@@ -3,45 +3,67 @@
3
3
  require "spec_helpers"
4
4
 
5
5
  describe Wayfarer::Page do
6
+ describe "#mime_type" do
7
+ let(:headers) { { "Content-Type" => "text/html; charset=UTF-8" } }
8
+
9
+ subject { build(:page, headers: headers).mime_type }
10
+
11
+ it { is_expected.to eq("text/html") }
12
+ end
13
+
6
14
  describe "#doc" do
7
15
  context "when Content-Type is absent" do
8
- subject(:page) { build(:page, :html, headers: {}) }
16
+ subject { build(:page, :html, headers: {}).doc }
9
17
 
10
- it "returns a Nokogiri::HTML::Document" do
11
- expect(page.doc).to be_a(Nokogiri::HTML::Document)
12
- end
18
+ it { is_expected.to be(nil) }
13
19
  end
14
20
 
15
21
  context "when Content-Type is HTML" do
16
- subject(:page) { build(:page, :html) }
22
+ subject(:page) { build(:page, :html).doc }
17
23
 
18
- it "returns a Nokogiri::HTML::Document" do
19
- expect(page.doc).to be_a(Nokogiri::HTML::Document)
20
- end
24
+ it { is_expected.to be_a(Nokogiri::HTML::Document) }
21
25
  end
22
26
 
23
27
  context "when Content-Type is XML" do
24
- subject(:page) { build(:page, :xml) }
28
+ subject(:page) { build(:page, :xml).doc }
25
29
 
26
- it "returns a Nokogiri::XML::Document" do
27
- expect(page.doc).to be_a(Nokogiri::XML::Document)
28
- end
30
+ it { is_expected.to be_a(Nokogiri::XML::Document) }
29
31
  end
30
32
 
31
33
  context "when Content-Type is JSON" do
32
- subject(:page) { build(:page, :json) }
34
+ subject(:page) { build(:page, :json).doc }
33
35
 
34
- it "returns a Hash" do
35
- expect(page.doc).to be_a(Hash)
36
- end
36
+ it { is_expected.to be_a(Hash) }
37
+ end
38
+
39
+ context "with Content-Type parameters" do
40
+ subject(:page) { build(:page, headers: { "content-type" => "text/html; charset=UTF-8" }).doc }
41
+
42
+ it { is_expected.to be_a(Nokogiri::HTML::Document) }
43
+ end
44
+
45
+ context "when Content-Type is unsupported" do
46
+ subject(:page) { build(:page, headers: { "Content-Type" => "foo/bar" }).doc }
47
+
48
+ it { is_expected.to be_nil }
37
49
  end
38
50
  end
39
51
 
40
- describe "#meta" do
41
- subject(:page) { build(:page, :html) }
52
+ describe "#headers" do
53
+ subject(:headers) { build(:page, headers: { "Content-Type" => "text/html" }).headers }
54
+
55
+ it "downcases keys" do
56
+ expect(headers).to eq("content-type" => "text/html")
57
+ end
42
58
 
43
- it "returns a MetaInspector document" do
44
- expect(page.meta).to be_a(MetaInspector::Document)
59
+ it "is case-sensitive" do
60
+ expect(headers["Content-Type"]).to be_nil
45
61
  end
46
62
  end
63
+
64
+ describe "#meta" do
65
+ subject(:page) { build(:page).meta }
66
+
67
+ it { is_expected.to be_a(MetaInspector::Document) }
68
+ end
47
69
  end
@@ -2,24 +2,23 @@
2
2
 
3
3
  require "spec_helpers"
4
4
 
5
- describe Wayfarer::Parsing::XML do
6
- subject(:parser) { Wayfarer::Parsing::XML }
5
+ describe Wayfarer::Parsing::XML, ".parse" do
6
+ let(:xml) { "<span>Foobar</span>" }
7
+ subject(:doc) { Wayfarer::Parsing::XML.parse(xml, variant) }
7
8
 
8
- describe ".parse_html" do
9
- it "returns a Nokogiri::HTML::Document" do
10
- html_str = "<span>Foobar</span>"
11
- doc = parser.parse_html(html_str)
9
+ context "HTML" do
10
+ let(:variant) { :html }
12
11
 
13
- expect(doc).to be_a Nokogiri::HTML::Document
12
+ specify do
13
+ expect(doc).to be_a(Nokogiri::HTML::Document)
14
14
  end
15
15
  end
16
16
 
17
- describe ".parse_xml" do
18
- it "returns a Nokogiri::XML::Document" do
19
- xml_str = "<barqux>Foobar</barqux>"
20
- doc = parser.parse_xml(xml_str)
17
+ context "XML" do
18
+ let(:variant) { :xml }
21
19
 
22
- expect(doc).to be_a Nokogiri::XML::Document
20
+ specify do
21
+ expect(doc).to be_a(Nokogiri::XML::Document)
23
22
  end
24
23
  end
25
24
  end
@@ -3,8 +3,8 @@
3
3
  require "spec_helpers"
4
4
 
5
5
  describe Wayfarer::Redis::Barrier, redis: true do
6
- let(:url) { "https://example.com" }
7
- subject(:barrier) { Wayfarer::Redis::Barrier.new("batch") }
6
+ let(:task) { build(:task, :redis_pool) }
7
+ subject(:barrier) { Wayfarer::Redis::Barrier.new(task) }
8
8
 
9
9
  describe "#redis_key" do
10
10
  it "returns the expected Redis key" do
@@ -14,65 +14,25 @@ describe Wayfarer::Redis::Barrier, redis: true do
14
14
 
15
15
  describe "#reset!" do
16
16
  it "resets seen URLs" do
17
- barrier.seen?(url)
17
+ barrier.check!(task.url)
18
18
  barrier.reset!
19
- expect(barrier.seen?(url)).to be false
19
+ expect(barrier.check!(task.url)).to be(false)
20
20
  end
21
21
  end
22
22
 
23
- describe "#seen?" do
23
+ describe "#check!" do
24
24
  context "with seen URL" do
25
- before { barrier.seen?(url) }
25
+ before { barrier.check!(task.url) }
26
26
 
27
27
  it "returns true" do
28
- expect(barrier.seen?(url)).to be(true)
28
+ expect(barrier.check!(task.url)).to be(true)
29
29
  end
30
30
  end
31
31
 
32
32
  context "with unseen URL" do
33
33
  it "returns false" do
34
- expect(barrier.seen?(url)).to be(false)
34
+ expect(barrier.check!(task.url)).to be(false)
35
35
  end
36
36
  end
37
37
  end
38
-
39
- describe "#peek" do
40
- let(:seen_urls) { %w[https://yahoo.com https://google.com] }
41
- let(:unseen_urls) { %w[https://w3c.org https://nasa.gov] }
42
-
43
- before do
44
- allow(Wayfarer::Redis::Version).to receive(:determine).and_return(redis_version)
45
-
46
- seen_urls.each do |url|
47
- barrier.seen?(url)
48
- end
49
- end
50
-
51
- context "Redis >= 6.2.0" do
52
- let(:redis_version) { [6, 2, 5] }
53
-
54
- it "returns membership" do
55
- urls = [*seen_urls, *unseen_urls]
56
- expect(barrier.peek(urls)).to eq([true, true, false, false])
57
- end
58
- end
59
-
60
- context "Redis < 6.2.0" do
61
- let(:redis_version) { [2, 6, 10] }
62
-
63
- it "returns membership" do
64
- urls = [*seen_urls, *unseen_urls]
65
- expect(barrier.peek(urls)).to eq([true, true, false, false])
66
- end
67
- end
68
- end
69
-
70
- describe "#unsee" do
71
- it "removes a seen URL" do
72
- barrier.seen?(url)
73
- expect {
74
- barrier.unsee(url)
75
- }.to change { barrier.seen?(url) }.to(false)
76
- end
77
- end
78
38
  end
@@ -3,7 +3,9 @@
3
3
  require "spec_helpers"
4
4
 
5
5
  describe Wayfarer::Redis::Counter, redis: true do
6
- subject(:counter) { Wayfarer::Redis::Counter.new("batch") }
6
+ let(:callback) { -> {} }
7
+ let(:task) { build(:task, :redis_pool) }
8
+ subject(:counter) { Wayfarer::Redis::Counter.new(task, &callback) }
7
9
 
8
10
  describe "#redis_key" do
9
11
  it "returns the expected Redis key" do
@@ -21,6 +23,16 @@ describe Wayfarer::Redis::Counter, redis: true do
21
23
  it "decrements" do
22
24
  expect { counter.decrement }.to change { counter.value }.by(-1)
23
25
  end
26
+
27
+ context "when reaching zero" do
28
+ let(:callback) { -> { @callback_called = true } }
29
+
30
+ before { counter.increment }
31
+
32
+ it "runs callback" do
33
+ expect { counter.decrement }.to change { @callback_called }.to(true).from(nil)
34
+ end
35
+ end
24
36
  end
25
37
 
26
38
  describe "#reset!" do
@@ -8,7 +8,7 @@ describe Wayfarer::Redis::Pool, redis: true do
8
8
 
9
9
  describe "::with" do
10
10
  before do
11
- Wayfarer.config.redis.factory = ->(_) { conn }
11
+ Wayfarer.config[:redis][:factory] = ->(_) { conn }
12
12
  end
13
13
 
14
14
  it "instantiates the factory and yields" do
data/spec/spec_helpers.rb CHANGED
@@ -33,12 +33,12 @@ module SpecHelpers
33
33
  FileUtils.mkdir_p(Pathname.new(path).dirname)
34
34
  IO.write(path, contents)
35
35
  end
36
+ end
36
37
 
37
- # ActiveJob test helpers swallow errors
38
- Base = Class.new(Wayfarer::Base) do
39
- rescue_from(StandardError) do |e|
40
- raise e
41
- end
38
+ module ActiveJobTestHelper
39
+ # perform_enqueued_jobs calls assert_equal
40
+ def assert_equal(expected, actual, _)
41
+ expect(actual).to eq(expected)
42
42
  end
43
43
  end
44
44
 
@@ -46,9 +46,13 @@ RSpec.configure do |config|
46
46
  config.include(FactoryBot::Syntax::Methods)
47
47
  config.include(ActiveJob::TestHelper)
48
48
  config.include(SpecHelpers)
49
+ config.include(ActiveJobTestHelper)
49
50
 
50
51
  config.before(:suite) do
52
+ Wayfarer::Logging.logger = Logger.new($stdout)
53
+
51
54
  FactoryBot.find_definitions
55
+ FactoryBot::SyntaxRunner.include SpecHelpers
52
56
 
53
57
  mutex = Mutex.new
54
58
  cvar = ConditionVariable.new
@@ -67,10 +71,8 @@ RSpec.configure do |config|
67
71
  end
68
72
 
69
73
  config.before do
70
- Wayfarer.config = Wayfarer::Config::Root.new
71
- Wayfarer.config.redis.url = redis_host
72
-
73
- ::Redis.new(url: redis_host).flushall
74
+ Wayfarer.config = Wayfarer::DEFAULT_CONFIG.clone
75
+ Wayfarer.config[:redis][:url] = redis_host
74
76
 
75
77
  ActiveJob::Base.queue_adapter = :test
76
78
  ActiveJob::Base.logger = Logger.new(nil)
@@ -81,17 +83,21 @@ RSpec.configure do |config|
81
83
  # For unknown reasons, Wayfarer::Networking::Ferrum#renew can take a very
82
84
  # long time to instantiate a new ::Ferrum::Browser and requires the 60s
83
85
  # timeout. TODO: Figure out what's going on
84
- Wayfarer.config.ferrum.options = { url: "http://chrome:3000", timeout: 120 }
85
- Wayfarer.config.selenium.driver = :firefox
86
- Wayfarer.config.selenium.options = { url: "http://firefox:4444" }
87
- Wayfarer.config.selenium.client_timeout = 10
86
+ Wayfarer.config[:ferrum][:options] = { url: "http://chrome:3000", timeout: 120 }
87
+ Wayfarer.config[:selenium][:driver] = :firefox
88
+ Wayfarer.config[:selenium][:options] = { url: "http://firefox:4444" }
89
+ Wayfarer.config[:selenium][:client_timeout] = 10
88
90
  end
89
91
 
90
92
  # TODO: Undo side-effect
91
93
  Capybara.register_driver(:cuprite) do |app|
92
- Capybara::Cuprite::Driver.new(app, Wayfarer.config.ferrum.options)
94
+ Capybara::Cuprite::Driver.new(app, Wayfarer.config[:ferrum][:options])
93
95
  end
94
- Wayfarer.config.capybara.driver = :cuprite
96
+ Wayfarer.config[:capybara][:driver] = :cuprite
97
+ end
98
+
99
+ config.before(:each, redis: true) do
100
+ ::Redis.new(url: redis_host).flushall
95
101
  end
96
102
 
97
103
  config.around(cli: true) do |example|
@@ -99,7 +105,12 @@ RSpec.configure do |config|
99
105
  tmp = Dir.mktmpdir
100
106
  Dir.chdir(tmp)
101
107
  example.run
108
+ ensure
102
109
  Dir.chdir(origin)
103
- FileUtils.rm_r(tmp)
110
+ # FileUtils.rm_r(tmp)
111
+ end
112
+
113
+ config.before(:each, cli: true) do
114
+ Object.send(:remove_const, :DummyJob) if defined?(DummyJob)
104
115
  end
105
116
  end
@@ -12,6 +12,14 @@ class TestApp < Sinatra::Base
12
12
  request.env[params[:header]]
13
13
  end
14
14
 
15
+ get "/response_header/:key/:val" do
16
+ headers params[:key] => params[:val]
17
+ end
18
+
19
+ get "/response_header/Content-Type/*" do
20
+ headers "Content-Type" => params[:splat].first
21
+ end
22
+
15
23
  get "/hello_world" do
16
24
  headers "hello" => "world"
17
25
  "Hello world!"
data/spec/task_spec.rb CHANGED
@@ -5,30 +5,9 @@ require "spec_helpers"
5
5
  describe Wayfarer::Task do
6
6
  subject(:task) { build(:task) }
7
7
 
8
- describe "#metadata" do
9
- it "returns an OpenStruct" do
10
- expect(task.metadata).to be_an(OpenStruct)
11
- end
12
- end
13
-
14
- describe "#barrier" do
15
- it "returns its batch barrier" do
16
- expect(task.barrier).to be_a(Wayfarer::Redis::Barrier)
17
- expect(task.barrier.batch).to eq(task.batch)
18
- end
19
- end
20
-
21
- describe "#counter" do
22
- it "returns its batch counter" do
23
- expect(task.counter).to be_a(Wayfarer::Redis::Counter)
24
- expect(task.counter.batch).to eq(task.batch)
25
- end
26
- end
27
-
28
- describe "#gc" do
29
- it "returns a garbage collector" do
30
- expect(task.gc).to be_a(Wayfarer::GC)
31
- expect(task.gc.task).to be(task)
8
+ describe "#[], #[]=" do
9
+ specify do
10
+ expect { task[:foo] = "bar" }.to change { task[:foo] }.from(nil).to("bar")
32
11
  end
33
12
  end
34
13
  end
@@ -8,6 +8,6 @@ describe Wayfarer do
8
8
  end
9
9
 
10
10
  describe "::config" do
11
- it("returns a config") { expect(Wayfarer.config).to be_a(Wayfarer::Config::Root) }
11
+ specify { expect(Wayfarer.config).to be_a(Hash) }
12
12
  end
13
13
  end
data/wayfarer.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "wayfarer"
5
- s.version = "0.4.5"
5
+ s.version = "0.4.7"
6
6
  s.license = "MIT"
7
7
 
8
8
  s.homepage = "http://github.com/bauerd/wayfarer"
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
22
22
 
23
23
  s.required_ruby_version = "~> 2.7"
24
24
 
25
- s.add_runtime_dependency "activejob", ">= 6.0"
25
+ s.add_runtime_dependency "activejob", ">= 7.1"
26
26
  s.add_runtime_dependency "addressable", "~> 2.8"
27
27
  s.add_runtime_dependency "capybara", "~> 3.0"
28
28
  s.add_runtime_dependency "connection_pool", "~> 2.2"
@@ -30,14 +30,15 @@ Gem::Specification.new do |s|
30
30
  s.add_runtime_dependency "ferrum", "~> 0.9"
31
31
  s.add_runtime_dependency "metainspector", "~> 5.0"
32
32
  s.add_runtime_dependency "mime-types", "~> 3.0"
33
- s.add_runtime_dependency "mustermann", "~> 1.1"
34
33
  s.add_runtime_dependency "mock_redis", "~> 0.29"
34
+ s.add_runtime_dependency "mustermann", "~> 1.1"
35
35
  s.add_runtime_dependency "net-http-persistent", "~> 3.0"
36
36
  s.add_runtime_dependency "nokogiri", "~> 1.11"
37
37
  s.add_runtime_dependency "normalize_url", "~> 0.0.6"
38
38
  s.add_runtime_dependency "redis", "~> 4.4", "< 4.5" # redis 4.5.x broke SMISMEMBER
39
39
  s.add_runtime_dependency "selenium-webdriver", "~> 3.4"
40
40
  s.add_runtime_dependency "thor", "~> 1.0"
41
+ s.add_runtime_dependency "zeitwerk", "~> 2.4"
41
42
 
42
43
  s.add_development_dependency "cuprite", "~> 0.13"
43
44
  s.add_development_dependency "factory_bot", "~> 6.0"