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
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wayfarer
4
+ module Redis
5
+ module Resettable
6
+ def reset!
7
+ redis_pool.with { |conn| conn.del(redis_key) }
8
+ end
9
+
10
+ def redis_pool
11
+ raise NotImplementedError
12
+ end
13
+
14
+ def redis_key
15
+ raise NotImplementedError
16
+ end
17
+ end
18
+ end
19
+ end
@@ -13,6 +13,7 @@ module Wayfarer
13
13
 
14
14
  def path(path, options = {}, &block)
15
15
  offset = File.join(path_offset, path)
16
+
16
17
  add_child_route(nil, offset, options, &block).tap do |route|
17
18
  route.matcher = Matchers::Path.new(offset, route)
18
19
  end
@@ -17,10 +17,12 @@ module Wayfarer
17
17
  end
18
18
 
19
19
  def match(url)
20
- route.accept(self)
21
-
20
+ # TODO: Ditch this and add a parameter to the path DSL#path
21
+ #
22
22
  # If the route's branch contains other path matchers in child routes,
23
23
  # match the beginning of the path (peeking), instead of the whole path.
24
+ route.accept(self)
25
+
24
26
  !!(if peeking
25
27
  matcher.peek(url.path)
26
28
  else
@@ -2,6 +2,10 @@
2
2
 
3
3
  module Wayfarer
4
4
  module Routing
5
- class RootRoute < Route; end
5
+ class RootRoute < Route
6
+ def invoke(url)
7
+ PathFinder.result(self, url)
8
+ end
9
+ end
6
10
  end
7
11
  end
@@ -5,6 +5,7 @@ module Wayfarer
5
5
  class Route
6
6
  include DSL
7
7
  include Stringify
8
+ extend Forwardable
8
9
 
9
10
  attr_reader :children
10
11
 
@@ -15,8 +16,7 @@ module Wayfarer
15
16
 
16
17
  stringify :matcher,
17
18
  :action,
18
- :path_offset,
19
- :children
19
+ :path_offset
20
20
 
21
21
  def initialize(matcher = Matchers::Custom.new { children.any? }, path_offset = "/")
22
22
  @matcher = matcher
@@ -24,24 +24,14 @@ module Wayfarer
24
24
  @path_offset = path_offset
25
25
  end
26
26
 
27
- def match(url)
28
- matcher.match(url)
29
- end
30
-
31
- def matches?(url)
32
- invoke(url).is_a?(Result::Match)
33
- end
34
-
35
- def invoke(url)
36
- PathFinder.result(self, url)
37
- end
38
-
39
27
  # Accepts a visitor for in-order traversal.
40
28
  def accept(visitor)
41
29
  return unless visitor.visit(self)
42
30
 
43
31
  children.each { |child| child.accept(visitor) }
44
32
  end
33
+
34
+ delegate match: :matcher
45
35
  end
46
36
  end
47
37
  end
@@ -1,46 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # 346325
4
-
5
3
  module Wayfarer
6
4
  module Stringify
7
- def self.included(base)
8
- base.include(InstanceMethods)
9
- base.extend(ClassMethods)
10
- base.instance_eval do
11
- cattr_accessor :stringified_attributes do
12
- []
13
- end
14
- end
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ class_attribute :stringified_attributes,
9
+ default: [],
10
+ instance_accessor: false,
11
+ instance_predicate: false
12
+
13
+ alias_method :inspect, :to_s
15
14
  end
16
15
 
17
- module ClassMethods
16
+ class_methods do
18
17
  def stringify(*variables)
19
18
  stringified_attributes.concat(variables)
20
19
  end
21
20
  end
22
21
 
23
- module InstanceMethods
24
- def to_s
25
- if self.class.stringified_attributes.any?
26
- "#<#{class_name} #{attributes.join(', ')}>"
27
- else
28
- "#<#{class_name}>"
29
- end
30
- end
31
-
32
- alias inspect to_s
22
+ def to_s
23
+ class_name = self.class.name
33
24
 
34
- def class_name
35
- self.class.name
36
- end
25
+ if self.class.stringified_attributes.any?
26
+ attrs = self.class
27
+ .stringified_attributes
28
+ .map { |attr| [attr, public_send(attr)] }
29
+ .to_h
30
+ .map { |k, v| "#{k}=#{v.inspect}" }
31
+ .join(", ")
37
32
 
38
- def attributes
39
- self.class
40
- .stringified_attributes
41
- .map { |attr| [attr, public_send(attr)] }
42
- .to_h
43
- .map { |k, v| [k, "=", v.inspect].join }
33
+ "#<#{class_name} #{attrs}>"
34
+ else
35
+ "#<#{class_name}>"
44
36
  end
45
37
  end
46
38
  end
data/lib/wayfarer/task.rb CHANGED
@@ -1,36 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Wayfarer
4
+ # @!attribute [r] url
5
+ # @return [String] the URL to process
6
+ # @!attribute [r] batch
7
+ # @return [String] the batch the task belongs to
4
8
  class Task
9
+ extend Forwardable
5
10
  include Stringify
6
11
 
7
- attr_reader :url,
8
- :batch,
9
- :metadata
12
+ attr_reader :url, :batch
10
13
 
11
- stringify :url,
12
- :batch
14
+ stringify :url, :batch
13
15
 
16
+ delegate %i([] []=) => :@ephemeral
17
+
18
+ # @!visibility private
14
19
  def initialize(url, batch)
15
20
  @url = url
16
21
  @batch = batch
17
- @metadata = OpenStruct.new
22
+ @ephemeral = {}
18
23
  end
19
24
 
25
+ # @!visibility private
20
26
  def ==(other)
21
27
  [url, batch] == [other.url, other.batch]
22
28
  end
23
-
24
- def barrier
25
- @barrier ||= Wayfarer::Redis::Barrier.new(batch)
26
- end
27
-
28
- def counter
29
- @counter ||= Wayfarer::Redis::Counter.new(batch)
30
- end
31
-
32
- def gc
33
- @gc ||= Wayfarer::GC.new(self)
34
- end
35
29
  end
36
30
  end
data/lib/wayfarer.rb CHANGED
@@ -38,11 +38,36 @@ module Wayfarer
38
38
  module VERSION
39
39
  MAJOR = 0
40
40
  MINOR = 4
41
- TINY = 5
41
+ TINY = 6
42
42
  STRING = [MAJOR, MINOR, TINY].join(".")
43
43
  end
44
44
 
45
- mattr_accessor :config, default: Wayfarer::Config::Root.new
45
+ DEFAULT_CONFIG = {
46
+ redis: {
47
+ url: "redis://localhost:6379/0",
48
+ factory: ->(redis) { ::Redis.new(url: redis[:url]) }
49
+ },
50
+ network: {
51
+ agent: :http,
52
+ pool_size: 1,
53
+ pool_timeout: 10,
54
+ http_headers: {},
55
+ renew_on: []
56
+ },
57
+ capybara: {
58
+ driver: nil
59
+ },
60
+ ferrum: {
61
+ options: {}
62
+ },
63
+ selenium: {
64
+ driver: :chrome,
65
+ options: {},
66
+ client_timeout: 60
67
+ }
68
+ }.freeze
69
+
70
+ mattr_accessor :config, default: DEFAULT_CONFIG.clone
46
71
 
47
72
  UserAgentTimeoutError = Class.new(StandardError) # TODO: Move to Networking namespace
48
73
  end
@@ -50,3 +75,5 @@ end
50
75
  loader.eager_load
51
76
 
52
77
  ActiveJob::Serializers.serializers << Wayfarer::Serializer
78
+
79
+ Wayfarer::BatchCompletion.subscribe!
data/mkdocs.yml CHANGED
@@ -1,14 +1,20 @@
1
1
  repo_url: https://github.com/bauerd/wayfarer
2
2
  edit_uri: edit/develop/docs/
3
- repo_name: Source Code
3
+ repo_name: Code
4
4
  site_name: Wayfarer
5
5
  markdown_extensions:
6
6
  - admonition
7
+ - attr_list
7
8
  - meta
8
9
  - def_list
9
10
  - pymdownx.details
10
11
  - pymdownx.highlight
11
- - pymdownx.superfences
12
+ - pymdownx.inlinehilite
13
+ - pymdownx.superfences:
14
+ custom_fences:
15
+ - name: mermaid
16
+ class: mermaid
17
+ format: !!python/name:pymdownx.superfences.fence_code_format
12
18
  - pymdownx.critic
13
19
  - pymdownx.caret
14
20
  - pymdownx.mark
@@ -18,11 +24,15 @@ markdown_extensions:
18
24
  custom_checkbox: true
19
25
 
20
26
  theme:
27
+ icon:
28
+ logo: material/sign-direction
29
+ repo: fontawesome/brands/git
21
30
  name: material
22
31
  features:
23
32
  - navigation.tabs
24
- - navigation.sections
25
- - navigation.expand
33
+ # - navigation.sections
34
+ # - navigation.expand
35
+ - navigation.indexes
26
36
  font:
27
37
  text: IBM Plex Sans
28
38
  code: IBM Plex Sans Mono
@@ -41,7 +51,42 @@ theme:
41
51
  toggle:
42
52
  icon: material/lightbulb
43
53
  name: Switch to light mode
44
- icon:
45
- repo: fontawesome/brands/git
46
-
47
54
 
55
+ nav:
56
+ - Home: index.md
57
+ - Guides:
58
+ - Tutorial: guides/tutorial.md
59
+ - Jobs:
60
+ - Overview: guides/jobs.md
61
+ - Error handling: guides/jobs/error_handling.md
62
+ - Tasks: guides/tasks.md
63
+ - Pages: guides/pages.md
64
+ - Routing:
65
+ - Overview: guides/routing.md
66
+ - Matchers:
67
+ - URL: todo
68
+ - Host: todo
69
+ - Path: todo
70
+ - Query: todo
71
+ - Custom matchers: todo
72
+ - Callbacks: guides/callbacks.md
73
+ - Handlers: guides/handlers.md
74
+ - Networking:
75
+ - Introduction: guides/user_agents.md
76
+ - User agent API: guides/networking/custom_adapters.md
77
+ - Built-in user agents:
78
+ - Plain HTTP: guides/networking/http.md
79
+ - Ferrum: guides/networking/ferrum.md
80
+ - Selenium: guides/networking/selenium.md
81
+ - Capybara: guides/networking/capybara.md
82
+ - Redis: guides/redis.md
83
+ - Design decisions: design.md
84
+ - Reference:
85
+ - Configuration: reference/configuration.md
86
+ - Command-line interface: reference/cli.md
87
+ - Cookbook:
88
+ - Browser navigation: cookbook/navigation.md
89
+ - Executing JavaScript: cookbook/executing_javascript.md
90
+ - Screenhots: cookbook/screenshots.md
91
+ - Setting the User-Agent: cookbook/user_agent.md
92
+ - API documentation: "https://www.rubydoc.info"
data/rake/docs.rake ADDED
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yard"
4
+
5
+ namespace :yard do
6
+ desc "Generate documentation"
7
+ YARD::Rake::YardocTask.new(:generate) do |t|
8
+ require_relative "../lib/wayfarer"
9
+
10
+ t.options = %w[--readme docs/index.md --no-private --markup markdown]
11
+ t.files = [
12
+ Wayfarer::Base,
13
+ Wayfarer::Task,
14
+ Wayfarer::Page,
15
+ Wayfarer::Handler,
16
+ Wayfarer::Routing::DSL,
17
+ Wayfarer::Parsing
18
+ ].freeze.map { |klass| Object.const_source_location(klass.name).first }
19
+ end
20
+
21
+ desc "Regenerate documentation on change"
22
+ task :watch do
23
+ # The output of `yard server` differs for some reason
24
+ sh "rerun --wait 0.5 --dir lib bundle exec rake yard:generate"
25
+ end
26
+ end
data/rake/lint.rake ADDED
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open-uri"
4
+ require "fileutils"
5
+ require "rubygems/package"
6
+ require "zlib"
7
+ require "zip"
8
+ require "rubocop/rake_task"
9
+ require "net/http"
10
+ require "uri"
11
+
12
+ VALE_URL_ROOT = "https://github.com/errata-ai"
13
+ VALE_VERSION = "2.15.4"
14
+ VALE_STYLE_GUIDE_VERSION = "v0.3.3"
15
+ VALE_PREFIX = File.expand_path(File.join(".github", "bin"))
16
+ VALE_STYLE_GUIDE_PREFIX = File.expand_path(File.join(".github", "share"))
17
+
18
+ namespace :lint do
19
+ RuboCop::RakeTask.new do |task|
20
+ task.formatters = %w[simple]
21
+ end
22
+
23
+ vale_command = File.join(VALE_PREFIX, "vale")
24
+ style_guide_directory = File.join(VALE_STYLE_GUIDE_PREFIX, "vale")
25
+
26
+ desc "Lint documentation"
27
+ task vale: [:"lint:vale:clean", vale_command, style_guide_directory] do
28
+ sh "#{vale_command} docs/**/*.md"
29
+ end
30
+
31
+ namespace :vale do
32
+ directory VALE_PREFIX
33
+
34
+ desc "Install Vale to #{vale_command}"
35
+ file vale_command => VALE_PREFIX do
36
+ unless (local_command = `which vale`.strip).empty?
37
+ next File.symlink(local_command, vale_command)
38
+ end
39
+
40
+ filename = "vale_#{VALE_VERSION}_Linux_64-bit.tar.gz"
41
+ url = File.join(VALE_URL_ROOT, "/vale/releases/download/v#{VALE_VERSION}/#{filename}")
42
+
43
+ extract_tar_gz(url, vale_command)
44
+
45
+ FileUtils.chmod("+x", vale_command)
46
+ end
47
+
48
+ desc "Deletes Vale"
49
+ task clean: :"lint:vale:style_guide:clean" do
50
+ File.delete(vale_command) if File.exist?(vale_command)
51
+ end
52
+
53
+ namespace :style_guide do
54
+ directory VALE_STYLE_GUIDE_PREFIX
55
+
56
+ desc "Retrieve Vale Google style guide #{VALE_STYLE_GUIDE_VERSION}"
57
+ directory style_guide_directory => VALE_STYLE_GUIDE_PREFIX do
58
+ FileUtils.mkdir_p(style_guide_directory)
59
+ url = "https://github.com/errata-ai/Google/releases/download/#{VALE_STYLE_GUIDE_VERSION}/Google.zip"
60
+ extract_zip(url, style_guide_directory)
61
+ end
62
+
63
+ desc "Deletes the Vale Google style guide"
64
+ task :clean do
65
+ FileUtils.rm_rf([style_guide_directory])
66
+ end
67
+
68
+ private
69
+
70
+ def extract_zip(url, destination)
71
+ content = URI.open(url)
72
+
73
+ Zip::File.open_buffer(content) do |zip|
74
+ zip.each do |entry|
75
+ path = File.join(destination, entry.name)
76
+
77
+ if entry.directory?
78
+ FileUtils.mkdir_p(path)
79
+ else
80
+ entry.extract(path)
81
+ File.chmod(0o755, path)
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+
88
+ private
89
+
90
+ def extract_tar_gz(url, destination)
91
+ URI.open(url) do |file|
92
+ Zlib::GzipReader.open(file) do |gz|
93
+ Gem::Package::TarReader.new(gz) do |tar|
94
+ tar.each do |entry|
95
+ next unless entry.file?
96
+
97
+ binary = entry.read
98
+ File.write(destination, binary)
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
data/rake/release.rake ADDED
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "yaml"
5
+ require "bundler/gem_tasks"
6
+
7
+ namespace :release do
8
+ task :guard_versions do
9
+ gem_spec = Gem::Specification.load("wayfarer.gemspec")
10
+ gem_version = gem_spec.version.version
11
+ lib_version = Wayfarer::VERSION::STRING
12
+
13
+ raise "Gem version #{gem_version} deviates from library version #{lib_version}" unless gem_version == lib_version
14
+ end
15
+
16
+ # TODO: `GEM_HOST_API_KEY` is only supported for RubyGems 3+
17
+ task :write_credentials do
18
+ raise "RubyGems 3+ supports `GEM_HOST_API_KEY`" unless RUBY_VERSION.split(".").first.to_i == 2
19
+
20
+ key = ENV.fetch("GEM_HOST_API_KEY") { raise "`GEM_HOST_API_KEY` is unset" }
21
+ contents = YAML.dump(rubygems_api_key: "Basic #{key}")
22
+ gem_path = File.join(Dir.home, ".gem")
23
+ FileUtils.mkdir_p(gem_path)
24
+ File.write(File.join(gem_path, "credentials"), contents)
25
+ end
26
+ end
27
+
28
+ Rake::Task[:release].enhance(%i[release:guard_versions])
29
+ Rake::Task[:"release:rubygem_push"].enhance(%i[release:write_credentials])
data/rake/tests.rake ADDED
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rspec/core/rake_task"
4
+
5
+ desc "Run all tests"
6
+ RSpec::Core::RakeTask.new(:test)
7
+
8
+ namespace :test do
9
+ desc "Run only isolated tests"
10
+ RSpec::Core::RakeTask.new :isolated do |task|
11
+ task.rspec_opts = ["--tag ~selenium --tag ~ferrum --tag ~cli"]
12
+ end
13
+
14
+ desc "Run only Selenium tests"
15
+ RSpec::Core::RakeTask.new :selenium do |task|
16
+ task.rspec_opts = ["--tag selenium"]
17
+ end
18
+
19
+ desc "Run only Ferrum tests"
20
+ RSpec::Core::RakeTask.new :ferrum do |task|
21
+ task.rspec_opts = ["--tag ferrum"]
22
+ end
23
+
24
+ desc "Run only CLI tests"
25
+ RSpec::Core::RakeTask.new :cli do |task|
26
+ task.rspec_opts = ["--tag cli"]
27
+ end
28
+ end
data/requirements.txt CHANGED
@@ -1 +1 @@
1
- mkdocs-material == 7.3.0
1
+ mkdocs-material == 9.5.9