wayfarer 0.4.1 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (676) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +10 -0
  3. data/Gemfile.lock +15 -11
  4. data/docs/cookbook/batch_routing.md +22 -0
  5. data/docs/cookbook/consent_screen.md +36 -0
  6. data/docs/cookbook/executing_javascript.md +41 -0
  7. data/docs/cookbook/navigation.md +43 -0
  8. data/docs/cookbook/querying_html.md +3 -3
  9. data/docs/cookbook/screenshots.md +2 -2
  10. data/docs/guides/callbacks.md +5 -5
  11. data/docs/guides/debugging.md +17 -0
  12. data/docs/guides/error_handling.md +22 -26
  13. data/docs/guides/jobs.md +44 -18
  14. data/docs/guides/navigation.md +73 -0
  15. data/docs/guides/{browser_automation → networking}/capybara.md +9 -4
  16. data/docs/guides/{browser_automation → networking}/custom_adapters.md +0 -0
  17. data/docs/guides/{browser_automation → networking}/ferrum.md +3 -1
  18. data/docs/guides/networking/http.md +33 -0
  19. data/docs/guides/{browser_automation → networking}/selenium.md +4 -2
  20. data/docs/guides/pages.md +4 -4
  21. data/docs/guides/performance.md +108 -0
  22. data/docs/guides/reliability.md +41 -0
  23. data/docs/guides/routing/steering.md +30 -0
  24. data/docs/guides/tasks.md +9 -33
  25. data/docs/reference/api/base.md +13 -127
  26. data/docs/reference/api/route.md +1 -1
  27. data/docs/reference/cli.md +0 -78
  28. data/docs/reference/configuration_keys.md +1 -1
  29. data/lib/wayfarer/base.rb +37 -27
  30. data/lib/wayfarer/cli/base.rb +19 -1
  31. data/lib/wayfarer/cli/job.rb +5 -11
  32. data/lib/wayfarer/cli/route.rb +4 -2
  33. data/lib/wayfarer/cli/templates/job.rb.tt +3 -1
  34. data/lib/wayfarer/config/networking.rb +1 -1
  35. data/lib/wayfarer/config/struct.rb +1 -1
  36. data/lib/wayfarer/gc.rb +3 -4
  37. data/lib/wayfarer/handler.rb +15 -0
  38. data/lib/wayfarer/middleware/base.rb +19 -0
  39. data/lib/wayfarer/middleware/chain.rb +8 -0
  40. data/lib/wayfarer/middleware/controller.rb +40 -0
  41. data/lib/wayfarer/middleware/dedup.rb +5 -0
  42. data/lib/wayfarer/middleware/dispatch.rb +22 -0
  43. data/lib/wayfarer/middleware/fetch.rb +33 -13
  44. data/lib/wayfarer/middleware/lazy.rb +11 -0
  45. data/lib/wayfarer/middleware/normalize.rb +2 -0
  46. data/lib/wayfarer/middleware/router.rb +41 -3
  47. data/lib/wayfarer/middleware/stage.rb +6 -2
  48. data/lib/wayfarer/networking/context.rb +1 -0
  49. data/lib/wayfarer/networking/ferrum.rb +1 -0
  50. data/lib/wayfarer/networking/follow.rb +22 -0
  51. data/lib/wayfarer/networking/pool.rb +9 -8
  52. data/lib/wayfarer/networking/result.rb +0 -8
  53. data/lib/wayfarer/page.rb +1 -1
  54. data/lib/wayfarer/routing/matchers/custom.rb +2 -0
  55. data/lib/wayfarer/routing/matchers/host.rb +3 -1
  56. data/lib/wayfarer/routing/matchers/path.rb +2 -1
  57. data/lib/wayfarer/routing/result.rb +0 -5
  58. data/lib/wayfarer/routing/route.rb +6 -0
  59. data/lib/wayfarer/routing/router.rb +28 -0
  60. data/lib/wayfarer/serializer.rb +2 -2
  61. data/lib/wayfarer/stringify.rb +13 -7
  62. data/lib/wayfarer/task.rb +4 -2
  63. data/lib/wayfarer.rb +2 -7
  64. data/spec/base_spec.rb +33 -42
  65. data/spec/callbacks_spec.rb +2 -2
  66. data/spec/cli/job_spec.rb +9 -5
  67. data/spec/config/networking_spec.rb +2 -2
  68. data/spec/factories/{queue/middleware.rb → middleware.rb} +3 -3
  69. data/spec/factories/{queue/page.rb → page.rb} +3 -3
  70. data/spec/factories/{queue/task.rb → task.rb} +0 -0
  71. data/spec/fixtures/dummy_job.rb +1 -1
  72. data/spec/gc_spec.rb +5 -9
  73. data/spec/handler_spec.rb +11 -0
  74. data/spec/integration/callbacks_spec.rb +85 -0
  75. data/spec/integration/page_spec.rb +62 -0
  76. data/spec/integration/params_spec.rb +56 -0
  77. data/spec/integration/stage_spec.rb +51 -0
  78. data/spec/integration/steering_spec.rb +57 -0
  79. data/spec/middleware/chain_spec.rb +32 -19
  80. data/spec/middleware/controller_spec.rb +86 -0
  81. data/spec/middleware/dedup_spec.rb +20 -8
  82. data/spec/middleware/dispatch_spec.rb +43 -0
  83. data/spec/middleware/fetch_spec.rb +116 -45
  84. data/spec/middleware/normalize_spec.rb +5 -4
  85. data/spec/middleware/router_spec.rb +80 -28
  86. data/spec/middleware/stage_spec.rb +42 -19
  87. data/spec/networking/follow_spec.rb +41 -0
  88. data/spec/routing/router_spec.rb +24 -0
  89. data/spec/spec_helpers.rb +11 -3
  90. data/spec/support/static/git-scm.com/assets/application-38b0d42ff05ffea45841edebbd14b75b89585646153808e82907c2c5c11f324b.js +772 -0
  91. data/spec/support/static/git-scm.com/assets/application-cafcf280f67db0e6d8168ba98a38da878769a9d5f37793b68ffb963a02d185e0.css +1 -0
  92. data/spec/support/static/git-scm.com/assets/modernize-b3ebe0c31c24f230dc62179d3e1030d2e57a53b1668d9382c0a27dbd44a94beb.js +20 -0
  93. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Bash.html +751 -0
  94. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-PowerShell.html +804 -0
  95. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Sublime-Text.html +728 -0
  96. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Visual-Studio-Code.html +751 -0
  97. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Visual-Studio.html +740 -0
  98. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Zsh.html +765 -0
  99. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Graphical-Interfaces.html +931 -0
  100. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Summary.html +702 -0
  101. data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-Command-line-Git.html +720 -0
  102. data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-Dulwich.html +746 -0
  103. data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-JGit.html +889 -0
  104. data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-Libgit2.html +1003 -0
  105. data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-go-git.html +792 -0
  106. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Administration.html +745 -0
  107. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Basic-Snapshotting.html +840 -0
  108. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Branching-and-Merging.html +829 -0
  109. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Debugging.html +731 -0
  110. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Email.html +766 -0
  111. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-External-Systems.html +721 -0
  112. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Getting-and-Creating-Projects.html +746 -0
  113. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Inspection-and-Comparison.html +735 -0
  114. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Patching.html +742 -0
  115. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Plumbing-Commands.html +715 -0
  116. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Setup-and-Config.html +863 -0
  117. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Sharing-and-Updating-Projects.html +802 -0
  118. data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-An-Example-Git-Enforced-Policy.html +1200 -0
  119. data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-Git-Attributes.html +1134 -0
  120. data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-Git-Configuration.html +1315 -0
  121. data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-Git-Hooks.html +876 -0
  122. data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-Summary.html +704 -0
  123. data/spec/support/static/git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project.html +1667 -0
  124. data/spec/support/static/git-scm.com/book/en/v2/Distributed-Git-Distributed-Workflows.html +859 -0
  125. data/spec/support/static/git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project.html +1354 -0
  126. data/spec/support/static/git-scm.com/book/en/v2/Distributed-Git-Summary.html +704 -0
  127. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-A-Short-History-of-Git.html +735 -0
  128. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-About-Version-Control.html +783 -0
  129. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup.html +889 -0
  130. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-Getting-Help.html +750 -0
  131. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-Installing-Git.html +879 -0
  132. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-Summary.html +704 -0
  133. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-The-Command-Line.html +711 -0
  134. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-What-is-Git?.html +857 -0
  135. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository.html +816 -0
  136. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Git-Aliases.html +775 -0
  137. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository.html +1432 -0
  138. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Summary.html +703 -0
  139. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Tagging.html +1049 -0
  140. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Undoing-Things.html +998 -0
  141. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-History.html +1172 -0
  142. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes.html +983 -0
  143. data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging.html +1102 -0
  144. data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Branch-Management.html +946 -0
  145. data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell.html +1020 -0
  146. data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Branching-Workflows.html +786 -0
  147. data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Rebasing.html +1028 -0
  148. data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Remote-Branches.html +1009 -0
  149. data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Summary.html +705 -0
  150. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Environment-Variables.html +1009 -0
  151. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Git-Objects.html +1209 -0
  152. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Git-References.html +939 -0
  153. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery.html +1086 -0
  154. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Packfiles.html +876 -0
  155. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain.html +745 -0
  156. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Summary.html +708 -0
  157. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-The-Refspec.html +872 -0
  158. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols.html +1043 -0
  159. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Advanced-Merging.html +1605 -0
  160. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Bundling.html +888 -0
  161. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Credential-Storage.html +1035 -0
  162. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git.html +861 -0
  163. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Interactive-Staging.html +920 -0
  164. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Replace.html +949 -0
  165. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Rerere.html +983 -0
  166. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Reset-Demystified.html +1236 -0
  167. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Revision-Selection.html +1178 -0
  168. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Rewriting-History.html +1182 -0
  169. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Searching.html +875 -0
  170. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work.html +922 -0
  171. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Stashing-and-Cleaning.html +1039 -0
  172. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Submodules.html +1864 -0
  173. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Summary.html +705 -0
  174. data/spec/support/static/git-scm.com/book/en/v2/Git-and-Other-Systems-Git-as-a-Client.html +2656 -0
  175. data/spec/support/static/git-scm.com/book/en/v2/Git-and-Other-Systems-Migrating-to-Git.html +1741 -0
  176. data/spec/support/static/git-scm.com/book/en/v2/Git-and-Other-Systems-Summary.html +703 -0
  177. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Generating-Your-SSH-Public-Key.html +759 -0
  178. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Getting-Git-on-a-Server.html +827 -0
  179. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Git-Daemon.html +775 -0
  180. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-GitLab.html +872 -0
  181. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-GitWeb.html +776 -0
  182. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server.html +870 -0
  183. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Smart-HTTP.html +789 -0
  184. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Summary.html +709 -0
  185. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols.html +963 -0
  186. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Third-Party-Hosted-Options.html +711 -0
  187. data/spec/support/static/git-scm.com/book/en/v2/GitHub-Account-Setup-and-Configuration.html +858 -0
  188. data/spec/support/static/git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project.html +1502 -0
  189. data/spec/support/static/git-scm.com/book/en/v2/GitHub-Maintaining-a-Project.html +1218 -0
  190. data/spec/support/static/git-scm.com/book/en/v2/GitHub-Managing-an-organization.html +797 -0
  191. data/spec/support/static/git-scm.com/book/en/v2/GitHub-Scripting-GitHub.html +1059 -0
  192. data/spec/support/static/git-scm.com/book/en/v2/GitHub-Summary.html +704 -0
  193. data/spec/support/static/git-scm.com/book/en/v2/ch00/_abort_merge.html +1605 -0
  194. data/spec/support/static/git-scm.com/book/en/v2/ch00/_add_email_addresses.html +858 -0
  195. data/spec/support/static/git-scm.com/book/en/v2/ch00/_advanced_merging.html +1605 -0
  196. data/spec/support/static/git-scm.com/book/en/v2/ch00/_an_example_git_enforced_policy.html +1200 -0
  197. data/spec/support/static/git-scm.com/book/en/v2/ch00/_annotated_tags.html +1049 -0
  198. data/spec/support/static/git-scm.com/book/en/v2/ch00/_api_comment.html +1059 -0
  199. data/spec/support/static/git-scm.com/book/en/v2/ch00/_bare_repo.html +827 -0
  200. data/spec/support/static/git-scm.com/book/en/v2/ch00/_basic_branching.html +1102 -0
  201. data/spec/support/static/git-scm.com/book/en/v2/ch00/_basic_merge_conflicts.html +1102 -0
  202. data/spec/support/static/git-scm.com/book/en/v2/ch00/_basic_merging.html +1102 -0
  203. data/spec/support/static/git-scm.com/book/en/v2/ch00/_binary_search.html +861 -0
  204. data/spec/support/static/git-scm.com/book/en/v2/ch00/_branch_management.html +946 -0
  205. data/spec/support/static/git-scm.com/book/en/v2/ch00/_branch_references.html +1178 -0
  206. data/spec/support/static/git-scm.com/book/en/v2/ch00/_build_number.html +1354 -0
  207. data/spec/support/static/git-scm.com/book/en/v2/ch00/_bundling.html +888 -0
  208. data/spec/support/static/git-scm.com/book/en/v2/ch00/_changing_multiple.html +1182 -0
  209. data/spec/support/static/git-scm.com/book/en/v2/ch00/_checking_out_conflicts.html +1605 -0
  210. data/spec/support/static/git-scm.com/book/en/v2/ch00/_checking_out_remotes.html +1354 -0
  211. data/spec/support/static/git-scm.com/book/en/v2/ch00/_checking_status.html +1432 -0
  212. data/spec/support/static/git-scm.com/book/en/v2/ch00/_cloning_submodules.html +1864 -0
  213. data/spec/support/static/git-scm.com/book/en/v2/ch00/_commit_guidelines.html +1667 -0
  214. data/spec/support/static/git-scm.com/book/en/v2/ch00/_commit_ranges.html +1178 -0
  215. data/spec/support/static/git-scm.com/book/en/v2/ch00/_commit_status.html +1059 -0
  216. data/spec/support/static/git-scm.com/book/en/v2/ch00/_committing_changes.html +1432 -0
  217. data/spec/support/static/git-scm.com/book/en/v2/ch00/_contrib_file.html +1218 -0
  218. data/spec/support/static/git-scm.com/book/en/v2/ch00/_contributing_project.html +1667 -0
  219. data/spec/support/static/git-scm.com/book/en/v2/ch00/_create_new_branch.html +1020 -0
  220. data/spec/support/static/git-scm.com/book/en/v2/ch00/_credential_caching.html +1035 -0
  221. data/spec/support/static/git-scm.com/book/en/v2/ch00/_custom_importer.html +1741 -0
  222. data/spec/support/static/git-scm.com/book/en/v2/ch00/_data_recovery.html +1086 -0
  223. data/spec/support/static/git-scm.com/book/en/v2/ch00/_delete_branches.html +1009 -0
  224. data/spec/support/static/git-scm.com/book/en/v2/ch00/_editor.html +889 -0
  225. data/spec/support/static/git-scm.com/book/en/v2/ch00/_eg_task_lists.html +1502 -0
  226. data/spec/support/static/git-scm.com/book/en/v2/ch00/_email_hooks.html +876 -0
  227. data/spec/support/static/git-scm.com/book/en/v2/ch00/_email_notification.html +1502 -0
  228. data/spec/support/static/git-scm.com/book/en/v2/ch00/_email_notifications.html +1218 -0
  229. data/spec/support/static/git-scm.com/book/en/v2/ch00/_email_pr.html +1218 -0
  230. data/spec/support/static/git-scm.com/book/en/v2/ch00/_enforcing_commit_message_format.html +1200 -0
  231. data/spec/support/static/git-scm.com/book/en/v2/ch00/_example_markdown.html +1502 -0
  232. data/spec/support/static/git-scm.com/book/en/v2/ch00/_external_merge_tools.html +1315 -0
  233. data/spec/support/static/git-scm.com/book/en/v2/ch00/_fetch_and_push_on_different_repositories.html +1502 -0
  234. data/spec/support/static/git-scm.com/book/en/v2/ch00/_fetching_and_pulling.html +983 -0
  235. data/spec/support/static/git-scm.com/book/en/v2/ch00/_file_annotation.html +861 -0
  236. data/spec/support/static/git-scm.com/book/en/v2/ch00/_first_time.html +889 -0
  237. data/spec/support/static/git-scm.com/book/en/v2/ch00/_generate_ssh_key.html +759 -0
  238. data/spec/support/static/git-scm.com/book/en/v2/ch00/_getting_a_repo.html +816 -0
  239. data/spec/support/static/git-scm.com/book/en/v2/ch00/_getting_git_on_a_server.html +827 -0
  240. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_aliases.html +775 -0
  241. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_am.html +1354 -0
  242. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_amend.html +1182 -0
  243. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_branches_overview.html +1020 -0
  244. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_clean.html +1039 -0
  245. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_cloning.html +816 -0
  246. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_commit_objects.html +1209 -0
  247. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_config.html +1315 -0
  248. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_diff_staged.html +1432 -0
  249. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_gc.html +1086 -0
  250. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_grep.html +875 -0
  251. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_help.html +750 -0
  252. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_hooks.html +876 -0
  253. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_mv.html +1432 -0
  254. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_p4.html +1741 -0
  255. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_p4_branches.html +2656 -0
  256. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_reflog.html +1178 -0
  257. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_refs.html +939 -0
  258. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_reset.html +1236 -0
  259. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_stashing.html +1039 -0
  260. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_submodules.html +1864 -0
  261. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_svn.html +2656 -0
  262. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_tagging.html +1049 -0
  263. data/spec/support/static/git-scm.com/book/en/v2/ch00/_gitlab_groups_section.html +872 -0
  264. data/spec/support/static/git-scm.com/book/en/v2/ch00/_ignoring.html +1432 -0
  265. data/spec/support/static/git-scm.com/book/en/v2/ch00/_inspecting_remote.html +983 -0
  266. data/spec/support/static/git-scm.com/book/en/v2/ch00/_integration_manager.html +859 -0
  267. data/spec/support/static/git-scm.com/book/en/v2/ch00/_interactive_staging.html +920 -0
  268. data/spec/support/static/git-scm.com/book/en/v2/ch00/_keyword_expansion.html +1134 -0
  269. data/spec/support/static/git-scm.com/book/en/v2/ch00/_libgit2_bindings.html +1003 -0
  270. data/spec/support/static/git-scm.com/book/en/v2/ch00/_manual_remerge.html +1605 -0
  271. data/spec/support/static/git-scm.com/book/en/v2/ch00/_md_code.html +1502 -0
  272. data/spec/support/static/git-scm.com/book/en/v2/ch00/_md_drag.html +1502 -0
  273. data/spec/support/static/git-scm.com/book/en/v2/ch00/_md_emoji.html +1502 -0
  274. data/spec/support/static/git-scm.com/book/en/v2/ch00/_md_quote.html +1502 -0
  275. data/spec/support/static/git-scm.com/book/en/v2/ch00/_merge_button.html +1218 -0
  276. data/spec/support/static/git-scm.com/book/en/v2/ch00/_merge_log.html +1605 -0
  277. data/spec/support/static/git-scm.com/book/en/v2/ch00/_merge_rebase_work.html +1028 -0
  278. data/spec/support/static/git-scm.com/book/en/v2/ch00/_new_repo_dropdown.html +1218 -0
  279. data/spec/support/static/git-scm.com/book/en/v2/ch00/_not_center.html +1218 -0
  280. data/spec/support/static/git-scm.com/book/en/v2/ch00/_org_page.html +797 -0
  281. data/spec/support/static/git-scm.com/book/en/v2/ch00/_other_client_hooks.html +876 -0
  282. data/spec/support/static/git-scm.com/book/en/v2/ch00/_p4_git_fusion.html +2656 -0
  283. data/spec/support/static/git-scm.com/book/en/v2/ch00/_patches_from_email.html +1354 -0
  284. data/spec/support/static/git-scm.com/book/en/v2/ch00/_personal_avatar.html +858 -0
  285. data/spec/support/static/git-scm.com/book/en/v2/ch00/_plumbing_porcelain.html +745 -0
  286. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_closed.html +1502 -0
  287. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_discussion.html +1502 -0
  288. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_fail.html +1502 -0
  289. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_final.html +1502 -0
  290. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_references.html +1502 -0
  291. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_references_render.html +1502 -0
  292. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_refs.html +1218 -0
  293. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pre_merge_rebase_work.html +1028 -0
  294. data/spec/support/static/git-scm.com/book/en/v2/ch00/_preparing_release.html +1354 -0
  295. data/spec/support/static/git-scm.com/book/en/v2/ch00/_private_team.html +1667 -0
  296. data/spec/support/static/git-scm.com/book/en/v2/ch00/_project_over_email.html +1667 -0
  297. data/spec/support/static/git-scm.com/book/en/v2/ch00/_public_project.html +1667 -0
  298. data/spec/support/static/git-scm.com/book/en/v2/ch00/_publishing_submodules.html +1864 -0
  299. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pushing_branches.html +1009 -0
  300. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pushing_refspecs.html +872 -0
  301. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pushing_remotes.html +983 -0
  302. data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebase_cherry_pick.html +1354 -0
  303. data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebase_peril.html +1028 -0
  304. data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebase_rebase.html +1028 -0
  305. data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebase_rebase_work.html +1028 -0
  306. data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebasing.html +1028 -0
  307. data/spec/support/static/git-scm.com/book/en/v2/ch00/_refspec.html +872 -0
  308. data/spec/support/static/git-scm.com/book/en/v2/ch00/_remote_branches.html +1009 -0
  309. data/spec/support/static/git-scm.com/book/en/v2/ch00/_remote_repos.html +983 -0
  310. data/spec/support/static/git-scm.com/book/en/v2/ch00/_removing_file_every_commit.html +1182 -0
  311. data/spec/support/static/git-scm.com/book/en/v2/ch00/_removing_files.html +1432 -0
  312. data/spec/support/static/git-scm.com/book/en/v2/ch00/_removing_objects.html +1086 -0
  313. data/spec/support/static/git-scm.com/book/en/v2/ch00/_replace.html +949 -0
  314. data/spec/support/static/git-scm.com/book/en/v2/ch00/_reverse_commit.html +1605 -0
  315. data/spec/support/static/git-scm.com/book/en/v2/ch00/_revision_selection.html +1178 -0
  316. data/spec/support/static/git-scm.com/book/en/v2/ch00/_rewriting_history.html +1182 -0
  317. data/spec/support/static/git-scm.com/book/en/v2/ch00/_searching.html +875 -0
  318. data/spec/support/static/git-scm.com/book/en/v2/ch00/_service_config.html +1059 -0
  319. data/spec/support/static/git-scm.com/book/en/v2/ch00/_services_hooks.html +1059 -0
  320. data/spec/support/static/git-scm.com/book/en/v2/ch00/_setting_up_server.html +870 -0
  321. data/spec/support/static/git-scm.com/book/en/v2/ch00/_sharing_tags.html +1049 -0
  322. data/spec/support/static/git-scm.com/book/en/v2/ch00/_signing.html +922 -0
  323. data/spec/support/static/git-scm.com/book/en/v2/ch00/_signing_commits.html +922 -0
  324. data/spec/support/static/git-scm.com/book/en/v2/ch00/_squashing.html +1182 -0
  325. data/spec/support/static/git-scm.com/book/en/v2/ch00/_starting_submodules.html +1864 -0
  326. data/spec/support/static/git-scm.com/book/en/v2/ch00/_subtree_merge.html +1605 -0
  327. data/spec/support/static/git-scm.com/book/en/v2/ch00/_switching_branches.html +1020 -0
  328. data/spec/support/static/git-scm.com/book/en/v2/ch00/_tagging_releases.html +1354 -0
  329. data/spec/support/static/git-scm.com/book/en/v2/ch00/_task_list_progress.html +1502 -0
  330. data/spec/support/static/git-scm.com/book/en/v2/ch00/_team_page.html +797 -0
  331. data/spec/support/static/git-scm.com/book/en/v2/ch00/_the_index.html +1236 -0
  332. data/spec/support/static/git-scm.com/book/en/v2/ch00/_the_shortlog.html +1354 -0
  333. data/spec/support/static/git-scm.com/book/en/v2/ch00/_topic_branch.html +786 -0
  334. data/spec/support/static/git-scm.com/book/en/v2/ch00/_tracking_branches.html +1009 -0
  335. data/spec/support/static/git-scm.com/book/en/v2/ch00/_tracking_files.html +1432 -0
  336. data/spec/support/static/git-scm.com/book/en/v2/ch00/_tree_objects.html +1209 -0
  337. data/spec/support/static/git-scm.com/book/en/v2/ch00/_triple_dot.html +1178 -0
  338. data/spec/support/static/git-scm.com/book/en/v2/ch00/_undoing.html +998 -0
  339. data/spec/support/static/git-scm.com/book/en/v2/ch00/_unstaging.html +998 -0
  340. data/spec/support/static/git-scm.com/book/en/v2/ch00/_viewing_history.html +1172 -0
  341. data/spec/support/static/git-scm.com/book/en/v2/ch00/_web_hook.html +1059 -0
  342. data/spec/support/static/git-scm.com/book/en/v2/ch00/_what_is_introduced.html +1354 -0
  343. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch01-getting-started.html +783 -0
  344. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch02-git-basics-chapter.html +816 -0
  345. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch03-git-branching.html +1020 -0
  346. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch05-distributed-git.html +859 -0
  347. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch06-github.html +858 -0
  348. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch06-github_flow.html +1502 -0
  349. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch10-git-internals.html +745 -0
  350. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch_core_editor.html +863 -0
  351. data/spec/support/static/git-scm.com/book/en/v2/ch00/divergent_history.html +1020 -0
  352. data/spec/support/static/git-scm.com/book/en/v2/ch00/double_dot.html +1178 -0
  353. data/spec/support/static/git-scm.com/book/en/v2/ch00/filters_a.html +1134 -0
  354. data/spec/support/static/git-scm.com/book/en/v2/ch00/filters_b.html +1134 -0
  355. data/spec/support/static/git-scm.com/book/en/v2/ch00/limit_options.html +1172 -0
  356. data/spec/support/static/git-scm.com/book/en/v2/ch00/log_options.html +1172 -0
  357. data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_a.html +1354 -0
  358. data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_b.html +1354 -0
  359. data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_c.html +1354 -0
  360. data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_d.html +1354 -0
  361. data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_e.html +1354 -0
  362. data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_f.html +1354 -0
  363. data/spec/support/static/git-scm.com/book/en/v2/ch00/oh_my_zsh_git.html +765 -0
  364. data/spec/support/static/git-scm.com/book/en/v2/ch00/pretty_format.html +1172 -0
  365. data/spec/support/static/git-scm.com/book/en/v2/ch00/psp_b.html +1667 -0
  366. data/spec/support/static/git-scm.com/book/en/v2/ch00/rbdiag_e.html +1028 -0
  367. data/spec/support/static/git-scm.com/book/en/v2/ch00/rbdiag_g.html +1028 -0
  368. data/spec/support/static/git-scm.com/book/en/v2/ch00/rbdiag_h.html +1028 -0
  369. data/spec/support/static/git-scm.com/book/en/v2/ch00/rbdiag_i.html +1028 -0
  370. data/spec/support/static/git-scm.com/book/en/v2/ch00/rebasing-merging-example.html +1028 -0
  371. data/spec/support/static/git-scm.com/book/en/v2/ch00/ref_rerere.html +983 -0
  372. data/spec/support/static/git-scm.com/book/en/v2/ch00/ref_the_ref.html +939 -0
  373. data/spec/support/static/git-scm.com/book/en/v2/ch00/wfdiag_b.html +859 -0
  374. data/spec/support/static/git-scm.com/book/en/v2/ch00/wfdiag_c.html +859 -0
  375. data/spec/support/static/git-scm.com/book/en/v2/ch00/what_is_git_section.html +857 -0
  376. data/spec/support/static/git-scm.com/book/en/v2/images/2fa-1.png +0 -0
  377. data/spec/support/static/git-scm.com/book/en/v2/images/account-settings.png +0 -0
  378. data/spec/support/static/git-scm.com/book/en/v2/images/advance-master.png +0 -0
  379. data/spec/support/static/git-scm.com/book/en/v2/images/advance-testing.png +0 -0
  380. data/spec/support/static/git-scm.com/book/en/v2/images/areas.png +0 -0
  381. data/spec/support/static/git-scm.com/book/en/v2/images/avatar-crop.png +0 -0
  382. data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-1.png +0 -0
  383. data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-2.png +0 -0
  384. data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-3.png +0 -0
  385. data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-4.png +0 -0
  386. data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-5.png +0 -0
  387. data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-6.png +0 -0
  388. data/spec/support/static/git-scm.com/book/en/v2/images/basic-merging-1.png +0 -0
  389. data/spec/support/static/git-scm.com/book/en/v2/images/basic-merging-2.png +0 -0
  390. data/spec/support/static/git-scm.com/book/en/v2/images/basic-rebase-1.png +0 -0
  391. data/spec/support/static/git-scm.com/book/en/v2/images/basic-rebase-2.png +0 -0
  392. data/spec/support/static/git-scm.com/book/en/v2/images/basic-rebase-3.png +0 -0
  393. data/spec/support/static/git-scm.com/book/en/v2/images/basic-rebase-4.png +0 -0
  394. data/spec/support/static/git-scm.com/book/en/v2/images/benevolent-dictator.png +0 -0
  395. data/spec/support/static/git-scm.com/book/en/v2/images/blink-01-start.png +0 -0
  396. data/spec/support/static/git-scm.com/book/en/v2/images/blink-02-pr.png +0 -0
  397. data/spec/support/static/git-scm.com/book/en/v2/images/blink-03-pull-request-open.png +0 -0
  398. data/spec/support/static/git-scm.com/book/en/v2/images/blink-04-email.png +0 -0
  399. data/spec/support/static/git-scm.com/book/en/v2/images/blink-04-pr-comment.png +0 -0
  400. data/spec/support/static/git-scm.com/book/en/v2/images/blink-05-general-comment.png +0 -0
  401. data/spec/support/static/git-scm.com/book/en/v2/images/blink-06-final.png +0 -0
  402. data/spec/support/static/git-scm.com/book/en/v2/images/branch-and-history.png +0 -0
  403. data/spec/support/static/git-scm.com/book/en/v2/images/branch_widget_mac.png +0 -0
  404. data/spec/support/static/git-scm.com/book/en/v2/images/branch_widget_win.png +0 -0
  405. data/spec/support/static/git-scm.com/book/en/v2/images/centralized.png +0 -0
  406. data/spec/support/static/git-scm.com/book/en/v2/images/centralized_workflow.png +0 -0
  407. data/spec/support/static/git-scm.com/book/en/v2/images/checkout-master.png +0 -0
  408. data/spec/support/static/git-scm.com/book/en/v2/images/clean.png +0 -0
  409. data/spec/support/static/git-scm.com/book/en/v2/images/collaborators.png +0 -0
  410. data/spec/support/static/git-scm.com/book/en/v2/images/commit-and-tree.png +0 -0
  411. data/spec/support/static/git-scm.com/book/en/v2/images/commits-and-parents.png +0 -0
  412. data/spec/support/static/git-scm.com/book/en/v2/images/data-model-1.png +0 -0
  413. data/spec/support/static/git-scm.com/book/en/v2/images/data-model-2.png +0 -0
  414. data/spec/support/static/git-scm.com/book/en/v2/images/data-model-3.png +0 -0
  415. data/spec/support/static/git-scm.com/book/en/v2/images/data-model-4.png +0 -0
  416. data/spec/support/static/git-scm.com/book/en/v2/images/deltas.png +0 -0
  417. data/spec/support/static/git-scm.com/book/en/v2/images/distributed.png +0 -0
  418. data/spec/support/static/git-scm.com/book/en/v2/images/double-dot.png +0 -0
  419. data/spec/support/static/git-scm.com/book/en/v2/images/email-settings.png +0 -0
  420. data/spec/support/static/git-scm.com/book/en/v2/images/forkbutton.png +0 -0
  421. data/spec/support/static/git-scm.com/book/en/v2/images/git-bash.png +0 -0
  422. data/spec/support/static/git-scm.com/book/en/v2/images/git-diff-check.png +0 -0
  423. data/spec/support/static/git-scm.com/book/en/v2/images/git-fusion-boot.png +0 -0
  424. data/spec/support/static/git-scm.com/book/en/v2/images/git-fusion-perforce-graph.png +0 -0
  425. data/spec/support/static/git-scm.com/book/en/v2/images/git-gui.png +0 -0
  426. data/spec/support/static/git-scm.com/book/en/v2/images/git-instaweb.png +0 -0
  427. data/spec/support/static/git-scm.com/book/en/v2/images/git-osx-installer.png +0 -0
  428. data/spec/support/static/git-scm.com/book/en/v2/images/github_mac.png +0 -0
  429. data/spec/support/static/git-scm.com/book/en/v2/images/github_win.png +0 -0
  430. data/spec/support/static/git-scm.com/book/en/v2/images/gitk.png +0 -0
  431. data/spec/support/static/git-scm.com/book/en/v2/images/gitlab-groups.png +0 -0
  432. data/spec/support/static/git-scm.com/book/en/v2/images/gitlab-menu.png +0 -0
  433. data/spec/support/static/git-scm.com/book/en/v2/images/gitlab-users.png +0 -0
  434. data/spec/support/static/git-scm.com/book/en/v2/images/head-to-master.png +0 -0
  435. data/spec/support/static/git-scm.com/book/en/v2/images/head-to-testing.png +0 -0
  436. data/spec/support/static/git-scm.com/book/en/v2/images/integration-manager.png +0 -0
  437. data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-1.png +0 -0
  438. data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-2.png +0 -0
  439. data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-3.png +0 -0
  440. data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-4.png +0 -0
  441. data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-5.png +0 -0
  442. data/spec/support/static/git-scm.com/book/en/v2/images/jb.png +0 -0
  443. data/spec/support/static/git-scm.com/book/en/v2/images/large-merges-1.png +0 -0
  444. data/spec/support/static/git-scm.com/book/en/v2/images/large-merges-2.png +0 -0
  445. data/spec/support/static/git-scm.com/book/en/v2/images/lifecycle.png +0 -0
  446. data/spec/support/static/git-scm.com/book/en/v2/images/local.png +0 -0
  447. data/spec/support/static/git-scm.com/book/en/v2/images/lr-branches-1.png +0 -0
  448. data/spec/support/static/git-scm.com/book/en/v2/images/lr-branches-2.png +0 -0
  449. data/spec/support/static/git-scm.com/book/en/v2/images/maint-01-email.png +0 -0
  450. data/spec/support/static/git-scm.com/book/en/v2/images/maint-02-merge.png +0 -0
  451. data/spec/support/static/git-scm.com/book/en/v2/images/maint-03-email-resp.png +0 -0
  452. data/spec/support/static/git-scm.com/book/en/v2/images/maint-04-target.png +0 -0
  453. data/spec/support/static/git-scm.com/book/en/v2/images/maint-05-mentions.png +0 -0
  454. data/spec/support/static/git-scm.com/book/en/v2/images/maint-06-unsubscribe.png +0 -0
  455. data/spec/support/static/git-scm.com/book/en/v2/images/maint-07-notifications.png +0 -0
  456. data/spec/support/static/git-scm.com/book/en/v2/images/maint-08-notifications-page.png +0 -0
  457. data/spec/support/static/git-scm.com/book/en/v2/images/maint-09-contrib.png +0 -0
  458. data/spec/support/static/git-scm.com/book/en/v2/images/maint-10-default-branch.png +0 -0
  459. data/spec/support/static/git-scm.com/book/en/v2/images/maint-11-transfer.png +0 -0
  460. data/spec/support/static/git-scm.com/book/en/v2/images/managed-team-1.png +0 -0
  461. data/spec/support/static/git-scm.com/book/en/v2/images/managed-team-2.png +0 -0
  462. data/spec/support/static/git-scm.com/book/en/v2/images/managed-team-3.png +0 -0
  463. data/spec/support/static/git-scm.com/book/en/v2/images/managed-team-flow.png +0 -0
  464. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-01-example.png +0 -0
  465. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-02-tasks.png +0 -0
  466. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-03-task-summary.png +0 -0
  467. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-04-fenced-code.png +0 -0
  468. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-05-quote.png +0 -0
  469. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-06-emoji-complete.png +0 -0
  470. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-07-emoji.png +0 -0
  471. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-08-drag-drop.png +0 -0
  472. data/spec/support/static/git-scm.com/book/en/v2/images/mentions-01-syntax.png +0 -0
  473. data/spec/support/static/git-scm.com/book/en/v2/images/mentions-02-render.png +0 -0
  474. data/spec/support/static/git-scm.com/book/en/v2/images/mentions-03-closed.png +0 -0
  475. data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-1.png +0 -0
  476. data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-2.png +0 -0
  477. data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-3.png +0 -0
  478. data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-4.png +0 -0
  479. data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-5.png +0 -0
  480. data/spec/support/static/git-scm.com/book/en/v2/images/new-repo.png +0 -0
  481. data/spec/support/static/git-scm.com/book/en/v2/images/neworg.png +0 -0
  482. data/spec/support/static/git-scm.com/book/en/v2/images/newrepo.png +0 -0
  483. data/spec/support/static/git-scm.com/book/en/v2/images/newrepoform.png +0 -0
  484. data/spec/support/static/git-scm.com/book/en/v2/images/orgs-01-page.png +0 -0
  485. data/spec/support/static/git-scm.com/book/en/v2/images/orgs-02-teams.png +0 -0
  486. data/spec/support/static/git-scm.com/book/en/v2/images/orgs-03-audit.png +0 -0
  487. data/spec/support/static/git-scm.com/book/en/v2/images/p4merge.png +0 -0
  488. data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-1.png +0 -0
  489. data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-2.png +0 -0
  490. data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-3.png +0 -0
  491. data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-4.png +0 -0
  492. data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-5.png +0 -0
  493. data/spec/support/static/git-scm.com/book/en/v2/images/posh-git.png +0 -0
  494. data/spec/support/static/git-scm.com/book/en/v2/images/pr-01-fail.png +0 -0
  495. data/spec/support/static/git-scm.com/book/en/v2/images/pr-02-merge-fix.png +0 -0
  496. data/spec/support/static/git-scm.com/book/en/v2/images/public-small-1.png +0 -0
  497. data/spec/support/static/git-scm.com/book/en/v2/images/public-small-2.png +0 -0
  498. data/spec/support/static/git-scm.com/book/en/v2/images/public-small-3.png +0 -0
  499. data/spec/support/static/git-scm.com/book/en/v2/images/rebasing-1.png +0 -0
  500. data/spec/support/static/git-scm.com/book/en/v2/images/rebasing-2.png +0 -0
  501. data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-1.png +0 -0
  502. data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-2.png +0 -0
  503. data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-3.png +0 -0
  504. data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-4.png +0 -0
  505. data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-5.png +0 -0
  506. data/spec/support/static/git-scm.com/book/en/v2/images/replace1.png +0 -0
  507. data/spec/support/static/git-scm.com/book/en/v2/images/replace2.png +0 -0
  508. data/spec/support/static/git-scm.com/book/en/v2/images/replace3.png +0 -0
  509. data/spec/support/static/git-scm.com/book/en/v2/images/replace4.png +0 -0
  510. data/spec/support/static/git-scm.com/book/en/v2/images/replace5.png +0 -0
  511. data/spec/support/static/git-scm.com/book/en/v2/images/reposettingslink.png +0 -0
  512. data/spec/support/static/git-scm.com/book/en/v2/images/rerere1.png +0 -0
  513. data/spec/support/static/git-scm.com/book/en/v2/images/rerere2.png +0 -0
  514. data/spec/support/static/git-scm.com/book/en/v2/images/rerere3.png +0 -0
  515. data/spec/support/static/git-scm.com/book/en/v2/images/reset-checkout.png +0 -0
  516. data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex1.png +0 -0
  517. data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex2.png +0 -0
  518. data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex3.png +0 -0
  519. data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex4.png +0 -0
  520. data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex5.png +0 -0
  521. data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex6.png +0 -0
  522. data/spec/support/static/git-scm.com/book/en/v2/images/reset-hard.png +0 -0
  523. data/spec/support/static/git-scm.com/book/en/v2/images/reset-mixed.png +0 -0
  524. data/spec/support/static/git-scm.com/book/en/v2/images/reset-path1.png +0 -0
  525. data/spec/support/static/git-scm.com/book/en/v2/images/reset-path2.png +0 -0
  526. data/spec/support/static/git-scm.com/book/en/v2/images/reset-path3.png +0 -0
  527. data/spec/support/static/git-scm.com/book/en/v2/images/reset-soft.png +0 -0
  528. data/spec/support/static/git-scm.com/book/en/v2/images/reset-squash-r1.png +0 -0
  529. data/spec/support/static/git-scm.com/book/en/v2/images/reset-squash-r2.png +0 -0
  530. data/spec/support/static/git-scm.com/book/en/v2/images/reset-squash-r3.png +0 -0
  531. data/spec/support/static/git-scm.com/book/en/v2/images/reset-start.png +0 -0
  532. data/spec/support/static/git-scm.com/book/en/v2/images/reset-workflow.png +0 -0
  533. data/spec/support/static/git-scm.com/book/en/v2/images/scripting-01-services.png +0 -0
  534. data/spec/support/static/git-scm.com/book/en/v2/images/scripting-02-email-service.png +0 -0
  535. data/spec/support/static/git-scm.com/book/en/v2/images/scripting-03-webhook.png +0 -0
  536. data/spec/support/static/git-scm.com/book/en/v2/images/scripting-04-webhook-debug.png +0 -0
  537. data/spec/support/static/git-scm.com/book/en/v2/images/scripting-05-access-token.png +0 -0
  538. data/spec/support/static/git-scm.com/book/en/v2/images/scripting-06-comment.png +0 -0
  539. data/spec/support/static/git-scm.com/book/en/v2/images/scripting-07-status.png +0 -0
  540. data/spec/support/static/git-scm.com/book/en/v2/images/signup.png +0 -0
  541. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-1.png +0 -0
  542. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-2.png +0 -0
  543. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-3.png +0 -0
  544. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-4.png +0 -0
  545. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-5.png +0 -0
  546. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-6.png +0 -0
  547. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-7.png +0 -0
  548. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-flow.png +0 -0
  549. data/spec/support/static/git-scm.com/book/en/v2/images/smudge.png +0 -0
  550. data/spec/support/static/git-scm.com/book/en/v2/images/snapshots.png +0 -0
  551. data/spec/support/static/git-scm.com/book/en/v2/images/ssh-keys.png +0 -0
  552. data/spec/support/static/git-scm.com/book/en/v2/images/topic-branches-1.png +0 -0
  553. data/spec/support/static/git-scm.com/book/en/v2/images/topic-branches-2.png +0 -0
  554. data/spec/support/static/git-scm.com/book/en/v2/images/two-branches.png +0 -0
  555. data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-reset.png +0 -0
  556. data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-revert.png +0 -0
  557. data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-revert2.png +0 -0
  558. data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-revert3.png +0 -0
  559. data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-start.png +0 -0
  560. data/spec/support/static/git-scm.com/book/en/v2/images/your-profile.png +0 -0
  561. data/spec/support/static/git-scm.com/book/en/v2/images/zsh-oh-my.png +0 -0
  562. data/spec/support/static/git-scm.com/book/en/v2/images/zsh-prompt.png +0 -0
  563. data/spec/support/static/git-scm.com/book/en/v2.html +688 -0
  564. data/spec/support/static/git-scm.com/favicon.ico +0 -0
  565. data/spec/support/static/git-scm.com/images/bg/body.jpg +0 -0
  566. data/spec/support/static/git-scm.com/images/bg/isometric-grid.png +0 -0
  567. data/spec/support/static/git-scm.com/images/bg/isometric-grid@2x.png +0 -0
  568. data/spec/support/static/git-scm.com/images/bg/search-header.jpg +0 -0
  569. data/spec/support/static/git-scm.com/images/company-project-logos/android.png +0 -0
  570. data/spec/support/static/git-scm.com/images/company-project-logos/android@2x.png +0 -0
  571. data/spec/support/static/git-scm.com/images/company-project-logos/eclipse.png +0 -0
  572. data/spec/support/static/git-scm.com/images/company-project-logos/eclipse@2x.png +0 -0
  573. data/spec/support/static/git-scm.com/images/company-project-logos/facebook.png +0 -0
  574. data/spec/support/static/git-scm.com/images/company-project-logos/facebook@2x.png +0 -0
  575. data/spec/support/static/git-scm.com/images/company-project-logos/gnome.png +0 -0
  576. data/spec/support/static/git-scm.com/images/company-project-logos/gnome@2x.png +0 -0
  577. data/spec/support/static/git-scm.com/images/company-project-logos/google.png +0 -0
  578. data/spec/support/static/git-scm.com/images/company-project-logos/google@2x.png +0 -0
  579. data/spec/support/static/git-scm.com/images/company-project-logos/kde.png +0 -0
  580. data/spec/support/static/git-scm.com/images/company-project-logos/kde@2x.png +0 -0
  581. data/spec/support/static/git-scm.com/images/company-project-logos/linked-in.png +0 -0
  582. data/spec/support/static/git-scm.com/images/company-project-logos/linked-in@2x.png +0 -0
  583. data/spec/support/static/git-scm.com/images/company-project-logos/linux.png +0 -0
  584. data/spec/support/static/git-scm.com/images/company-project-logos/linux@2x.png +0 -0
  585. data/spec/support/static/git-scm.com/images/company-project-logos/microsoft.png +0 -0
  586. data/spec/support/static/git-scm.com/images/company-project-logos/microsoft@2x.png +0 -0
  587. data/spec/support/static/git-scm.com/images/company-project-logos/netflix.png +0 -0
  588. data/spec/support/static/git-scm.com/images/company-project-logos/netflix@2x.png +0 -0
  589. data/spec/support/static/git-scm.com/images/company-project-logos/perl.png +0 -0
  590. data/spec/support/static/git-scm.com/images/company-project-logos/perl@2x.png +0 -0
  591. data/spec/support/static/git-scm.com/images/company-project-logos/postgresql.png +0 -0
  592. data/spec/support/static/git-scm.com/images/company-project-logos/postgresql@2x.png +0 -0
  593. data/spec/support/static/git-scm.com/images/company-project-logos/qt.png +0 -0
  594. data/spec/support/static/git-scm.com/images/company-project-logos/qt@2x.png +0 -0
  595. data/spec/support/static/git-scm.com/images/company-project-logos/rails.png +0 -0
  596. data/spec/support/static/git-scm.com/images/company-project-logos/rails@2x.png +0 -0
  597. data/spec/support/static/git-scm.com/images/company-project-logos/twitter.png +0 -0
  598. data/spec/support/static/git-scm.com/images/company-project-logos/twitter@2x.png +0 -0
  599. data/spec/support/static/git-scm.com/images/company-project-logos/x.png +0 -0
  600. data/spec/support/static/git-scm.com/images/company-project-logos/x@2x.png +0 -0
  601. data/spec/support/static/git-scm.com/images/epub.png +0 -0
  602. data/spec/support/static/git-scm.com/images/icons/admin-sm.png +0 -0
  603. data/spec/support/static/git-scm.com/images/icons/admin-sm@2x.png +0 -0
  604. data/spec/support/static/git-scm.com/images/icons/apple.png +0 -0
  605. data/spec/support/static/git-scm.com/images/icons/apple@2x.png +0 -0
  606. data/spec/support/static/git-scm.com/images/icons/book.png +0 -0
  607. data/spec/support/static/git-scm.com/images/icons/book@2x.png +0 -0
  608. data/spec/support/static/git-scm.com/images/icons/box.png +0 -0
  609. data/spec/support/static/git-scm.com/images/icons/box@2x.png +0 -0
  610. data/spec/support/static/git-scm.com/images/icons/branch-sm.png +0 -0
  611. data/spec/support/static/git-scm.com/images/icons/branch-sm@2x.png +0 -0
  612. data/spec/support/static/git-scm.com/images/icons/camera-sm.png +0 -0
  613. data/spec/support/static/git-scm.com/images/icons/camera-sm@2x.png +0 -0
  614. data/spec/support/static/git-scm.com/images/icons/chevron-up@2x.png +0 -0
  615. data/spec/support/static/git-scm.com/images/icons/code.png +0 -0
  616. data/spec/support/static/git-scm.com/images/icons/code@2x.png +0 -0
  617. data/spec/support/static/git-scm.com/images/icons/debugging-sm.png +0 -0
  618. data/spec/support/static/git-scm.com/images/icons/debugging-sm@2x.png +0 -0
  619. data/spec/support/static/git-scm.com/images/icons/document.png +0 -0
  620. data/spec/support/static/git-scm.com/images/icons/document@2x.png +0 -0
  621. data/spec/support/static/git-scm.com/images/icons/download.png +0 -0
  622. data/spec/support/static/git-scm.com/images/icons/email-sm.png +0 -0
  623. data/spec/support/static/git-scm.com/images/icons/email-sm@2x.png +0 -0
  624. data/spec/support/static/git-scm.com/images/icons/external-sm.png +0 -0
  625. data/spec/support/static/git-scm.com/images/icons/external-sm@2x.png +0 -0
  626. data/spec/support/static/git-scm.com/images/icons/gui.png +0 -0
  627. data/spec/support/static/git-scm.com/images/icons/gui@2x.png +0 -0
  628. data/spec/support/static/git-scm.com/images/icons/info.png +0 -0
  629. data/spec/support/static/git-scm.com/images/icons/info@2x.png +0 -0
  630. data/spec/support/static/git-scm.com/images/icons/inspection-sm.png +0 -0
  631. data/spec/support/static/git-scm.com/images/icons/inspection-sm@2x.png +0 -0
  632. data/spec/support/static/git-scm.com/images/icons/linux.png +0 -0
  633. data/spec/support/static/git-scm.com/images/icons/linux@2x.png +0 -0
  634. data/spec/support/static/git-scm.com/images/icons/nav-circles.png +0 -0
  635. data/spec/support/static/git-scm.com/images/icons/nav-circles@2x.png +0 -0
  636. data/spec/support/static/git-scm.com/images/icons/patching-sm.png +0 -0
  637. data/spec/support/static/git-scm.com/images/icons/patching-sm@2x.png +0 -0
  638. data/spec/support/static/git-scm.com/images/icons/plumbing-sm.png +0 -0
  639. data/spec/support/static/git-scm.com/images/icons/plumbing-sm@2x.png +0 -0
  640. data/spec/support/static/git-scm.com/images/icons/projects-sm.png +0 -0
  641. data/spec/support/static/git-scm.com/images/icons/projects-sm@2x.png +0 -0
  642. data/spec/support/static/git-scm.com/images/icons/search.png +0 -0
  643. data/spec/support/static/git-scm.com/images/icons/search@2x.png +0 -0
  644. data/spec/support/static/git-scm.com/images/icons/server-admin-sm.png +0 -0
  645. data/spec/support/static/git-scm.com/images/icons/server-admin-sm@2x.png +0 -0
  646. data/spec/support/static/git-scm.com/images/icons/setup-sm.png +0 -0
  647. data/spec/support/static/git-scm.com/images/icons/setup-sm@2x.png +0 -0
  648. data/spec/support/static/git-scm.com/images/icons/sharing-sm.png +0 -0
  649. data/spec/support/static/git-scm.com/images/icons/sharing-sm@2x.png +0 -0
  650. data/spec/support/static/git-scm.com/images/icons/sidebar.png +0 -0
  651. data/spec/support/static/git-scm.com/images/icons/sidebar@2x.png +0 -0
  652. data/spec/support/static/git-scm.com/images/icons/source-code.png +0 -0
  653. data/spec/support/static/git-scm.com/images/icons/source-code@2x.png +0 -0
  654. data/spec/support/static/git-scm.com/images/icons/windows.png +0 -0
  655. data/spec/support/static/git-scm.com/images/icons/windows@2x.png +0 -0
  656. data/spec/support/static/git-scm.com/images/logo@2x.png +0 -0
  657. data/spec/support/static/git-scm.com/images/mobi.png +0 -0
  658. data/spec/support/static/git-scm.com/images/monitor-default.png +0 -0
  659. data/spec/support/static/git-scm.com/images/monitor-default@2x.png +0 -0
  660. data/spec/support/static/git-scm.com/images/monitor-linux.png +0 -0
  661. data/spec/support/static/git-scm.com/images/monitor-linux@2x.png +0 -0
  662. data/spec/support/static/git-scm.com/images/monitor-mac.png +0 -0
  663. data/spec/support/static/git-scm.com/images/monitor-mac@2x.png +0 -0
  664. data/spec/support/static/git-scm.com/images/monitor-windows.png +0 -0
  665. data/spec/support/static/git-scm.com/images/monitor-windows@2x.png +0 -0
  666. data/spec/support/static/git-scm.com/images/pdf.png +0 -0
  667. data/spec/support/static/git-scm.com/images/progit2.png +0 -0
  668. data/spec/support/static/git-scm.com/images/sidebar-divider.png +0 -0
  669. data/spec/support/static/git-scm.com/images/sidebar-divider@2x.png +0 -0
  670. data/spec/support/static/git-scm.com/robots.txt +0 -0
  671. data/spec/task_spec.rb +7 -0
  672. data/wayfarer.gemspec +2 -2
  673. metadata +620 -16
  674. data/lib/wayfarer/middleware/worker.rb +0 -50
  675. data/spec/factories/queue/chain.rb +0 -11
  676. data/spec/middleware/worker_spec.rb +0 -127
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a2bbcc550d6799e1e3588b832905866116105fdcceb0eeef5ec244622f15bb10
4
- data.tar.gz: b8b324d89d162e578cde829f15a44bb08b9e93ad2a3bb5b6619e96275a7fa6cd
3
+ metadata.gz: e7d0560732b7b89dd2bb7d86ed4d5c6a07f240c246c864bb067060cbd5fe7156
4
+ data.tar.gz: cc58bdc83b09293caa5eea587f437d14333a20c399be586fc4d2216cc9c0ae39
5
5
  SHA512:
