wayfarer 0.4.8 → 0.4.10

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 (615) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yaml +0 -2
  3. data/Gemfile.lock +1 -1
  4. data/docs/guides/development.md +18 -26
  5. data/docs/guides/networking/custom_adapters.md +93 -86
  6. data/docs/guides/networking/http.md +1 -1
  7. data/docs/guides/routing.md +1 -1
  8. data/docs/guides/tutorial.md +1 -2
  9. data/lib/wayfarer/cli.rb +16 -0
  10. data/lib/wayfarer/logging.rb +3 -4
  11. data/lib/wayfarer/middleware/base.rb +0 -4
  12. data/lib/wayfarer/middleware/controller.rb +1 -1
  13. data/lib/wayfarer/networking/context.rb +1 -1
  14. data/lib/wayfarer/networking/ferrum.rb +1 -1
  15. data/lib/wayfarer/networking/pool.rb +3 -9
  16. data/lib/wayfarer/networking/strategy.rb +6 -2
  17. data/lib/wayfarer/parsing.rb +1 -1
  18. data/lib/wayfarer.rb +9 -4
  19. data/rake/release.rake +0 -6
  20. data/spec/spec_helpers.rb +1 -1
  21. data/spec/wayfarer/integration/page_spec.rb +9 -9
  22. data/spec/wayfarer/integration/parsing_spec.rb +3 -2
  23. data/spec/wayfarer/integration/stage_spec.rb +3 -3
  24. data/spec/wayfarer/middleware/controller_spec.rb +3 -4
  25. data/spec/wayfarer/networking/context_spec.rb +3 -2
  26. data/spec/wayfarer/networking/pool_spec.rb +1 -1
  27. data/spec/wayfarer/networking/strategy.rb +2 -2
  28. data/wayfarer.gemspec +1 -1
  29. metadata +1 -1172
  30. data/lib/wayfarer/middleware/lazy.rb +0 -11
  31. data/spec/support/static/git-scm.com/assets/application-38b0d42ff05ffea45841edebbd14b75b89585646153808e82907c2c5c11f324b.js +0 -772
  32. data/spec/support/static/git-scm.com/assets/application-cafcf280f67db0e6d8168ba98a38da878769a9d5f37793b68ffb963a02d185e0.css +0 -1
  33. data/spec/support/static/git-scm.com/assets/modernize-b3ebe0c31c24f230dc62179d3e1030d2e57a53b1668d9382c0a27dbd44a94beb.js +0 -20
  34. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Bash.html +0 -751
  35. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-PowerShell.html +0 -804
  36. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Sublime-Text.html +0 -728
  37. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Visual-Studio-Code.html +0 -751
  38. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Visual-Studio.html +0 -740
  39. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Zsh.html +0 -765
  40. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Graphical-Interfaces.html +0 -931
  41. data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Summary.html +0 -702
  42. data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-Command-line-Git.html +0 -720
  43. data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-Dulwich.html +0 -746
  44. data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-JGit.html +0 -889
  45. data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-Libgit2.html +0 -1003
  46. data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-go-git.html +0 -792
  47. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Administration.html +0 -745
  48. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Basic-Snapshotting.html +0 -840
  49. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Branching-and-Merging.html +0 -829
  50. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Debugging.html +0 -731
  51. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Email.html +0 -766
  52. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-External-Systems.html +0 -721
  53. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Getting-and-Creating-Projects.html +0 -746
  54. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Inspection-and-Comparison.html +0 -735
  55. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Patching.html +0 -742
  56. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Plumbing-Commands.html +0 -715
  57. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Setup-and-Config.html +0 -863
  58. data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Sharing-and-Updating-Projects.html +0 -802
  59. data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-An-Example-Git-Enforced-Policy.html +0 -1200
  60. data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-Git-Attributes.html +0 -1134
  61. data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-Git-Configuration.html +0 -1315
  62. data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-Git-Hooks.html +0 -876
  63. data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-Summary.html +0 -704
  64. data/spec/support/static/git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project.html +0 -1667
  65. data/spec/support/static/git-scm.com/book/en/v2/Distributed-Git-Distributed-Workflows.html +0 -859
  66. data/spec/support/static/git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project.html +0 -1354
  67. data/spec/support/static/git-scm.com/book/en/v2/Distributed-Git-Summary.html +0 -704
  68. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-A-Short-History-of-Git.html +0 -735
  69. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-About-Version-Control.html +0 -783
  70. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup.html +0 -889
  71. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-Getting-Help.html +0 -750
  72. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-Installing-Git.html +0 -879
  73. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-Summary.html +0 -704
  74. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-The-Command-Line.html +0 -711
  75. data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-What-is-Git?.html +0 -857
  76. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository.html +0 -816
  77. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Git-Aliases.html +0 -775
  78. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository.html +0 -1432
  79. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Summary.html +0 -703
  80. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Tagging.html +0 -1049
  81. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Undoing-Things.html +0 -998
  82. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-History.html +0 -1172
  83. data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes.html +0 -983
  84. data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging.html +0 -1102
  85. data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Branch-Management.html +0 -946
  86. data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell.html +0 -1020
  87. data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Branching-Workflows.html +0 -786
  88. data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Rebasing.html +0 -1028
  89. data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Remote-Branches.html +0 -1009
  90. data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Summary.html +0 -705
  91. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Environment-Variables.html +0 -1009
  92. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Git-Objects.html +0 -1209
  93. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Git-References.html +0 -939
  94. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery.html +0 -1086
  95. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Packfiles.html +0 -876
  96. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain.html +0 -745
  97. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Summary.html +0 -708
  98. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-The-Refspec.html +0 -872
  99. data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols.html +0 -1043
  100. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Advanced-Merging.html +0 -1605
  101. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Bundling.html +0 -888
  102. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Credential-Storage.html +0 -1035
  103. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git.html +0 -861
  104. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Interactive-Staging.html +0 -920
  105. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Replace.html +0 -949
  106. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Rerere.html +0 -983
  107. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Reset-Demystified.html +0 -1236
  108. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Revision-Selection.html +0 -1178
  109. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Rewriting-History.html +0 -1182
  110. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Searching.html +0 -875
  111. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work.html +0 -922
  112. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Stashing-and-Cleaning.html +0 -1039
  113. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Submodules.html +0 -1864
  114. data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Summary.html +0 -705
  115. data/spec/support/static/git-scm.com/book/en/v2/Git-and-Other-Systems-Git-as-a-Client.html +0 -2656
  116. data/spec/support/static/git-scm.com/book/en/v2/Git-and-Other-Systems-Migrating-to-Git.html +0 -1741
  117. data/spec/support/static/git-scm.com/book/en/v2/Git-and-Other-Systems-Summary.html +0 -703
  118. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Generating-Your-SSH-Public-Key.html +0 -759
  119. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Getting-Git-on-a-Server.html +0 -827
  120. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Git-Daemon.html +0 -775
  121. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-GitLab.html +0 -872
  122. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-GitWeb.html +0 -776
  123. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server.html +0 -870
  124. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Smart-HTTP.html +0 -789
  125. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Summary.html +0 -709
  126. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols.html +0 -963
  127. data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Third-Party-Hosted-Options.html +0 -711
  128. data/spec/support/static/git-scm.com/book/en/v2/GitHub-Account-Setup-and-Configuration.html +0 -858
  129. data/spec/support/static/git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project.html +0 -1502
  130. data/spec/support/static/git-scm.com/book/en/v2/GitHub-Maintaining-a-Project.html +0 -1218
  131. data/spec/support/static/git-scm.com/book/en/v2/GitHub-Managing-an-organization.html +0 -797
  132. data/spec/support/static/git-scm.com/book/en/v2/GitHub-Scripting-GitHub.html +0 -1059
  133. data/spec/support/static/git-scm.com/book/en/v2/GitHub-Summary.html +0 -704
  134. data/spec/support/static/git-scm.com/book/en/v2/ch00/_abort_merge.html +0 -1605
  135. data/spec/support/static/git-scm.com/book/en/v2/ch00/_add_email_addresses.html +0 -858
  136. data/spec/support/static/git-scm.com/book/en/v2/ch00/_advanced_merging.html +0 -1605
  137. data/spec/support/static/git-scm.com/book/en/v2/ch00/_an_example_git_enforced_policy.html +0 -1200
  138. data/spec/support/static/git-scm.com/book/en/v2/ch00/_annotated_tags.html +0 -1049
  139. data/spec/support/static/git-scm.com/book/en/v2/ch00/_api_comment.html +0 -1059
  140. data/spec/support/static/git-scm.com/book/en/v2/ch00/_bare_repo.html +0 -827
  141. data/spec/support/static/git-scm.com/book/en/v2/ch00/_basic_branching.html +0 -1102
  142. data/spec/support/static/git-scm.com/book/en/v2/ch00/_basic_merge_conflicts.html +0 -1102
  143. data/spec/support/static/git-scm.com/book/en/v2/ch00/_basic_merging.html +0 -1102
  144. data/spec/support/static/git-scm.com/book/en/v2/ch00/_binary_search.html +0 -861
  145. data/spec/support/static/git-scm.com/book/en/v2/ch00/_branch_management.html +0 -946
  146. data/spec/support/static/git-scm.com/book/en/v2/ch00/_branch_references.html +0 -1178
  147. data/spec/support/static/git-scm.com/book/en/v2/ch00/_build_number.html +0 -1354
  148. data/spec/support/static/git-scm.com/book/en/v2/ch00/_bundling.html +0 -888
  149. data/spec/support/static/git-scm.com/book/en/v2/ch00/_changing_multiple.html +0 -1182
  150. data/spec/support/static/git-scm.com/book/en/v2/ch00/_checking_out_conflicts.html +0 -1605
  151. data/spec/support/static/git-scm.com/book/en/v2/ch00/_checking_out_remotes.html +0 -1354
  152. data/spec/support/static/git-scm.com/book/en/v2/ch00/_checking_status.html +0 -1432
  153. data/spec/support/static/git-scm.com/book/en/v2/ch00/_cloning_submodules.html +0 -1864
  154. data/spec/support/static/git-scm.com/book/en/v2/ch00/_commit_guidelines.html +0 -1667
  155. data/spec/support/static/git-scm.com/book/en/v2/ch00/_commit_ranges.html +0 -1178
  156. data/spec/support/static/git-scm.com/book/en/v2/ch00/_commit_status.html +0 -1059
  157. data/spec/support/static/git-scm.com/book/en/v2/ch00/_committing_changes.html +0 -1432
  158. data/spec/support/static/git-scm.com/book/en/v2/ch00/_contrib_file.html +0 -1218
  159. data/spec/support/static/git-scm.com/book/en/v2/ch00/_contributing_project.html +0 -1667
  160. data/spec/support/static/git-scm.com/book/en/v2/ch00/_create_new_branch.html +0 -1020
  161. data/spec/support/static/git-scm.com/book/en/v2/ch00/_credential_caching.html +0 -1035
  162. data/spec/support/static/git-scm.com/book/en/v2/ch00/_custom_importer.html +0 -1741
  163. data/spec/support/static/git-scm.com/book/en/v2/ch00/_data_recovery.html +0 -1086
  164. data/spec/support/static/git-scm.com/book/en/v2/ch00/_delete_branches.html +0 -1009
  165. data/spec/support/static/git-scm.com/book/en/v2/ch00/_editor.html +0 -889
  166. data/spec/support/static/git-scm.com/book/en/v2/ch00/_eg_task_lists.html +0 -1502
  167. data/spec/support/static/git-scm.com/book/en/v2/ch00/_email_hooks.html +0 -876
  168. data/spec/support/static/git-scm.com/book/en/v2/ch00/_email_notification.html +0 -1502
  169. data/spec/support/static/git-scm.com/book/en/v2/ch00/_email_notifications.html +0 -1218
  170. data/spec/support/static/git-scm.com/book/en/v2/ch00/_email_pr.html +0 -1218
  171. data/spec/support/static/git-scm.com/book/en/v2/ch00/_enforcing_commit_message_format.html +0 -1200
  172. data/spec/support/static/git-scm.com/book/en/v2/ch00/_example_markdown.html +0 -1502
  173. data/spec/support/static/git-scm.com/book/en/v2/ch00/_external_merge_tools.html +0 -1315
  174. data/spec/support/static/git-scm.com/book/en/v2/ch00/_fetch_and_push_on_different_repositories.html +0 -1502
  175. data/spec/support/static/git-scm.com/book/en/v2/ch00/_fetching_and_pulling.html +0 -983
  176. data/spec/support/static/git-scm.com/book/en/v2/ch00/_file_annotation.html +0 -861
  177. data/spec/support/static/git-scm.com/book/en/v2/ch00/_first_time.html +0 -889
  178. data/spec/support/static/git-scm.com/book/en/v2/ch00/_generate_ssh_key.html +0 -759
  179. data/spec/support/static/git-scm.com/book/en/v2/ch00/_getting_a_repo.html +0 -816
  180. data/spec/support/static/git-scm.com/book/en/v2/ch00/_getting_git_on_a_server.html +0 -827
  181. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_aliases.html +0 -775
  182. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_am.html +0 -1354
  183. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_amend.html +0 -1182
  184. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_branches_overview.html +0 -1020
  185. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_clean.html +0 -1039
  186. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_cloning.html +0 -816
  187. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_commit_objects.html +0 -1209
  188. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_config.html +0 -1315
  189. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_diff_staged.html +0 -1432
  190. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_gc.html +0 -1086
  191. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_grep.html +0 -875
  192. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_help.html +0 -750
  193. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_hooks.html +0 -876
  194. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_mv.html +0 -1432
  195. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_p4.html +0 -1741
  196. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_p4_branches.html +0 -2656
  197. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_reflog.html +0 -1178
  198. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_refs.html +0 -939
  199. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_reset.html +0 -1236
  200. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_stashing.html +0 -1039
  201. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_submodules.html +0 -1864
  202. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_svn.html +0 -2656
  203. data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_tagging.html +0 -1049
  204. data/spec/support/static/git-scm.com/book/en/v2/ch00/_gitlab_groups_section.html +0 -872
  205. data/spec/support/static/git-scm.com/book/en/v2/ch00/_ignoring.html +0 -1432
  206. data/spec/support/static/git-scm.com/book/en/v2/ch00/_inspecting_remote.html +0 -983
  207. data/spec/support/static/git-scm.com/book/en/v2/ch00/_integration_manager.html +0 -859
  208. data/spec/support/static/git-scm.com/book/en/v2/ch00/_interactive_staging.html +0 -920
  209. data/spec/support/static/git-scm.com/book/en/v2/ch00/_keyword_expansion.html +0 -1134
  210. data/spec/support/static/git-scm.com/book/en/v2/ch00/_libgit2_bindings.html +0 -1003
  211. data/spec/support/static/git-scm.com/book/en/v2/ch00/_manual_remerge.html +0 -1605
  212. data/spec/support/static/git-scm.com/book/en/v2/ch00/_md_code.html +0 -1502
  213. data/spec/support/static/git-scm.com/book/en/v2/ch00/_md_drag.html +0 -1502
  214. data/spec/support/static/git-scm.com/book/en/v2/ch00/_md_emoji.html +0 -1502
  215. data/spec/support/static/git-scm.com/book/en/v2/ch00/_md_quote.html +0 -1502
  216. data/spec/support/static/git-scm.com/book/en/v2/ch00/_merge_button.html +0 -1218
  217. data/spec/support/static/git-scm.com/book/en/v2/ch00/_merge_log.html +0 -1605
  218. data/spec/support/static/git-scm.com/book/en/v2/ch00/_merge_rebase_work.html +0 -1028
  219. data/spec/support/static/git-scm.com/book/en/v2/ch00/_new_repo_dropdown.html +0 -1218
  220. data/spec/support/static/git-scm.com/book/en/v2/ch00/_not_center.html +0 -1218
  221. data/spec/support/static/git-scm.com/book/en/v2/ch00/_org_page.html +0 -797
  222. data/spec/support/static/git-scm.com/book/en/v2/ch00/_other_client_hooks.html +0 -876
  223. data/spec/support/static/git-scm.com/book/en/v2/ch00/_p4_git_fusion.html +0 -2656
  224. data/spec/support/static/git-scm.com/book/en/v2/ch00/_patches_from_email.html +0 -1354
  225. data/spec/support/static/git-scm.com/book/en/v2/ch00/_personal_avatar.html +0 -858
  226. data/spec/support/static/git-scm.com/book/en/v2/ch00/_plumbing_porcelain.html +0 -745
  227. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_closed.html +0 -1502
  228. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_discussion.html +0 -1502
  229. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_fail.html +0 -1502
  230. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_final.html +0 -1502
  231. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_references.html +0 -1502
  232. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_references_render.html +0 -1502
  233. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_refs.html +0 -1218
  234. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pre_merge_rebase_work.html +0 -1028
  235. data/spec/support/static/git-scm.com/book/en/v2/ch00/_preparing_release.html +0 -1354
  236. data/spec/support/static/git-scm.com/book/en/v2/ch00/_private_team.html +0 -1667
  237. data/spec/support/static/git-scm.com/book/en/v2/ch00/_project_over_email.html +0 -1667
  238. data/spec/support/static/git-scm.com/book/en/v2/ch00/_public_project.html +0 -1667
  239. data/spec/support/static/git-scm.com/book/en/v2/ch00/_publishing_submodules.html +0 -1864
  240. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pushing_branches.html +0 -1009
  241. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pushing_refspecs.html +0 -872
  242. data/spec/support/static/git-scm.com/book/en/v2/ch00/_pushing_remotes.html +0 -983
  243. data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebase_cherry_pick.html +0 -1354
  244. data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebase_peril.html +0 -1028
  245. data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebase_rebase.html +0 -1028
  246. data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebase_rebase_work.html +0 -1028
  247. data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebasing.html +0 -1028
  248. data/spec/support/static/git-scm.com/book/en/v2/ch00/_refspec.html +0 -872
  249. data/spec/support/static/git-scm.com/book/en/v2/ch00/_remote_branches.html +0 -1009
  250. data/spec/support/static/git-scm.com/book/en/v2/ch00/_remote_repos.html +0 -983
  251. data/spec/support/static/git-scm.com/book/en/v2/ch00/_removing_file_every_commit.html +0 -1182
  252. data/spec/support/static/git-scm.com/book/en/v2/ch00/_removing_files.html +0 -1432
  253. data/spec/support/static/git-scm.com/book/en/v2/ch00/_removing_objects.html +0 -1086
  254. data/spec/support/static/git-scm.com/book/en/v2/ch00/_replace.html +0 -949
  255. data/spec/support/static/git-scm.com/book/en/v2/ch00/_reverse_commit.html +0 -1605
  256. data/spec/support/static/git-scm.com/book/en/v2/ch00/_revision_selection.html +0 -1178
  257. data/spec/support/static/git-scm.com/book/en/v2/ch00/_rewriting_history.html +0 -1182
  258. data/spec/support/static/git-scm.com/book/en/v2/ch00/_searching.html +0 -875
  259. data/spec/support/static/git-scm.com/book/en/v2/ch00/_service_config.html +0 -1059
  260. data/spec/support/static/git-scm.com/book/en/v2/ch00/_services_hooks.html +0 -1059
  261. data/spec/support/static/git-scm.com/book/en/v2/ch00/_setting_up_server.html +0 -870
  262. data/spec/support/static/git-scm.com/book/en/v2/ch00/_sharing_tags.html +0 -1049
  263. data/spec/support/static/git-scm.com/book/en/v2/ch00/_signing.html +0 -922
  264. data/spec/support/static/git-scm.com/book/en/v2/ch00/_signing_commits.html +0 -922
  265. data/spec/support/static/git-scm.com/book/en/v2/ch00/_squashing.html +0 -1182
  266. data/spec/support/static/git-scm.com/book/en/v2/ch00/_starting_submodules.html +0 -1864
  267. data/spec/support/static/git-scm.com/book/en/v2/ch00/_subtree_merge.html +0 -1605
  268. data/spec/support/static/git-scm.com/book/en/v2/ch00/_switching_branches.html +0 -1020
  269. data/spec/support/static/git-scm.com/book/en/v2/ch00/_tagging_releases.html +0 -1354
  270. data/spec/support/static/git-scm.com/book/en/v2/ch00/_task_list_progress.html +0 -1502
  271. data/spec/support/static/git-scm.com/book/en/v2/ch00/_team_page.html +0 -797
  272. data/spec/support/static/git-scm.com/book/en/v2/ch00/_the_index.html +0 -1236
  273. data/spec/support/static/git-scm.com/book/en/v2/ch00/_the_shortlog.html +0 -1354
  274. data/spec/support/static/git-scm.com/book/en/v2/ch00/_topic_branch.html +0 -786
  275. data/spec/support/static/git-scm.com/book/en/v2/ch00/_tracking_branches.html +0 -1009
  276. data/spec/support/static/git-scm.com/book/en/v2/ch00/_tracking_files.html +0 -1432
  277. data/spec/support/static/git-scm.com/book/en/v2/ch00/_tree_objects.html +0 -1209
  278. data/spec/support/static/git-scm.com/book/en/v2/ch00/_triple_dot.html +0 -1178
  279. data/spec/support/static/git-scm.com/book/en/v2/ch00/_undoing.html +0 -998
  280. data/spec/support/static/git-scm.com/book/en/v2/ch00/_unstaging.html +0 -998
  281. data/spec/support/static/git-scm.com/book/en/v2/ch00/_viewing_history.html +0 -1172
  282. data/spec/support/static/git-scm.com/book/en/v2/ch00/_web_hook.html +0 -1059
  283. data/spec/support/static/git-scm.com/book/en/v2/ch00/_what_is_introduced.html +0 -1354
  284. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch01-getting-started.html +0 -783
  285. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch02-git-basics-chapter.html +0 -816
  286. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch03-git-branching.html +0 -1020
  287. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch05-distributed-git.html +0 -859
  288. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch06-github.html +0 -858
  289. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch06-github_flow.html +0 -1502
  290. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch10-git-internals.html +0 -745
  291. data/spec/support/static/git-scm.com/book/en/v2/ch00/ch_core_editor.html +0 -863
  292. data/spec/support/static/git-scm.com/book/en/v2/ch00/divergent_history.html +0 -1020
  293. data/spec/support/static/git-scm.com/book/en/v2/ch00/double_dot.html +0 -1178
  294. data/spec/support/static/git-scm.com/book/en/v2/ch00/filters_a.html +0 -1134
  295. data/spec/support/static/git-scm.com/book/en/v2/ch00/filters_b.html +0 -1134
  296. data/spec/support/static/git-scm.com/book/en/v2/ch00/limit_options.html +0 -1172
  297. data/spec/support/static/git-scm.com/book/en/v2/ch00/log_options.html +0 -1172
  298. data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_a.html +0 -1354
  299. data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_b.html +0 -1354
  300. data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_c.html +0 -1354
  301. data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_d.html +0 -1354
  302. data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_e.html +0 -1354
  303. data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_f.html +0 -1354
  304. data/spec/support/static/git-scm.com/book/en/v2/ch00/oh_my_zsh_git.html +0 -765
  305. data/spec/support/static/git-scm.com/book/en/v2/ch00/pretty_format.html +0 -1172
  306. data/spec/support/static/git-scm.com/book/en/v2/ch00/psp_b.html +0 -1667
  307. data/spec/support/static/git-scm.com/book/en/v2/ch00/rbdiag_e.html +0 -1028
  308. data/spec/support/static/git-scm.com/book/en/v2/ch00/rbdiag_g.html +0 -1028
  309. data/spec/support/static/git-scm.com/book/en/v2/ch00/rbdiag_h.html +0 -1028
  310. data/spec/support/static/git-scm.com/book/en/v2/ch00/rbdiag_i.html +0 -1028
  311. data/spec/support/static/git-scm.com/book/en/v2/ch00/rebasing-merging-example.html +0 -1028
  312. data/spec/support/static/git-scm.com/book/en/v2/ch00/ref_rerere.html +0 -983
  313. data/spec/support/static/git-scm.com/book/en/v2/ch00/ref_the_ref.html +0 -939
  314. data/spec/support/static/git-scm.com/book/en/v2/ch00/wfdiag_b.html +0 -859
  315. data/spec/support/static/git-scm.com/book/en/v2/ch00/wfdiag_c.html +0 -859
  316. data/spec/support/static/git-scm.com/book/en/v2/ch00/what_is_git_section.html +0 -857
  317. data/spec/support/static/git-scm.com/book/en/v2/images/2fa-1.png +0 -0
  318. data/spec/support/static/git-scm.com/book/en/v2/images/account-settings.png +0 -0
  319. data/spec/support/static/git-scm.com/book/en/v2/images/advance-master.png +0 -0
  320. data/spec/support/static/git-scm.com/book/en/v2/images/advance-testing.png +0 -0
  321. data/spec/support/static/git-scm.com/book/en/v2/images/areas.png +0 -0
  322. data/spec/support/static/git-scm.com/book/en/v2/images/avatar-crop.png +0 -0
  323. data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-1.png +0 -0
  324. data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-2.png +0 -0
  325. data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-3.png +0 -0
  326. data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-4.png +0 -0
  327. data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-5.png +0 -0
  328. data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-6.png +0 -0
  329. data/spec/support/static/git-scm.com/book/en/v2/images/basic-merging-1.png +0 -0
  330. data/spec/support/static/git-scm.com/book/en/v2/images/basic-merging-2.png +0 -0
  331. data/spec/support/static/git-scm.com/book/en/v2/images/basic-rebase-1.png +0 -0
  332. data/spec/support/static/git-scm.com/book/en/v2/images/basic-rebase-2.png +0 -0
  333. data/spec/support/static/git-scm.com/book/en/v2/images/basic-rebase-3.png +0 -0
  334. data/spec/support/static/git-scm.com/book/en/v2/images/basic-rebase-4.png +0 -0
  335. data/spec/support/static/git-scm.com/book/en/v2/images/benevolent-dictator.png +0 -0
  336. data/spec/support/static/git-scm.com/book/en/v2/images/blink-01-start.png +0 -0
  337. data/spec/support/static/git-scm.com/book/en/v2/images/blink-02-pr.png +0 -0
  338. data/spec/support/static/git-scm.com/book/en/v2/images/blink-03-pull-request-open.png +0 -0
  339. data/spec/support/static/git-scm.com/book/en/v2/images/blink-04-email.png +0 -0
  340. data/spec/support/static/git-scm.com/book/en/v2/images/blink-04-pr-comment.png +0 -0
  341. data/spec/support/static/git-scm.com/book/en/v2/images/blink-05-general-comment.png +0 -0
  342. data/spec/support/static/git-scm.com/book/en/v2/images/blink-06-final.png +0 -0
  343. data/spec/support/static/git-scm.com/book/en/v2/images/branch-and-history.png +0 -0
  344. data/spec/support/static/git-scm.com/book/en/v2/images/branch_widget_mac.png +0 -0
  345. data/spec/support/static/git-scm.com/book/en/v2/images/branch_widget_win.png +0 -0
  346. data/spec/support/static/git-scm.com/book/en/v2/images/centralized.png +0 -0
  347. data/spec/support/static/git-scm.com/book/en/v2/images/centralized_workflow.png +0 -0
  348. data/spec/support/static/git-scm.com/book/en/v2/images/checkout-master.png +0 -0
  349. data/spec/support/static/git-scm.com/book/en/v2/images/clean.png +0 -0
  350. data/spec/support/static/git-scm.com/book/en/v2/images/collaborators.png +0 -0
  351. data/spec/support/static/git-scm.com/book/en/v2/images/commit-and-tree.png +0 -0
  352. data/spec/support/static/git-scm.com/book/en/v2/images/commits-and-parents.png +0 -0
  353. data/spec/support/static/git-scm.com/book/en/v2/images/data-model-1.png +0 -0
  354. data/spec/support/static/git-scm.com/book/en/v2/images/data-model-2.png +0 -0
  355. data/spec/support/static/git-scm.com/book/en/v2/images/data-model-3.png +0 -0
  356. data/spec/support/static/git-scm.com/book/en/v2/images/data-model-4.png +0 -0
  357. data/spec/support/static/git-scm.com/book/en/v2/images/deltas.png +0 -0
  358. data/spec/support/static/git-scm.com/book/en/v2/images/distributed.png +0 -0
  359. data/spec/support/static/git-scm.com/book/en/v2/images/double-dot.png +0 -0
  360. data/spec/support/static/git-scm.com/book/en/v2/images/email-settings.png +0 -0
  361. data/spec/support/static/git-scm.com/book/en/v2/images/forkbutton.png +0 -0
  362. data/spec/support/static/git-scm.com/book/en/v2/images/git-bash.png +0 -0
  363. data/spec/support/static/git-scm.com/book/en/v2/images/git-diff-check.png +0 -0
  364. data/spec/support/static/git-scm.com/book/en/v2/images/git-fusion-boot.png +0 -0
  365. data/spec/support/static/git-scm.com/book/en/v2/images/git-fusion-perforce-graph.png +0 -0
  366. data/spec/support/static/git-scm.com/book/en/v2/images/git-gui.png +0 -0
  367. data/spec/support/static/git-scm.com/book/en/v2/images/git-instaweb.png +0 -0
  368. data/spec/support/static/git-scm.com/book/en/v2/images/git-osx-installer.png +0 -0
  369. data/spec/support/static/git-scm.com/book/en/v2/images/github_mac.png +0 -0
  370. data/spec/support/static/git-scm.com/book/en/v2/images/github_win.png +0 -0
  371. data/spec/support/static/git-scm.com/book/en/v2/images/gitk.png +0 -0
  372. data/spec/support/static/git-scm.com/book/en/v2/images/gitlab-groups.png +0 -0
  373. data/spec/support/static/git-scm.com/book/en/v2/images/gitlab-menu.png +0 -0
  374. data/spec/support/static/git-scm.com/book/en/v2/images/gitlab-users.png +0 -0
  375. data/spec/support/static/git-scm.com/book/en/v2/images/head-to-master.png +0 -0
  376. data/spec/support/static/git-scm.com/book/en/v2/images/head-to-testing.png +0 -0
  377. data/spec/support/static/git-scm.com/book/en/v2/images/integration-manager.png +0 -0
  378. data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-1.png +0 -0
  379. data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-2.png +0 -0
  380. data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-3.png +0 -0
  381. data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-4.png +0 -0
  382. data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-5.png +0 -0
  383. data/spec/support/static/git-scm.com/book/en/v2/images/jb.png +0 -0
  384. data/spec/support/static/git-scm.com/book/en/v2/images/large-merges-1.png +0 -0
  385. data/spec/support/static/git-scm.com/book/en/v2/images/large-merges-2.png +0 -0
  386. data/spec/support/static/git-scm.com/book/en/v2/images/lifecycle.png +0 -0
  387. data/spec/support/static/git-scm.com/book/en/v2/images/local.png +0 -0
  388. data/spec/support/static/git-scm.com/book/en/v2/images/lr-branches-1.png +0 -0
  389. data/spec/support/static/git-scm.com/book/en/v2/images/lr-branches-2.png +0 -0
  390. data/spec/support/static/git-scm.com/book/en/v2/images/maint-01-email.png +0 -0
  391. data/spec/support/static/git-scm.com/book/en/v2/images/maint-02-merge.png +0 -0
  392. data/spec/support/static/git-scm.com/book/en/v2/images/maint-03-email-resp.png +0 -0
  393. data/spec/support/static/git-scm.com/book/en/v2/images/maint-04-target.png +0 -0
  394. data/spec/support/static/git-scm.com/book/en/v2/images/maint-05-mentions.png +0 -0
  395. data/spec/support/static/git-scm.com/book/en/v2/images/maint-06-unsubscribe.png +0 -0
  396. data/spec/support/static/git-scm.com/book/en/v2/images/maint-07-notifications.png +0 -0
  397. data/spec/support/static/git-scm.com/book/en/v2/images/maint-08-notifications-page.png +0 -0
  398. data/spec/support/static/git-scm.com/book/en/v2/images/maint-09-contrib.png +0 -0
  399. data/spec/support/static/git-scm.com/book/en/v2/images/maint-10-default-branch.png +0 -0
  400. data/spec/support/static/git-scm.com/book/en/v2/images/maint-11-transfer.png +0 -0
  401. data/spec/support/static/git-scm.com/book/en/v2/images/managed-team-1.png +0 -0
  402. data/spec/support/static/git-scm.com/book/en/v2/images/managed-team-2.png +0 -0
  403. data/spec/support/static/git-scm.com/book/en/v2/images/managed-team-3.png +0 -0
  404. data/spec/support/static/git-scm.com/book/en/v2/images/managed-team-flow.png +0 -0
  405. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-01-example.png +0 -0
  406. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-02-tasks.png +0 -0
  407. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-03-task-summary.png +0 -0
  408. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-04-fenced-code.png +0 -0
  409. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-05-quote.png +0 -0
  410. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-06-emoji-complete.png +0 -0
  411. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-07-emoji.png +0 -0
  412. data/spec/support/static/git-scm.com/book/en/v2/images/markdown-08-drag-drop.png +0 -0
  413. data/spec/support/static/git-scm.com/book/en/v2/images/mentions-01-syntax.png +0 -0
  414. data/spec/support/static/git-scm.com/book/en/v2/images/mentions-02-render.png +0 -0
  415. data/spec/support/static/git-scm.com/book/en/v2/images/mentions-03-closed.png +0 -0
  416. data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-1.png +0 -0
  417. data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-2.png +0 -0
  418. data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-3.png +0 -0
  419. data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-4.png +0 -0
  420. data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-5.png +0 -0
  421. data/spec/support/static/git-scm.com/book/en/v2/images/new-repo.png +0 -0
  422. data/spec/support/static/git-scm.com/book/en/v2/images/neworg.png +0 -0
  423. data/spec/support/static/git-scm.com/book/en/v2/images/newrepo.png +0 -0
  424. data/spec/support/static/git-scm.com/book/en/v2/images/newrepoform.png +0 -0
  425. data/spec/support/static/git-scm.com/book/en/v2/images/orgs-01-page.png +0 -0
  426. data/spec/support/static/git-scm.com/book/en/v2/images/orgs-02-teams.png +0 -0
  427. data/spec/support/static/git-scm.com/book/en/v2/images/orgs-03-audit.png +0 -0
  428. data/spec/support/static/git-scm.com/book/en/v2/images/p4merge.png +0 -0
  429. data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-1.png +0 -0
  430. data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-2.png +0 -0
  431. data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-3.png +0 -0
  432. data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-4.png +0 -0
  433. data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-5.png +0 -0
  434. data/spec/support/static/git-scm.com/book/en/v2/images/posh-git.png +0 -0
  435. data/spec/support/static/git-scm.com/book/en/v2/images/pr-01-fail.png +0 -0
  436. data/spec/support/static/git-scm.com/book/en/v2/images/pr-02-merge-fix.png +0 -0
  437. data/spec/support/static/git-scm.com/book/en/v2/images/public-small-1.png +0 -0
  438. data/spec/support/static/git-scm.com/book/en/v2/images/public-small-2.png +0 -0
  439. data/spec/support/static/git-scm.com/book/en/v2/images/public-small-3.png +0 -0
  440. data/spec/support/static/git-scm.com/book/en/v2/images/rebasing-1.png +0 -0
  441. data/spec/support/static/git-scm.com/book/en/v2/images/rebasing-2.png +0 -0
  442. data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-1.png +0 -0
  443. data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-2.png +0 -0
  444. data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-3.png +0 -0
  445. data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-4.png +0 -0
  446. data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-5.png +0 -0
  447. data/spec/support/static/git-scm.com/book/en/v2/images/replace1.png +0 -0
  448. data/spec/support/static/git-scm.com/book/en/v2/images/replace2.png +0 -0
  449. data/spec/support/static/git-scm.com/book/en/v2/images/replace3.png +0 -0
  450. data/spec/support/static/git-scm.com/book/en/v2/images/replace4.png +0 -0
  451. data/spec/support/static/git-scm.com/book/en/v2/images/replace5.png +0 -0
  452. data/spec/support/static/git-scm.com/book/en/v2/images/reposettingslink.png +0 -0
  453. data/spec/support/static/git-scm.com/book/en/v2/images/rerere1.png +0 -0
  454. data/spec/support/static/git-scm.com/book/en/v2/images/rerere2.png +0 -0
  455. data/spec/support/static/git-scm.com/book/en/v2/images/rerere3.png +0 -0
  456. data/spec/support/static/git-scm.com/book/en/v2/images/reset-checkout.png +0 -0
  457. data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex1.png +0 -0
  458. data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex2.png +0 -0
  459. data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex3.png +0 -0
  460. data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex4.png +0 -0
  461. data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex5.png +0 -0
  462. data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex6.png +0 -0
  463. data/spec/support/static/git-scm.com/book/en/v2/images/reset-hard.png +0 -0
  464. data/spec/support/static/git-scm.com/book/en/v2/images/reset-mixed.png +0 -0
  465. data/spec/support/static/git-scm.com/book/en/v2/images/reset-path1.png +0 -0
  466. data/spec/support/static/git-scm.com/book/en/v2/images/reset-path2.png +0 -0
  467. data/spec/support/static/git-scm.com/book/en/v2/images/reset-path3.png +0 -0
  468. data/spec/support/static/git-scm.com/book/en/v2/images/reset-soft.png +0 -0
  469. data/spec/support/static/git-scm.com/book/en/v2/images/reset-squash-r1.png +0 -0
  470. data/spec/support/static/git-scm.com/book/en/v2/images/reset-squash-r2.png +0 -0
  471. data/spec/support/static/git-scm.com/book/en/v2/images/reset-squash-r3.png +0 -0
  472. data/spec/support/static/git-scm.com/book/en/v2/images/reset-start.png +0 -0
  473. data/spec/support/static/git-scm.com/book/en/v2/images/reset-workflow.png +0 -0
  474. data/spec/support/static/git-scm.com/book/en/v2/images/scripting-01-services.png +0 -0
  475. data/spec/support/static/git-scm.com/book/en/v2/images/scripting-02-email-service.png +0 -0
  476. data/spec/support/static/git-scm.com/book/en/v2/images/scripting-03-webhook.png +0 -0
  477. data/spec/support/static/git-scm.com/book/en/v2/images/scripting-04-webhook-debug.png +0 -0
  478. data/spec/support/static/git-scm.com/book/en/v2/images/scripting-05-access-token.png +0 -0
  479. data/spec/support/static/git-scm.com/book/en/v2/images/scripting-06-comment.png +0 -0
  480. data/spec/support/static/git-scm.com/book/en/v2/images/scripting-07-status.png +0 -0
  481. data/spec/support/static/git-scm.com/book/en/v2/images/signup.png +0 -0
  482. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-1.png +0 -0
  483. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-2.png +0 -0
  484. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-3.png +0 -0
  485. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-4.png +0 -0
  486. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-5.png +0 -0
  487. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-6.png +0 -0
  488. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-7.png +0 -0
  489. data/spec/support/static/git-scm.com/book/en/v2/images/small-team-flow.png +0 -0
  490. data/spec/support/static/git-scm.com/book/en/v2/images/smudge.png +0 -0
  491. data/spec/support/static/git-scm.com/book/en/v2/images/snapshots.png +0 -0
  492. data/spec/support/static/git-scm.com/book/en/v2/images/ssh-keys.png +0 -0
  493. data/spec/support/static/git-scm.com/book/en/v2/images/topic-branches-1.png +0 -0
  494. data/spec/support/static/git-scm.com/book/en/v2/images/topic-branches-2.png +0 -0
  495. data/spec/support/static/git-scm.com/book/en/v2/images/two-branches.png +0 -0
  496. data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-reset.png +0 -0
  497. data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-revert.png +0 -0
  498. data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-revert2.png +0 -0
  499. data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-revert3.png +0 -0
  500. data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-start.png +0 -0
  501. data/spec/support/static/git-scm.com/book/en/v2/images/your-profile.png +0 -0
  502. data/spec/support/static/git-scm.com/book/en/v2/images/zsh-oh-my.png +0 -0
  503. data/spec/support/static/git-scm.com/book/en/v2/images/zsh-prompt.png +0 -0
  504. data/spec/support/static/git-scm.com/book/en/v2.html +0 -688
  505. data/spec/support/static/git-scm.com/favicon.ico +0 -0
  506. data/spec/support/static/git-scm.com/images/bg/body.jpg +0 -0
  507. data/spec/support/static/git-scm.com/images/bg/isometric-grid.png +0 -0
  508. data/spec/support/static/git-scm.com/images/bg/isometric-grid@2x.png +0 -0
  509. data/spec/support/static/git-scm.com/images/bg/search-header.jpg +0 -0
  510. data/spec/support/static/git-scm.com/images/company-project-logos/android.png +0 -0
  511. data/spec/support/static/git-scm.com/images/company-project-logos/android@2x.png +0 -0
  512. data/spec/support/static/git-scm.com/images/company-project-logos/eclipse.png +0 -0
  513. data/spec/support/static/git-scm.com/images/company-project-logos/eclipse@2x.png +0 -0
  514. data/spec/support/static/git-scm.com/images/company-project-logos/facebook.png +0 -0
  515. data/spec/support/static/git-scm.com/images/company-project-logos/facebook@2x.png +0 -0
  516. data/spec/support/static/git-scm.com/images/company-project-logos/gnome.png +0 -0
  517. data/spec/support/static/git-scm.com/images/company-project-logos/gnome@2x.png +0 -0
  518. data/spec/support/static/git-scm.com/images/company-project-logos/google.png +0 -0
  519. data/spec/support/static/git-scm.com/images/company-project-logos/google@2x.png +0 -0
  520. data/spec/support/static/git-scm.com/images/company-project-logos/kde.png +0 -0
  521. data/spec/support/static/git-scm.com/images/company-project-logos/kde@2x.png +0 -0
  522. data/spec/support/static/git-scm.com/images/company-project-logos/linked-in.png +0 -0
  523. data/spec/support/static/git-scm.com/images/company-project-logos/linked-in@2x.png +0 -0
  524. data/spec/support/static/git-scm.com/images/company-project-logos/linux.png +0 -0
  525. data/spec/support/static/git-scm.com/images/company-project-logos/linux@2x.png +0 -0
  526. data/spec/support/static/git-scm.com/images/company-project-logos/microsoft.png +0 -0
  527. data/spec/support/static/git-scm.com/images/company-project-logos/microsoft@2x.png +0 -0
  528. data/spec/support/static/git-scm.com/images/company-project-logos/netflix.png +0 -0
  529. data/spec/support/static/git-scm.com/images/company-project-logos/netflix@2x.png +0 -0
  530. data/spec/support/static/git-scm.com/images/company-project-logos/perl.png +0 -0
  531. data/spec/support/static/git-scm.com/images/company-project-logos/perl@2x.png +0 -0
  532. data/spec/support/static/git-scm.com/images/company-project-logos/postgresql.png +0 -0
  533. data/spec/support/static/git-scm.com/images/company-project-logos/postgresql@2x.png +0 -0
  534. data/spec/support/static/git-scm.com/images/company-project-logos/qt.png +0 -0
  535. data/spec/support/static/git-scm.com/images/company-project-logos/qt@2x.png +0 -0
  536. data/spec/support/static/git-scm.com/images/company-project-logos/rails.png +0 -0
  537. data/spec/support/static/git-scm.com/images/company-project-logos/rails@2x.png +0 -0
  538. data/spec/support/static/git-scm.com/images/company-project-logos/twitter.png +0 -0
  539. data/spec/support/static/git-scm.com/images/company-project-logos/twitter@2x.png +0 -0
  540. data/spec/support/static/git-scm.com/images/company-project-logos/x.png +0 -0
  541. data/spec/support/static/git-scm.com/images/company-project-logos/x@2x.png +0 -0
  542. data/spec/support/static/git-scm.com/images/epub.png +0 -0
  543. data/spec/support/static/git-scm.com/images/icons/admin-sm.png +0 -0
  544. data/spec/support/static/git-scm.com/images/icons/admin-sm@2x.png +0 -0
  545. data/spec/support/static/git-scm.com/images/icons/apple.png +0 -0
  546. data/spec/support/static/git-scm.com/images/icons/apple@2x.png +0 -0
  547. data/spec/support/static/git-scm.com/images/icons/book.png +0 -0
  548. data/spec/support/static/git-scm.com/images/icons/book@2x.png +0 -0
  549. data/spec/support/static/git-scm.com/images/icons/box.png +0 -0
  550. data/spec/support/static/git-scm.com/images/icons/box@2x.png +0 -0
  551. data/spec/support/static/git-scm.com/images/icons/branch-sm.png +0 -0
  552. data/spec/support/static/git-scm.com/images/icons/branch-sm@2x.png +0 -0
  553. data/spec/support/static/git-scm.com/images/icons/camera-sm.png +0 -0
  554. data/spec/support/static/git-scm.com/images/icons/camera-sm@2x.png +0 -0
  555. data/spec/support/static/git-scm.com/images/icons/chevron-up@2x.png +0 -0
  556. data/spec/support/static/git-scm.com/images/icons/code.png +0 -0
  557. data/spec/support/static/git-scm.com/images/icons/code@2x.png +0 -0
  558. data/spec/support/static/git-scm.com/images/icons/debugging-sm.png +0 -0
  559. data/spec/support/static/git-scm.com/images/icons/debugging-sm@2x.png +0 -0
  560. data/spec/support/static/git-scm.com/images/icons/document.png +0 -0
  561. data/spec/support/static/git-scm.com/images/icons/document@2x.png +0 -0
  562. data/spec/support/static/git-scm.com/images/icons/download.png +0 -0
  563. data/spec/support/static/git-scm.com/images/icons/email-sm.png +0 -0
  564. data/spec/support/static/git-scm.com/images/icons/email-sm@2x.png +0 -0
  565. data/spec/support/static/git-scm.com/images/icons/external-sm.png +0 -0
  566. data/spec/support/static/git-scm.com/images/icons/external-sm@2x.png +0 -0
  567. data/spec/support/static/git-scm.com/images/icons/gui.png +0 -0
  568. data/spec/support/static/git-scm.com/images/icons/gui@2x.png +0 -0
  569. data/spec/support/static/git-scm.com/images/icons/info.png +0 -0
  570. data/spec/support/static/git-scm.com/images/icons/info@2x.png +0 -0
  571. data/spec/support/static/git-scm.com/images/icons/inspection-sm.png +0 -0
  572. data/spec/support/static/git-scm.com/images/icons/inspection-sm@2x.png +0 -0
  573. data/spec/support/static/git-scm.com/images/icons/linux.png +0 -0
  574. data/spec/support/static/git-scm.com/images/icons/linux@2x.png +0 -0
  575. data/spec/support/static/git-scm.com/images/icons/nav-circles.png +0 -0
  576. data/spec/support/static/git-scm.com/images/icons/nav-circles@2x.png +0 -0
  577. data/spec/support/static/git-scm.com/images/icons/patching-sm.png +0 -0
  578. data/spec/support/static/git-scm.com/images/icons/patching-sm@2x.png +0 -0
  579. data/spec/support/static/git-scm.com/images/icons/plumbing-sm.png +0 -0
  580. data/spec/support/static/git-scm.com/images/icons/plumbing-sm@2x.png +0 -0
  581. data/spec/support/static/git-scm.com/images/icons/projects-sm.png +0 -0
  582. data/spec/support/static/git-scm.com/images/icons/projects-sm@2x.png +0 -0
  583. data/spec/support/static/git-scm.com/images/icons/search.png +0 -0
  584. data/spec/support/static/git-scm.com/images/icons/search@2x.png +0 -0
  585. data/spec/support/static/git-scm.com/images/icons/server-admin-sm.png +0 -0
  586. data/spec/support/static/git-scm.com/images/icons/server-admin-sm@2x.png +0 -0
  587. data/spec/support/static/git-scm.com/images/icons/setup-sm.png +0 -0
  588. data/spec/support/static/git-scm.com/images/icons/setup-sm@2x.png +0 -0
  589. data/spec/support/static/git-scm.com/images/icons/sharing-sm.png +0 -0
  590. data/spec/support/static/git-scm.com/images/icons/sharing-sm@2x.png +0 -0
  591. data/spec/support/static/git-scm.com/images/icons/sidebar.png +0 -0
  592. data/spec/support/static/git-scm.com/images/icons/sidebar@2x.png +0 -0
  593. data/spec/support/static/git-scm.com/images/icons/source-code.png +0 -0
  594. data/spec/support/static/git-scm.com/images/icons/source-code@2x.png +0 -0
  595. data/spec/support/static/git-scm.com/images/icons/windows.png +0 -0
  596. data/spec/support/static/git-scm.com/images/icons/windows@2x.png +0 -0
  597. data/spec/support/static/git-scm.com/images/logo@2x.png +0 -0
  598. data/spec/support/static/git-scm.com/images/mobi.png +0 -0
  599. data/spec/support/static/git-scm.com/images/monitor-default.png +0 -0
  600. data/spec/support/static/git-scm.com/images/monitor-default@2x.png +0 -0
  601. data/spec/support/static/git-scm.com/images/monitor-linux.png +0 -0
  602. data/spec/support/static/git-scm.com/images/monitor-linux@2x.png +0 -0
  603. data/spec/support/static/git-scm.com/images/monitor-mac.png +0 -0
  604. data/spec/support/static/git-scm.com/images/monitor-mac@2x.png +0 -0
  605. data/spec/support/static/git-scm.com/images/monitor-windows.png +0 -0
  606. data/spec/support/static/git-scm.com/images/monitor-windows@2x.png +0 -0
  607. data/spec/support/static/git-scm.com/images/pdf.png +0 -0
  608. data/spec/support/static/git-scm.com/images/progit2.png +0 -0
  609. data/spec/support/static/git-scm.com/images/sidebar-divider.png +0 -0
  610. data/spec/support/static/git-scm.com/images/sidebar-divider@2x.png +0 -0
  611. data/spec/support/static/git-scm.com/robots.txt +0 -0
  612. data/spec/support/static/graph/details/a.html +0 -10
  613. data/spec/support/static/graph/details/b.html +0 -10
  614. data/spec/support/static/graph/index.html +0 -20
  615. data/spec/support/static/links/links.html +0 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 677b57fadbc7e01a8adfbc5c2280dfe81aa0de2fce3b778281acc33d42a9a8f3
