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.
- checksums.yaml +4 -4
- data/.github/workflows/release.yaml +0 -2
- data/Gemfile.lock +1 -1
- data/docs/guides/development.md +18 -26
- data/docs/guides/networking/custom_adapters.md +93 -86
- data/docs/guides/networking/http.md +1 -1
- data/docs/guides/routing.md +1 -1
- data/docs/guides/tutorial.md +1 -2
- data/lib/wayfarer/cli.rb +16 -0
- data/lib/wayfarer/logging.rb +3 -4
- data/lib/wayfarer/middleware/base.rb +0 -4
- data/lib/wayfarer/middleware/controller.rb +1 -1
- data/lib/wayfarer/networking/context.rb +1 -1
- data/lib/wayfarer/networking/ferrum.rb +1 -1
- data/lib/wayfarer/networking/pool.rb +3 -9
- data/lib/wayfarer/networking/strategy.rb +6 -2
- data/lib/wayfarer/parsing.rb +1 -1
- data/lib/wayfarer.rb +9 -4
- data/rake/release.rake +0 -6
- data/spec/spec_helpers.rb +1 -1
- data/spec/wayfarer/integration/page_spec.rb +9 -9
- data/spec/wayfarer/integration/parsing_spec.rb +3 -2
- data/spec/wayfarer/integration/stage_spec.rb +3 -3
- data/spec/wayfarer/middleware/controller_spec.rb +3 -4
- data/spec/wayfarer/networking/context_spec.rb +3 -2
- data/spec/wayfarer/networking/pool_spec.rb +1 -1
- data/spec/wayfarer/networking/strategy.rb +2 -2
- data/wayfarer.gemspec +1 -1
- metadata +1 -1172
- data/lib/wayfarer/middleware/lazy.rb +0 -11
- data/spec/support/static/git-scm.com/assets/application-38b0d42ff05ffea45841edebbd14b75b89585646153808e82907c2c5c11f324b.js +0 -772
- data/spec/support/static/git-scm.com/assets/application-cafcf280f67db0e6d8168ba98a38da878769a9d5f37793b68ffb963a02d185e0.css +0 -1
- data/spec/support/static/git-scm.com/assets/modernize-b3ebe0c31c24f230dc62179d3e1030d2e57a53b1668d9382c0a27dbd44a94beb.js +0 -20
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Bash.html +0 -751
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-PowerShell.html +0 -804
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Sublime-Text.html +0 -728
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Visual-Studio-Code.html +0 -751
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Visual-Studio.html +0 -740
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Git-in-Zsh.html +0 -765
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Graphical-Interfaces.html +0 -931
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-A:-Git-in-Other-Environments-Summary.html +0 -702
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-Command-line-Git.html +0 -720
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-Dulwich.html +0 -746
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-JGit.html +0 -889
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-Libgit2.html +0 -1003
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-B:-Embedding-Git-in-your-Applications-go-git.html +0 -792
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Administration.html +0 -745
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Basic-Snapshotting.html +0 -840
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Branching-and-Merging.html +0 -829
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Debugging.html +0 -731
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Email.html +0 -766
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-External-Systems.html +0 -721
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Getting-and-Creating-Projects.html +0 -746
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Inspection-and-Comparison.html +0 -735
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Patching.html +0 -742
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Plumbing-Commands.html +0 -715
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Setup-and-Config.html +0 -863
- data/spec/support/static/git-scm.com/book/en/v2/Appendix-C:-Git-Commands-Sharing-and-Updating-Projects.html +0 -802
- data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-An-Example-Git-Enforced-Policy.html +0 -1200
- data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-Git-Attributes.html +0 -1134
- data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-Git-Configuration.html +0 -1315
- data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-Git-Hooks.html +0 -876
- data/spec/support/static/git-scm.com/book/en/v2/Customizing-Git-Summary.html +0 -704
- data/spec/support/static/git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project.html +0 -1667
- data/spec/support/static/git-scm.com/book/en/v2/Distributed-Git-Distributed-Workflows.html +0 -859
- data/spec/support/static/git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/Distributed-Git-Summary.html +0 -704
- data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-A-Short-History-of-Git.html +0 -735
- data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-About-Version-Control.html +0 -783
- data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup.html +0 -889
- data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-Getting-Help.html +0 -750
- data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-Installing-Git.html +0 -879
- data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-Summary.html +0 -704
- data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-The-Command-Line.html +0 -711
- data/spec/support/static/git-scm.com/book/en/v2/Getting-Started-What-is-Git?.html +0 -857
- data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository.html +0 -816
- data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Git-Aliases.html +0 -775
- data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository.html +0 -1432
- data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Summary.html +0 -703
- data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Tagging.html +0 -1049
- data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Undoing-Things.html +0 -998
- data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-History.html +0 -1172
- data/spec/support/static/git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes.html +0 -983
- data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging.html +0 -1102
- data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Branch-Management.html +0 -946
- data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell.html +0 -1020
- data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Branching-Workflows.html +0 -786
- data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Rebasing.html +0 -1028
- data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Remote-Branches.html +0 -1009
- data/spec/support/static/git-scm.com/book/en/v2/Git-Branching-Summary.html +0 -705
- data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Environment-Variables.html +0 -1009
- data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Git-Objects.html +0 -1209
- data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Git-References.html +0 -939
- data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery.html +0 -1086
- data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Packfiles.html +0 -876
- data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain.html +0 -745
- data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Summary.html +0 -708
- data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-The-Refspec.html +0 -872
- data/spec/support/static/git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols.html +0 -1043
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Advanced-Merging.html +0 -1605
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Bundling.html +0 -888
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Credential-Storage.html +0 -1035
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git.html +0 -861
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Interactive-Staging.html +0 -920
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Replace.html +0 -949
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Rerere.html +0 -983
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Reset-Demystified.html +0 -1236
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Revision-Selection.html +0 -1178
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Rewriting-History.html +0 -1182
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Searching.html +0 -875
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work.html +0 -922
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Stashing-and-Cleaning.html +0 -1039
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Submodules.html +0 -1864
- data/spec/support/static/git-scm.com/book/en/v2/Git-Tools-Summary.html +0 -705
- data/spec/support/static/git-scm.com/book/en/v2/Git-and-Other-Systems-Git-as-a-Client.html +0 -2656
- data/spec/support/static/git-scm.com/book/en/v2/Git-and-Other-Systems-Migrating-to-Git.html +0 -1741
- data/spec/support/static/git-scm.com/book/en/v2/Git-and-Other-Systems-Summary.html +0 -703
- data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Generating-Your-SSH-Public-Key.html +0 -759
- data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Getting-Git-on-a-Server.html +0 -827
- data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Git-Daemon.html +0 -775
- data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-GitLab.html +0 -872
- data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-GitWeb.html +0 -776
- data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server.html +0 -870
- data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Smart-HTTP.html +0 -789
- data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Summary.html +0 -709
- data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols.html +0 -963
- data/spec/support/static/git-scm.com/book/en/v2/Git-on-the-Server-Third-Party-Hosted-Options.html +0 -711
- data/spec/support/static/git-scm.com/book/en/v2/GitHub-Account-Setup-and-Configuration.html +0 -858
- data/spec/support/static/git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/GitHub-Maintaining-a-Project.html +0 -1218
- data/spec/support/static/git-scm.com/book/en/v2/GitHub-Managing-an-organization.html +0 -797
- data/spec/support/static/git-scm.com/book/en/v2/GitHub-Scripting-GitHub.html +0 -1059
- data/spec/support/static/git-scm.com/book/en/v2/GitHub-Summary.html +0 -704
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_abort_merge.html +0 -1605
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_add_email_addresses.html +0 -858
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_advanced_merging.html +0 -1605
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_an_example_git_enforced_policy.html +0 -1200
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_annotated_tags.html +0 -1049
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_api_comment.html +0 -1059
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_bare_repo.html +0 -827
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_basic_branching.html +0 -1102
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_basic_merge_conflicts.html +0 -1102
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_basic_merging.html +0 -1102
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_binary_search.html +0 -861
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_branch_management.html +0 -946
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_branch_references.html +0 -1178
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_build_number.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_bundling.html +0 -888
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_changing_multiple.html +0 -1182
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_checking_out_conflicts.html +0 -1605
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_checking_out_remotes.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_checking_status.html +0 -1432
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_cloning_submodules.html +0 -1864
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_commit_guidelines.html +0 -1667
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_commit_ranges.html +0 -1178
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_commit_status.html +0 -1059
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_committing_changes.html +0 -1432
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_contrib_file.html +0 -1218
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_contributing_project.html +0 -1667
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_create_new_branch.html +0 -1020
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_credential_caching.html +0 -1035
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_custom_importer.html +0 -1741
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_data_recovery.html +0 -1086
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_delete_branches.html +0 -1009
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_editor.html +0 -889
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_eg_task_lists.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_email_hooks.html +0 -876
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_email_notification.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_email_notifications.html +0 -1218
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_email_pr.html +0 -1218
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_enforcing_commit_message_format.html +0 -1200
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_example_markdown.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_external_merge_tools.html +0 -1315
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_fetch_and_push_on_different_repositories.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_fetching_and_pulling.html +0 -983
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_file_annotation.html +0 -861
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_first_time.html +0 -889
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_generate_ssh_key.html +0 -759
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_getting_a_repo.html +0 -816
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_getting_git_on_a_server.html +0 -827
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_aliases.html +0 -775
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_am.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_amend.html +0 -1182
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_branches_overview.html +0 -1020
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_clean.html +0 -1039
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_cloning.html +0 -816
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_commit_objects.html +0 -1209
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_config.html +0 -1315
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_diff_staged.html +0 -1432
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_gc.html +0 -1086
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_grep.html +0 -875
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_help.html +0 -750
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_hooks.html +0 -876
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_mv.html +0 -1432
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_p4.html +0 -1741
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_p4_branches.html +0 -2656
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_reflog.html +0 -1178
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_refs.html +0 -939
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_reset.html +0 -1236
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_stashing.html +0 -1039
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_submodules.html +0 -1864
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_svn.html +0 -2656
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_git_tagging.html +0 -1049
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_gitlab_groups_section.html +0 -872
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_ignoring.html +0 -1432
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_inspecting_remote.html +0 -983
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_integration_manager.html +0 -859
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_interactive_staging.html +0 -920
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_keyword_expansion.html +0 -1134
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_libgit2_bindings.html +0 -1003
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_manual_remerge.html +0 -1605
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_md_code.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_md_drag.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_md_emoji.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_md_quote.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_merge_button.html +0 -1218
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_merge_log.html +0 -1605
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_merge_rebase_work.html +0 -1028
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_new_repo_dropdown.html +0 -1218
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_not_center.html +0 -1218
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_org_page.html +0 -797
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_other_client_hooks.html +0 -876
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_p4_git_fusion.html +0 -2656
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_patches_from_email.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_personal_avatar.html +0 -858
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_plumbing_porcelain.html +0 -745
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_closed.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_discussion.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_fail.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_final.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_references.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_references_render.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_pr_refs.html +0 -1218
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_pre_merge_rebase_work.html +0 -1028
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_preparing_release.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_private_team.html +0 -1667
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_project_over_email.html +0 -1667
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_public_project.html +0 -1667
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_publishing_submodules.html +0 -1864
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_pushing_branches.html +0 -1009
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_pushing_refspecs.html +0 -872
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_pushing_remotes.html +0 -983
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebase_cherry_pick.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebase_peril.html +0 -1028
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebase_rebase.html +0 -1028
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebase_rebase_work.html +0 -1028
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_rebasing.html +0 -1028
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_refspec.html +0 -872
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_remote_branches.html +0 -1009
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_remote_repos.html +0 -983
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_removing_file_every_commit.html +0 -1182
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_removing_files.html +0 -1432
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_removing_objects.html +0 -1086
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_replace.html +0 -949
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_reverse_commit.html +0 -1605
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_revision_selection.html +0 -1178
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_rewriting_history.html +0 -1182
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_searching.html +0 -875
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_service_config.html +0 -1059
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_services_hooks.html +0 -1059
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_setting_up_server.html +0 -870
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_sharing_tags.html +0 -1049
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_signing.html +0 -922
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_signing_commits.html +0 -922
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_squashing.html +0 -1182
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_starting_submodules.html +0 -1864
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_subtree_merge.html +0 -1605
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_switching_branches.html +0 -1020
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_tagging_releases.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_task_list_progress.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_team_page.html +0 -797
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_the_index.html +0 -1236
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_the_shortlog.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_topic_branch.html +0 -786
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_tracking_branches.html +0 -1009
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_tracking_files.html +0 -1432
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_tree_objects.html +0 -1209
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_triple_dot.html +0 -1178
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_undoing.html +0 -998
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_unstaging.html +0 -998
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_viewing_history.html +0 -1172
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_web_hook.html +0 -1059
- data/spec/support/static/git-scm.com/book/en/v2/ch00/_what_is_introduced.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/ch01-getting-started.html +0 -783
- data/spec/support/static/git-scm.com/book/en/v2/ch00/ch02-git-basics-chapter.html +0 -816
- data/spec/support/static/git-scm.com/book/en/v2/ch00/ch03-git-branching.html +0 -1020
- data/spec/support/static/git-scm.com/book/en/v2/ch00/ch05-distributed-git.html +0 -859
- data/spec/support/static/git-scm.com/book/en/v2/ch00/ch06-github.html +0 -858
- data/spec/support/static/git-scm.com/book/en/v2/ch00/ch06-github_flow.html +0 -1502
- data/spec/support/static/git-scm.com/book/en/v2/ch00/ch10-git-internals.html +0 -745
- data/spec/support/static/git-scm.com/book/en/v2/ch00/ch_core_editor.html +0 -863
- data/spec/support/static/git-scm.com/book/en/v2/ch00/divergent_history.html +0 -1020
- data/spec/support/static/git-scm.com/book/en/v2/ch00/double_dot.html +0 -1178
- data/spec/support/static/git-scm.com/book/en/v2/ch00/filters_a.html +0 -1134
- data/spec/support/static/git-scm.com/book/en/v2/ch00/filters_b.html +0 -1134
- data/spec/support/static/git-scm.com/book/en/v2/ch00/limit_options.html +0 -1172
- data/spec/support/static/git-scm.com/book/en/v2/ch00/log_options.html +0 -1172
- data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_a.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_b.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_c.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_d.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_e.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/merwf_f.html +0 -1354
- data/spec/support/static/git-scm.com/book/en/v2/ch00/oh_my_zsh_git.html +0 -765
- data/spec/support/static/git-scm.com/book/en/v2/ch00/pretty_format.html +0 -1172
- data/spec/support/static/git-scm.com/book/en/v2/ch00/psp_b.html +0 -1667
- data/spec/support/static/git-scm.com/book/en/v2/ch00/rbdiag_e.html +0 -1028
- data/spec/support/static/git-scm.com/book/en/v2/ch00/rbdiag_g.html +0 -1028
- data/spec/support/static/git-scm.com/book/en/v2/ch00/rbdiag_h.html +0 -1028
- data/spec/support/static/git-scm.com/book/en/v2/ch00/rbdiag_i.html +0 -1028
- data/spec/support/static/git-scm.com/book/en/v2/ch00/rebasing-merging-example.html +0 -1028
- data/spec/support/static/git-scm.com/book/en/v2/ch00/ref_rerere.html +0 -983
- data/spec/support/static/git-scm.com/book/en/v2/ch00/ref_the_ref.html +0 -939
- data/spec/support/static/git-scm.com/book/en/v2/ch00/wfdiag_b.html +0 -859
- data/spec/support/static/git-scm.com/book/en/v2/ch00/wfdiag_c.html +0 -859
- data/spec/support/static/git-scm.com/book/en/v2/ch00/what_is_git_section.html +0 -857
- data/spec/support/static/git-scm.com/book/en/v2/images/2fa-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/account-settings.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/advance-master.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/advance-testing.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/areas.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/avatar-crop.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-4.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-5.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/basic-branching-6.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/basic-merging-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/basic-merging-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/basic-rebase-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/basic-rebase-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/basic-rebase-3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/basic-rebase-4.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/benevolent-dictator.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/blink-01-start.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/blink-02-pr.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/blink-03-pull-request-open.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/blink-04-email.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/blink-04-pr-comment.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/blink-05-general-comment.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/blink-06-final.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/branch-and-history.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/branch_widget_mac.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/branch_widget_win.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/centralized.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/centralized_workflow.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/checkout-master.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/clean.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/collaborators.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/commit-and-tree.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/commits-and-parents.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/data-model-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/data-model-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/data-model-3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/data-model-4.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/deltas.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/distributed.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/double-dot.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/email-settings.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/forkbutton.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/git-bash.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/git-diff-check.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/git-fusion-boot.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/git-fusion-perforce-graph.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/git-gui.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/git-instaweb.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/git-osx-installer.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/github_mac.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/github_win.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/gitk.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/gitlab-groups.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/gitlab-menu.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/gitlab-users.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/head-to-master.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/head-to-testing.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/integration-manager.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-4.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/interesting-rebase-5.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/jb.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/large-merges-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/large-merges-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/lifecycle.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/local.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/lr-branches-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/lr-branches-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/maint-01-email.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/maint-02-merge.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/maint-03-email-resp.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/maint-04-target.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/maint-05-mentions.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/maint-06-unsubscribe.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/maint-07-notifications.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/maint-08-notifications-page.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/maint-09-contrib.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/maint-10-default-branch.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/maint-11-transfer.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/managed-team-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/managed-team-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/managed-team-3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/managed-team-flow.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/markdown-01-example.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/markdown-02-tasks.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/markdown-03-task-summary.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/markdown-04-fenced-code.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/markdown-05-quote.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/markdown-06-emoji-complete.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/markdown-07-emoji.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/markdown-08-drag-drop.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/mentions-01-syntax.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/mentions-02-render.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/mentions-03-closed.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-4.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/merging-workflows-5.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/new-repo.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/neworg.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/newrepo.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/newrepoform.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/orgs-01-page.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/orgs-02-teams.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/orgs-03-audit.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/p4merge.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-4.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/perils-of-rebasing-5.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/posh-git.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/pr-01-fail.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/pr-02-merge-fix.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/public-small-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/public-small-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/public-small-3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/rebasing-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/rebasing-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-4.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/remote-branches-5.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/replace1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/replace2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/replace3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/replace4.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/replace5.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reposettingslink.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/rerere1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/rerere2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/rerere3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-checkout.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex4.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex5.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-ex6.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-hard.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-mixed.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-path1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-path2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-path3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-soft.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-squash-r1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-squash-r2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-squash-r3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-start.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/reset-workflow.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/scripting-01-services.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/scripting-02-email-service.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/scripting-03-webhook.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/scripting-04-webhook-debug.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/scripting-05-access-token.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/scripting-06-comment.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/scripting-07-status.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/signup.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/small-team-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/small-team-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/small-team-3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/small-team-4.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/small-team-5.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/small-team-6.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/small-team-7.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/small-team-flow.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/smudge.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/snapshots.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/ssh-keys.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/topic-branches-1.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/topic-branches-2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/two-branches.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-reset.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-revert.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-revert2.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-revert3.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/undomerge-start.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/your-profile.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/zsh-oh-my.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2/images/zsh-prompt.png +0 -0
- data/spec/support/static/git-scm.com/book/en/v2.html +0 -688
- data/spec/support/static/git-scm.com/favicon.ico +0 -0
- data/spec/support/static/git-scm.com/images/bg/body.jpg +0 -0
- data/spec/support/static/git-scm.com/images/bg/isometric-grid.png +0 -0
- data/spec/support/static/git-scm.com/images/bg/isometric-grid@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/bg/search-header.jpg +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/android.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/android@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/eclipse.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/eclipse@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/facebook.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/facebook@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/gnome.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/gnome@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/google.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/google@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/kde.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/kde@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/linked-in.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/linked-in@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/linux.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/linux@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/microsoft.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/microsoft@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/netflix.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/netflix@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/perl.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/perl@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/postgresql.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/postgresql@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/qt.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/qt@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/rails.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/rails@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/twitter.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/twitter@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/x.png +0 -0
- data/spec/support/static/git-scm.com/images/company-project-logos/x@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/epub.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/admin-sm.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/admin-sm@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/apple.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/apple@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/book.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/book@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/box.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/box@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/branch-sm.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/branch-sm@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/camera-sm.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/camera-sm@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/chevron-up@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/code.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/code@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/debugging-sm.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/debugging-sm@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/document.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/document@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/download.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/email-sm.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/email-sm@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/external-sm.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/external-sm@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/gui.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/gui@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/info.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/info@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/inspection-sm.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/inspection-sm@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/linux.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/linux@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/nav-circles.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/nav-circles@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/patching-sm.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/patching-sm@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/plumbing-sm.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/plumbing-sm@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/projects-sm.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/projects-sm@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/search.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/search@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/server-admin-sm.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/server-admin-sm@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/setup-sm.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/setup-sm@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/sharing-sm.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/sharing-sm@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/sidebar.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/sidebar@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/source-code.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/source-code@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/windows.png +0 -0
- data/spec/support/static/git-scm.com/images/icons/windows@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/logo@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/mobi.png +0 -0
- data/spec/support/static/git-scm.com/images/monitor-default.png +0 -0
- data/spec/support/static/git-scm.com/images/monitor-default@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/monitor-linux.png +0 -0
- data/spec/support/static/git-scm.com/images/monitor-linux@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/monitor-mac.png +0 -0
- data/spec/support/static/git-scm.com/images/monitor-mac@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/monitor-windows.png +0 -0
- data/spec/support/static/git-scm.com/images/monitor-windows@2x.png +0 -0
- data/spec/support/static/git-scm.com/images/pdf.png +0 -0
- data/spec/support/static/git-scm.com/images/progit2.png +0 -0
- data/spec/support/static/git-scm.com/images/sidebar-divider.png +0 -0
- data/spec/support/static/git-scm.com/images/sidebar-divider@2x.png +0 -0
- data/spec/support/static/git-scm.com/robots.txt +0 -0
- data/spec/support/static/graph/details/a.html +0 -10
- data/spec/support/static/graph/details/b.html +0 -10
- data/spec/support/static/graph/index.html +0 -20
- data/spec/support/static/links/links.html +0 -28
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 39fd7cefe2a4a7e07e2c3f69c0d13f96603e983432c56616444407a04af55442
|
|
4
|
+
data.tar.gz: 465b842759a03128413d66ff59b5116f0f7d444b193ad0929ed3a3914f55d5ad
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 21111b9d58ab7d0286f2f0a8c575485f0553cc4ddb8f19ebcad9f82f67e70dd53290832de6a4da137839a22151f0d06a47b0c606bc139b1491c5ce3d2accf188
|
|
7
|
+
data.tar.gz: '049cc40ee6973ecc66ce921d1ca8bf746ae9066ef88ebe3a364a0b859d125d9857daba149dfffd0b630f9addf88d2330ca3f9de5e57dab521d1dc2908a1d5cde'
|
data/Gemfile.lock
CHANGED
data/docs/guides/development.md
CHANGED
|
@@ -2,21 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
## Release Procedure
|
|
4
4
|
|
|
5
|
-
1.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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,
|
|
53
|
-
requires updating an integer value in Redis, and batch completion
|
|
54
|
-
useful feature, since most crawls should end eventually, and often you want
|
|
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,
|
|
60
|
-
may contain Ruby objects that don't de/serialize well,
|
|
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
|
-
###
|
|
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
|
|
4
|
-
agents:
|
|
5
|
-
|
|
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
|
|
16
|
-
job's user agent.
|
|
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
|
-
##
|
|
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
|
|
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
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
44
|
+
class StatelessAgent {
|
|
45
|
+
<<Interface>>
|
|
46
|
+
+#fetch(instance, url)*
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
BaseAgent |>.. StatefulAgent : implements
|
|
50
|
+
BaseAgent |>.. StatelessAgent : implements
|
|
39
51
|
```
|
|
40
52
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
* `#
|
|
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
|
-
|
|
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
|
-
|
|
66
|
-
methods:
|
|
80
|
+
!!! info "`redirect(url)` enqueues a task for the URL and stops processing the current task."
|
|
67
81
|
|
|
68
|
-
|
|
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
|
-
|
|
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
|
-
|
|
76
|
-
certain errors.
|
|
88
|
+
### Stateful interface
|
|
77
89
|
|
|
78
|
-
|
|
79
|
-
|
|
90
|
+
In addition to the base interface, stateful user agents implement two additional
|
|
91
|
+
instance callbacks:
|
|
80
92
|
|
|
81
|
-
* `#
|
|
82
|
-
|
|
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
|
-
=== "
|
|
102
|
+
=== "Stateless"
|
|
87
103
|
|
|
88
104
|
```ruby
|
|
89
|
-
class
|
|
105
|
+
class StatelessAgent
|
|
90
106
|
include Wayfarer::Networking::Strategy
|
|
91
107
|
|
|
92
|
-
#
|
|
93
|
-
|
|
94
|
-
def create
|
|
95
|
-
MyBrowser.new
|
|
108
|
+
def self.renew_on # optional
|
|
109
|
+
[MyIrrecoverableError]
|
|
96
110
|
end
|
|
97
111
|
|
|
98
|
-
def
|
|
99
|
-
|
|
112
|
+
def create # required
|
|
113
|
+
MyClient.new
|
|
100
114
|
end
|
|
101
115
|
|
|
102
|
-
def
|
|
103
|
-
|
|
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
|
-
|
|
119
|
+
return redirect(response.redirect_url) if response.redirect?
|
|
110
120
|
|
|
111
|
-
|
|
112
|
-
|
|
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
|
|
116
|
-
|
|
127
|
+
def destroy(client) # optional
|
|
128
|
+
client.close
|
|
117
129
|
end
|
|
118
130
|
end
|
|
119
131
|
```
|
|
120
132
|
|
|
121
|
-
=== "
|
|
133
|
+
=== "Stateful"
|
|
122
134
|
|
|
123
135
|
```ruby
|
|
124
|
-
class
|
|
136
|
+
class StatefulAgent
|
|
125
137
|
include Wayfarer::Networking::Strategy
|
|
126
138
|
|
|
127
|
-
#
|
|
128
|
-
|
|
129
|
-
def create
|
|
130
|
-
MyClient.new
|
|
139
|
+
def self.renew_on # optional
|
|
140
|
+
[MyIrrecoverableError]
|
|
131
141
|
end
|
|
132
142
|
|
|
133
|
-
def
|
|
134
|
-
|
|
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
|
-
#
|
|
147
|
+
def navigate(browser, url) # required
|
|
148
|
+
browser.goto(url)
|
|
149
|
+
end
|
|
145
150
|
|
|
146
|
-
def
|
|
147
|
-
|
|
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
|
|
151
|
-
|
|
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
|
|
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
|
data/docs/guides/routing.md
CHANGED
|
@@ -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.
|
|
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
|
data/docs/guides/tutorial.md
CHANGED
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
|
data/lib/wayfarer/logging.rb
CHANGED
|
@@ -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
|
-
|
|
27
|
-
|
|
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
|
|
@@ -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
|
|
@@ -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
|
-
|
|
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
|
data/lib/wayfarer/parsing.rb
CHANGED
|
@@ -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, :
|
|
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/
|
|
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 =
|
|
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
|
-
|
|
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("
|
|
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("
|
|
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(
|
|
38
|
-
expect(page.meta.links.internal.count).to be(
|
|
39
|
-
expect(page.meta.links.external.count).to be(
|
|
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("
|
|
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(
|
|
64
|
-
expect(page.meta.links.internal.count).to be(
|
|
65
|
-
expect(page.meta.links.external.count).to be(
|
|
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
|
|