6
- metadata.gz: 998c06776f7a7922aa2d36770dc7e4389c5814ac36a20062b20e7fe6986fb52e4fde9f538287510fccfca1689fb9f7f4e019ec23dcbeff777add1a99e24fba26
7
- data.tar.gz: 239e3db3d5fffb8f81e74c655a648ce03febd346c25fb86b695bca8a8d328e6ff341d63d4becf63a2811defae3af5a1c4bf1c772e327b114df5909a06151a95b
6
+ metadata.gz: 5427038da9468be757d11709c5a08879063af448be881d881a288aedf8b6930a49755d4e89e1701dc68cfb1f2be6de613ae04b466669901a281a6f4f268c3671
7
+ data.tar.gz: 23a208e0eb8c72d12273660010fa19d9b8fb7a304508a5b051c348b23720d2a1d1aecc7836d93aac91466065048a36b1bc126193165f47b59c77979c55a00f68
data/.rubocop.yml CHANGED
@@ -20,6 +20,10 @@ Style/BlockDelimiters:
20
20
  - subject
21
21
  - expect
22
22
 
23
+ Style/ClassAndModuleChildren:
24
+ Exclude:
25
+ - "spec/**/*"
26
+
23
27
  Style/Documentation:
24
28
  Enabled: false
25
29
 