4
- data.tar.gz: 22c93784493e7a551c19c1f070defa7de8a99d14e8ee740cf866d62dbb9542b9
3
+ metadata.gz: 39fd7cefe2a4a7e07e2c3f69c0d13f96603e983432c56616444407a04af55442
4
+ data.tar.gz: 465b842759a03128413d66ff59b5116f0f7d444b193ad0929ed3a3914f55d5ad
5
5
  SHA512:
6
- metadata.gz: 2c232c7760c3914f56b742ddbcdd7f9719e98a02f0019ffc14ec9f883499f63aaa9a92afb95c241b4d79a8369f8fb53727c9d7d5d694b79786a6d90753a9bc3b
7
- data.tar.gz: 680a7e146e41d3eaf9c8bc48362a9ae8d59dd94baf26b436ee14e47329cfd924c83299aef5f59f10c2e1227f8e08170984885341e79222345ab9bbb460da0f1c
6
+ metadata.gz: 21111b9d58ab7d0286f2f0a8c575485f0553cc4ddb8f19ebcad9f82f67e70dd53290832de6a4da137839a22151f0d06a47b0c606bc139b1491c5ce3d2accf188
7
+ data.tar.gz: '049cc40ee6973ecc66ce921d1ca8bf746ae9066ef88ebe3a364a0b859d125d9857daba149dfffd0b630f9addf88d2330ca3f9de5e57dab521d1dc2908a1d5cde'
@@ -13,8 +13,6 @@ jobs:
13
13
 
14
14
  - run: docker compose exec -T wayfarer git config --global --add safe.directory /opt/app
15
15
 
16
- - run: git status
17
-
18
16
  - name: Release gem
19
17
  env:
20
18
  GIT_AUTHOR_NAME: Dominic Bauer
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- wayfarer (0.4.8)
4
+ wayfarer (0.4.10)
5
5
  activejob (>= 7.1)
6
6
  addressable (~> 2.8)
7
7
  capybara (~> 3.4)
@@ -2,21 +2,11 @@
2
2
 
3
3
  ## Release Procedure
4
4
 
5
- 1. Ensure `Wayfarer::VERSION` was bumped appropriately.
6
- 2. Ensure the version in wayfarer.gemspec matches.
7
- 3. Open a release Pull Request develop -> master branch
8
- 4. Merge the Pull Request
9
- 5. Publish RubyGem and git tag as follows:
10
-
11
- ```
12
- git checkout master
13
- git pull origin master --rebase
14
- bundle exec rake build
15
- gem push build/wayfarer-*.gem
16
- bundle exec rake clean
17
- git tag <VERSION>
18
- git push origin <VERSION>
19
- ```
5
+ 1. Bump versions:
6
+ * `Wayfarer::VERSION` in `lib/wayfarer.rb`
7
+ * RubyGem version in `wayfarer.gemspec`
8
+ * Run `bundle install` to regenerate `Gemfile.lock`
9
+ 2. Push to `master` or `develop` and run the manual `release` worflow
20
10
 