@@ -32,6 +36,12 @@ Metrics/BlockLength:
32
36
 
33
37
  Metrics/AbcSize:
34
38
  Max: 30
39
+ Exclude:
40
+ - "spec/**/*"
35
41
 
36
42
  Metrics/CyclomaticComplexity:
37
43
  Max: 15
44
+
45
+ Lint/ConstantDefinitionInBlock:
46
+ Exclude:
47
+ - "spec/**/*"
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- wayfarer (0.4.1)
5
- activejob (~> 6.0)
4
+ wayfarer (0.4.5)
5
+ activejob (>= 6.0)
6
6
  addressable (~> 2.8)
7
7
  capybara (~> 3.0)
8
8
  connection_pool (~> 2.2)
@@ -59,16 +59,17 @@ GEM
59
59
  activesupport (>= 5.0.0)
60
60
  faker (1.9.6)
61
61
  i18n (>= 0.7)
62
- faraday (1.8.0)
62
+ faraday (1.9.3)
63
63
  faraday-em_http (~> 1.0)
64
64
  faraday-em_synchrony (~> 1.0)
65
65
  faraday-excon (~> 1.1)
66
- faraday-httpclient (~> 1.0.1)
66
+ faraday-httpclient (~> 1.0)
67
+ faraday-multipart (~> 1.0)
67
68
  faraday-net_http (~> 1.0)