21
11
  ## Conventions and guidelines
22
12
 
@@ -27,10 +17,11 @@ git push origin <VERSION>
27
17
 
28
18
  ### Navigate the web along URL patterns
29
19
 
30
- URLs are less prone to change than served markup.
31
- One reason for this is that changes to a URL's path can have negative
32
- consequences for its page ranking in search engines. Websites naturally implement
33
- architectural URL patterns like REST or expose surrogate keys.
20
+ URLs are less prone to change than served markup. There are also SEO
21
+ incentives to keep their paths stable. Since websites naturally implement
22
+ architectural URL patterns like REST on the application layer, URL structure
23
+ reflects internal domain concepts necessarily, for which Wayfarer's URL-based
24
+ routing is designed.
34
25
 
35
26
  ### Follow URLs verbatim as they appear in responses
36
27
 
@@ -49,17 +40,18 @@ is ephemeral.
49
40
 
50
41
  There are two core features that depend on Redis. First, per-batch acylicity is
51
42
  achieved by maintaining the set of processed URLs per batch in Redis.
52
- There's no option to follow links in a cyclic manner. Second, batch completion
53
- requires updating an integer value in Redis, and batch completion is a very
54
- useful feature, since most crawls should end eventually, and often you want to
55
- know when.
43
+ There's no configuration option to follow links in a cyclic manner. Second,
44
+ batch completion requires updating an integer value in Redis, and batch completion
45
+ is a very useful feature, since most crawls should end eventually, and often you want
46
+ to know when.
56
47
 
57
48
  ### No configuration files
58
49
 
59
- Wayfarer can be configured through `Wayfarer.config` only, because `Wayfarer.config`
60
- may contain Ruby objects that don't de/serialize well, such as `Proc`s or `Set`s.
50
+ Wayfarer can be configured through `Wayfarer.config` in Ruby code only,
51
+ because `Wayfarer.config` may contain Ruby objects that don't de/serialize well,
52
+ such as `Proc`s or `Set`s.
61
53
 
62
- ### Features out of scope
54
+ ### Other features that are out of scope
63
55
 
64
56
  Wayfarer won't provide:
65
57
 
@@ -1,9 +1,11 @@
1
1
  # User agent API
2
2
 
3
- Wayfarer retrieves web pages with user agents. There are two types of user
4
- agents: __stateful__ browsers which carry state and follow redirects implicitly
5
- as they navigate to a URL, and __stateless__ HTTP clients, which handle
6
- redirects explicitly.
3
+ Wayfarer retrieves URL contents with user agents. It supports two types of user
4
+ agents:
5
+
6
+ * __stateless__ HTTP clients which handle redirects explicitly.
7
+ * __stateful__ browsers which carry state and follow redirects implicitly
8
+ as they navigate to a URL
7
9
 
8
10
  | | Stateless adapters | Stateful adapters |