68
- faraday-net_http_persistent (~> 1.1)
69
+ faraday-net_http_persistent (~> 1.0)
69
70
  faraday-patron (~> 1.0)
70
71
  faraday-rack (~> 1.0)
71
- multipart-post (>= 1.2, < 3)
72
+ faraday-retry (~> 1.0)
72
73
  ruby2_keywords (>= 0.0.4)
73
74
  faraday-cookie_jar (0.0.7)
74
75
  faraday (>= 0.8.0)
@@ -81,19 +82,22 @@ GEM
81
82
  faraday-http-cache (2.2.0)
82
83
  faraday (>= 0.8)
83
84
  faraday-httpclient (1.0.1)
85
+ faraday-multipart (1.0.3)
86
+ multipart-post (>= 1.2, < 3)
84
87
  faraday-net_http (1.0.1)
85
88
  faraday-net_http_persistent (1.2.0)
86
89
  faraday-patron (1.0.0)
87
90
  faraday-rack (1.0.0)
91
+ faraday-retry (1.0.3)
88
92
  faraday_middleware (1.2.0)
89
93
  faraday (~> 1.0)
90
- fastimage (2.2.5)
94
+ fastimage (2.2.6)
91
95
  ferrum (0.11)
92
96
  addressable (~> 2.5)