9
11
  |-------------------|--------------------|-------------------|
@@ -12,151 +14,156 @@ redirects explicitly.
12
14
 
13
15
  Because spawning browser processes or instantiating HTTP clients is expensive,
14
16
  Wayfarer keeps user agents in a pool and reuses them across jobs. This means
15
- that browser state carries over between jobs, as a job checks out a previous
16
- job's user agent. Only on certain irrecoverable errors are individual user agents
17
+ that browser state carries over between jobs, as each job checks out a previous
18
+ job's user agent. When exceptions are raised, you must [handle them](/guides/jobs/#handling-errors).
19
+
20
+ Only on certain irrecoverable errors are individual user agents
17
21
  destroyed and recreated. For example when a browser process crashes, it is
18
22
  replaced with a fresh browser process.
19
23
 
20
- ## Base interface for custom user agents
24
+ ## Implementing the user agent interfaces
21
25
 
22
26
  You implement both stateful and stateless agents by including the
23
- `Wayfarer::Networking::Strategy` module and defining callback methods. The
24
- interfaces for stateful and stateless share the following base methods:
27
+ `Wayfarer::Networking::Strategy` module and defining callback methods:
25
28
 
26
29
  ```mermaid
27
30
  classDiagram
28
- class Square~Shape~{
29
- int id
30
- List~int~ position
31
- setPoints(List~int~ points)
32
- getPoints() List~int~
31
+ class BaseAgent {
32
+ <<Interface>>
33
+ +#create()*
34
+ +#destroy(instance)*
35
+ +::renew_on()$
36
+ }
37
+
38
+ class StatefulAgent {
39
+ <<Interface>>
40
+ +#navigate(instance, url)*
41
+ +#live(instance)*
33
42
  }
34
43
 
35
- Square : -List~string~ messages
36
- Square : +setMessages(List~string~ messages)
37
- Square : +getMessages() List~string~
38
- Square : +getDistanceMatrix() List~List~int~~
44
+ class StatelessAgent {
45
+ <<Interface>>
46
+ +#fetch(instance, url)*
47
+ }
48
+
49
+ BaseAgent |>.. StatefulAgent : implements
50
+ BaseAgent |>.. StatelessAgent : implements
39
51
  ```
40
52
 
41
- * `#create` (__required__): Called when a new instance (browser process or HTTP client) is
42
- needed.
43
- * `#destroy(instance)` (optional): Called when an instance should be destroyed. Browser
44
- processes should be quit, and HTTP clients should be freed.
45
- * `#renew_on` (optional): Returns a list of exception classes upon which the existing
46
- instance gets destroyed and replaced with a newly created one.
53
+ Every user agent implementation must provide the `#create` instance callback
54
+ which returns an initialized user agent. Typically, the optional
55
+ `#destroy(instance)` instance callback is also implemented to free resources
56
+ of an existing user agent.
47
57
 
48
- ## Stateless interface
58
+ Also a class method `::renew_on` can be defined which returns an array of
59
+ exception classes upon which an instance of the user agent should get recreated
60
+ (destroy-and-create).
49
61
 
50
- The stateless interface indicate HTTP 3xx redirect responses explicitly. This is how
51
- Wayfarer provides redirect handling out of the box, as there is a configurable limit
52
- on the number of retries to follow.
62
+ ### Stateless interface
53
63
 
54
- In addition to the base interface, stateless user agents implement `#fetch`
64
+ In addition to the base interface, stateless user agents implement `#fetch(instance, url)`
55
65
  which fetches [pages](../pages) or indicates redirects:
56
66
 
57
- * `#fetch(instance, url)` (__required__): Called to retrieve a URL. Responses with a
67
+ * `#create()` __(required)__
68
+ * `#fetch(instance, url)` __(required)__: Called to retrieve a URL. Responses with a
58
69
  3xx status code must indicate the redirect URL by returning `redirect(url)`, since Wayfarer
59
70
  deals with redirects on your behalf to avoid redirect loops. All other status
60
71
  codes, including 4xx and 5xx, are considered successful and are indicated by calling
61
72
  `success(url:, body:, status_code:, headers:)`.
73
+ * `#destroy(instance)` (optional)
74
+ * `::renew_on` (optional)
62
75
 
63
- ## Stateful interface
76
+ The stateless interface indicate HTTP 3xx redirect responses explicitly. This is how
77
+ Wayfarer provides redirect handling out of the box, as there is a configurable limit
78
+ on the number of retries to follow.
64
79
 
65
- In addition to the base interface, stateful user agents implement two additional
66
- methods:
80
+ !!! info "`redirect(url)` enqueues a task for the URL and stops processing the current task."
67
81
 
68
- * `#navigate(instance, url)` (__required__): Navigates the user agent to the given URL.
69
- Stateful user agents follow redirects implicitly.
70
- * `#live(instance) -> Wayfarer::Page` (__required__): Turns the current user agent state
71
- into a [page](../pages).
82
+ !!! info "Pages with HTTP error status codes get routed"
72
83
 
73
- ## Recreating user agents on error with `#renew_on`
84
+ If a HTTP request to a URL results in an error status code (for example, 404),
85
+ page retrieval is considered successful. This allows job actions to record
86
+ such data.
74
87
 
75
- Agents can optionally implement `#renew_on` to get themselves rereated on
76
- certain errors.
88
+ ### Stateful interface
77
89
 
78
- If `#fetch` or `#navigate` raise an exception and the exception class is listed
79
- in `#renew_on`, the instance is destroyed and recreated.
90
+ In addition to the base interface, stateful user agents implement two additional
91
+ instance callbacks:
80
92
 
81
- * `#renew_on` (optional): A list of exception classes upon which the existing instance gets
82
- destroyed and replaced with a newly created one.
93
+ * `#create()` __(required)__
94
+ * `#navigate(instance, url)` __(required)__: Navigates the user agent to the given URL.
95
+ * `#live(instance)` __(required)__: Turns the current user agent state
96
+ into a [page](../pages) by calling `success(url:, body:, status_code:, headers:)`.
97
+ * `#destroy(instance)` (optional)
98
+ * `::renew_on` (optional)
83
99
 
84
100
  ## Example implementations
85
101
 
86
- === "Stateful"
102
+ === "Stateless"
87
103
 
88
104
  ```ruby
89
- class StatefulAgent
105
+ class StatelessAgent
90
106
  include Wayfarer::Networking::Strategy
91
107
 
92
- # Required methods
93
-
94
- def create
95
- MyBrowser.new
108
+ def self.renew_on # optional
109
+ [MyIrrecoverableError]
96
110
  end
97
111
 
98
- def navigate(browser, url)
99
- browser.goto(url)
112
+ def create # required
113
+ MyClient.new
100
114
  end
101
115
 
102
- def live(browser)
103
- success(url: browser.url,
104
- body: browser.body,
105
- status_code: browser.status_code,
106
- headers: browser.headers)
107
- end
116
+ def fetch(client, url) # required
117
+ response = client.get(url)
108
118
 
109
- # Optional methods
119
+ return redirect(response.redirect_url) if response.redirect?
110
120
 
111
- def destroy(browser)
112
- browser.quit
121
+ success(url: url,
122
+ body: response.body,
123
+ status_code: response.status_code,
124
+ headers: response.headers)
113
125
  end
114
126
 
115
- def renew_on
116
- [MyBrowser::IrrecoverableError]
127
+ def destroy(client) # optional
128
+ client.close
117
129
  end
118
130
  end
119
131
  ```
120
132
 
121
- === "Stateless"
133
+ === "Stateful"
122
134
 
123
135
  ```ruby
124
- class StatelessAgent
136
+ class StatefulAgent
125
137
  include Wayfarer::Networking::Strategy
126
138
 
127
- # Required methods
128
-
129
- def create
130
- MyClient.new
139
+ def self.renew_on # optional
140
+ [MyIrrecoverableError]
131
141
  end
132
142
 
133
- def fetch(client, url)
134
- response = client.get(url)
135
-
136
- return redirect(response.redirect_url) if response.redirect?
137
-
138
- success(url: url,
139
- body: response.body,
140
- status_code: response.status_code,
141
- headers: response.headers)
143
+ def create # required
144
+ MyBrowser.new
142
145
  end
143
146
 
144
- # Optional methods
147
+ def navigate(browser, url) # required
148
+ browser.goto(url)
149
+ end
145
150
 
146
- def destroy(client)
147
- client.close
151
+ def live(browser) # required
152
+ success(url: browser.url,
153
+ body: browser.body,
154
+ status_code: browser.status_code,
155
+ headers: browser.headers)
148
156
  end
149
157
 
150
- def renew_on # optional
151
- [MyClient::IrrecoverableError]
158
+ def destroy(browser) # optional
159
+ browser.quit
152
160
  end
153
161
  end
154
162
  ```
155
163
 
156
-
157
- Register and use the strategy:
164
+ Register and use the agent:
158
165
 
159
166
  ```ruby
160
- Wayfarer::Networking::Pool.registry[:my_agent] = MyAgent.new
167
+ Wayfarer.config[:network][:agents][:my_agent] = MyAgent.new
161
168
  Wayfarer.config[:network][:agent] = :my_agent
162
169
  ```
@@ -6,7 +6,7 @@ also alongside automated browsers.
6
6
  ## Ad-hoc GET requests
7
7
 
8
8
  When automating browsers, it can be useful to additionally retrieve another page
9
- over plain HTTP. Jobs can fetch URLs to [pages](/pages) with `#http`:
9
+ or even the current page over plain HTTP. Jobs can fetch URLs to [pages](/pages) with `#http`:
10
10
 
11
11
  ```ruby
12
12
  class DummyJob < Wayfarer::Base
@@ -9,7 +9,7 @@ Actions are instance methods denoted by symbols, or [handlers](/guides/handlers)
9
9
  By default, Wayfarer [applies some transformations to each URL](../tasks/#url-normalization) to bring it
10
10
  into a canonical form. Routing happens based on this canonical form.
11
11
 
12
- You can always access a task's raw string as it was enqueued with `task.batch`.
12
+ You can always access a task's raw string as it was enqueued with `task.url`.
13
13
 
14
14
  A job's route declarations equate to a predicate tree.
15
15
  When a URL is routed, the predicate tree is searched depth-first. If a
@@ -62,5 +62,4 @@ bundle exec wayfarer perform -r dummy_job.rb DummyJob https://example.com
62
62
  If you don't provide a batch, Wayfarer uses a generated UUID instead.
63
63
  We could have also used `DummyJob.crawl
64
64
 
65
-
66
-
65
+ (To be continued.)
data/lib/wayfarer/cli.rb CHANGED
@@ -13,6 +13,13 @@ module Wayfarer
13
13
 
14
14
  class_option :require, aliases: :r, type: :string, default: nil
15
15
 