93
97
  cliver (~> 0.3)
94
98
  concurrent-ruby (~> 1.1)
95
99
  websocket-driver (>= 0.6, < 0.8)
96
- globalid (0.5.2)
100
+ globalid (1.0.0)
97
101
  activesupport (>= 5.0)
98
102
  http-cookie (1.0.4)
99
103
  domain_name (~> 0.5)
@@ -111,9 +115,9 @@ GEM
111
115
  nesty (~> 1.0)
112
116
  nokogiri (~> 1.11)
113
117
  method_source (1.0.0)
114
- mime-types (3.3.1)
118
+ mime-types (3.4.1)
115
119
  mime-types-data (~> 3.2015)
116
- mime-types-data (3.2021.0901)
120
+ mime-types-data (3.2022.0105)
117
121
  mini_mime (1.1.2)
118
122
  mini_portile2 (2.6.1)
119
123
  minitest (5.14.4)
@@ -182,7 +186,7 @@ GEM
182
186
  rack (~> 1.5)
183
187
  rack-protection (~> 1.4)
184
188
  tilt (>= 1.3, < 3)
185
- thor (1.1.0)
189
+ thor (1.2.1)
186
190
  tilt (2.0.10)
187
191
  tzinfo (2.0.4)
188
192
  concurrent-ruby (~> 1.0)