16
+ class_option :log_level,
17
+ aliases: :l,
18
+ type: :string,
19
+ desc: "Set the log level (debug, info, warn, error, fatal).",
20
+ enum: %w[debug info warn error fatal unknown],
21
+ default: "info"
22
+
16
23
  desc "route JOB URL", "Routing tree for URL for JOB"
17
24
  option :format, type: :string, enum: %w[yaml json ruby], default: "yaml"
18
25
  def route(job, url)
@@ -84,6 +91,8 @@ module Wayfarer
84
91
  require File.join(Dir.pwd, require_path) if require_path
85
92
 
86
93
  load_rails
94
+
95
+ set_log_level
87
96
  end
88
97
 
89
98
  def load_rails
@@ -99,5 +108,12 @@ module Wayfarer
99
108
  require File.expand_path("config/boot", Dir.pwd)
100
109
  require File.expand_path("config/environment", Dir.pwd)
101
110
  end
111
+
112
+ def set_log_level
113
+ level = options[:log_level] || return
114
+ severity = ActiveSupport::Logger::Severity.const_get(level.upcase)
115
+
116
+ Wayfarer::Logging.logger.level = severity
117
+ end
102
118
  end
103
119
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Wayfarer
4
4
  module Logging
5
- mattr_accessor :logger, default: ActiveSupport::Logger.new($stdout)
5
+ mattr_accessor :logger, default: ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new($stdout))
6
6
 
7
7
  def self.emit(...)
8
8
  Emitter.new(...)
@@ -23,9 +23,8 @@ module Wayfarer
23
23
  level, msg = messages[key] || raise(ArgumentError, "No log message for #{key.inspect}")
24
24
  severity = ActiveSupport::Logger::Severity.const_get(level.upcase)
25
25
 
26
- ActiveSupport::TaggedLogging
27
- .new(Logging.logger)
28
- .tagged(task.batch, task.url, task[:controller]&.class&.name) do |logger|
26
+ Logging.logger
27
+ .tagged(task.batch, task.url, task[:controller]&.class&.name) do |logger|
29
28
  logger.add(severity, msg % args)
30
29
  end
31
30
  end
@@ -12,10 +12,6 @@ module Wayfarer
12
12
 
13
13
  Module.new
14
14
  end
15
-
16
- def lazy
17
- Wayfarer::Middleware::Lazy.new(self)
18
- end
19
15
  end
20
16
  end
21
17
  end
@@ -18,7 +18,7 @@ module Wayfarer
18
18
 
19
19
  class_methods do
20
20
  def use(middleware)
21
- chain.push(middleware.lazy)
21
+ chain.push(middleware.new)
22
22
  api(middleware)
23
23
  end
24
24
 
@@ -36,7 +36,7 @@ module Wayfarer
36
36
 
37
37
  def supervise
38
38
  yield
39
- rescue *strategy.renew_on, *Wayfarer.config[:network][:renew_on] => e
39
+ rescue *strategy.class.renew_on, *Wayfarer.config[:network][:renew_on] => e
40
40
  renew # may raise
41
41
  ensure
42
42
  # If renewing raises, re-raise the originally caught exception
@@ -5,7 +5,7 @@ module Wayfarer
5
5
  class Ferrum
6
6
  include Strategy
7
7
 
8
- def renew_on
8
+ def self.renew_on
9
9
  [::Ferrum::DeadBrowserError]
10
10
  end
11
11
 
@@ -10,14 +10,6 @@ module Wayfarer
10
10
  instance_accessor: false,
11
11
  instance_predicate: false
12
12
 
13
- class_attribute :registry,
14
- default: { http: HTTP,
15
- ferrum: Ferrum,
16
- selenium: Selenium,
17
- capybara: Capybara },
18
- instance_accessor: false,
19
- instance_predicate: false
20
-
21
13
  attr_reader :pool
22
14
 
23
15
  def initialize
@@ -43,7 +35,9 @@ module Wayfarer
43
35
  end
44
36
 
45
37
  def strategy
46
- self.class.registry[Wayfarer.config.dig(:network, :agent)].new
38
+ Wayfarer.config.dig(:network, :agent).then do |agent|
39
+ Wayfarer.config.dig(:network, :agents).fetch(agent).new
40
+ end
47
41
  end
48
42
  end
49
43
  end
@@ -3,8 +3,12 @@
3
3
  module Wayfarer
4
4
  module Networking
5
5
  module Strategy
6
- def renew_on
7
- []
6
+ extend ActiveSupport::Concern
7
+
8
+ class_methods do
9
+ def renew_on
10
+ []
11
+ end
8
12
  end
9
13
 
10
14
  def fetch(instance, url)
@@ -12,7 +12,7 @@ module Wayfarer
12
12
 
13
13
  # @!visibility private
14
14
  def parse(body, content_type = FALLBACK_CONTENT_TYPE)
15
- parser, args = Wayfarer.config.dig(:parsing, :registry, content_type)
15
+ parser, args = Wayfarer.config.dig(:parsing, :content_types, content_type)
16
16
  return unless parser
17
17
 
18
18
  parser.parse(body, *args)
data/lib/wayfarer.rb CHANGED
@@ -9,8 +9,7 @@ require "uri"
9
9
  require "yaml"
10
10
 
11
11
  require "active_job"
12
- require "active_support/core_ext/array/wrap"
13
- require "active_support/core_ext/object/deep_dup"
12
+ require "active_support/all"
14
13
  require "capybara"
15
14
  require "connection_pool"
16
15
  require "ferrum"
@@ -42,7 +41,7 @@ module Wayfarer
42
41
  module VERSION
43
42
  MAJOR = 0
44
43
  MINOR = 4
45
- TINY = 8
44
+ TINY = 10
46
45
  STRING = [MAJOR, MINOR, TINY].join(".")
47
46
  end
48
47
 
@@ -53,6 +52,12 @@ module Wayfarer
53
52
  },
54
53
  network: {
55
54
  agent: :http,
55
+ agents: {
56
+ http: Wayfarer::Networking::HTTP,
57
+ ferrum: Wayfarer::Networking::Ferrum,
58
+ selenium: Wayfarer::Networking::Selenium,
59
+ capybara: Wayfarer::Networking::Capybara
60
+ },
56
61
  pool: {
57
62
  size: 1,
58
63
  timeout: 10
@@ -61,7 +66,7 @@ module Wayfarer
61
66
  renew_on: []
62
67
  },
63
68
  parsing: {
64
- registry: {
69
+ content_types: {
65
70
  "application/json" => Wayfarer::Parsing::JSON,
66
71
  "text/html" => [Wayfarer::Parsing::XML, :html],
67
72
  "application/xml" => [Wayfarer::Parsing::XML, :xml]
data/rake/release.rake CHANGED
@@ -12,12 +12,6 @@ namespace :release do
12
12
 
13
13
  raise "Gem version #{gem_version} deviates from library version #{lib_version}" unless gem_version == lib_version
14
14
  end
15
-
16
- task :guard_debug do
17
- sh "git diff --exit-code"
18
- sh "git diff-index --quiet --cached HEAD"
19
- end
20
15
  end
21
16
 
22
17
  Rake::Task[:"release:rubygem_push"].enhance(%i[release:guard_versions])
23
- Rake::Task[:"release:guard_clean"].enhance(%i[release:guard_debug])
data/spec/spec_helpers.rb CHANGED
@@ -61,7 +61,7 @@ RSpec.configure do |config|
61
61
  config.include_context "with Redis", :redis
62
62
 
63
63
  config.before :suite do
64
- Wayfarer::Logging.logger = Logger.new($stdout)
64
+ Wayfarer::Logging.logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new($stdout))
65
65
 
66
66
  FactoryBot.find_definitions
67
67
  FactoryBot::SyntaxRunner.include(SpecHelpers)
@@ -8,7 +8,7 @@ describe "Pages", :redis do
8
8
  mock_handler! :dummy_handler
9
9
  end
10
10
 
11
- let(:url) { test_app_path("git-scm.com/book/en/v2.html") }
11
+ let(:url) { test_app_path("finders.html") }
12
12
 
13
13
  shared_examples "executes" do
14
14
  specify do
@@ -29,14 +29,14 @@ describe "Pages", :redis do
29
29
  route.host test_app_host, to: :index
30
30
 
31
31
  def index
32
- expect(page.url).to eq(test_app_path("git-scm.com/book/en/v2.html"))
32
+ expect(page.url).to eq(test_app_path("finders.html"))
33
33
  expect(page.status_code).to be(200)
34
34
  expect(page.body).not_to be_empty
35
35
  expect(page.headers.count).to be(9)
36
36
 
37
- expect(page.meta.links.all.count).to be(157)
38
- expect(page.meta.links.internal.count).to be(102)
39
- expect(page.meta.links.external.count).to be(55)
37
+ expect(page.meta.links.all.count).to be(6)
38
+ expect(page.meta.links.internal.count).to be(3)
39
+ expect(page.meta.links.external.count).to be(3)
40
40
  end
41
41
  end
42
42
  end
@@ -55,14 +55,14 @@ describe "Pages", :redis do
55
55
  route.to :index
56
56
 
57
57
  def index
58
- expect(page.url).to eq(test_app_path("git-scm.com/book/en/v2.html"))
58
+ expect(page.url).to eq(test_app_path("finders.html"))
59
59
  expect(page.status_code).to be(200)
60
60
  expect(page.body).not_to be_empty
61
61
  expect(page.headers.count).to be(9)
62
62
 
63
- expect(page.meta.links.all.count).to be(157)
64
- expect(page.meta.links.internal.count).to be(102)
65
- expect(page.meta.links.external.count).to be(55)
63
+ expect(page.meta.links.all.count).to be(6)
64
+ expect(page.meta.links.internal.count).to be(3)
65
+ expect(page.meta.links.external.count).to be(3)
66
66
  end
67
67
  end
68
68