@@ -0,0 +1,22 @@
1
+ # Batch routing
2
+
3
+ ```ruby
4
+ # Create a record in an external database and store the hostname
5
+ record = Database::Row.create(hostname: "example.com")
6
+
7
+ class DummyJob < Wayfarer::Base
8
+ route do |hostname|
9
+ host hostname, to: :index
10
+ end
11
+
12
+ steer do |task|
13
+ # Pass the external record's hostname to the router
14
+ [Database::Row.find(task.batch).hostname]
15
+ end
16
+
17
+ # ...
18
+ end
19
+
20
+ # Enqueue the task and use the database record's key as batch
21
+ DummyJob.crawl("https://example.com", batch: record.id)
22
+ ```
@@ -0,0 +1,36 @@
1
+ # Consent Screens
2
+
3
+ Some websites have nag-screens that make visitors wait for a button to show up.
4
+ Here is an example with Ferrum where the opt-in button is contained in an
5
+ iframe, clicked, and makes the live page behind the screen accessible to
6
+ `#index`:
7
+
8
+ ```ruby
9
+ Wayfarer.config.network.agent = :ferrum
10
+
11
+ class DummyJob < Wayfarer::Base
12
+ route { to :index, host: "example.com" }
13
+
14
+ before_action if: :consent_required? do
15
+ sleep(5) # If the consent form has a loading animation
16
+ consent_button&.click
17
+ sleep(5) # Wait for browser to get redirected behind nag-screen
18
+ end
19
+
20
+ def index
21
+ # Nag-screen passed
22
+ stage page(live: true).meta.links.internal
23
+ end
24
+
25
+ private
26
+
27
+ def consent_button
28
+ browser.frames.third.css("button#consent")&.first
29
+ end
30
+
31
+ def consent_required?
32
+ browser.css(".consent_screen").any?
33
+ end
34
+ end
35
+
36
+ ```
@@ -0,0 +1,41 @@
1
+ # Executing JavaScript
2
+
3
+ Executing JavaScript requires automating a browser.
4
+
5
+ === "Ferrum"
6
+
7
+ ```ruby
8
+ class DummyJob < Wayfarer::Base
9
+ route { to :index }
10
+
11
+ def index
12
+ browser.evaluate("[window.scrollX, window.scrollY]")
13
+ end
14
+ end
15
+ ```
16
+
17
+ === "Selenium"
18
+
19
+ ```ruby
20
+ class DummyJob < Wayfarer::Base
21
+ route { to :index }
22
+
23
+ def index
24
+ # Mind the explicit return
25
+ browser.execute_script("return [window.scrollX, window.scrollY]")
26
+ end
27
+ end
28
+ ```
29
+
30
+ === "Capybara"
31
+
32
+ ```ruby
33
+ class DummyJob < Wayfarer::Base
34
+ route { to :index }
35
+
36
+ def index
37
+ # Capybara does not return value of JavaScript execution
38
+ browser.execute_script("console.log('Foobar')") # => nil
39
+ end
40
+ end
41
+ ```
@@ -0,0 +1,43 @@
1
+ # Navigation
2
+
3
+ === "Ferrum"
4
+
5
+ ```ruby
6
+ class DummyJob < Wayfarer::Base
7
+ route { to :index }
8
+
9
+ def index
10
+ agent.goto("https://example.com")
11
+ agent.back
12
+ agent.forward
13
+ end
14
+ end
15
+ ```
16
+
17
+ === "Selenium"
18
+
19
+ ```ruby
20
+ class DummyJob < Wayfarer::Base
21
+ route { to :index }
22
+
23
+ def index
24
+ agent.navigate.to("https://example.com")
25
+ agent.navigate.back
26
+ agent.navigate.forward
27
+ end
28
+ end
29
+ ```
30
+
31
+ === "Capybara"
32
+
33
+ ```ruby
34
+ class DummyJob < Wayfarer::Base
35
+ route { to :index }
36
+
37
+ def index
38
+ agent.visit("https://example.com")
39
+ agent.go_back
40
+ agent.go_forward
41
+ end
42
+ end
43
+ ```
@@ -6,7 +6,7 @@ See: [Nokogiri: Searching an HTML / XML Document](https://nokogiri.org/tutorials
6
6
 
7
7
  ```ruby
8
8
  class DummyJob < Wayfarer::Base
9
- route.to :index
9
+ route { to :index }
10
10
 
11
11
  def index
12
12
  page.doc.css("html")
@@ -19,7 +19,7 @@ See: [Nokogiri: Searching an HTML / XML Document](https://nokogiri.org/tutorials
19
19
 
20
20
  ```ruby
21
21
  class DummyJob < Wayfarer::Base
22
- route.to :index
22
+ route { to :index }
23
23
 
24
24
  def index
25
25
  browser.at_css("html")
@@ -32,7 +32,7 @@ See: [Nokogiri: Searching an HTML / XML Document](https://nokogiri.org/tutorials
32
32
 
33
33
  ```ruby
34
34
  class DummyJob < Wayfarer::Base
35
- route.to :index
35
+ route { to :index }
36
36
 
37
37
  def index
38
38
  browser.find_elements(css: "html")
@@ -6,7 +6,7 @@ Taking screenshots requires automating a browser.
6
6
 
7
7
  ```ruby
8
8
  class DummyJob < Wayfarer::Base
9
- route.to :index
9
+ route { to :index }
10
10
 
11
11
  def index
12
12
  browser.screenshot(path: "screenshot.png")
@@ -18,7 +18,7 @@ Taking screenshots requires automating a browser.
18
18
 
19
19
  ```ruby
20
20
  class DummyJob < Wayfarer::Base
21
- route.to :index
21
+ route { to :index }
22
22
 
23
23
  def index
24
24
  browser.save_screenshot("screenshot.png")
@@ -52,16 +52,16 @@ end
52
52
  Internally, a batch counter is in-/decremented on certain events. Once the
53
53
  counter reaches zero, `after_batch` callbacks runs in declaration order.
54
54
 
55
- The counter is incremented when:
55
+ The counter is incremented when within the batch:
56
56
 
57
- * A job is enqueued within the batch.
57
+ * A job is enqueued.
58
58
 
59
59
  The counter is decremented when:
60
60
 
61
61
  * A job succeeds.
62
- * A job fails due to an unhandled exception.
63
- * A job fails due to a discarded exception.
64
- * A job fails and thereyby exhausts its maximum attempts.
62
+ * A job errors due to an unhandled exception.
63
+ * A job is discarded due to an exception.
64
+ * A job errors and thereyby exhausts its maximum attempts.
65
65
 
66
66
  !!! attention "Batch callbacks can fail jobs"
67
67
 
@@ -0,0 +1,17 @@
1
+ # Debugging
2
+
3
+ [Wayfarer's CLI](/reference/cli/) has two sub-commands that come in handy when
4
+ diagnosing problems in the development workflow.
5
+
6
+ ## Routing a URL from the shell
7
+
8
+ ## `wayfarer route`
9
+
10
+ ### `wayfarer route result JOB URL`
11
+
12
+ : Prints the result of invoking `JOB`'s router with `URL`.
13
+
14
+ ### `wayfarer route tree JOB URL`
15
+
16
+ : Visualises the routing tree result of invoking `JOB`'s router with `URL`.
17
+
@@ -1,35 +1,31 @@
1
1
  # Error handling
2
2
 
3
- Wayfarer relies on Active Job's error handling facilities, `retry_on` and
4
- `discard_on`:
3
+ ## Wayfarer never swallows exceptions
5
4
 
6
- * [Active Job Basics: Exceptions](https://guides.rubyonrails.org/active_job_basics.html#exceptions)
7
- * [ActiveJob::Exceptions](https://edgeapi.rubyonrails.org/classes/ActiveJob/Exceptions/ClassMethods.html)
5
+ * Wayfarer never swallows exceptions.
6
+ * Jobs with unhandled exceptions are not retried.
8
7
 
9
- ## Retrying
8
+ ## Retrying and discarding
10
9
 
11
- ```ruby
12
- class DummyJob < Wayfarer::Base
13
- retry_on MyError, attempts: 3 do |job, error|
14
- # All 3 attempts have failed (1 initial attempt + 2 retries)
15
- end
16
- end
17
- ```
10
+ Wayfarer relies on [Active Job's two error handling facilities](https://guides.rubyonrails.org/active_job_basics.html#exceptions).
18
11
 
19
- ## Discarding
12
+ * `retry_on` to retry jobs a number of times on certain errors:
20
13
 
21
- ```ruby
22
- class DummyJob < Wayfarer::Base
23
- discard_on MyError do |job, error|
24
- # The job will not get retried
25
- end
26
- end
27
- ```
14
+ ```ruby
15
+ class DummyJob < Wayfarer::Base
16
+ retry_on MyError, attempts: 3 do |job, error|
17
+ # This block runs once all 3 attempts have failed
18
+ # (1 initial attempt + 2 retries)
19
+ end
20
+ end
21
+ ```
28
22
 
29
- ## Job failures
23
+ * `discard_on` to throw away jobs on certain errors:
30
24
 
31
- Jobs are not retried and their URLs locked within their batch if:
32
-
33
- * A discarded exception is raised.
34
- * An unhandled exception is raised.
35
- * A handled exception is raised, but retry attempts are exhausted.
25
+ ```ruby
26
+ class DummyJob < Wayfarer::Base
27
+ discard_on MyError do |job, error|
28
+ # This block runs once and buries the job
29
+ end
30
+ end
31
+ ```
data/docs/guides/jobs.md CHANGED
@@ -1,16 +1,36 @@
1
1
  # Jobs
2
2
 
3
- Jobs are Ruby classes that look as follows:
3
+ Jobs are Ruby classes that process [tasks](/guides/tasks) and look as follows:
4
4
 
5
5
  ```ruby
6
6
  class DummyJob < Wayfarer::Base
7
- route.to :index
7
+ route { to :index }
8
8
 
9
9
  def index
10
10
  end
11
11
  end
12
12
  ```
13
13
 
14
+ Here is how to enqueue a task for a URL:
15
+
16
+ ```ruby
17
+ DummyJob.crawl("https://example.com")
18
+ ```
19
+
20
+ This is the same as calling the Active Job API directly and passing a task
21
+ and a random batch:
22
+
23
+ ```ruby
24
+ task = Wayfarer::Task.new("https://example.com", SecureRandom.uuid)
25
+ DummyJob.perform_later(task)
26
+ ```
27
+
28
+ A batch can be specified with `::crawl`, too:
29
+
30
+ ```ruby
31
+ DummyJob.crawl("https://example.com", batch: "my-batch")
32
+ ```
33
+
14
34
  ## Current task
15
35
 
16
36
  Jobs consume [tasks](../tasks) from a message queue. The currently processed
@@ -18,58 +38,64 @@ task is accessible like so:
18
38
 
19
39
  ```ruby
20
40
  class DummyJob < Wayfarer::Base
21
- route.to :index
41
+ route { to :index }
22
42
 
23
43
  def index
24
44
  task.url # => "https://example.com"
25
- task.batch # => "55fe80d4-97ce-..."
45
+ task.batch # => "my-batch"
26
46
  end
27
47
  end
28
48
  ```
29
49
 
30
50
  ## Current page
31
51
 
32
- Once control is handed over to jobs, their task's URL has been retrieved into a
33
- [page](../pages) object:
52
+ A task's URL contents get fetched into a [page](../pages) object if the task URL
53
+ matched a route:
34
54
 
35
55
  ```ruby
36
56
  class DummyJob < Wayfarer::Base
37
- route.to :index
57
+ route { to :index, host: "example.com" }
38
58
 
39
59
  def index
40
- page.url # => "https://example.com"
41
- page.body # => "<html>..."
60
+ page.url # => "https://example.com"
61
+ page.body # => "<html>..."
62
+ page.status_code # => 200
63
+ page.headers # { "Content-Type" => ... }
42
64
  end
43
65
  end
44
66
  ```
45
67
 
46
68
  ## URL parameters
47
69
 
48
- TODO
70
+ Jobs can extract data from URLs with their router:
49
71
 
50
72
  ```ruby
51
73
  class DummyJob < Wayfarer::Base
52
- route.to :index
74
+ route do
75
+ path "/users/:id/profile"
76
+ end
53
77
 
54
78
  def index
55
- page.url # => "https://example.com"
56
- page.body # => "<html>..."
79
+ params[:id] # => "42"
57
80
  end
58
81
  end
82
+
83
+ DummyJob.crawl("https://example.com/users/42/profile")
59
84
  ```
60
85
 
61
86
 
62
- ## Automated browser
87
+ ## User agent
63
88
 
64
- When automating browsers, the remote browser process that retrieved the URL is
65
- accessible like so:
89
+ The HTTP client or automated browser that fetched the URL is available:
66
90
 
67
91
  ```ruby
92
+ Wayfarer.config.network.agent = :ferrum # Chrome DevTools Protocol
93
+
68
94
  class DummyJob < Wayfarer::Base
69
- route.to :index
95
+ route { to :index }
70
96
 
71
97
  def index
72
- browser # => #<Ferrum::Browser ...> or #<Selenium::WebDriver ...>
98
+ browser.save_screenshot("capture.png")
73
99
  end
74
100
  end
75
101
  ```
@@ -0,0 +1,73 @@
1
+ # Navigation
2
+
3
+ Wayfarer has two mechanisms for navigating crawls:
4
+
5
+ * Jobs have a router that decides if a task's URL gets fetched and processed.
6
+ * Jobs can add URLs to a processing set with `#stage`.
7
+
8
+ ## Staging URLs
9
+
10
+ Jobs can turn URLs into tasks within their own batch with `#stage`. Staging a
11
+ URL does not enqueue it immediately. Instead, the URL is added to a processing
12
+ set first.
13
+
14
+ ```ruby
15
+ class DummyJob < Wayfarer::Base
16
+ route { to :index }
17
+
18
+ def index
19
+ stage page.meta.links.all
20
+ end
21
+ end
22
+ ```
23
+
24
+ Once the `index` action method returns, all URLs in `page.meta.links.all`
25
+ are (1) normalized to a canonical form and (2) checked for inclusion in
26
+ the batch's processed URL Redis set. All unprocessed URLs are enqueued as
27
+ tasks within the same batch.
28
+
29
+ `#stage` can be called arbitrarily often, with invalid URLs too, as they are
30
+ filtered out behind the scenes:
31
+
32
+ ```ruby
33
+ def index
34
+ stage "_bro:ken@url/" # => ["_bro:ken@url/"]
35
+ end
36
+ ```
37
+
38
+ See also: [Performance: Stage less URLs](/guides/performance)
39
+
40
+ !!! attention "Failing action methods do not enqueue tasks"
41
+
42
+ If an action method fails as in:
43
+
44
+ ```ruby
45
+ def index
46
+ stage page.meta.links.all
47
+ fail "Error occured"
48
+ end
49
+ ```
50
+
51
+ None of the staged URLs are enqueued as tasks. Jobs that raise an exception
52
+ should get retried, or the exception should be handled.
53
+
54
+
55
+ ## Routing URLs
56
+
57
+ In the following example, the task is written to the message queue, but the
58
+ job's routes do not match the URL. When the task gets consumed, the URL does not
59
+ get fetched and the action method not called.
60
+
61
+ ```ruby
62
+ class DummyJob < Wayfarer::Base
63
+ route do
64
+ host "example.com", path: "/users/:user_id", to: :user
65
+ end
66
+
67
+ # ...
68
+ end
69
+
70
+ DummyJob.crawl("https://mismatching.host/users/42")
71
+ ```
72
+
73
+
@@ -7,8 +7,11 @@ When Capybara is in use, a remote browser process is available as a Capybara
7
7
  session:
8
8
 
9
9
  ```ruby
10
- class DummyWorker < Wayfarer::Worker
11
- route.to :index
10
+ Wayfarer.config.network.agent = :capybara
11
+ # Wayfarer.config.capybara.driver = ...
12
+
13
+ class DummyJob < Wayfarer::Worker
14
+ route { to :index }
12
15
 
13
16
  def index
14
17
  browser # => #<Capybara::Session ...>
@@ -57,10 +60,12 @@ end
57
60
  3. Register the driver:
58
61
 
59
62
  ```ruby
63
+ require "capybara/cuprite"
64
+
60
65
  Capybara.javascript_driver = :cuprite
61
66
 
62
67
  Capybara.register_driver(:cuprite) do |app|
63
- # Wayfarer's Ferrum or Selenium options must be passed along manually
64
- Capybara::Cuprite::Driver.new(app, Wayfare.config.ferrum.options)
68
+ # Wayfarer's Ferrum or Selenium options can be passed along
69
+ Capybara::Cuprite::Driver.new(app, Wayfarer.config.ferrum.options)
65
70
  end
66
71
  ```
@@ -11,8 +11,10 @@ When Ferrum is in use, a Google Chrome process is accessible within jobs like
11
11
  so:
12
12
 
13
13
  ```ruby
14
+ Wayfarer.config.network.agent = :ferrum
15
+
14
16
  class DummyWorker < Wayfarer::Worker
15
- route.to :index
17
+ route { to :index }
16
18
 
17
19
  def index
18
20
  browser # => #<Ferrum::Browser ...>
@@ -0,0 +1,33 @@
1
+ # Plain HTTP
2
+
3
+ Wayfarer can retrieve pages via plain HTTP requests, also alongside automated
4
+ browsers.
5
+
6
+ ## Agent
7
+
8
+ The HTTP agent is the default.
9
+
10
+ ## Ad-hoc requests
11
+
12
+ When automating browsers, it can be useful to additionally retrieve the page
13
+ over plain HTTP. Jobs can fetch URLs to [pages](/pages) with `#http`:
14
+
15
+ ```ruby
16
+ class DummyJob < Wayfarer::Base
17
+ route { to :index }
18
+
19
+ def index
20
+ http.fetch(task.url) # => #<Wayfarer::Page ...>
21
+ end
22
+ end
23
+ ```
24
+
25
+ By default, 3 redirects are followed, and this can be configured by passing the
26
+ `follow` keyword:
27
+
28
+ ```ruby
29
+ http.fetch(url, follow: 5)
30
+ ```
31
+
32
+ If redirected too often, `Wayfarer::Networking::RedirectsExhaustedError` is
33
+ raised.