├── .github ├── dependabot.yml └── workflows │ └── ruby.yml ├── .gitignore ├── .rspec ├── CODE_OF_CONDUCT.md ├── Gemfile ├── LICENSE.txt ├── README.md ├── Rakefile ├── bin ├── console └── setup ├── exe ├── lock_diff └── lock_diff_for_tachikoma ├── lib ├── lock_diff.rb └── lock_diff │ ├── changelog.rb │ ├── cli │ └── option_parser.rb │ ├── diff_info.rb │ ├── formatter │ └── github_markdown.rb │ ├── gem.rb │ ├── gem │ ├── lockfile_comparator.rb │ ├── package.rb │ ├── ruby_gem.rb │ └── spec.rb │ ├── github.rb │ ├── github │ ├── access_token.rb │ ├── changelog_url_finder.rb │ ├── client.rb │ ├── content.rb │ ├── directory.rb │ ├── pull_request.rb │ ├── repository_name_detector.rb │ ├── tag_finder.rb │ └── url_detector.rb │ ├── lockfile_comparator.rb │ ├── pull_request.rb │ └── version.rb ├── lock_diff.gemspec └── spec ├── fixtures └── vcr_cassettes │ ├── CFPropertyList.yml │ ├── addressable.yml │ ├── aws.yml │ ├── brakeman.yml │ ├── github_com.yml │ ├── lock_diff.yml │ ├── rack.yml │ ├── rails.yml │ ├── rr.yml │ └── vcr.yml ├── lock_diff ├── diff_info_spec.rb ├── gem │ ├── package_spec.rb │ └── spec_spec.rb └── github │ ├── content_spec.rb │ ├── directory_spec.rb │ ├── repository_name_detector_spec.rb │ ├── tag_finder_spec.rb │ └── url_detector_spec.rb ├── lock_diff_spec.rb ├── spec_helper.rb ├── support └── test_data.rb └── test_data └── lockfile └── gemfile_lock ├── Gemfile.lock.base └── Gemfile.lock.head /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: bundler 4 | directory: / 5 | schedule: 6 | interval: daily 7 | -------------------------------------------------------------------------------- /.github/workflows/ruby.yml: -------------------------------------------------------------------------------- 1 | name: Ruby 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | test: 11 | 12 | runs-on: ubuntu-latest 13 | strategy: 14 | matrix: 15 | ruby-version: ['2.5', '2.6', '2.7', '3.0'] 16 | 17 | steps: 18 | - uses: actions/checkout@v2 19 | - name: Set up Ruby 20 | uses: ruby/setup-ruby@v1 21 | with: 22 | ruby-version: ${{ matrix.ruby-version }} 23 | bundler-cache: true 24 | - name: Run tests 25 | run: bundle exec rspec 26 | env: 27 | GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.bundle/ 2 | /.yardoc 3 | /Gemfile.lock 4 | /_yardoc/ 5 | /coverage/ 6 | /doc/ 7 | /pkg/ 8 | /spec/reports/ 9 | /tmp/ 10 | .pryrc 11 | .envrc 12 | 13 | # rspec failure tracking 14 | .rspec_status 15 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --format documentation 2 | --color 3 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at tkoyama@aiming-inc.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at [http://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: http://contributor-covenant.org 74 | [version]: http://contributor-covenant.org/version/1/4/ 75 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | # Specify your gem's dependencies in lock_diff.gemspec 4 | gemspec 5 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 vividmuimui 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LockDiff 2 | 3 | [![Gem Version](https://badge.fury.io/rb/lock_diff.svg)](https://badge.fury.io/rb/lock_diff) 4 | ![Build Status](https://github.com/vividmuimui/lock_diff/actions/workflows/ruby.yml/badge.svg) 5 | [![Code Climate](https://codeclimate.com/github/vividmuimui/lock_diff/badges/gpa.svg)](https://codeclimate.com/github/vividmuimui/lock_diff) 6 | 7 | This gem detects changes to your package manager (e.g. Gemfile) and generates a Markdown-formatted diff including: 8 | 9 | * links to the corresponding package's change logs 10 | * Github `...`-delineated diff links for the relevant changes 11 | 12 | It also optionally posts the diff as a comment to the pull request responsible for the package update. 13 | 14 | Like this. 15 | 16 | > https://github.com/vividmuimui/lock_diff_sample/pull/9#issuecomment-315140796 17 | > ![image](https://user-images.githubusercontent.com/1803598/28178302-eeef61f4-6838-11e7-8c41-bd13195bef6d.png) 18 | 19 | ## Strategies 20 | 21 | - Gemfile.lock(Ruby/Bundler) 22 | 23 | ## Installation 24 | 25 | Add this line to your application's Gemfile: 26 | 27 | ```ruby 28 | gem 'lock_diff' 29 | ``` 30 | 31 | And then execute: 32 | 33 | $ bundle 34 | 35 | Or install it yourself as: 36 | 37 | $ gem install lock_diff 38 | 39 | ## Usage 40 | 41 | lock_diff requires you to provide a `GITHUB_ACCESS_TOKEN` as an environment variable. 42 | 43 | ### Command line 44 | 45 | ```sh 46 | $ lock_diff 47 | Usage: lock_diff [options] 48 | Require flags 49 | -r, --repository=REPOSITORY Like as "user/repository" 50 | -n, --number=PULL_REQUEST_NUMBER 51 | 52 | Optional flags 53 | --post-comment=true or false Print result to stdout when false. (default is false) 54 | -v, --verbose Run verbosely 55 | --version Show version 56 | ``` 57 | 58 | For example, to comment on https://github.com/vividmuimui/lock_diff_sample/pull/9#issuecomment-315140796, run this command: 59 | 60 | ```sh 61 | $ lock_diff -r "vividmuimui/lock_diff_sample" -n 9 --post-comment=false 62 | ``` 63 | 64 | ### Ruby 65 | 66 | ```ruby 67 | require 'lock_diff' 68 | LockDiff.run(repository: "vividmuimui/lock_diff_sample", number: 9, post_comment: false) 69 | ``` 70 | 71 | ### For Tachikoma pull request 72 | 73 | When used in conjunction with [tachikoma](https://rubygems.org/gems/tachikoma), use the `lock_diff_for_tachikoma` command instead of `lock_diff`. 74 | `lock_diff_for_tachikoma` automatically detects and comments on the most recent tachikoma pull request. 75 | 76 | #### Command line 77 | 78 | ```sh 79 | $ lock_diff_for_tachikoma 80 | Usage: lock_diff_for_tachikoma [options] 81 | Require flags 82 | -r, --repository=REPOSITORY Like as "user/repository" 83 | 84 | Optional flags 85 | --post-comment=true or false Print result to stdout when false. (default is false) 86 | -v, --verbose Run verbosely 87 | --version Show version 88 | ``` 89 | 90 | ```sh 91 | $ lock_diff_for_tachikoma -r "vividmuimui/lock_diff_sample" --post-comment=false 92 | ``` 93 | 94 | #### Ruby 95 | 96 | ```ruby 97 | require 'lock_diff' 98 | LockDiff.lock_diff_for_tachikoma(repository: "vividmuimui/lock_diff_sample", post_comment: false) 99 | ``` 100 | 101 | ## Development 102 | 103 | TODO: 104 | 105 | ## Contributing 106 | 107 | Bug reports and pull requests are welcome on GitHub at https://github.com/vividmuimui/lock_diff. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. 108 | 109 | ## License 110 | 111 | The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). 112 | 113 | ### Original 114 | 115 | Most of the source code in this repository is by https://github.com/kyanny/compare_linker. 116 | 117 | ``` 118 | Copyright (c) 2014 Kensuke Nagae 119 | 120 | MIT License 121 | 122 | Permission is hereby granted, free of charge, to any person obtaining 123 | a copy of this software and associated documentation files (the 124 | "Software"), to deal in the Software without restriction, including 125 | without limitation the rights to use, copy, modify, merge, publish, 126 | distribute, sublicense, and/or sell copies of the Software, and to 127 | permit persons to whom the Software is furnished to do so, subject to 128 | the following conditions: 129 | 130 | The above copyright notice and this permission notice shall be 131 | included in all copies or substantial portions of the Software. 132 | 133 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 134 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 135 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 136 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 137 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 138 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 139 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 140 | ``` 141 | 142 | 143 | ## Code of Conduct 144 | 145 | Everyone interacting in the LockDiff project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/vividmuimui/lock_diff/blob/master/CODE_OF_CONDUCT.md). 146 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "bundler/gem_tasks" 2 | require "rspec/core/rake_task" 3 | 4 | RSpec::Core::RakeTask.new(:spec) 5 | 6 | task default: :spec 7 | -------------------------------------------------------------------------------- /bin/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require "bundler/setup" 4 | require "lock_diff" 5 | 6 | # You can add fixtures and/or initialization code here to make experimenting 7 | # with your gem easier. You can also use a different console, if you like. 8 | 9 | # (If you use this, don't forget to add pry to your Gemfile!) 10 | # require "pry" 11 | # Pry.start 12 | 13 | require "irb" 14 | IRB.start(__FILE__) 15 | -------------------------------------------------------------------------------- /bin/setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euo pipefail 3 | IFS=$'\n\t' 4 | set -vx 5 | 6 | bundle install 7 | 8 | # Do any other automated setup that you need to do here 9 | -------------------------------------------------------------------------------- /exe/lock_diff: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require "lock_diff" 4 | require "lock_diff/cli/option_parser" 5 | 6 | options = LockDiff::Cli::OptionParser.parse(ARGV, require_flags: %i(repository number)) 7 | LockDiff.run(**options) 8 | -------------------------------------------------------------------------------- /exe/lock_diff_for_tachikoma: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require "lock_diff" 4 | require "lock_diff/cli/option_parser" 5 | 6 | options = LockDiff::Cli::OptionParser.parse(ARGV, require_flags: %i(repository)) 7 | LockDiff.run_by_latest_tachikoma(**options) 8 | -------------------------------------------------------------------------------- /lib/lock_diff.rb: -------------------------------------------------------------------------------- 1 | require "logger" 2 | require "forwardable" 3 | 4 | require "lock_diff/changelog" 5 | require "lock_diff/diff_info" 6 | require "lock_diff/formatter/github_markdown" 7 | require "lock_diff/gem" 8 | require "lock_diff/github" 9 | require "lock_diff/lockfile_comparator" 10 | require "lock_diff/pull_request" 11 | require "lock_diff/version" 12 | 13 | module LockDiff 14 | class << self 15 | attr_accessor :config 16 | 17 | def init! 18 | self.config = Config.new 19 | end 20 | 21 | def logger 22 | config.logger 23 | end 24 | 25 | def run(repository:, number:, post_comment: false) 26 | pr = PullRequest.find_by(repository: repository, number: number) 27 | _run(pull_request: pr, post_comment: post_comment) 28 | end 29 | 30 | def run_by_latest_tachikoma(repository:, post_comment: false) 31 | pr = PullRequest.latest_by_tachikoma(repository) 32 | if pr 33 | LockDiff.logger.info { "Running on repository: #{pr.repository}, number: #{pr.number}"} 34 | _run(pull_request: pr, post_comment: post_comment) 35 | else 36 | LockDiff.logger.warn("Not found pull request by tachikoma. (Hint: search pull request by whether branch name includes 'tachikoma'") 37 | end 38 | end 39 | 40 | private 41 | 42 | def _run(pull_request:, post_comment: false) 43 | lockfile_diff_infos = LockfileComparator.compare_by(pull_request) 44 | 45 | if lockfile_diff_infos.empty? 46 | LockDiff.logger.info("Lock file is changed but changed gem does not exist.") 47 | return 48 | end 49 | 50 | result = config.formatter.format(lockfile_diff_infos) 51 | 52 | if post_comment 53 | pull_request.add_comment(result) 54 | else 55 | $stdout.puts result 56 | end 57 | end 58 | end 59 | 60 | class Config 61 | attr_accessor :pr_repository_service, :formatter, :strategy, :logger 62 | 63 | def initialize 64 | @pr_repository_service = Github 65 | @formatter = Formatter::GithubMarkdown 66 | @strategy = Gem 67 | @logger = Logger.new($stdout) 68 | @logger.level = :warn 69 | end 70 | end 71 | end 72 | 73 | LockDiff.init! 74 | -------------------------------------------------------------------------------- /lib/lock_diff/changelog.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module LockDiff 4 | class Changelog 5 | attr_reader :url 6 | 7 | def initialize(url) 8 | @url = url 9 | end 10 | 11 | def name 12 | File.basename(@url) 13 | end 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /lib/lock_diff/cli/option_parser.rb: -------------------------------------------------------------------------------- 1 | require "optparse" 2 | 3 | module LockDiff 4 | module Cli 5 | class OptionParser 6 | class << self 7 | def parse(args, require_flags:) 8 | new(require_flags).parse(args) 9 | end 10 | end 11 | 12 | def initialize(require_flags) 13 | @require_flags = require_flags 14 | end 15 | 16 | def parse(args) 17 | options = { 18 | post_comment: false 19 | } 20 | opt = ::OptionParser.new 21 | 22 | opt.separator("Require flags") 23 | if @require_flags.include? :repository 24 | opt.on('-r', '--repository=REPOSITORY', 'Like as "user/repository"') { |v| options[:repository] = v } 25 | end 26 | if @require_flags.include? :number 27 | opt.on('-n', '--number=PULL_REQUEST_NUMBER') { |v| options[:number] = v } 28 | end 29 | 30 | opt.separator("\nOptional flags") 31 | opt.on('--post-comment=true or false', 'Print result to stdout when false. (default is false)') { |v| options[:post_comment] = v } 32 | opt.on("-v", "--verbose", "Run verbosely") { LockDiff.logger.level = :info } 33 | opt.on("--more-verbose", "Run more verbosely") { LockDiff.logger.level = :debug } 34 | opt.on_tail("--version", "Show version") do 35 | $stdout.puts LockDiff::VERSION 36 | exit 37 | end 38 | opt.parse!(args) 39 | 40 | if @require_flags.all? { |flag| options.key?(flag) } 41 | options 42 | else 43 | $stdout.puts opt.help 44 | exit 45 | end 46 | end 47 | 48 | end 49 | end 50 | end 51 | -------------------------------------------------------------------------------- /lib/lock_diff/diff_info.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | class DiffInfo 3 | extend Forwardable 4 | 5 | UPGRADE = 'upgrade' 6 | DOWNGRADE = 'downgrade' 7 | DELETE = 'delete' 8 | NEW = 'new' 9 | 10 | attr_reader :old_package, :new_package 11 | def_delegators :package, :name, :repository_url 12 | def_delegator :package, :url, :package_url 13 | 14 | def initialize(old_package:, new_package:) 15 | @old_package = old_package 16 | @new_package = new_package 17 | end 18 | 19 | def changed? 20 | @old_package.different?(@new_package) 21 | end 22 | 23 | def status 24 | case 25 | when @old_package.version && @new_package.version 26 | if @old_package.version <= @new_package.version 27 | UPGRADE 28 | else 29 | DOWNGRADE 30 | end 31 | when @old_package.version 32 | DELETE 33 | when @new_package.version 34 | NEW 35 | end 36 | end 37 | 38 | def package 39 | case status 40 | when UPGRADE, NEW 41 | @new_package 42 | when DOWNGRADE, DELETE 43 | @old_package 44 | end 45 | end 46 | 47 | def status_emoji 48 | case status 49 | when UPGRADE 50 | ':chart_with_upwards_trend:' 51 | when DOWNGRADE 52 | ':chart_with_downwards_trend:' 53 | when DELETE 54 | ':x:' 55 | when NEW 56 | ':new:' 57 | end 58 | end 59 | 60 | def changelogs 61 | return nil if [DOWNGRADE, DELETE].include?(status) 62 | 63 | Github::ChangelogUrlFinder.new( 64 | repository: package.repository, 65 | repository_url: package.repository_url, 66 | ref: @new_package.ref, 67 | package_name: package.name 68 | ).call.map do |url| 69 | Changelog.new(url) 70 | end 71 | end 72 | 73 | def commits_url 74 | return unless package.repository_url 75 | old_ref = @old_package.ref 76 | new_ref = @new_package.ref 77 | compare_path = 78 | case status 79 | when UPGRADE 80 | "compare/#{old_ref}...#{new_ref}" if old_ref && new_ref 81 | when DOWNGRADE 82 | "compare/#{new_ref}...#{old_ref}" if old_ref && new_ref 83 | when DELETE 84 | "commits/#{old_ref}" if old_ref 85 | when NEW 86 | "commits/#{new_ref}" if new_ref 87 | end 88 | 89 | "#{package.repository_url}/#{compare_path}" if compare_path 90 | end 91 | 92 | def commits_url_text 93 | case status 94 | when UPGRADE 95 | "#{@old_package.version_str}...#{@new_package.version_str}" 96 | when DOWNGRADE 97 | "#{@new_package.version_str}...#{@old_package.version_str}" 98 | when DELETE 99 | "#{@old_package.version_str}" 100 | when NEW 101 | "#{@new_package.version_str}" 102 | end 103 | end 104 | 105 | end 106 | end 107 | -------------------------------------------------------------------------------- /lib/lock_diff/formatter/github_markdown.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | module Formatter 3 | class GithubMarkdown 4 | def self.format(diff_infos) 5 | new(diff_infos).call 6 | end 7 | 8 | def initialize(diff_infos) 9 | @diff_infos = diff_infos 10 | end 11 | 12 | def call 13 | _body = body 14 | if _body 15 | (headers + _body).join("\n") 16 | end 17 | end 18 | 19 | private 20 | 21 | def headers 22 | [ 23 | "| package | repo | status | commits | changelog |", 24 | "|---------|:----:|:------:|---------|-----------|" 25 | ] 26 | end 27 | 28 | def body 29 | @diff_infos.map { |diff_info| DiffFormmater.new(diff_info).call } 30 | end 31 | 32 | class DiffFormmater 33 | def initialize(diff_info) 34 | LockDiff.logger.info { diff_info.name } 35 | @diff_info = diff_info 36 | end 37 | 38 | def call 39 | text = [] 40 | text << package 41 | text << repository 42 | text << status 43 | text << commits_text 44 | text << changelogs 45 | "| #{text.join(' | ')} |" 46 | end 47 | 48 | private 49 | 50 | attr_reader :diff_info 51 | 52 | def status 53 | diff_info.status_emoji 54 | end 55 | 56 | def package 57 | if diff_info.package_url 58 | "[#{diff_info.name}](#{diff_info.package_url})" 59 | else 60 | diff_info.name 61 | end 62 | end 63 | 64 | def repository 65 | if diff_info.repository_url 66 | "[:octocat:](#{diff_info.repository_url})" 67 | else 68 | '' 69 | end 70 | end 71 | 72 | def commits_text 73 | if diff_info.commits_url 74 | "[#{diff_info.commits_url_text}](#{diff_info.commits_url})" 75 | else 76 | diff_info.commits_url_text 77 | end 78 | end 79 | 80 | def changelogs 81 | if diff_info.changelogs 82 | diff_info.changelogs.map do |changelog| 83 | "[#{changelog.name}](#{changelog.url})" 84 | end.join(" ") 85 | else 86 | "" 87 | end 88 | end 89 | end 90 | end 91 | end 92 | end 93 | -------------------------------------------------------------------------------- /lib/lock_diff/gem.rb: -------------------------------------------------------------------------------- 1 | require "bundler" 2 | require_relative "gem/lockfile_comparator" 3 | require_relative "gem/package" 4 | require_relative "gem/ruby_gem" 5 | require_relative "gem/spec" 6 | 7 | module LockDiff 8 | module Gem 9 | class << self 10 | def lockfile_name 11 | 'Gemfile.lock' 12 | end 13 | 14 | def lockfile_comparator 15 | LockfileComparator 16 | end 17 | end 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /lib/lock_diff/gem/lockfile_comparator.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | module Gem 3 | class LockfileComparator 4 | def initialize(old_lockfile:, new_lockfile:) 5 | @old_lockfile = old_lockfile 6 | @new_lockfile = new_lockfile 7 | end 8 | 9 | def call 10 | old_specs_by_name = Spec.parse(@old_lockfile).map { |spec| [spec.name, spec] }.to_h 11 | new_specs_by_name = Spec.parse(@new_lockfile).map { |spec| [spec.name, spec] }.to_h 12 | names = (old_specs_by_name.keys + new_specs_by_name.keys).uniq 13 | 14 | names.map { |name| 15 | DiffInfo.new( 16 | old_package: (old_specs_by_name[name] || NullSpec.new(name)).to_package, 17 | new_package: (new_specs_by_name[name] || NullSpec.new(name)).to_package 18 | ) 19 | }.select(&:changed?) 20 | end 21 | end 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /lib/lock_diff/gem/package.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | module Gem 3 | class Package 4 | extend Forwardable 5 | 6 | def_delegators :@spec, :name, :revision, :version, :repository_url 7 | def_delegator :@spec, :ruby_gem_url, :url 8 | 9 | def initialize(spec) 10 | @spec = spec 11 | end 12 | 13 | def ref 14 | revision || git_tag 15 | end 16 | 17 | def version_str 18 | revision || version.to_s 19 | end 20 | 21 | def different?(other) 22 | name != other.name || revision != other.revision || version != other.version 23 | end 24 | 25 | def repository 26 | @repository ||= Github::RepositoryNameDetector.new(@spec.repository_url).call 27 | end 28 | 29 | private 30 | 31 | def git_tag 32 | return unless version && repository 33 | return @git_tag if defined? @git_tag 34 | @git_tag = Github::TagFinder.new( 35 | repository: repository, 36 | package_name: name, 37 | version: version 38 | ).call 39 | end 40 | 41 | end 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /lib/lock_diff/gem/ruby_gem.rb: -------------------------------------------------------------------------------- 1 | require "httpclient" 2 | require 'ostruct' 3 | require 'json' 4 | 5 | module LockDiff 6 | module Gem 7 | # wrapper of RubyGem 8 | class RubyGem 9 | extend Forwardable 10 | 11 | def initialize(name) 12 | @ruby_gem = Repository.find(name) 13 | end 14 | 15 | def repository_url 16 | @repository_url ||= Github::UrlDetector.new([source_code_url, @ruby_gem.homepage_uri]).call 17 | end 18 | 19 | def url 20 | @ruby_gem.project_uri 21 | end 22 | 23 | private 24 | 25 | def source_code_url 26 | @ruby_gem.source_code_uri 27 | end 28 | 29 | class Repository 30 | class << self 31 | def find(name) 32 | ruby_gem = repository[name] 33 | return ruby_gem if ruby_gem 34 | repository[name] = fetch(name) 35 | end 36 | 37 | def fetch(name) 38 | content = HTTPClient.get_content("https://rubygems.org/api/v1/gems/#{name}.json") 39 | OpenStruct.new(JSON.parse(content)) 40 | rescue => e 41 | LockDiff.logger.warn("Could not fetch gem info of #{name} because of #{e.inspect}") 42 | NullRubyGem.new(name) 43 | end 44 | 45 | def repository 46 | @repository ||= {} 47 | end 48 | end 49 | end 50 | 51 | end 52 | 53 | class NullRubyGem 54 | def initialize(name) 55 | @name = name 56 | end 57 | 58 | def homepage_uri 59 | end 60 | 61 | def source_code_uri 62 | end 63 | 64 | def project_uri 65 | end 66 | 67 | end 68 | end 69 | end 70 | -------------------------------------------------------------------------------- /lib/lock_diff/gem/spec.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | module Gem 3 | # wrapper of lazy_specification 4 | module Spec 5 | class UnSupportSource < StandardError; end 6 | 7 | class << self 8 | def new(lazy_specification) 9 | case lazy_specification.source 10 | when Bundler::Source::Rubygems 11 | RubyGemSpec.new(lazy_specification) 12 | when Bundler::Source::Git 13 | GitSpec.new(lazy_specification) 14 | when Bundler::Source::Path 15 | PathSpec.new(lazy_specification) 16 | else 17 | raise UnSupportSource, "#{lazy_specification.source.class} source by #{lazy_specification.name} is not supported" 18 | end 19 | end 20 | 21 | def parse(lockfile) 22 | Bundler::LockfileParser.new(lockfile).specs.map do |lazy_specification| 23 | new(lazy_specification) 24 | end 25 | end 26 | 27 | end 28 | 29 | class Base 30 | extend Forwardable 31 | 32 | def_delegators :@spec, :name, :version 33 | 34 | def initialize(lazy_specification) 35 | @spec = lazy_specification 36 | end 37 | 38 | def revision 39 | @spec.git_version&.strip 40 | end 41 | 42 | def to_package 43 | Package.new(self) 44 | end 45 | 46 | def repository_url; end 47 | def ruby_gem_url; end 48 | end 49 | 50 | class RubyGemSpec < Base 51 | def_delegators :ruby_gem, :repository_url 52 | def_delegator :ruby_gem, :url, :ruby_gem_url 53 | 54 | private 55 | 56 | def ruby_gem 57 | @ruby_gem ||= RubyGem.new(@spec.name) 58 | end 59 | end 60 | 61 | class GitSpec < Base 62 | def repository_url 63 | @repository_url ||= Github::UrlDetector.new(@spec.source.uri).call 64 | end 65 | end 66 | 67 | class PathSpec < Base 68 | end 69 | end 70 | 71 | class NullSpec 72 | attr_reader :name 73 | 74 | def initialize(name) 75 | @name = name 76 | end 77 | 78 | def revision 79 | end 80 | 81 | def version 82 | nil 83 | end 84 | 85 | def repository_url; end 86 | def ruby_gem_url; end 87 | 88 | def to_package 89 | Package.new(self) 90 | end 91 | end 92 | 93 | end 94 | end 95 | -------------------------------------------------------------------------------- /lib/lock_diff/github.rb: -------------------------------------------------------------------------------- 1 | require_relative "github/access_token" 2 | require_relative "github/changelog_url_finder" 3 | require_relative "github/client" 4 | require_relative "github/content" 5 | require_relative "github/directory" 6 | require_relative "github/url_detector" 7 | require_relative "github/pull_request" 8 | require_relative "github/repository_name_detector" 9 | require_relative "github/tag_finder" 10 | 11 | module LockDiff 12 | module Github 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /lib/lock_diff/github/access_token.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | module Github 3 | class AccessToken < ::String 4 | def initialize(token = nil) 5 | super(token || ENV.fetch('GITHUB_ACCESS_TOKEN')) 6 | end 7 | end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /lib/lock_diff/github/changelog_url_finder.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | module Github 3 | class ChangelogUrlFinder 4 | def initialize(repository:, repository_url:, ref:, package_name:) 5 | @repository = repository 6 | @repository_url = repository_url 7 | @ref = ref 8 | @package_name = package_name 9 | end 10 | 11 | def call 12 | directories.flat_map(&:change_log_urls).push(find_release_url).compact 13 | end 14 | 15 | private 16 | 17 | def directories 18 | [ 19 | Directory.new(@repository, @ref), 20 | Directory.new(@repository, @ref, path: @package_name), 21 | Directory.new(@repository, @ref, path: "gems/#{@package_name}"), 22 | Directory.new(@repository, @ref, path: 'docs') 23 | ] 24 | end 25 | 26 | def find_release_url 27 | return unless @repository_url 28 | unless Github.client.exist_releases?(@repository) 29 | @repository_url + "/releases" 30 | end 31 | end 32 | end 33 | end 34 | end 35 | -------------------------------------------------------------------------------- /lib/lock_diff/github/client.rb: -------------------------------------------------------------------------------- 1 | require 'octokit' 2 | 3 | module LockDiff 4 | module Github 5 | # wrapper of Octokit::Client 6 | 7 | class << self 8 | def client 9 | @client ||= Github::Client.new(Github::AccessToken.new) 10 | end 11 | end 12 | 13 | class Client 14 | def initialize(access_token) 15 | @client = Octokit::Client.new(access_token: access_token) 16 | end 17 | 18 | def file(repository, path:, ref:) 19 | content = @client.contents(repository, path: path, ref: ref) 20 | Base64.decode64(content.content) 21 | end 22 | 23 | def pull_request(repository, number) 24 | Github::PullRequest.new(@client.pull_request(repository, number)) 25 | end 26 | 27 | def newer_pull_requests(repository) 28 | @client.pull_requests(repository). 29 | map { |pull_request| Github::PullRequest.new(pull_request) } 30 | end 31 | 32 | def pull_request_content_path(repository, number, file_name) 33 | content = @client.pull_request_files(repository, number). 34 | find { |file| file.filename.include?(file_name) } 35 | content&.filename 36 | end 37 | 38 | def exist_releases?(repository) 39 | return false unless repository 40 | @client.releases(repository).empty? 41 | end 42 | 43 | def contents(repository, options = {}) 44 | return [] unless repository 45 | @client.contents(repository, options).map do |content| 46 | Content.new(content) 47 | end 48 | end 49 | 50 | def tag_names(repository, options = {}) 51 | return [] unless repository 52 | @client.tags(repository, options).map(&:name) 53 | end 54 | 55 | def add_comment(repository, number, comment) 56 | @client.add_comment(repository, number, comment) 57 | end 58 | 59 | end 60 | end 61 | end 62 | -------------------------------------------------------------------------------- /lib/lock_diff/github/content.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | module Github 3 | # wrapper of Github Content 4 | class Content 5 | extend Forwardable 6 | 7 | def_delegators :@content, :name, :html_url 8 | 9 | CHANGE_LOG_CANDIDATES = %w[ 10 | changelog 11 | changes 12 | history 13 | releases 14 | releasenote 15 | news 16 | ].freeze 17 | 18 | def initialize(content) 19 | @content = content 20 | end 21 | 22 | def change_log? 23 | file? && CHANGE_LOG_CANDIDATES.any? do |candidate| 24 | normalized_name.start_with?(candidate) 25 | end 26 | end 27 | 28 | private 29 | 30 | def normalized_name 31 | @normalized_name ||= name.downcase.delete('_') 32 | end 33 | 34 | def file? 35 | @content.type == 'file' 36 | end 37 | end 38 | end 39 | end 40 | -------------------------------------------------------------------------------- /lib/lock_diff/github/directory.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | module Github 3 | class Directory 4 | def initialize(repository, ref, path: nil) 5 | @repository = repository 6 | @ref = ref 7 | @path = path 8 | end 9 | 10 | def change_log_urls 11 | contents.select(&:change_log?).map(&:html_url) 12 | rescue Octokit::NotFound 13 | [] 14 | end 15 | 16 | private 17 | 18 | def contents 19 | @contents ||= Github.client.contents(@repository, ref: @ref, path: @path) 20 | end 21 | end 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /lib/lock_diff/github/pull_request.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | module Github 3 | # wrapper of github PullRequest 4 | class PullRequest 5 | def initialize(pull_request) 6 | @pr = pull_request 7 | end 8 | 9 | def base_ref 10 | @pr.base.ref 11 | end 12 | 13 | def head_ref 14 | @pr.head.ref 15 | end 16 | 17 | def number 18 | @pr.number 19 | end 20 | 21 | def repository 22 | @pr.base.repo.full_name 23 | end 24 | 25 | def find_content_path(file_name) 26 | Github.client.pull_request_content_path(repository, number, file_name) 27 | end 28 | 29 | def add_comment(comment) 30 | Github.client.add_comment(repository, number, comment) 31 | end 32 | 33 | def base_file(path) 34 | Github.client.file(repository, path: path, ref: @pr.base.sha) 35 | end 36 | 37 | def head_file(path) 38 | Github.client.file(repository, path: path, ref: @pr.head.sha) 39 | end 40 | end 41 | end 42 | end 43 | -------------------------------------------------------------------------------- /lib/lock_diff/github/repository_name_detector.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | module Github 3 | class RepositoryNameDetector 4 | REGEXP = %r!github\.com[/:](.*?)(?:\.git)?\z! 5 | 6 | def initialize(url) 7 | @url = url 8 | end 9 | 10 | def call 11 | return unless @url 12 | path = @url.match(REGEXP).to_a.last&.split('#')&.first 13 | return unless path 14 | repository_name = path.split("/").first(2).join("/") 15 | repository_name if repository_name.match?(/.+\/.+/) 16 | end 17 | 18 | end 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /lib/lock_diff/github/tag_finder.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | module Github 3 | class TagFinder 4 | def initialize(repository:, package_name:, version:) 5 | @repository = repository 6 | @package_name = package_name 7 | @version_str = version.to_s 8 | end 9 | 10 | def call 11 | find_tag(limit: 4, per_page: 50) 12 | end 13 | 14 | private 15 | 16 | def find_tag(page: 1, limit:, per_page:) 17 | return nil if page > limit 18 | 19 | fetched_tags = TagsRepository.find(@repository, page: page, per_page: per_page) 20 | tag = fetched_tags.find { |tag_name| match_rule?(tag_name) } 21 | 22 | return tag if tag 23 | 24 | unless fetched_tags.count < per_page 25 | find_tag(page: page + 1, limit: limit, per_page: per_page) 26 | end 27 | end 28 | 29 | def match_rule?(tag_name) 30 | [ 31 | @version_str, 32 | "v#{@version_str}", 33 | "#{@package_name}-#{@version_str}", 34 | "#{@package_name.downcase}-#{@version_str}" 35 | ].include?(tag_name) 36 | end 37 | 38 | class TagsRepository 39 | class << self 40 | def find(repo_name, options = {}) 41 | key = "#{repo_name}-#{options[:page]}" 42 | ruby_gem = repository[key] 43 | return ruby_gem if repository.key?(key) 44 | repository[key] = fetch(repo_name, options) 45 | end 46 | 47 | def fetch(repo_name, options = {}) 48 | LockDiff.logger.debug { "Fetch tags #{repo_name}, #{options}"} 49 | Github.client.tag_names(repo_name, options) 50 | end 51 | 52 | def repository 53 | @repository ||= {} 54 | end 55 | end 56 | end 57 | 58 | end 59 | end 60 | end 61 | -------------------------------------------------------------------------------- /lib/lock_diff/github/url_detector.rb: -------------------------------------------------------------------------------- 1 | require "httpclient" 2 | 3 | module LockDiff 4 | module Github 5 | class UrlDetector 6 | # xxx.github.aaa/yyyy 7 | REGEXP = %r!https?://([^/]+)\.github\.[^/]+/([^/]+)! 8 | 9 | def initialize(urls) 10 | @urls = Array(urls).compact 11 | end 12 | 13 | def call 14 | url = @urls.find { |_url| _url.include?("github") } 15 | return unless url 16 | 17 | begin 18 | response = HTTPClient.get(url, follow_redirect: true) 19 | url = response.header.request_uri.to_s 20 | rescue 21 | repository = RepositoryNameDetector.new(url).call 22 | url = "https://github.com/#{repository}" 23 | end 24 | 25 | if url.match(REGEXP) 26 | _, owner, repo = url.match(REGEXP).to_a 27 | url = "https://github.com/#{owner}/#{repo}" 28 | HTTPClient.get(url).ok? ? url : nil 29 | else 30 | repository = RepositoryNameDetector.new(url).call 31 | "https://github.com/#{repository}" 32 | end 33 | rescue => e 34 | LockDiff.logger.warn("Could not detect github url by #{url} because of #{e.inspect}") 35 | nil 36 | end 37 | end 38 | end 39 | end 40 | -------------------------------------------------------------------------------- /lib/lock_diff/lockfile_comparator.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | class LockfileComparator 3 | class NotChangedLockfile < StandardError; end 4 | 5 | class << self 6 | def compare_by(pull_request) 7 | file_path = pull_request.find_content_path(lockfile_name) 8 | raise NotChangedLockfile if file_path.nil? 9 | 10 | LockDiff.config.strategy.lockfile_comparator.new( 11 | old_lockfile: pull_request.base_file(file_path), 12 | new_lockfile: pull_request.head_file(file_path) 13 | ).call 14 | end 15 | 16 | def lockfile_name 17 | LockDiff.config.strategy.lockfile_name 18 | end 19 | end 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /lib/lock_diff/pull_request.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | class PullRequest 3 | extend Forwardable 4 | class NotFoundPullRequest < StandardError; end 5 | 6 | class << self 7 | def find_by(repository:, number:) 8 | client.pull_request(repository, number) 9 | rescue => e 10 | message = "Not found pull request by (repository: #{repository}, number: #{number}, client: #{client.class}). Becase of #{e.inspect}" 11 | LockDiff.logger.warn(message) 12 | raise NotFoundPullRequest.new(message) 13 | end 14 | 15 | def latest_by_tachikoma(repository) 16 | client.newer_pull_requests(repository).find do |pull_request| 17 | branch = pull_request.head_ref 18 | branch.include?("tachikoma") || branch.include?("bundle-update") 19 | end 20 | end 21 | 22 | private 23 | 24 | def client 25 | LockDiff.config.pr_repository_service.client 26 | end 27 | end 28 | 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /lib/lock_diff/version.rb: -------------------------------------------------------------------------------- 1 | module LockDiff 2 | VERSION = "0.9.0" 3 | end 4 | -------------------------------------------------------------------------------- /lock_diff.gemspec: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | lib = File.expand_path("../lib", __FILE__) 3 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 4 | require "lock_diff/version" 5 | 6 | Gem::Specification.new do |spec| 7 | spec.name = "lock_diff" 8 | spec.version = LockDiff::VERSION 9 | spec.authors = ["vividmuimui"] 10 | spec.email = ["vivid.muimui@gmail.com"] 11 | 12 | spec.summary = %q{This gem detects changes to your package manager (e.g. Gemfile) and generates a Markdown-formatted diff.} 13 | spec.description = %q{This gem detects changes to your package manager (e.g. Gemfile) and generates a Markdown-formatted diff.} 14 | # spec.homepage = "https://github.com/vividmuimui/lock_diff" 15 | spec.homepage = "" 16 | spec.license = "MIT" 17 | 18 | spec.files = `git ls-files -z`.split("\x0").reject do |f| 19 | f.match(%r{^(test|spec|features)/}) 20 | end 21 | spec.bindir = "exe" 22 | spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } 23 | spec.require_paths = ["lib"] 24 | spec.required_ruby_version = ">= 2.4.0" 25 | 26 | spec.add_dependency "octokit", "~> 4.0" 27 | spec.add_dependency "httpclient" 28 | 29 | spec.add_development_dependency "bundler", "> 1.15" 30 | spec.add_development_dependency "rake", ">= 13" 31 | spec.add_development_dependency "rspec", "~> 3.0" 32 | spec.add_development_dependency "pry" 33 | spec.add_development_dependency "pry-byebug" 34 | spec.add_development_dependency "vcr" 35 | spec.add_development_dependency "webmock" 36 | end 37 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/CFPropertyList.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.github.com/repos/ckruse/CFPropertyList/tags?page=1&per_page=50 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | Accept: 11 | - application/vnd.github.v3+json 12 | User-Agent: 13 | - Octokit Ruby Gem 4.18.0 14 | Content-Type: 15 | - application/json 16 | Accept-Encoding: 17 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 18 | response: 19 | status: 20 | code: 200 21 | message: OK 22 | headers: 23 | Server: 24 | - GitHub.com 25 | Date: 26 | - Sun, 09 May 2021 19:35:12 GMT 27 | Content-Type: 28 | - application/json; charset=utf-8 29 | Transfer-Encoding: 30 | - chunked 31 | Cache-Control: 32 | - private, max-age=60, s-maxage=60 33 | Vary: 34 | - Accept, Authorization, Cookie, X-GitHub-OTP 35 | - Accept-Encoding, Accept, X-Requested-With 36 | Etag: 37 | - W/"aa3c9d6edad780d219e87c9abaf64ea5d18ea56af2e09229f9bfc746fd71375f" 38 | Last-Modified: 39 | - Tue, 27 Apr 2021 08:58:41 GMT 40 | X-Oauth-Scopes: 41 | - repo, workflow 42 | X-Accepted-Oauth-Scopes: 43 | - '' 44 | X-Github-Media-Type: 45 | - github.v3; format=json 46 | X-Ratelimit-Limit: 47 | - '5000' 48 | X-Ratelimit-Remaining: 49 | - '4994' 50 | X-Ratelimit-Reset: 51 | - '1620591640' 52 | X-Ratelimit-Used: 53 | - '6' 54 | X-Ratelimit-Resource: 55 | - core 56 | Access-Control-Expose-Headers: 57 | - ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, 58 | X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, 59 | X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, 60 | Sunset 61 | Access-Control-Allow-Origin: 62 | - "*" 63 | Strict-Transport-Security: 64 | - max-age=31536000; includeSubdomains; preload 65 | X-Frame-Options: 66 | - deny 67 | X-Content-Type-Options: 68 | - nosniff 69 | X-Xss-Protection: 70 | - '0' 71 | Referrer-Policy: 72 | - origin-when-cross-origin, strict-origin-when-cross-origin 73 | Content-Security-Policy: 74 | - default-src 'none' 75 | X-Github-Request-Id: 76 | - E7F0:1443:D0795:1643FD:60983970 77 | body: 78 | encoding: ASCII-8BIT 79 | string: '[{"name":"cfpropertylist-3.0.3","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-3.0.3","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-3.0.3","commit":{"sha":"d4f522d89afd040509f2aa8404c6af3d800c671f","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/d4f522d89afd040509f2aa8404c6af3d800c671f"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0zLjAuMw=="},{"name":"cfpropertylist-3.0.2","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-3.0.2","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-3.0.2","commit":{"sha":"1864ae59eb575e240644684e37bfeaa612754891","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/1864ae59eb575e240644684e37bfeaa612754891"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0zLjAuMg=="},{"name":"cfpropertylist-3.0.1","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-3.0.1","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-3.0.1","commit":{"sha":"8d946cba4d272124f5b4686420b847ad6a1c28d2","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/8d946cba4d272124f5b4686420b847ad6a1c28d2"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0zLjAuMQ=="},{"name":"cfpropertylist-3.0.0","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-3.0.0","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-3.0.0","commit":{"sha":"e0e26abf390262c5052979b78c20f1662c75707d","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/e0e26abf390262c5052979b78c20f1662c75707d"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0zLjAuMA=="},{"name":"cfpropertylist-2.3.6","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.3.6","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.3.6","commit":{"sha":"b53f89d92a419d7a9e7da2bdbbfc95972074c434","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/b53f89d92a419d7a9e7da2bdbbfc95972074c434"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjMuNg=="},{"name":"cfpropertylist-2.3.5","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.3.5","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.3.5","commit":{"sha":"cd4dced09dc36506879a68b4dbf9021985c6b786","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/cd4dced09dc36506879a68b4dbf9021985c6b786"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjMuNQ=="},{"name":"cfpropertylist-2.2.8","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.2.8","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.2.8","commit":{"sha":"14c9063e76801ffc47886c620cba7fc4f613a72b","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/14c9063e76801ffc47886c620cba7fc4f613a72b"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjIuOA=="},{"name":"cfpropertylist-2.2.7","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.2.7","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.2.7","commit":{"sha":"8d2d7f9fc3bc1877a8adee649e0e7167c5c61c93","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/8d2d7f9fc3bc1877a8adee649e0e7167c5c61c93"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjIuNw=="},{"name":"cfpropertylist-2.2.6","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.2.6","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.2.6","commit":{"sha":"df1db263bea8cd754f9a78d9210a4bea28e16e86","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/df1db263bea8cd754f9a78d9210a4bea28e16e86"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjIuNg=="},{"name":"cfpropertylist-2.2.5","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.2.5","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.2.5","commit":{"sha":"037a96fd199c89736455bf646c92f29094fd3912","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/037a96fd199c89736455bf646c92f29094fd3912"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjIuNQ=="},{"name":"cfpropertylist-2.2.4","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.2.4","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.2.4","commit":{"sha":"5f3f3ad2a98840d58892ecda60902b1a25cee97e","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/5f3f3ad2a98840d58892ecda60902b1a25cee97e"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjIuNA=="},{"name":"cfpropertylist-2.2.3","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.2.3","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.2.3","commit":{"sha":"0b7441b05d6c2e8eddf33da8ce932277e6fe0986","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/0b7441b05d6c2e8eddf33da8ce932277e6fe0986"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjIuMw=="},{"name":"cfpropertylist-2.2.2","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.2.2","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.2.2","commit":{"sha":"1f9ba89cd6be38c0372c587b806ba87af758f55a","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/1f9ba89cd6be38c0372c587b806ba87af758f55a"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjIuMg=="},{"name":"cfpropertylist-2.2.1","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.2.1","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.2.1","commit":{"sha":"5cc46bbfa5799afdd13f3e78cfa4deab0224a03a","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/5cc46bbfa5799afdd13f3e78cfa4deab0224a03a"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjIuMQ=="},{"name":"cfpropertylist-2.2","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.2","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.2","commit":{"sha":"618b022c3741a3df2dec95af9445b3d35d8d4f60","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/618b022c3741a3df2dec95af9445b3d35d8d4f60"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjI="},{"name":"cfpropertylist-2.1.2","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.1.2","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.1.2","commit":{"sha":"25425814d25e20c53b4607d02bd773bd9dff37d3","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/25425814d25e20c53b4607d02bd773bd9dff37d3"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjEuMg=="},{"name":"cfpropertylist-2.1.1","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.1.1","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.1.1","commit":{"sha":"31783c767224e15056088ff4d4230d33667b19b3","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/31783c767224e15056088ff4d4230d33667b19b3"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjEuMQ=="},{"name":"cfpropertylist-2.1","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.1","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.1","commit":{"sha":"41fd845eea9a26222f5140b699bc188db24c3760","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/41fd845eea9a26222f5140b699bc188db24c3760"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjE="},{"name":"cfpropertylist-2.0.17","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0.17","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0.17","commit":{"sha":"3ecf49f7d3082f7ed69e01870a45a86bd121f5fa","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/3ecf49f7d3082f7ed69e01870a45a86bd121f5fa"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjAuMTc="},{"name":"cfpropertylist-2.0.14","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0.14","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0.14","commit":{"sha":"44da3fb902e47d6adb406d8ed2e4d607fe59885f","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/44da3fb902e47d6adb406d8ed2e4d607fe59885f"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjAuMTQ="},{"name":"cfpropertylist-2.0.13","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0.13","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0.13","commit":{"sha":"92210e0b32fab1531580dc2b6b0dcd8fb695a32f","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/92210e0b32fab1531580dc2b6b0dcd8fb695a32f"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjAuMTM="},{"name":"cfpropertylist-2.0.12","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0.12","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0.12","commit":{"sha":"db46a41380c0126526bd4c9ffba93a40fa225338","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/db46a41380c0126526bd4c9ffba93a40fa225338"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjAuMTI="},{"name":"cfpropertylist-2.0.10","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0.10","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0.10","commit":{"sha":"cb9f518d4eff301f85a0c376330379df5ac36fa8","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/cb9f518d4eff301f85a0c376330379df5ac36fa8"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjAuMTA="},{"name":"cfpropertylist-2.0.9","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0.9","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0.9","commit":{"sha":"ac19223eb07d725d07a7d301187816dba6c9ac3e","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/ac19223eb07d725d07a7d301187816dba6c9ac3e"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjAuOQ=="},{"name":"cfpropertylist-2.0.8","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0.8","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0.8","commit":{"sha":"e1847b14d0d2e47115578e49e35bf4b5707223ea","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/e1847b14d0d2e47115578e49e35bf4b5707223ea"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjAuOA=="},{"name":"cfpropertylist-2.0.7","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0.7","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0.7","commit":{"sha":"29d3d2e5a562c63cf13b1b435d16174d01e8e8e9","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/29d3d2e5a562c63cf13b1b435d16174d01e8e8e9"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjAuNw=="},{"name":"cfpropertylist-2.0.6","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0.6","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0.6","commit":{"sha":"b7ba36020bc46f5e3d96ff25ec2463a1e3b0bb78","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/b7ba36020bc46f5e3d96ff25ec2463a1e3b0bb78"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjAuNg=="},{"name":"cfpropertylist-2.0.5","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0.5","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0.5","commit":{"sha":"c70f9628ada2b11250589bc90667d98b60214138","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/c70f9628ada2b11250589bc90667d98b60214138"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjAuNQ=="},{"name":"cfpropertylist-2.0.4","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0.4","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0.4","commit":{"sha":"59c54626e686fa8bd180780f3eef440aef67f183","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/59c54626e686fa8bd180780f3eef440aef67f183"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjAuNA=="},{"name":"cfpropertylist-2.0.3","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0.3","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0.3","commit":{"sha":"b3bfe80b6bec06a71f07a97016578fefb57881c5","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/b3bfe80b6bec06a71f07a97016578fefb57881c5"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjAuMw=="},{"name":"cfpropertylist-2.0.2","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0.2","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0.2","commit":{"sha":"ac6814d9abb57986e8eaa63e6b6cd1761a7c3b86","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/ac6814d9abb57986e8eaa63e6b6cd1761a7c3b86"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjAuMg=="},{"name":"cfpropertylist-2.0.1","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0.1","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0.1","commit":{"sha":"b772867c99d8774723c6be372db35883a458256a","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/b772867c99d8774723c6be372db35883a458256a"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjAuMQ=="},{"name":"cfpropertylist-2.0","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-2.0","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-2.0","commit":{"sha":"f551550b69c251a84a98414bdb6b41f47f5aea2d","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/f551550b69c251a84a98414bdb6b41f47f5aea2d"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0yLjA="},{"name":"cfpropertylist-1.0","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertylist-1.0","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertylist-1.0","commit":{"sha":"0c029538142856cfb3431a8abf266e8a5c0c2f41","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/0c029538142856cfb3431a8abf266e8a5c0c2f41"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5bGlzdC0xLjA="},{"name":"cfpropertyList-2.3.4","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertyList-2.3.4","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertyList-2.3.4","commit":{"sha":"562599d71560d96c2d3c408f202688984909de34","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/562599d71560d96c2d3c408f202688984909de34"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5TGlzdC0yLjMuNA=="},{"name":"cfpropertyList-2.3.3","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertyList-2.3.3","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertyList-2.3.3","commit":{"sha":"5139ec05540dead226f0049303e86ca82a23998f","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/5139ec05540dead226f0049303e86ca82a23998f"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5TGlzdC0yLjMuMw=="},{"name":"cfpropertyList-2.3.2","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertyList-2.3.2","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertyList-2.3.2","commit":{"sha":"160977b9ec7ed154989bf6dfebb7afa5332e3c7b","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/160977b9ec7ed154989bf6dfebb7afa5332e3c7b"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5TGlzdC0yLjMuMg=="},{"name":"cfpropertyList-2.3.1","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertyList-2.3.1","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertyList-2.3.1","commit":{"sha":"9dd8360ddc38661c3b0a20139f5081460178e970","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/9dd8360ddc38661c3b0a20139f5081460178e970"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5TGlzdC0yLjMuMQ=="},{"name":"cfpropertyList-2.3.0","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/cfpropertyList-2.3.0","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/cfpropertyList-2.3.0","commit":{"sha":"ad97dd25f8c3fc0ba4cc18873f58c816ea5d8a5e","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/ad97dd25f8c3fc0ba4cc18873f58c816ea5d8a5e"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9jZnByb3BlcnR5TGlzdC0yLjMuMA=="},{"name":"CFPropertyList-2.0.11","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/CFPropertyList-2.0.11","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/CFPropertyList-2.0.11","commit":{"sha":"03ff79e06094a61cd60ef46b0ae57e240b4ec9ac","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/03ff79e06094a61cd60ef46b0ae57e240b4ec9ac"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy9DRlByb3BlcnR5TGlzdC0yLjAuMTE="},{"name":"2.0.16","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/2.0.16","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/2.0.16","commit":{"sha":"93fb931b874e9479832eddff011a56b228b19acf","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/93fb931b874e9479832eddff011a56b228b19acf"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy8yLjAuMTY="},{"name":"2.0.15","zipball_url":"https://api.github.com/repos/ckruse/CFPropertyList/zipball/refs/tags/2.0.15","tarball_url":"https://api.github.com/repos/ckruse/CFPropertyList/tarball/refs/tags/2.0.15","commit":{"sha":"dd50f8e15fd0b7ecb172ec609fb06d5adb6599be","url":"https://api.github.com/repos/ckruse/CFPropertyList/commits/dd50f8e15fd0b7ecb172ec609fb06d5adb6599be"},"node_id":"MDM6UmVmNTM5MzE1OnJlZnMvdGFncy8yLjAuMTU="}]' 80 | recorded_at: Sun, 09 May 2021 19:35:12 GMT 81 | recorded_with: VCR 6.0.0 82 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/addressable.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.github.com/repos/sporkmonger/addressable/tags?page=1&per_page=50 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | Accept: 11 | - application/vnd.github.v3+json 12 | User-Agent: 13 | - Octokit Ruby Gem 4.18.0 14 | Content-Type: 15 | - application/json 16 | Accept-Encoding: 17 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 18 | response: 19 | status: 20 | code: 200 21 | message: OK 22 | headers: 23 | Server: 24 | - GitHub.com 25 | Date: 26 | - Sun, 09 May 2021 19:35:11 GMT 27 | Content-Type: 28 | - application/json; charset=utf-8 29 | Transfer-Encoding: 30 | - chunked 31 | Cache-Control: 32 | - private, max-age=60, s-maxage=60 33 | Vary: 34 | - Accept, Authorization, Cookie, X-GitHub-OTP 35 | - Accept-Encoding, Accept, X-Requested-With 36 | Etag: 37 | - W/"461d7cd25e15c893dde9aa551f142d26be7b139f5091726861fb05d787d0cbc3" 38 | Last-Modified: 39 | - Sun, 09 May 2021 01:11:04 GMT 40 | X-Oauth-Scopes: 41 | - repo, workflow 42 | X-Accepted-Oauth-Scopes: 43 | - '' 44 | X-Github-Media-Type: 45 | - github.v3; format=json 46 | X-Ratelimit-Limit: 47 | - '5000' 48 | X-Ratelimit-Remaining: 49 | - '4996' 50 | X-Ratelimit-Reset: 51 | - '1620591640' 52 | X-Ratelimit-Used: 53 | - '4' 54 | X-Ratelimit-Resource: 55 | - core 56 | Access-Control-Expose-Headers: 57 | - ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, 58 | X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, 59 | X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, 60 | Sunset 61 | Access-Control-Allow-Origin: 62 | - "*" 63 | Strict-Transport-Security: 64 | - max-age=31536000; includeSubdomains; preload 65 | X-Frame-Options: 66 | - deny 67 | X-Content-Type-Options: 68 | - nosniff 69 | X-Xss-Protection: 70 | - '0' 71 | Referrer-Policy: 72 | - origin-when-cross-origin, strict-origin-when-cross-origin 73 | Content-Security-Policy: 74 | - default-src 'none' 75 | X-Github-Request-Id: 76 | - E7EE:7ED2:183453:1CD459:6098396F 77 | body: 78 | encoding: ASCII-8BIT 79 | string: '[{"name":"addressable-2.7.0","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.7.0","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.7.0","commit":{"sha":"598aea6b1b6c7cb1e05aa717090235c3703ce759","url":"https://api.github.com/repos/sporkmonger/addressable/commits/598aea6b1b6c7cb1e05aa717090235c3703ce759"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuNy4w"},{"name":"addressable-2.6.0","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.6.0","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.6.0","commit":{"sha":"a0e06dbfc91ea820a111b2db30795088c907c29e","url":"https://api.github.com/repos/sporkmonger/addressable/commits/a0e06dbfc91ea820a111b2db30795088c907c29e"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuNi4w"},{"name":"addressable-2.5.2","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.5.2","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.5.2","commit":{"sha":"0a0e96acb17225f9b1c9cab0bad332b448934c9a","url":"https://api.github.com/repos/sporkmonger/addressable/commits/0a0e96acb17225f9b1c9cab0bad332b448934c9a"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuNS4y"},{"name":"addressable-2.5.1","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.5.1","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.5.1","commit":{"sha":"279dbaf44436500fdbba86b167bbff0fe0ab54e0","url":"https://api.github.com/repos/sporkmonger/addressable/commits/279dbaf44436500fdbba86b167bbff0fe0ab54e0"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuNS4x"},{"name":"addressable-2.5.0","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.5.0","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.5.0","commit":{"sha":"09c5ea06d63066bf12e096b7da9513150b074973","url":"https://api.github.com/repos/sporkmonger/addressable/commits/09c5ea06d63066bf12e096b7da9513150b074973"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuNS4w"},{"name":"addressable-2.4.0","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.4.0","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.4.0","commit":{"sha":"fb8efbfa705258e9d1571d1d6a4c3e64a7631270","url":"https://api.github.com/repos/sporkmonger/addressable/commits/fb8efbfa705258e9d1571d1d6a4c3e64a7631270"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuNC4w"},{"name":"addressable-2.3.8","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.3.8","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.3.8","commit":{"sha":"a4ed495243e7d3b7766f99dc5c57ed26951dc5b8","url":"https://api.github.com/repos/sporkmonger/addressable/commits/a4ed495243e7d3b7766f99dc5c57ed26951dc5b8"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMy44"},{"name":"addressable-2.3.7","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.3.7","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.3.7","commit":{"sha":"953b28ffaf164461014fdf3985df65b5dd584af6","url":"https://api.github.com/repos/sporkmonger/addressable/commits/953b28ffaf164461014fdf3985df65b5dd584af6"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMy43"},{"name":"addressable-2.3.6","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.3.6","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.3.6","commit":{"sha":"9d1e5777e8353fd8b22d39101e9b67425f8e2cfd","url":"https://api.github.com/repos/sporkmonger/addressable/commits/9d1e5777e8353fd8b22d39101e9b67425f8e2cfd"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMy42"},{"name":"addressable-2.3.5","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.3.5","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.3.5","commit":{"sha":"9c1122c7fa77f4f62768809a0639de73566df12e","url":"https://api.github.com/repos/sporkmonger/addressable/commits/9c1122c7fa77f4f62768809a0639de73566df12e"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMy41"},{"name":"addressable-2.3.4","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.3.4","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.3.4","commit":{"sha":"f47caa4f4a181fd6784f4e6fadc02b0345bd05df","url":"https://api.github.com/repos/sporkmonger/addressable/commits/f47caa4f4a181fd6784f4e6fadc02b0345bd05df"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMy40"},{"name":"addressable-2.3.3","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.3.3","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.3.3","commit":{"sha":"28ce5d056accc2146c0a7747f9e5a112daa43052","url":"https://api.github.com/repos/sporkmonger/addressable/commits/28ce5d056accc2146c0a7747f9e5a112daa43052"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMy4z"},{"name":"addressable-2.3.2","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.3.2","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.3.2","commit":{"sha":"7f14836517acc210588607d0c4ec87a965919bac","url":"https://api.github.com/repos/sporkmonger/addressable/commits/7f14836517acc210588607d0c4ec87a965919bac"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMy4y"},{"name":"addressable-2.3.1","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.3.1","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.3.1","commit":{"sha":"7f13fde92562573448974b2a6b5b871daaa6f937","url":"https://api.github.com/repos/sporkmonger/addressable/commits/7f13fde92562573448974b2a6b5b871daaa6f937"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMy4x"},{"name":"addressable-2.3.0","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.3.0","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.3.0","commit":{"sha":"768b408ef1e731bb3c9fdf29fbcf23cad5c42d18","url":"https://api.github.com/repos/sporkmonger/addressable/commits/768b408ef1e731bb3c9fdf29fbcf23cad5c42d18"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMy4w"},{"name":"addressable-2.2.8","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.2.8","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.2.8","commit":{"sha":"25c04c93cea7514bd6d701286c61f976f799707c","url":"https://api.github.com/repos/sporkmonger/addressable/commits/25c04c93cea7514bd6d701286c61f976f799707c"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMi44"},{"name":"addressable-2.2.7","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.2.7","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.2.7","commit":{"sha":"378581a7996f52a10cda8da8fe8b72509d1276bb","url":"https://api.github.com/repos/sporkmonger/addressable/commits/378581a7996f52a10cda8da8fe8b72509d1276bb"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMi43"},{"name":"addressable-2.2.6","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.2.6","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.2.6","commit":{"sha":"cfd786b792dda11f8317ab24d7161fe31f56a9b6","url":"https://api.github.com/repos/sporkmonger/addressable/commits/cfd786b792dda11f8317ab24d7161fe31f56a9b6"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMi42"},{"name":"addressable-2.2.5","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.2.5","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.2.5","commit":{"sha":"354f223087425c5d028f19794b07682af93dd4ed","url":"https://api.github.com/repos/sporkmonger/addressable/commits/354f223087425c5d028f19794b07682af93dd4ed"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMi41"},{"name":"addressable-2.2.4","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.2.4","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.2.4","commit":{"sha":"6565b984f25145da745187fbaec5956e3535a84c","url":"https://api.github.com/repos/sporkmonger/addressable/commits/6565b984f25145da745187fbaec5956e3535a84c"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMi40"},{"name":"addressable-2.2.3","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.2.3","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.2.3","commit":{"sha":"4dcd913de90caa3124bdb9a4aa142d4cf1bbd558","url":"https://api.github.com/repos/sporkmonger/addressable/commits/4dcd913de90caa3124bdb9a4aa142d4cf1bbd558"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMi4z"},{"name":"addressable-2.2.2","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.2.2","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.2.2","commit":{"sha":"b97eaa0fc721ecef845567f1d692508ed39b0ec8","url":"https://api.github.com/repos/sporkmonger/addressable/commits/b97eaa0fc721ecef845567f1d692508ed39b0ec8"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMi4y"},{"name":"addressable-2.2.1","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.2.1","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.2.1","commit":{"sha":"01604a358884cba3e6fc1c836506730ace41443e","url":"https://api.github.com/repos/sporkmonger/addressable/commits/01604a358884cba3e6fc1c836506730ace41443e"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMi4x"},{"name":"addressable-2.2.0","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.2.0","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.2.0","commit":{"sha":"d7fabf9c313ceb9f5b70407ca0454983ab703587","url":"https://api.github.com/repos/sporkmonger/addressable/commits/d7fabf9c313ceb9f5b70407ca0454983ab703587"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMi4w"},{"name":"addressable-2.1.2","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.1.2","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.1.2","commit":{"sha":"6c052b878555ed77f7629368c1924ea1ffac1d3c","url":"https://api.github.com/repos/sporkmonger/addressable/commits/6c052b878555ed77f7629368c1924ea1ffac1d3c"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMS4y"},{"name":"addressable-2.1.1","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.1.1","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.1.1","commit":{"sha":"de80951378af58004772ce7efd6fd62d9d74d248","url":"https://api.github.com/repos/sporkmonger/addressable/commits/de80951378af58004772ce7efd6fd62d9d74d248"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMS4x"},{"name":"addressable-2.1.0","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.1.0","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.1.0","commit":{"sha":"f7e9f17d9e2585845efefac88b139b856fcd2173","url":"https://api.github.com/repos/sporkmonger/addressable/commits/f7e9f17d9e2585845efefac88b139b856fcd2173"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMS4w"},{"name":"addressable-2.0.2","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.0.2","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.0.2","commit":{"sha":"d341c39f7b99a14b2b41ffb79beb0170467120d1","url":"https://api.github.com/repos/sporkmonger/addressable/commits/d341c39f7b99a14b2b41ffb79beb0170467120d1"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMC4y"},{"name":"addressable-2.0.1","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.0.1","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.0.1","commit":{"sha":"6fb070f7d04a5a7b251ff5dac22bd1fb81fd346c","url":"https://api.github.com/repos/sporkmonger/addressable/commits/6fb070f7d04a5a7b251ff5dac22bd1fb81fd346c"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMC4x"},{"name":"addressable-2.0.0","zipball_url":"https://api.github.com/repos/sporkmonger/addressable/zipball/refs/tags/addressable-2.0.0","tarball_url":"https://api.github.com/repos/sporkmonger/addressable/tarball/refs/tags/addressable-2.0.0","commit":{"sha":"126259d1ef0315fa0b1cad07b8194748763e2bf2","url":"https://api.github.com/repos/sporkmonger/addressable/commits/126259d1ef0315fa0b1cad07b8194748763e2bf2"},"node_id":"MDM6UmVmMjI2MDE6cmVmcy90YWdzL2FkZHJlc3NhYmxlLTIuMC4w"}]' 80 | recorded_at: Sun, 09 May 2021 19:35:11 GMT 81 | recorded_with: VCR 6.0.0 82 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/aws.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3?ref=version-3 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | Accept: 11 | - application/vnd.github.v3+json 12 | User-Agent: 13 | - Octokit Ruby Gem 4.18.0 14 | Content-Type: 15 | - application/json 16 | Authorization: 17 | - token f0d1005a546bf3c5881dfce4a39b1fd97a99c3ea 18 | Accept-Encoding: 19 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 20 | response: 21 | status: 22 | code: 200 23 | message: OK 24 | headers: 25 | Server: 26 | - GitHub.com 27 | Date: 28 | - Sun, 09 May 2021 19:10:51 GMT 29 | Content-Type: 30 | - application/json; charset=utf-8 31 | Transfer-Encoding: 32 | - chunked 33 | Cache-Control: 34 | - private, max-age=60, s-maxage=60 35 | Vary: 36 | - Accept, Authorization, Cookie, X-GitHub-OTP 37 | - Accept-Encoding, Accept, X-Requested-With 38 | Etag: 39 | - W/"c29501793394ce0defe749c71e6165e83a19bd15" 40 | Last-Modified: 41 | - Sun, 09 May 2021 14:00:22 GMT 42 | X-Oauth-Scopes: 43 | - repo, workflow 44 | X-Accepted-Oauth-Scopes: 45 | - '' 46 | X-Github-Media-Type: 47 | - github.v3; format=json 48 | X-Ratelimit-Limit: 49 | - '5000' 50 | X-Ratelimit-Remaining: 51 | - '4996' 52 | X-Ratelimit-Reset: 53 | - '1620587579' 54 | X-Ratelimit-Used: 55 | - '4' 56 | X-Ratelimit-Resource: 57 | - core 58 | Access-Control-Expose-Headers: 59 | - ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, 60 | X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, 61 | X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, 62 | Sunset 63 | Access-Control-Allow-Origin: 64 | - "*" 65 | Strict-Transport-Security: 66 | - max-age=31536000; includeSubdomains; preload 67 | X-Frame-Options: 68 | - deny 69 | X-Content-Type-Options: 70 | - nosniff 71 | X-Xss-Protection: 72 | - '0' 73 | Referrer-Policy: 74 | - origin-when-cross-origin, strict-origin-when-cross-origin 75 | Content-Security-Policy: 76 | - default-src 'none' 77 | X-Github-Request-Id: 78 | - E6C5:5D92:5B0C98:692D73:609833BB 79 | body: 80 | encoding: ASCII-8BIT 81 | string: '[{"name":"CHANGELOG.md","path":"gems/aws-sdk-s3/CHANGELOG.md","sha":"cc8dd719b8148624778d005aef177068963d44bb","size":19599,"url":"https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3/CHANGELOG.md?ref=version-3","html_url":"https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/CHANGELOG.md","git_url":"https://api.github.com/repos/aws/aws-sdk-ruby/git/blobs/cc8dd719b8148624778d005aef177068963d44bb","download_url":"https://raw.githubusercontent.com/aws/aws-sdk-ruby/version-3/gems/aws-sdk-s3/CHANGELOG.md","type":"file","_links":{"self":"https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3/CHANGELOG.md?ref=version-3","git":"https://api.github.com/repos/aws/aws-sdk-ruby/git/blobs/cc8dd719b8148624778d005aef177068963d44bb","html":"https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/CHANGELOG.md"}},{"name":"LICENSE.txt","path":"gems/aws-sdk-s3/LICENSE.txt","sha":"d645695673349e3947e8e5ae42332d0ac3164cd7","size":11358,"url":"https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3/LICENSE.txt?ref=version-3","html_url":"https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/LICENSE.txt","git_url":"https://api.github.com/repos/aws/aws-sdk-ruby/git/blobs/d645695673349e3947e8e5ae42332d0ac3164cd7","download_url":"https://raw.githubusercontent.com/aws/aws-sdk-ruby/version-3/gems/aws-sdk-s3/LICENSE.txt","type":"file","_links":{"self":"https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3/LICENSE.txt?ref=version-3","git":"https://api.github.com/repos/aws/aws-sdk-ruby/git/blobs/d645695673349e3947e8e5ae42332d0ac3164cd7","html":"https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/LICENSE.txt"}},{"name":"VERSION","path":"gems/aws-sdk-s3/VERSION","sha":"df83a51c6cb9a69892ecce1187badf8d49ac5864","size":7,"url":"https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3/VERSION?ref=version-3","html_url":"https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/VERSION","git_url":"https://api.github.com/repos/aws/aws-sdk-ruby/git/blobs/df83a51c6cb9a69892ecce1187badf8d49ac5864","download_url":"https://raw.githubusercontent.com/aws/aws-sdk-ruby/version-3/gems/aws-sdk-s3/VERSION","type":"file","_links":{"self":"https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3/VERSION?ref=version-3","git":"https://api.github.com/repos/aws/aws-sdk-ruby/git/blobs/df83a51c6cb9a69892ecce1187badf8d49ac5864","html":"https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/VERSION"}},{"name":"aws-sdk-s3.gemspec","path":"gems/aws-sdk-s3/aws-sdk-s3.gemspec","sha":"fe378797b76bf0e5475575f6c8b55db5b729356a","size":1277,"url":"https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3/aws-sdk-s3.gemspec?ref=version-3","html_url":"https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/aws-sdk-s3.gemspec","git_url":"https://api.github.com/repos/aws/aws-sdk-ruby/git/blobs/fe378797b76bf0e5475575f6c8b55db5b729356a","download_url":"https://raw.githubusercontent.com/aws/aws-sdk-ruby/version-3/gems/aws-sdk-s3/aws-sdk-s3.gemspec","type":"file","_links":{"self":"https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3/aws-sdk-s3.gemspec?ref=version-3","git":"https://api.github.com/repos/aws/aws-sdk-ruby/git/blobs/fe378797b76bf0e5475575f6c8b55db5b729356a","html":"https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/aws-sdk-s3.gemspec"}},{"name":"features","path":"gems/aws-sdk-s3/features","sha":"0a3c90b92cc45389352d677745fe5b53823fe0dd","size":0,"url":"https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3/features?ref=version-3","html_url":"https://github.com/aws/aws-sdk-ruby/tree/version-3/gems/aws-sdk-s3/features","git_url":"https://api.github.com/repos/aws/aws-sdk-ruby/git/trees/0a3c90b92cc45389352d677745fe5b53823fe0dd","download_url":null,"type":"dir","_links":{"self":"https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3/features?ref=version-3","git":"https://api.github.com/repos/aws/aws-sdk-ruby/git/trees/0a3c90b92cc45389352d677745fe5b53823fe0dd","html":"https://github.com/aws/aws-sdk-ruby/tree/version-3/gems/aws-sdk-s3/features"}},{"name":"lib","path":"gems/aws-sdk-s3/lib","sha":"c2237d448e37f8775c60b7a950f25f75c0c2fd77","size":0,"url":"https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3/lib?ref=version-3","html_url":"https://github.com/aws/aws-sdk-ruby/tree/version-3/gems/aws-sdk-s3/lib","git_url":"https://api.github.com/repos/aws/aws-sdk-ruby/git/trees/c2237d448e37f8775c60b7a950f25f75c0c2fd77","download_url":null,"type":"dir","_links":{"self":"https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3/lib?ref=version-3","git":"https://api.github.com/repos/aws/aws-sdk-ruby/git/trees/c2237d448e37f8775c60b7a950f25f75c0c2fd77","html":"https://github.com/aws/aws-sdk-ruby/tree/version-3/gems/aws-sdk-s3/lib"}},{"name":"spec","path":"gems/aws-sdk-s3/spec","sha":"ab48e2ef0b5127f6812cdd7db689d160760de710","size":0,"url":"https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3/spec?ref=version-3","html_url":"https://github.com/aws/aws-sdk-ruby/tree/version-3/gems/aws-sdk-s3/spec","git_url":"https://api.github.com/repos/aws/aws-sdk-ruby/git/trees/ab48e2ef0b5127f6812cdd7db689d160760de710","download_url":null,"type":"dir","_links":{"self":"https://api.github.com/repos/aws/aws-sdk-ruby/contents/gems/aws-sdk-s3/spec?ref=version-3","git":"https://api.github.com/repos/aws/aws-sdk-ruby/git/trees/ab48e2ef0b5127f6812cdd7db689d160760de710","html":"https://github.com/aws/aws-sdk-ruby/tree/version-3/gems/aws-sdk-s3/spec"}}]' 82 | recorded_at: Sun, 09 May 2021 19:10:51 GMT 83 | recorded_with: VCR 6.0.0 84 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/lock_diff.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.github.com/repos/vividmuimui/lock_diff/tags?page=1&per_page=50 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | Accept: 11 | - application/vnd.github.v3+json 12 | User-Agent: 13 | - Octokit Ruby Gem 4.18.0 14 | Content-Type: 15 | - application/json 16 | Accept-Encoding: 17 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 18 | response: 19 | status: 20 | code: 200 21 | message: OK 22 | headers: 23 | Server: 24 | - GitHub.com 25 | Date: 26 | - Sun, 09 May 2021 19:35:12 GMT 27 | Content-Type: 28 | - application/json; charset=utf-8 29 | Transfer-Encoding: 30 | - chunked 31 | Cache-Control: 32 | - private, max-age=60, s-maxage=60 33 | Vary: 34 | - Accept, Authorization, Cookie, X-GitHub-OTP 35 | - Accept-Encoding, Accept, X-Requested-With 36 | Etag: 37 | - W/"c170b91d51586b9fca2e261e6a13dea9d582312b388e8d35ca837af70c35f500" 38 | Last-Modified: 39 | - Sat, 27 Feb 2021 14:43:04 GMT 40 | X-Oauth-Scopes: 41 | - repo, workflow 42 | X-Accepted-Oauth-Scopes: 43 | - '' 44 | X-Github-Media-Type: 45 | - github.v3; format=json 46 | X-Ratelimit-Limit: 47 | - '5000' 48 | X-Ratelimit-Remaining: 49 | - '4993' 50 | X-Ratelimit-Reset: 51 | - '1620591640' 52 | X-Ratelimit-Used: 53 | - '7' 54 | X-Ratelimit-Resource: 55 | - core 56 | Access-Control-Expose-Headers: 57 | - ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, 58 | X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, 59 | X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, 60 | Sunset 61 | Access-Control-Allow-Origin: 62 | - "*" 63 | Strict-Transport-Security: 64 | - max-age=31536000; includeSubdomains; preload 65 | X-Frame-Options: 66 | - deny 67 | X-Content-Type-Options: 68 | - nosniff 69 | X-Xss-Protection: 70 | - '0' 71 | Referrer-Policy: 72 | - origin-when-cross-origin, strict-origin-when-cross-origin 73 | Content-Security-Policy: 74 | - default-src 'none' 75 | X-Github-Request-Id: 76 | - E7F1:608E:DD728:10592A:60983970 77 | body: 78 | encoding: ASCII-8BIT 79 | string: '[{"name":"v0.6.0","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.6.0","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.6.0","commit":{"sha":"5b2a8d7bd40e0d2c22c3f01caaac20e2991384d1","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/5b2a8d7bd40e0d2c22c3f01caaac20e2991384d1"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjYuMA=="},{"name":"v0.5.0","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.5.0","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.5.0","commit":{"sha":"8a6f138dad15f3bb5dc0fc2a62eeed07f960ed30","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/8a6f138dad15f3bb5dc0fc2a62eeed07f960ed30"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjUuMA=="},{"name":"v0.4.2","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.4.2","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.4.2","commit":{"sha":"3df37a5e386c708ab56bac899ee5aec593a2150d","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/3df37a5e386c708ab56bac899ee5aec593a2150d"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjQuMg=="},{"name":"v0.4.1","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.4.1","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.4.1","commit":{"sha":"0f7b4679aad706f0e55f26a85e9714f4ea64e843","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/0f7b4679aad706f0e55f26a85e9714f4ea64e843"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjQuMQ=="},{"name":"v0.4.0","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.4.0","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.4.0","commit":{"sha":"499dacc1aa0c8a8682a06a00205f04083e71a829","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/499dacc1aa0c8a8682a06a00205f04083e71a829"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjQuMA=="},{"name":"v0.3.8","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.3.8","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.3.8","commit":{"sha":"d092ea585c212dd38fad07e4f7fc3111a094e619","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/d092ea585c212dd38fad07e4f7fc3111a094e619"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjMuOA=="},{"name":"v0.3.7","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.3.7","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.3.7","commit":{"sha":"4add5ebb9a9f13444ebbe261f5f80b7408b4f5ff","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/4add5ebb9a9f13444ebbe261f5f80b7408b4f5ff"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjMuNw=="},{"name":"v0.3.6","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.3.6","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.3.6","commit":{"sha":"e4ca13a0f770f8749ca8b9bde120a8b0460c1a29","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/e4ca13a0f770f8749ca8b9bde120a8b0460c1a29"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjMuNg=="},{"name":"v0.3.5","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.3.5","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.3.5","commit":{"sha":"c9d8ae4af4c5975076e29e6d20738ae9125b4408","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/c9d8ae4af4c5975076e29e6d20738ae9125b4408"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjMuNQ=="},{"name":"v0.3.4","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.3.4","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.3.4","commit":{"sha":"0bf2ec37101895bf7e497ab9a71fd05a39229416","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/0bf2ec37101895bf7e497ab9a71fd05a39229416"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjMuNA=="},{"name":"v0.3.3","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.3.3","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.3.3","commit":{"sha":"ddcc4473355acf0561261ce076be89d37182611d","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/ddcc4473355acf0561261ce076be89d37182611d"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjMuMw=="},{"name":"v0.3.2","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.3.2","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.3.2","commit":{"sha":"2f31667f88a7d4406be26ae5a74cde42b2a2e16d","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/2f31667f88a7d4406be26ae5a74cde42b2a2e16d"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjMuMg=="},{"name":"v0.3.1","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.3.1","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.3.1","commit":{"sha":"0011e0b41c498a46d5e24b7dc0b69526efb67eb3","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/0011e0b41c498a46d5e24b7dc0b69526efb67eb3"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjMuMQ=="},{"name":"v0.3.1.pre","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.3.1.pre","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.3.1.pre","commit":{"sha":"2ee9903ac6cec3376642e37b4c3e877512f9f1f4","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/2ee9903ac6cec3376642e37b4c3e877512f9f1f4"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjMuMS5wcmU="},{"name":"v0.3.0","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.3.0","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.3.0","commit":{"sha":"446cbd59a2797fd38cef3d701abe5fbebc2ad88d","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/446cbd59a2797fd38cef3d701abe5fbebc2ad88d"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjMuMA=="},{"name":"v0.2.1","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.2.1","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.2.1","commit":{"sha":"125d20335f3ad40fa518284b76b7e86749e30cf1","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/125d20335f3ad40fa518284b76b7e86749e30cf1"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjIuMQ=="},{"name":"v0.2.0","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.2.0","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.2.0","commit":{"sha":"a10308bec0f25b4f1f8de08f2ffa4163981564dd","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/a10308bec0f25b4f1f8de08f2ffa4163981564dd"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjIuMA=="},{"name":"v0.1.7","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.1.7","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.1.7","commit":{"sha":"045ca55f8bd54342e424b0db3ee333ddc8dda8d1","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/045ca55f8bd54342e424b0db3ee333ddc8dda8d1"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjEuNw=="},{"name":"v0.1.6","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.1.6","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.1.6","commit":{"sha":"fda0aa86bf9ff19233679be89d40fdb046aff15b","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/fda0aa86bf9ff19233679be89d40fdb046aff15b"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjEuNg=="},{"name":"v0.1.5","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.1.5","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.1.5","commit":{"sha":"87f182587b3d9581ca135a52a7ef7d687f2a6078","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/87f182587b3d9581ca135a52a7ef7d687f2a6078"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjEuNQ=="},{"name":"v0.1.4","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.1.4","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.1.4","commit":{"sha":"97a34eb9505f001dc45aaf5a9cde7039ab596494","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/97a34eb9505f001dc45aaf5a9cde7039ab596494"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjEuNA=="},{"name":"v0.1.3","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.1.3","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.1.3","commit":{"sha":"0e20ac40e1ed67ecf898c8076c627143ef688275","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/0e20ac40e1ed67ecf898c8076c627143ef688275"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjEuMw=="},{"name":"v0.1.2","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.1.2","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.1.2","commit":{"sha":"d1d76bd21113a1174961a080a45cf8b355af8cca","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/d1d76bd21113a1174961a080a45cf8b355af8cca"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjEuMg=="},{"name":"v0.1.1","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.1.1","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.1.1","commit":{"sha":"574aa4572e7520d73a6075c7c87ab4c7e12a635a","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/574aa4572e7520d73a6075c7c87ab4c7e12a635a"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjEuMQ=="},{"name":"v0.1.0","zipball_url":"https://api.github.com/repos/vividmuimui/lock_diff/zipball/refs/tags/v0.1.0","tarball_url":"https://api.github.com/repos/vividmuimui/lock_diff/tarball/refs/tags/v0.1.0","commit":{"sha":"e7473cfd35dbc8f2aeaccdb23c4f4e11ab2ed0ce","url":"https://api.github.com/repos/vividmuimui/lock_diff/commits/e7473cfd35dbc8f2aeaccdb23c4f4e11ab2ed0ce"},"node_id":"MDM6UmVmOTM4NjY0MTk6cmVmcy90YWdzL3YwLjEuMA=="}]' 80 | recorded_at: Sun, 09 May 2021 19:35:12 GMT 81 | recorded_with: VCR 6.0.0 82 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/rack.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.github.com/repos/rack/rack/tags?page=1&per_page=50 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | Accept: 11 | - application/vnd.github.v3+json 12 | User-Agent: 13 | - Octokit Ruby Gem 4.18.0 14 | Content-Type: 15 | - application/json 16 | Accept-Encoding: 17 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 18 | response: 19 | status: 20 | code: 200 21 | message: OK 22 | headers: 23 | Server: 24 | - GitHub.com 25 | Date: 26 | - Sun, 09 May 2021 19:35:12 GMT 27 | Content-Type: 28 | - application/json; charset=utf-8 29 | Transfer-Encoding: 30 | - chunked 31 | Cache-Control: 32 | - private, max-age=60, s-maxage=60 33 | Vary: 34 | - Accept, Authorization, Cookie, X-GitHub-OTP 35 | - Accept-Encoding, Accept, X-Requested-With 36 | Etag: 37 | - W/"6d76577be6d31201fdd80aa7bcf74b1a21c36aa637071578398d8a6718b189a6" 38 | Last-Modified: 39 | - Sun, 09 May 2021 14:02:08 GMT 40 | X-Oauth-Scopes: 41 | - repo, workflow 42 | X-Accepted-Oauth-Scopes: 43 | - '' 44 | X-Github-Media-Type: 45 | - github.v3; format=json 46 | Link: 47 | - ; rel="next", 48 | ; rel="last" 49 | X-Ratelimit-Limit: 50 | - '5000' 51 | X-Ratelimit-Remaining: 52 | - '4995' 53 | X-Ratelimit-Reset: 54 | - '1620591640' 55 | X-Ratelimit-Used: 56 | - '5' 57 | X-Ratelimit-Resource: 58 | - core 59 | Access-Control-Expose-Headers: 60 | - ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, 61 | X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, 62 | X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, 63 | Sunset 64 | Access-Control-Allow-Origin: 65 | - "*" 66 | Strict-Transport-Security: 67 | - max-age=31536000; includeSubdomains; preload 68 | X-Frame-Options: 69 | - deny 70 | X-Content-Type-Options: 71 | - nosniff 72 | X-Xss-Protection: 73 | - '0' 74 | Referrer-Policy: 75 | - origin-when-cross-origin, strict-origin-when-cross-origin 76 | Content-Security-Policy: 77 | - default-src 'none' 78 | X-Github-Request-Id: 79 | - E7EF:171D:17D79:1E412:6098396F 80 | body: 81 | encoding: ASCII-8BIT 82 | string: '[{"name":"v2.2.2","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/v2.2.2","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/v2.2.2","commit":{"sha":"a5e80f01947954af76b14c1d1fdd8e79dd8337f3","url":"https://api.github.com/repos/rack/rack/commits/a5e80f01947954af76b14c1d1fdd8e79dd8337f3"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzL3YyLjIuMg=="},{"name":"v2.2.1","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/v2.2.1","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/v2.2.1","commit":{"sha":"961d9761bcb2bee17c80bba8b7bc9e285086d6c4","url":"https://api.github.com/repos/rack/rack/commits/961d9761bcb2bee17c80bba8b7bc9e285086d6c4"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzL3YyLjIuMQ=="},{"name":"test","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/test","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/test","commit":{"sha":"87e39bae4fdd43bf3b98ea820c13fe8c451b1cc4","url":"https://api.github.com/repos/rack/rack/commits/87e39bae4fdd43bf3b98ea820c13fe8c451b1cc4"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzL3Rlc3Q="},{"name":"2.2.3","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.2.3","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.2.3","commit":{"sha":"1741c580d71cfca8e541e96cc372305c8892ee74","url":"https://api.github.com/repos/rack/rack/commits/1741c580d71cfca8e541e96cc372305c8892ee74"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMi4z"},{"name":"2.2.0","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.2.0","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.2.0","commit":{"sha":"39d501a28c1fe51284addfe6dacffafb69d49849","url":"https://api.github.com/repos/rack/rack/commits/39d501a28c1fe51284addfe6dacffafb69d49849"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMi4w"},{"name":"2.1.4","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.1.4","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.1.4","commit":{"sha":"52808700e0ade4225625c6729529e13a6b31cc2f","url":"https://api.github.com/repos/rack/rack/commits/52808700e0ade4225625c6729529e13a6b31cc2f"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMS40"},{"name":"2.1.3","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.1.3","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.1.3","commit":{"sha":"b9b8652334e833e32b5fb8627463632867b5d6a8","url":"https://api.github.com/repos/rack/rack/commits/b9b8652334e833e32b5fb8627463632867b5d6a8"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMS4z"},{"name":"2.1.2","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.1.2","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.1.2","commit":{"sha":"16a51d8e0b64964323c3719b8154106af5cc0feb","url":"https://api.github.com/repos/rack/rack/commits/16a51d8e0b64964323c3719b8154106af5cc0feb"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMS4y"},{"name":"2.1.1","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.1.1","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.1.1","commit":{"sha":"799a520a015de5938bc01faa8e90b76589c6e7d3","url":"https://api.github.com/repos/rack/rack/commits/799a520a015de5938bc01faa8e90b76589c6e7d3"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMS4x"},{"name":"2.1.0","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.1.0","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.1.0","commit":{"sha":"879ae7163a399a9ed36d876668f4ecae4ae8b9e4","url":"https://api.github.com/repos/rack/rack/commits/879ae7163a399a9ed36d876668f4ecae4ae8b9e4"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMS4w"},{"name":"2.0.9","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.0.9","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.0.9","commit":{"sha":"85684323f8f58409e717af91e446d257d496f8b8","url":"https://api.github.com/repos/rack/rack/commits/85684323f8f58409e717af91e446d257d496f8b8"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMC45"},{"name":"2.0.8","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.0.8","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.0.8","commit":{"sha":"e7ee459546d217f32afc83e0b168c5eb9f95d784","url":"https://api.github.com/repos/rack/rack/commits/e7ee459546d217f32afc83e0b168c5eb9f95d784"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMC44"},{"name":"2.0.7","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.0.7","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.0.7","commit":{"sha":"7fb95dbec28dc70f3cfbba0a684db0735d8ab2ca","url":"https://api.github.com/repos/rack/rack/commits/7fb95dbec28dc70f3cfbba0a684db0735d8ab2ca"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMC43"},{"name":"2.0.6","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.0.6","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.0.6","commit":{"sha":"8376dd11e6526a53432ee59b7a5d092bda9fc901","url":"https://api.github.com/repos/rack/rack/commits/8376dd11e6526a53432ee59b7a5d092bda9fc901"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMC42"},{"name":"2.0.5","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.0.5","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.0.5","commit":{"sha":"decd97682ec4c6345fe359b6a1d3c51e5fbdce5b","url":"https://api.github.com/repos/rack/rack/commits/decd97682ec4c6345fe359b6a1d3c51e5fbdce5b"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMC41"},{"name":"2.0.4","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.0.4","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.0.4","commit":{"sha":"0a95875745ec65e91a57460a41373ae4d3a94934","url":"https://api.github.com/repos/rack/rack/commits/0a95875745ec65e91a57460a41373ae4d3a94934"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMC40"},{"name":"2.0.3","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.0.3","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.0.3","commit":{"sha":"6a5f356cc12e5801843fbd95ecc603416c901cf3","url":"https://api.github.com/repos/rack/rack/commits/6a5f356cc12e5801843fbd95ecc603416c901cf3"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMC4z"},{"name":"2.0.2","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.0.2","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.0.2","commit":{"sha":"620766d061975a67f80fa5dc3887563c1563a64d","url":"https://api.github.com/repos/rack/rack/commits/620766d061975a67f80fa5dc3887563c1563a64d"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMC4y"},{"name":"2.0.1","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.0.1","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.0.1","commit":{"sha":"25a549883b85fb33970b4a1530a365c0c9e51f95","url":"https://api.github.com/repos/rack/rack/commits/25a549883b85fb33970b4a1530a365c0c9e51f95"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMC4x"},{"name":"2.0.0","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.0.0","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.0.0","commit":{"sha":"1a408687493175250408fe87c5046bf1adfa6386","url":"https://api.github.com/repos/rack/rack/commits/1a408687493175250408fe87c5046bf1adfa6386"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMC4w"},{"name":"2.0.0.rc1","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.0.0.rc1","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.0.0.rc1","commit":{"sha":"9073125f71afd615091f575d74ec468a0b1b79bf","url":"https://api.github.com/repos/rack/rack/commits/9073125f71afd615091f575d74ec468a0b1b79bf"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMC4wLnJjMQ=="},{"name":"2.0.0.alpha","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/2.0.0.alpha","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/2.0.0.alpha","commit":{"sha":"f4562619c3c669404e39d9b09924bed5a6b71c14","url":"https://api.github.com/repos/rack/rack/commits/f4562619c3c669404e39d9b09924bed5a6b71c14"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzIuMC4wLmFscGhh"},{"name":"1.6.13","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.13","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.13","commit":{"sha":"47a1fd73fc77f094573f4215b0fc884f4ac1c03c","url":"https://api.github.com/repos/rack/rack/commits/47a1fd73fc77f094573f4215b0fc884f4ac1c03c"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi4xMw=="},{"name":"1.6.12","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.12","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.12","commit":{"sha":"de902e48d1c971fe145002039121afb69e10af5a","url":"https://api.github.com/repos/rack/rack/commits/de902e48d1c971fe145002039121afb69e10af5a"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi4xMg=="},{"name":"1.6.11","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.11","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.11","commit":{"sha":"2bef132505cb2f80c432e3f4526dfef969cd2e25","url":"https://api.github.com/repos/rack/rack/commits/2bef132505cb2f80c432e3f4526dfef969cd2e25"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi4xMQ=="},{"name":"1.6.10","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.10","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.10","commit":{"sha":"fdcd03a3c5a1c51d1f96fc97f9dfa1a9deac0c77","url":"https://api.github.com/repos/rack/rack/commits/fdcd03a3c5a1c51d1f96fc97f9dfa1a9deac0c77"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi4xMA=="},{"name":"1.6.9","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.9","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.9","commit":{"sha":"617aac0fb89f25603afc2b6497fdc3333354aee5","url":"https://api.github.com/repos/rack/rack/commits/617aac0fb89f25603afc2b6497fdc3333354aee5"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi45"},{"name":"1.6.8","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.8","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.8","commit":{"sha":"90afdf309b4c0665f542579a21fbd1c285d05083","url":"https://api.github.com/repos/rack/rack/commits/90afdf309b4c0665f542579a21fbd1c285d05083"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi44"},{"name":"1.6.7","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.7","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.7","commit":{"sha":"51e8891e4807495d972fcba9832c4fdb30d37b50","url":"https://api.github.com/repos/rack/rack/commits/51e8891e4807495d972fcba9832c4fdb30d37b50"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi43"},{"name":"1.6.6","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.6","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.6","commit":{"sha":"2ed117a11a8ed0455260b10f6696d4d3919f7dc5","url":"https://api.github.com/repos/rack/rack/commits/2ed117a11a8ed0455260b10f6696d4d3919f7dc5"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi42"},{"name":"1.6.5","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.5","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.5","commit":{"sha":"1886a60e9b96c2a4106fd89eb41dc817696c6369","url":"https://api.github.com/repos/rack/rack/commits/1886a60e9b96c2a4106fd89eb41dc817696c6369"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi41"},{"name":"1.6.4","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.4","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.4","commit":{"sha":"ee18520bd9894e68a5d2b26c82835c2e67a43a8b","url":"https://api.github.com/repos/rack/rack/commits/ee18520bd9894e68a5d2b26c82835c2e67a43a8b"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi40"},{"name":"1.6.3","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.3","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.3","commit":{"sha":"134d6218d0881d87ae6a522e88eafbddb6cd1bb7","url":"https://api.github.com/repos/rack/rack/commits/134d6218d0881d87ae6a522e88eafbddb6cd1bb7"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi4z"},{"name":"1.6.2","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.2","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.2","commit":{"sha":"90d7d2a8f7ab50cb80adcc05a7fcdd1dfa60f2ad","url":"https://api.github.com/repos/rack/rack/commits/90d7d2a8f7ab50cb80adcc05a7fcdd1dfa60f2ad"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi4y"},{"name":"1.6.1","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.1","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.1","commit":{"sha":"08e62f29164505e50f3b3acc09e4c67a843e0172","url":"https://api.github.com/repos/rack/rack/commits/08e62f29164505e50f3b3acc09e4c67a843e0172"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi4x"},{"name":"1.6.0","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.0","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.0","commit":{"sha":"65a7104b6b3e9ecd8f33c63a478ab9a33a103507","url":"https://api.github.com/repos/rack/rack/commits/65a7104b6b3e9ecd8f33c63a478ab9a33a103507"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi4w"},{"name":"1.6.0.beta2","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.0.beta2","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.0.beta2","commit":{"sha":"8cb9b65b4e7c7157aba0f5421e59c70411c919cf","url":"https://api.github.com/repos/rack/rack/commits/8cb9b65b4e7c7157aba0f5421e59c70411c919cf"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi4wLmJldGEy"},{"name":"1.6.0.beta","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.6.0.beta","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.6.0.beta","commit":{"sha":"e4e4c397e89c026f9c23500cf7fc14ccdb756010","url":"https://api.github.com/repos/rack/rack/commits/e4e4c397e89c026f9c23500cf7fc14ccdb756010"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNi4wLmJldGE="},{"name":"1.5.5","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.5.5","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.5.5","commit":{"sha":"e7e064611e1004ec62b593ec993a06d967d6c72e","url":"https://api.github.com/repos/rack/rack/commits/e7e064611e1004ec62b593ec993a06d967d6c72e"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNS41"},{"name":"1.5.4","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.5.4","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.5.4","commit":{"sha":"90e627ab60d4df281206621a34271a9867a84fc7","url":"https://api.github.com/repos/rack/rack/commits/90e627ab60d4df281206621a34271a9867a84fc7"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNS40"},{"name":"1.5.3","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.5.3","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.5.3","commit":{"sha":"14e139c4a87c2e1a94dd3e305d6f485a19719855","url":"https://api.github.com/repos/rack/rack/commits/14e139c4a87c2e1a94dd3e305d6f485a19719855"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNS4z"},{"name":"1.5.2","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.5.2","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.5.2","commit":{"sha":"ac590d055c936bb9a618e955a690dc836c625211","url":"https://api.github.com/repos/rack/rack/commits/ac590d055c936bb9a618e955a690dc836c625211"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNS4y"},{"name":"1.5.1","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.5.1","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.5.1","commit":{"sha":"42b11a7fb918127143ca570af9930b2e7ef7222c","url":"https://api.github.com/repos/rack/rack/commits/42b11a7fb918127143ca570af9930b2e7ef7222c"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNS4x"},{"name":"1.5.0","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.5.0","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.5.0","commit":{"sha":"0cba6a4d5aeb1ac8768b6ca36320731487fb596b","url":"https://api.github.com/repos/rack/rack/commits/0cba6a4d5aeb1ac8768b6ca36320731487fb596b"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNS4w"},{"name":"1.4.7","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.4.7","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.4.7","commit":{"sha":"f5c09684fb93dbe76d7b9d0a0411d32ba5d66d04","url":"https://api.github.com/repos/rack/rack/commits/f5c09684fb93dbe76d7b9d0a0411d32ba5d66d04"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNC43"},{"name":"1.4.6","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.4.6","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.4.6","commit":{"sha":"e4f4df517b73ee4e7d365891f4ac2fb6a09a026c","url":"https://api.github.com/repos/rack/rack/commits/e4f4df517b73ee4e7d365891f4ac2fb6a09a026c"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNC42"},{"name":"1.4.5","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.4.5","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.4.5","commit":{"sha":"9939d40a5e23dcb058751d1029b794aa2f551900","url":"https://api.github.com/repos/rack/rack/commits/9939d40a5e23dcb058751d1029b794aa2f551900"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNC41"},{"name":"1.4.4","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.4.4","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.4.4","commit":{"sha":"ffbdb982a731df7c5b166354a09a3d239f7b18c8","url":"https://api.github.com/repos/rack/rack/commits/ffbdb982a731df7c5b166354a09a3d239f7b18c8"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNC40"},{"name":"1.4.3","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.4.3","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.4.3","commit":{"sha":"55ea327306f9eb1fdc206e8f04c3c0e234591560","url":"https://api.github.com/repos/rack/rack/commits/55ea327306f9eb1fdc206e8f04c3c0e234591560"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNC4z"},{"name":"1.4.2","zipball_url":"https://api.github.com/repos/rack/rack/zipball/refs/tags/1.4.2","tarball_url":"https://api.github.com/repos/rack/rack/tarball/refs/tags/1.4.2","commit":{"sha":"15c0365365a1719eb70c45a2a5a92b4afb610d5a","url":"https://api.github.com/repos/rack/rack/commits/15c0365365a1719eb70c45a2a5a92b4afb610d5a"},"node_id":"MDM6UmVmOTYwNzE6cmVmcy90YWdzLzEuNC4y"}]' 83 | recorded_at: Sun, 09 May 2021 19:35:12 GMT 84 | recorded_with: VCR 6.0.0 85 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/rails.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.github.com/repos/rails/rails/contents/?ref=master 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | Accept: 11 | - application/vnd.github.v3+json 12 | User-Agent: 13 | - Octokit Ruby Gem 4.18.0 14 | Content-Type: 15 | - application/json 16 | Authorization: 17 | - token f0d1005a546bf3c5881dfce4a39b1fd97a99c3ea 18 | Accept-Encoding: 19 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 20 | response: 21 | status: 22 | code: 404 23 | message: Not Found 24 | headers: 25 | Server: 26 | - GitHub.com 27 | Date: 28 | - Sun, 09 May 2021 19:20:40 GMT 29 | Content-Type: 30 | - application/json; charset=utf-8 31 | Transfer-Encoding: 32 | - chunked 33 | X-Oauth-Scopes: 34 | - repo, workflow 35 | X-Accepted-Oauth-Scopes: 36 | - '' 37 | X-Github-Media-Type: 38 | - github.v3; format=json 39 | X-Ratelimit-Limit: 40 | - '5000' 41 | X-Ratelimit-Remaining: 42 | - '4999' 43 | X-Ratelimit-Reset: 44 | - '1620591640' 45 | X-Ratelimit-Used: 46 | - '1' 47 | X-Ratelimit-Resource: 48 | - core 49 | Access-Control-Expose-Headers: 50 | - ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, 51 | X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, 52 | X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, 53 | Sunset 54 | Access-Control-Allow-Origin: 55 | - "*" 56 | Strict-Transport-Security: 57 | - max-age=31536000; includeSubdomains; preload 58 | X-Frame-Options: 59 | - deny 60 | X-Content-Type-Options: 61 | - nosniff 62 | X-Xss-Protection: 63 | - '0' 64 | Referrer-Policy: 65 | - origin-when-cross-origin, strict-origin-when-cross-origin 66 | Content-Security-Policy: 67 | - default-src 'none' 68 | Vary: 69 | - Accept-Encoding, Accept, X-Requested-With 70 | X-Github-Request-Id: 71 | - E73E:76EA:1864BE:1CDE5F:60983607 72 | body: 73 | encoding: ASCII-8BIT 74 | string: '{"message":"No commit found for the ref master","documentation_url":"https://docs.github.com/v3/repos/contents/"}' 75 | recorded_at: Sun, 09 May 2021 19:20:40 GMT 76 | recorded_with: VCR 6.0.0 77 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/vcr.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.github.com/repos/vcr/vcr/contents/?ref=master 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | Accept: 11 | - application/vnd.github.v3+json 12 | User-Agent: 13 | - Octokit Ruby Gem 4.18.0 14 | Content-Type: 15 | - application/json 16 | Authorization: 17 | - token f0d1005a546bf3c5881dfce4a39b1fd97a99c3ea 18 | Accept-Encoding: 19 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 20 | response: 21 | status: 22 | code: 200 23 | message: OK 24 | headers: 25 | Server: 26 | - GitHub.com 27 | Date: 28 | - Sun, 09 May 2021 17:25:48 GMT 29 | Content-Type: 30 | - application/json; charset=utf-8 31 | Transfer-Encoding: 32 | - chunked 33 | Cache-Control: 34 | - private, max-age=60, s-maxage=60 35 | Vary: 36 | - Accept, Authorization, Cookie, X-GitHub-OTP 37 | - Accept-Encoding, Accept, X-Requested-With 38 | Etag: 39 | - W/"26b391d36fe0cb42e8d79cdec7635bb03259b7cf" 40 | Last-Modified: 41 | - Sun, 09 May 2021 14:01:30 GMT 42 | X-Oauth-Scopes: 43 | - repo, workflow 44 | X-Accepted-Oauth-Scopes: 45 | - '' 46 | X-Github-Media-Type: 47 | - github.v3; format=json 48 | X-Ratelimit-Limit: 49 | - '5000' 50 | X-Ratelimit-Remaining: 51 | - '4987' 52 | X-Ratelimit-Reset: 53 | - '1620582872' 54 | X-Ratelimit-Used: 55 | - '13' 56 | X-Ratelimit-Resource: 57 | - core 58 | Access-Control-Expose-Headers: 59 | - ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, 60 | X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, 61 | X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, 62 | Sunset 63 | Access-Control-Allow-Origin: 64 | - "*" 65 | Strict-Transport-Security: 66 | - max-age=31536000; includeSubdomains; preload 67 | X-Frame-Options: 68 | - deny 69 | X-Content-Type-Options: 70 | - nosniff 71 | X-Xss-Protection: 72 | - '0' 73 | Referrer-Policy: 74 | - origin-when-cross-origin, strict-origin-when-cross-origin 75 | Content-Security-Policy: 76 | - default-src 'none' 77 | X-Github-Request-Id: 78 | - E425:65BD:51FB1:12953D:60981B1C 79 | body: 80 | encoding: ASCII-8BIT 81 | string: '[{"name":".github","path":".github","sha":"771a53fee70d910b9eb0ba8189c7c0d95bd30949","size":0,"url":"https://api.github.com/repos/vcr/vcr/contents/.github?ref=master","html_url":"https://github.com/vcr/vcr/tree/master/.github","git_url":"https://api.github.com/repos/vcr/vcr/git/trees/771a53fee70d910b9eb0ba8189c7c0d95bd30949","download_url":null,"type":"dir","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/.github?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/trees/771a53fee70d910b9eb0ba8189c7c0d95bd30949","html":"https://github.com/vcr/vcr/tree/master/.github"}},{"name":".gitignore","path":".gitignore","sha":"fdf1d35f8508ee78df2c9227cffbee7492288ac6","size":689,"url":"https://api.github.com/repos/vcr/vcr/contents/.gitignore?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/.gitignore","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/fdf1d35f8508ee78df2c9227cffbee7492288ac6","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/.gitignore","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/.gitignore?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/fdf1d35f8508ee78df2c9227cffbee7492288ac6","html":"https://github.com/vcr/vcr/blob/master/.gitignore"}},{"name":".rspec","path":".rspec","sha":"4e1e0d2f722485c7d284fb5cd7da855826e39b5a","size":8,"url":"https://api.github.com/repos/vcr/vcr/contents/.rspec?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/.rspec","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/4e1e0d2f722485c7d284fb5cd7da855826e39b5a","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/.rspec","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/.rspec?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/4e1e0d2f722485c7d284fb5cd7da855826e39b5a","html":"https://github.com/vcr/vcr/blob/master/.rspec"}},{"name":".travis.yml","path":".travis.yml","sha":"9621b16c05f4e747cbfea8ad6560d97c1dd1f167","size":128,"url":"https://api.github.com/repos/vcr/vcr/contents/.travis.yml?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/.travis.yml","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/9621b16c05f4e747cbfea8ad6560d97c1dd1f167","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/.travis.yml","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/.travis.yml?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/9621b16c05f4e747cbfea8ad6560d97c1dd1f167","html":"https://github.com/vcr/vcr/blob/master/.travis.yml"}},{"name":".yardopts","path":".yardopts","sha":"1279291162d380b424630ee6255bec1eb77f93e9","size":119,"url":"https://api.github.com/repos/vcr/vcr/contents/.yardopts?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/.yardopts","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/1279291162d380b424630ee6255bec1eb77f93e9","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/.yardopts","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/.yardopts?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/1279291162d380b424630ee6255bec1eb77f93e9","html":"https://github.com/vcr/vcr/blob/master/.yardopts"}},{"name":"Appraisals","path":"Appraisals","sha":"21d576597b7c010bb65ff4dd73b81867ec2de171","size":146,"url":"https://api.github.com/repos/vcr/vcr/contents/Appraisals?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/Appraisals","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/21d576597b7c010bb65ff4dd73b81867ec2de171","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/Appraisals","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/Appraisals?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/21d576597b7c010bb65ff4dd73b81867ec2de171","html":"https://github.com/vcr/vcr/blob/master/Appraisals"}},{"name":"CHANGELOG.md","path":"CHANGELOG.md","sha":"b25856394382f94b7439ff996e2a42ac129330ec","size":50353,"url":"https://api.github.com/repos/vcr/vcr/contents/CHANGELOG.md?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/CHANGELOG.md","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/b25856394382f94b7439ff996e2a42ac129330ec","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/CHANGELOG.md","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/CHANGELOG.md?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/b25856394382f94b7439ff996e2a42ac129330ec","html":"https://github.com/vcr/vcr/blob/master/CHANGELOG.md"}},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","sha":"033338d1115fbb4aac04796895d27d388952143b","size":875,"url":"https://api.github.com/repos/vcr/vcr/contents/CONTRIBUTING.md?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/CONTRIBUTING.md","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/033338d1115fbb4aac04796895d27d388952143b","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/CONTRIBUTING.md","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/CONTRIBUTING.md?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/033338d1115fbb4aac04796895d27d388952143b","html":"https://github.com/vcr/vcr/blob/master/CONTRIBUTING.md"}},{"name":"DEVELOPMENT.md","path":"DEVELOPMENT.md","sha":"58e03f2fcdd957bc3fefaa6b38be2229cc60aa1f","size":2920,"url":"https://api.github.com/repos/vcr/vcr/contents/DEVELOPMENT.md?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/DEVELOPMENT.md","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/58e03f2fcdd957bc3fefaa6b38be2229cc60aa1f","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/DEVELOPMENT.md","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/DEVELOPMENT.md?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/58e03f2fcdd957bc3fefaa6b38be2229cc60aa1f","html":"https://github.com/vcr/vcr/blob/master/DEVELOPMENT.md"}},{"name":"Gemfile","path":"Gemfile","sha":"2dc6e51575973bea895e59621733cc785c92591f","size":234,"url":"https://api.github.com/repos/vcr/vcr/contents/Gemfile?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/Gemfile","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/2dc6e51575973bea895e59621733cc785c92591f","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/Gemfile","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/Gemfile?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/2dc6e51575973bea895e59621733cc785c92591f","html":"https://github.com/vcr/vcr/blob/master/Gemfile"}},{"name":"Gemfile.cucumber-3.1","path":"Gemfile.cucumber-3.1","sha":"bc4bfda00f85b540511d15a333bd0d792084c50e","size":65,"url":"https://api.github.com/repos/vcr/vcr/contents/Gemfile.cucumber-3.1?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/Gemfile.cucumber-3.1","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/bc4bfda00f85b540511d15a333bd0d792084c50e","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/Gemfile.cucumber-3.1","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/Gemfile.cucumber-3.1?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/bc4bfda00f85b540511d15a333bd0d792084c50e","html":"https://github.com/vcr/vcr/blob/master/Gemfile.cucumber-3.1"}},{"name":"Gemfile.faraday-1.0.0","path":"Gemfile.faraday-1.0.0","sha":"c80d31397feae3aaced9ee3ce36578138e0929f3","size":120,"url":"https://api.github.com/repos/vcr/vcr/contents/Gemfile.faraday-1.0.0?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/Gemfile.faraday-1.0.0","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/c80d31397feae3aaced9ee3ce36578138e0929f3","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/Gemfile.faraday-1.0.0","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/Gemfile.faraday-1.0.0?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/c80d31397feae3aaced9ee3ce36578138e0929f3","html":"https://github.com/vcr/vcr/blob/master/Gemfile.faraday-1.0.0"}},{"name":"Gemfile.typhoeus-0.4","path":"Gemfile.typhoeus-0.4","sha":"14b461ae186b5232634a8a3b9fae3690dd23d658","size":94,"url":"https://api.github.com/repos/vcr/vcr/contents/Gemfile.typhoeus-0.4?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/Gemfile.typhoeus-0.4","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/14b461ae186b5232634a8a3b9fae3690dd23d658","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/Gemfile.typhoeus-0.4","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/Gemfile.typhoeus-0.4?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/14b461ae186b5232634a8a3b9fae3690dd23d658","html":"https://github.com/vcr/vcr/blob/master/Gemfile.typhoeus-0.4"}},{"name":"LICENSE","path":"LICENSE","sha":"78b7f42ff320dc2526b0c909b02089d2358af178","size":9575,"url":"https://api.github.com/repos/vcr/vcr/contents/LICENSE?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/LICENSE","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/78b7f42ff320dc2526b0c909b02089d2358af178","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/LICENSE","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/LICENSE?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/78b7f42ff320dc2526b0c909b02089d2358af178","html":"https://github.com/vcr/vcr/blob/master/LICENSE"}},{"name":"MAINTAINERS","path":"MAINTAINERS","sha":"619f382ca4e98f7e81a9f6aba39eae10ec4ec1cd","size":50,"url":"https://api.github.com/repos/vcr/vcr/contents/MAINTAINERS?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/MAINTAINERS","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/619f382ca4e98f7e81a9f6aba39eae10ec4ec1cd","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/MAINTAINERS","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/MAINTAINERS?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/619f382ca4e98f7e81a9f6aba39eae10ec4ec1cd","html":"https://github.com/vcr/vcr/blob/master/MAINTAINERS"}},{"name":"README.md","path":"README.md","sha":"081e99ca4538423df764fc1ce5bbcca7152c4236","size":21775,"url":"https://api.github.com/repos/vcr/vcr/contents/README.md?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/README.md","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/081e99ca4538423df764fc1ce5bbcca7152c4236","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/README.md","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/README.md?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/081e99ca4538423df764fc1ce5bbcca7152c4236","html":"https://github.com/vcr/vcr/blob/master/README.md"}},{"name":"Rakefile","path":"Rakefile","sha":"f162e126739fe99a3b704871017e2c4865c4747d","size":3465,"url":"https://api.github.com/repos/vcr/vcr/contents/Rakefile?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/Rakefile","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/f162e126739fe99a3b704871017e2c4865c4747d","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/Rakefile","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/Rakefile?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/f162e126739fe99a3b704871017e2c4865c4747d","html":"https://github.com/vcr/vcr/blob/master/Rakefile"}},{"name":"Upgrade.md","path":"Upgrade.md","sha":"a3bc66c1baca862f7e09029cbcfa8583ffee8261","size":8006,"url":"https://api.github.com/repos/vcr/vcr/contents/Upgrade.md?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/Upgrade.md","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/a3bc66c1baca862f7e09029cbcfa8583ffee8261","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/Upgrade.md","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/Upgrade.md?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/a3bc66c1baca862f7e09029cbcfa8583ffee8261","html":"https://github.com/vcr/vcr/blob/master/Upgrade.md"}},{"name":"cucumber.yml","path":"cucumber.yml","sha":"34a734903ce81dc5be9c2df6778a0beb4da2f75c","size":880,"url":"https://api.github.com/repos/vcr/vcr/contents/cucumber.yml?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/cucumber.yml","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/34a734903ce81dc5be9c2df6778a0beb4da2f75c","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/cucumber.yml","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/cucumber.yml?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/34a734903ce81dc5be9c2df6778a0beb4da2f75c","html":"https://github.com/vcr/vcr/blob/master/cucumber.yml"}},{"name":"features","path":"features","sha":"7459e4ff8a22f6175422a27279a41ff1d21e0305","size":0,"url":"https://api.github.com/repos/vcr/vcr/contents/features?ref=master","html_url":"https://github.com/vcr/vcr/tree/master/features","git_url":"https://api.github.com/repos/vcr/vcr/git/trees/7459e4ff8a22f6175422a27279a41ff1d21e0305","download_url":null,"type":"dir","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/features?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/trees/7459e4ff8a22f6175422a27279a41ff1d21e0305","html":"https://github.com/vcr/vcr/tree/master/features"}},{"name":"lib","path":"lib","sha":"c193d91f79efa515ee93d2ffd4d544dde27e96ef","size":0,"url":"https://api.github.com/repos/vcr/vcr/contents/lib?ref=master","html_url":"https://github.com/vcr/vcr/tree/master/lib","git_url":"https://api.github.com/repos/vcr/vcr/git/trees/c193d91f79efa515ee93d2ffd4d544dde27e96ef","download_url":null,"type":"dir","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/lib?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/trees/c193d91f79efa515ee93d2ffd4d544dde27e96ef","html":"https://github.com/vcr/vcr/tree/master/lib"}},{"name":"script","path":"script","sha":"000466cc8e41efd0f25c77e823bda34de294a703","size":0,"url":"https://api.github.com/repos/vcr/vcr/contents/script?ref=master","html_url":"https://github.com/vcr/vcr/tree/master/script","git_url":"https://api.github.com/repos/vcr/vcr/git/trees/000466cc8e41efd0f25c77e823bda34de294a703","download_url":null,"type":"dir","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/script?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/trees/000466cc8e41efd0f25c77e823bda34de294a703","html":"https://github.com/vcr/vcr/tree/master/script"}},{"name":"spec","path":"spec","sha":"0b15a591a27a18d297f513b4b98ab0db60185438","size":0,"url":"https://api.github.com/repos/vcr/vcr/contents/spec?ref=master","html_url":"https://github.com/vcr/vcr/tree/master/spec","git_url":"https://api.github.com/repos/vcr/vcr/git/trees/0b15a591a27a18d297f513b4b98ab0db60185438","download_url":null,"type":"dir","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/spec?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/trees/0b15a591a27a18d297f513b4b98ab0db60185438","html":"https://github.com/vcr/vcr/tree/master/spec"}},{"name":"vcr.gemspec","path":"vcr.gemspec","sha":"5f1b079b7faeef57ff1a31682c9449bb31c58fdc","size":2011,"url":"https://api.github.com/repos/vcr/vcr/contents/vcr.gemspec?ref=master","html_url":"https://github.com/vcr/vcr/blob/master/vcr.gemspec","git_url":"https://api.github.com/repos/vcr/vcr/git/blobs/5f1b079b7faeef57ff1a31682c9449bb31c58fdc","download_url":"https://raw.githubusercontent.com/vcr/vcr/master/vcr.gemspec","type":"file","_links":{"self":"https://api.github.com/repos/vcr/vcr/contents/vcr.gemspec?ref=master","git":"https://api.github.com/repos/vcr/vcr/git/blobs/5f1b079b7faeef57ff1a31682c9449bb31c58fdc","html":"https://github.com/vcr/vcr/blob/master/vcr.gemspec"}}]' 82 | recorded_at: Sun, 09 May 2021 17:25:48 GMT 83 | recorded_with: VCR 6.0.0 84 | -------------------------------------------------------------------------------- /spec/lock_diff/diff_info_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | module LockDiff 4 | RSpec.describe DiffInfo do 5 | describe '#status' do 6 | class DummySpec 7 | attr_reader :name, :revision, :version, :repository_url, :ruby_gem_url 8 | def initialize(name: 'dummy', revision: nil, version: "1.0.0", repository_url: nil, ruby_gem_url: nil) 9 | @name = name 10 | @revision = revision 11 | @version = ::Gem::Version.new(version) 12 | @repository_url = repository_url || 'https://github.com/dummy/dummy' 13 | @ruby_gem_url = ruby_gem_url || 'https://rubygems.org/gems/dummy' 14 | end 15 | 16 | def to_package 17 | Gem::Package.new(self) 18 | end 19 | end 20 | 21 | it 'returns upgrade if old version < new version' do 22 | old_package = DummySpec.new(version: "1.0.0").to_package 23 | new_package = DummySpec.new(version: "1.0.1").to_package 24 | instance = DiffInfo.new(old_package: old_package, new_package: new_package) 25 | expect(instance.status).to eq DiffInfo::UPGRADE 26 | end 27 | 28 | it 'returns upgrade if revision updated and version is same' do 29 | old_package = DummySpec.new(version: "1.0.0", revision: "123456").to_package 30 | new_package = DummySpec.new(version: "1.0.0", revision: "abcdef").to_package 31 | instance = DiffInfo.new(old_package: old_package, new_package: new_package) 32 | expect(instance.status).to eq DiffInfo::UPGRADE 33 | end 34 | 35 | it 'returns downgrade if old version > new version' do 36 | old_package = DummySpec.new(version: "1.0.1").to_package 37 | new_package = DummySpec.new(version: "1.0.0").to_package 38 | instance = DiffInfo.new(old_package: old_package, new_package: new_package) 39 | expect(instance.status).to eq DiffInfo::DOWNGRADE 40 | end 41 | 42 | it 'returns delete if new package is null' do 43 | old_package = DummySpec.new.to_package 44 | new_package = Gem::NullSpec.new('dummy').to_package 45 | instance = DiffInfo.new(old_package: old_package, new_package: new_package) 46 | expect(instance.status).to eq DiffInfo::DELETE 47 | end 48 | 49 | it 'returns new if old package is null' do 50 | old_package = Gem::NullSpec.new('dummy').to_package 51 | new_package = DummySpec.new.to_package 52 | instance = DiffInfo.new(old_package: old_package, new_package: new_package) 53 | expect(instance.status).to eq DiffInfo::NEW 54 | end 55 | 56 | end 57 | 58 | end 59 | end 60 | -------------------------------------------------------------------------------- /spec/lock_diff/gem/package_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | module LockDiff 4 | module Gem 5 | RSpec.describe Spec do 6 | let(:test_data) { TestData::Gem.new } 7 | let(:spec_with_revision) { Spec.new(test_data.sample_git_source) } 8 | let(:spec_with_git_tag) { Spec.new(test_data.lazy_specifications.find { |a| a.name == "brakeman" }) } 9 | let(:spec_without_ref) { Spec.new(test_data.lazy_specifications.find { |a| a.name == "dummy_gem" }) } 10 | let(:null_spec) { NullSpec.new("dummy") } 11 | 12 | describe '#ref', with_http: true do 13 | specify do 14 | expect(Package.new(spec_with_revision).ref).to eq spec_with_revision.revision 15 | 16 | VCR.use_cassette('brakeman') do 17 | expect(Package.new(spec_with_git_tag).ref).to eq "v3.6.2" 18 | end 19 | 20 | expect(Package.new(spec_without_ref).ref).to be_nil 21 | end 22 | end 23 | 24 | describe '#version_str' do 25 | specify do 26 | expect(Package.new(spec_with_revision).version_str).to eq spec_with_revision.revision 27 | expect(Package.new(spec_with_git_tag).version_str).to eq spec_with_git_tag.version.to_s 28 | expect(Package.new(spec_without_ref).version_str).to eq spec_without_ref.version.to_s 29 | expect(Package.new(null_spec).version_str).to eq "" 30 | end 31 | end 32 | 33 | describe '#different?' do 34 | skip 35 | end 36 | 37 | describe '#repository' do 38 | specify do 39 | spec = double(repository_url: 'https://github.com/rr/rr') 40 | expect(Package.new(spec).repository).to eq 'rr/rr' 41 | 42 | spec = double(repository_url: nil) 43 | expect(Package.new(spec).repository).to be_nil 44 | end 45 | end 46 | 47 | end 48 | end 49 | end 50 | -------------------------------------------------------------------------------- /spec/lock_diff/gem/spec_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | module LockDiff 4 | module Gem 5 | RSpec.describe Spec do 6 | let(:test_data) { TestData::Gem.new } 7 | 8 | describe '.new' do 9 | it 'returns RubyGemSpec if source is rubygems' do 10 | lazy_specification = test_data.sample_rubygems_source 11 | expect(Spec.new(lazy_specification)).to be_a Spec::RubyGemSpec 12 | end 13 | 14 | it 'returns RubyGemSpec if source is git' do 15 | lazy_specification = test_data.sample_git_source 16 | expect(Spec.new(lazy_specification)).to be_a Spec::GitSpec 17 | end 18 | 19 | it 'returns RubyGemSpec if source is path' do 20 | lazy_specification = test_data.sample_path_source 21 | expect(Spec.new(lazy_specification)).to be_a Spec::PathSpec 22 | end 23 | 24 | it 'raises error if unknown source' do 25 | lazy_specification = double(source: :unknown, name: :unknown) 26 | expect { Spec.new(lazy_specification)}.to raise_error Spec::UnSupportSource 27 | end 28 | end 29 | 30 | describe '.parse' do 31 | let(:lockfile) { test_data.lockfile } 32 | subject { Spec.parse(lockfile) } 33 | it { is_expected.to all(be_a Spec::Base) } 34 | end 35 | 36 | shared_examples_for 'Gem::Spec' do 37 | specify do 38 | expect(instance).to respond_to( 39 | *%w(revision to_package repository_url ruby_gem_url name version) 40 | ) 41 | end 42 | 43 | specify do 44 | expect(instance.version).to be_a(::Gem::Version).or(be_nil) 45 | expect(instance.to_package).to be_a Gem::Package 46 | end 47 | end 48 | 49 | describe 'RubyGemSpec class' do 50 | let(:lazy_specification) { test_data.sample_git_source } 51 | let(:instance) { Spec::RubyGemSpec.new(lazy_specification) } 52 | 53 | it_behaves_like 'Gem::Spec' 54 | 55 | describe '#repository_url', with_http: true do 56 | specify do 57 | VCR.use_cassette('github.com') do 58 | expect(instance.repository_url).to be_start_with 'https://github.com' 59 | end 60 | end 61 | end 62 | 63 | describe '#ruby_gem_url', with_http: true do 64 | specify do 65 | VCR.use_cassette('rubygems.org') do 66 | expect(instance.ruby_gem_url).to be_start_with 'https://rubygems.org/gems/' 67 | end 68 | end 69 | end 70 | end 71 | 72 | describe 'GitSpec class' do 73 | let(:lazy_specification) { test_data.sample_git_source } 74 | let(:instance) { Spec::GitSpec.new(lazy_specification) } 75 | 76 | it_behaves_like 'Gem::Spec' 77 | 78 | describe '#revision' do 79 | specify { expect(instance.revision).to eq lazy_specification.git_version.strip } 80 | end 81 | 82 | describe '#repository_url', with_http: true do 83 | specify { expect(instance.repository_url).to be_start_with "https://github.com/" } 84 | end 85 | end 86 | 87 | describe 'PathSpec class' do 88 | it_behaves_like 'Gem::Spec' do 89 | let(:instance) { Spec::PathSpec.new(test_data.sample_path_source) } 90 | end 91 | end 92 | 93 | describe 'NullSpec class' do 94 | it_behaves_like 'Gem::Spec' do 95 | let(:instance) { NullSpec.new('dummy') } 96 | end 97 | end 98 | end 99 | end 100 | end 101 | -------------------------------------------------------------------------------- /spec/lock_diff/github/content_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | module LockDiff::Github 4 | RSpec.describe Content do 5 | describe '#change_log?' do 6 | specify do 7 | change_log = Content.new OpenStruct.new(type: 'file', name: 'CHANGELOG.md') 8 | release_note = Content.new OpenStruct.new(type: 'file', name: 'RELEASE_NOTE.md') 9 | gemfile = Content.new OpenStruct.new(type: 'file', name: 'Gemfile') 10 | directory = Content.new OpenStruct.new(type: 'dir', name: 'app') 11 | 12 | expect(change_log).to be_change_log 13 | expect(release_note).to be_change_log 14 | expect(gemfile).not_to be_change_log 15 | expect(directory).not_to be_change_log 16 | end 17 | end 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /spec/lock_diff/github/directory_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | module LockDiff::Github 4 | RSpec.describe Directory do 5 | describe '#change_log_urls?' do 6 | context 'CHANGELOG exists in repository root' do 7 | specify do 8 | repository = Directory.new('vcr/vcr', 'master') 9 | 10 | ::VCR.use_cassette('vcr') do 11 | expect(repository.change_log_urls).to eq ['https://github.com/vcr/vcr/blob/master/CHANGELOG.md'] 12 | end 13 | end 14 | end 15 | 16 | context 'CHANGELOG does not exist in repository root' do 17 | specify do 18 | repository = Directory.new('rails/rails', 'master') 19 | 20 | ::VCR.use_cassette('rails') do 21 | expect(repository.change_log_urls).to eq [] 22 | end 23 | end 24 | end 25 | 26 | context 'CHANGELOG exists in subdirectory' do 27 | specify do 28 | repository = Directory.new('aws/aws-sdk-ruby', 'version-3', path: 'gems/aws-sdk-s3') 29 | 30 | ::VCR.use_cassette('aws') do 31 | expect(repository.change_log_urls).to eq ['https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/CHANGELOG.md'] 32 | end 33 | end 34 | end 35 | end 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /spec/lock_diff/github/repository_name_detector_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | module LockDiff::Github 4 | RSpec.describe RepositoryNameDetector do 5 | specify do 6 | expect(RepositoryNameDetector.new("https://github.com/rr/rr").call).to eq 'rr/rr' 7 | expect(RepositoryNameDetector.new("https://github.com/rr/rr/foo/bar/baz").call).to eq 'rr/rr' 8 | expect(RepositoryNameDetector.new("https://github.com/rr/rr/foo#readme").call).to eq 'rr/rr' 9 | expect(RepositoryNameDetector.new('https://rubygems.org/gems/rr').call).to eq nil 10 | expect(RepositoryNameDetector.new(nil).call).to eq nil 11 | end 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /spec/lock_diff/github/tag_finder_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | module LockDiff::Github 4 | RSpec.describe TagFinder, with_http: true do 5 | [ 6 | { 7 | repository: "presidentbeef/brakeman", 8 | package_name: "brakeman", 9 | version: ::Gem::Version.new("3.7.0"), 10 | expected: 'v3.7.0' 11 | }, 12 | { 13 | repository: "sporkmonger/addressable", 14 | package_name: "addressable", 15 | version: ::Gem::Version.new("2.4.0"), 16 | expected: 'addressable-2.4.0' 17 | }, 18 | { 19 | repository: "rack/rack", 20 | package_name: "rack", 21 | version: ::Gem::Version.new("2.0.1"), 22 | expected: '2.0.1' 23 | }, 24 | { 25 | repository: "ckruse/CFPropertyList", 26 | package_name: "CFPropertyList", 27 | version: ::Gem::Version.new("2.2.8"), 28 | expected: 'cfpropertylist-2.2.8' 29 | }, 30 | { 31 | repository: "vividmuimui/lock_diff", 32 | package_name: "lock_diff", 33 | version: ::Gem::Version.new("0.3.1.pre"), 34 | expected: 'v0.3.1.pre' 35 | }, 36 | ].each do |params| 37 | specify do 38 | VCR.use_cassette(params[:package_name]) do 39 | tag = TagFinder.new(repository: params[:repository], package_name: params[:package_name], version: params[:version]).call 40 | expect(tag).to eq params[:expected] 41 | end 42 | end 43 | end 44 | end 45 | end 46 | -------------------------------------------------------------------------------- /spec/lock_diff/github/url_detector_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | module LockDiff 4 | module Github 5 | RSpec.describe UrlDetector, with_http: true do 6 | specify do 7 | urls = [ 8 | 'https://github.com/rr/rr', 9 | 'https://rr.github.io/rr/', 10 | 'http://github.com/rr/rr', 11 | 'https://github.com/rr/rr.git', 12 | 'https://github.com/rr/rr/foo/bar/baz', 13 | ] 14 | VCR.use_cassette('rr') do 15 | urls.each do |url| 16 | expect(UrlDetector.new(url).call).to eq 'https://github.com/rr/rr' 17 | end 18 | end 19 | end 20 | 21 | specify do 22 | urls = [ 23 | 'http://example.com/dummy', 24 | 'https://github.com/rr/rr', 25 | ] 26 | expect(UrlDetector.new(urls).call).to eq 'https://github.com/rr/rr' 27 | end 28 | end 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /spec/lock_diff_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | RSpec.describe LockDiff do 4 | it "has a version number" do 5 | expect(LockDiff::VERSION).not_to be nil 6 | end 7 | 8 | it "has initialized config" do 9 | expect(LockDiff.config).to be_a LockDiff::Config 10 | expect(LockDiff.config.pr_repository_service).to eq LockDiff::Github 11 | expect(LockDiff.config.formatter).to eq LockDiff::Formatter::GithubMarkdown 12 | expect(LockDiff.config.strategy).to eq LockDiff::Gem 13 | expect(LockDiff.logger).to be_a Logger 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | require "bundler/setup" 2 | require "lock_diff" 3 | require "vcr" 4 | Dir[File.expand_path(File.dirname(__FILE__) + "/support/**/*.rb")].each(&method(:require)) 5 | 6 | RSpec.configure do |config| 7 | # Enable flags like --only-failures and --next-failure 8 | config.example_status_persistence_file_path = ".rspec_status" 9 | 10 | # Disable RSpec exposing methods globally on `Module` and `main` 11 | config.disable_monkey_patching! 12 | 13 | config.expect_with :rspec do |c| 14 | c.syntax = :expect 15 | end 16 | 17 | # config.filter_run_excluding with_http: true 18 | end 19 | 20 | VCR.configure do |config| 21 | config.cassette_library_dir = "spec/fixtures/vcr_cassettes" 22 | config.hook_into :webmock 23 | config.filter_sensitive_data('') { ENV.fetch('GITHUB_ACCESS_TOKEN') } 24 | end 25 | 26 | LockDiff.logger.level = :debug 27 | -------------------------------------------------------------------------------- /spec/support/test_data.rb: -------------------------------------------------------------------------------- 1 | module TestData 2 | class Gem 3 | FILES = { 4 | default: File.read(File.expand_path(File.dirname(__FILE__) + "/../test_data/lockfile/gemfile_lock/Gemfile.lock.base")), 5 | base: File.read(File.expand_path(File.dirname(__FILE__) + "/../test_data/lockfile/gemfile_lock/Gemfile.lock.base")), 6 | head: File.read(File.expand_path(File.dirname(__FILE__) + "/../test_data/lockfile/gemfile_lock/Gemfile.lock.head")) 7 | } 8 | 9 | attr_reader :lockfile 10 | 11 | def initialize(lockfile = FILES[:default]) 12 | @lockfile = lockfile 13 | end 14 | 15 | def lockfile_parser 16 | Bundler::LockfileParser.new(lockfile) 17 | end 18 | 19 | def lazy_specifications 20 | lockfile_parser.specs 21 | end 22 | 23 | def sample_git_source 24 | lazy_specifications.select { |spec| spec.source.class == Bundler::Source::Git }.sample 25 | end 26 | 27 | def sample_rubygems_source 28 | lazy_specifications.select { |spec| spec.source.class == Bundler::Source::Rubygems }.sample 29 | end 30 | 31 | def sample_path_source 32 | lazy_specifications.select { |spec| spec.source.class == Bundler::Source::Path }.sample 33 | end 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /spec/test_data/lockfile/gemfile_lock/Gemfile.lock.base: -------------------------------------------------------------------------------- 1 | GIT 2 | remote: https://github.com/awesome-print/awesome_print.git 3 | revision: b15046845dca3d4eb7c36c18afe1dff86a9451e2 4 | branch: v1.7.0 5 | specs: 6 | awesome_print (1.7.0) 7 | 8 | PATH 9 | remote: dummy_gem2 10 | specs: 11 | dummy_gem2 (0.1.0) 12 | 13 | PATH 14 | remote: dummy_gem 15 | specs: 16 | dummy_gem (0.1.0) 17 | 18 | GEM 19 | remote: https://rubygems.org/ 20 | specs: 21 | CFPropertyList (2.2.8) 22 | actioncable (5.1.1) 23 | actionpack (= 5.1.1) 24 | nio4r (~> 2.0) 25 | websocket-driver (~> 0.6.1) 26 | actionmailer (5.1.1) 27 | actionpack (= 5.1.1) 28 | actionview (= 5.1.1) 29 | activejob (= 5.1.1) 30 | mail (~> 2.5, >= 2.5.4) 31 | rails-dom-testing (~> 2.0) 32 | actionpack (5.1.1) 33 | actionview (= 5.1.1) 34 | activesupport (= 5.1.1) 35 | rack (~> 2.0) 36 | rack-test (~> 0.6.3) 37 | rails-dom-testing (~> 2.0) 38 | rails-html-sanitizer (~> 1.0, >= 1.0.2) 39 | actionview (5.1.1) 40 | activesupport (= 5.1.1) 41 | builder (~> 3.1) 42 | erubi (~> 1.4) 43 | rails-dom-testing (~> 2.0) 44 | rails-html-sanitizer (~> 1.0, >= 1.0.3) 45 | activejob (5.1.1) 46 | activesupport (= 5.1.1) 47 | globalid (>= 0.3.6) 48 | activemodel (5.1.1) 49 | activesupport (= 5.1.1) 50 | activerecord (5.1.1) 51 | activemodel (= 5.1.1) 52 | activesupport (= 5.1.1) 53 | arel (~> 8.0) 54 | activesupport (5.1.1) 55 | concurrent-ruby (~> 1.0, >= 1.0.2) 56 | i18n (~> 0.7) 57 | minitest (~> 5.1) 58 | tzinfo (~> 1.1) 59 | addressable (2.4.0) 60 | arel (8.0.0) 61 | ast (2.3.0) 62 | autoprefixer-rails (7.1.2.3) 63 | execjs 64 | brakeman (3.6.2) 65 | builder (3.2.2) 66 | concurrent-ruby (1.0.5) 67 | domain_name (0.5.20160216) 68 | unf (>= 0.0.5, < 1.0.0) 69 | erubi (1.6.1) 70 | execjs (2.7.0) 71 | ffi (1.9.18) 72 | globalid (0.4.0) 73 | activesupport (>= 4.2.0) 74 | i18n (0.8.6) 75 | loofah (2.0.3) 76 | nokogiri (>= 1.5.9) 77 | mail (2.6.4) 78 | mime-types (>= 1.16, < 4) 79 | method_source (0.8.2) 80 | mime-types (3.1) 81 | mime-types-data (~> 3.2015) 82 | mime-types-data (3.2016.0521) 83 | mini_portile2 (2.2.0) 84 | minitest (5.10.2) 85 | momentjs-rails (2.11.0) 86 | railties (>= 3.1) 87 | newrelic_rpm (4.1.0.333) 88 | nio4r (2.1.0) 89 | nokogiri (1.8.0) 90 | mini_portile2 (~> 2.2.0) 91 | parser (2.3.1.2) 92 | ast (~> 2.2) 93 | pg (0.21.0) 94 | rack (2.0.2) 95 | rack-test (0.6.3) 96 | rack (>= 1.0) 97 | rails (5.1.1) 98 | actioncable (= 5.1.1) 99 | actionmailer (= 5.1.1) 100 | actionpack (= 5.1.1) 101 | actionview (= 5.1.1) 102 | activejob (= 5.1.1) 103 | activemodel (= 5.1.1) 104 | activerecord (= 5.1.1) 105 | activesupport (= 5.1.1) 106 | bundler (>= 1.3.0, < 2.0) 107 | railties (= 5.1.1) 108 | sprockets-rails (>= 2.0.0) 109 | rails-dom-testing (2.0.3) 110 | activesupport (>= 4.2.0) 111 | nokogiri (>= 1.6) 112 | rails-html-sanitizer (1.0.3) 113 | loofah (~> 2.0) 114 | railties (5.1.1) 115 | actionpack (= 5.1.1) 116 | activesupport (= 5.1.1) 117 | method_source 118 | rake (>= 0.8.7) 119 | thor (>= 0.18.1, < 2.0) 120 | rake (11.1.2) 121 | rb-fsevent (0.9.7) 122 | rb-inotify (0.9.8) 123 | ffi (>= 0.5.0) 124 | simplecov-html (0.10.0) 125 | sprockets (3.7.1) 126 | concurrent-ruby (~> 1.0) 127 | rack (> 1, < 3) 128 | sprockets-rails (3.2.0) 129 | actionpack (>= 4.0) 130 | activesupport (>= 4.0) 131 | sprockets (>= 3.0.0) 132 | thor (0.19.4) 133 | thread_safe (0.3.6) 134 | tzinfo (1.2.3) 135 | thread_safe (~> 0.1) 136 | unf (0.1.4) 137 | unf_ext 138 | unf_ext (0.0.7.4) 139 | websocket-driver (0.6.5) 140 | websocket-extensions (>= 0.1.0) 141 | websocket-extensions (0.1.2) 142 | 143 | PLATFORMS 144 | ruby 145 | 146 | DEPENDENCIES 147 | CFPropertyList (= 2.2.8) 148 | addressable (= 2.4.0) 149 | autoprefixer-rails 150 | awesome_print! 151 | brakeman (= 3.6.2) 152 | builder (= 3.2.2) 153 | domain_name (= 0.5.20160216) 154 | dummy_gem (= 0.1.0)! 155 | dummy_gem2 (= 0.1.0)! 156 | mail (= 2.6.4) 157 | momentjs-rails (= 2.11.0) 158 | newrelic_rpm (= 4.1.0.333) 159 | parser (= 2.3.1.2) 160 | pg (= 0.21.0) 161 | rack (= 2.0.2) 162 | rails (= 5.1.1) 163 | rake (= 11.1.2) 164 | rb-fsevent (= 0.9.7) 165 | rb-inotify (= 0.9.8) 166 | simplecov-html (= 0.10.0) 167 | 168 | BUNDLED WITH 169 | 1.15.2 170 | -------------------------------------------------------------------------------- /spec/test_data/lockfile/gemfile_lock/Gemfile.lock.head: -------------------------------------------------------------------------------- 1 | GIT 2 | remote: https://github.com/awesome-print/awesome_print.git 3 | revision: 9a591077c0aecfe8101b05f16c5472b79247cbc6 4 | specs: 5 | awesome_print (1.8.0) 6 | 7 | PATH 8 | remote: dummy_gem2 9 | specs: 10 | dummy_gem2 (0.0.9) 11 | 12 | PATH 13 | remote: dummy_gem 14 | specs: 15 | dummy_gem (0.1.1) 16 | 17 | GEM 18 | remote: https://rubygems.org/ 19 | specs: 20 | CFPropertyList (2.3.5) 21 | actioncable (5.1.2) 22 | actionpack (= 5.1.2) 23 | nio4r (~> 2.0) 24 | websocket-driver (~> 0.6.1) 25 | actionmailer (5.1.2) 26 | actionpack (= 5.1.2) 27 | actionview (= 5.1.2) 28 | activejob (= 5.1.2) 29 | mail (~> 2.5, >= 2.5.4) 30 | rails-dom-testing (~> 2.0) 31 | actionpack (5.1.2) 32 | actionview (= 5.1.2) 33 | activesupport (= 5.1.2) 34 | rack (~> 2.0) 35 | rack-test (~> 0.6.3) 36 | rails-dom-testing (~> 2.0) 37 | rails-html-sanitizer (~> 1.0, >= 1.0.2) 38 | actionview (5.1.2) 39 | activesupport (= 5.1.2) 40 | builder (~> 3.1) 41 | erubi (~> 1.4) 42 | rails-dom-testing (~> 2.0) 43 | rails-html-sanitizer (~> 1.0, >= 1.0.3) 44 | activejob (5.1.2) 45 | activesupport (= 5.1.2) 46 | globalid (>= 0.3.6) 47 | activemodel (5.1.2) 48 | activesupport (= 5.1.2) 49 | activerecord (5.1.2) 50 | activemodel (= 5.1.2) 51 | activesupport (= 5.1.2) 52 | arel (~> 8.0) 53 | activesupport (5.1.2) 54 | concurrent-ruby (~> 1.0, >= 1.0.2) 55 | i18n (~> 0.7) 56 | minitest (~> 5.1) 57 | tzinfo (~> 1.1) 58 | addressable (2.5.1) 59 | public_suffix (~> 2.0, >= 2.0.2) 60 | arel (8.0.0) 61 | ast (2.3.0) 62 | brakeman (3.7.0) 63 | builder (3.2.3) 64 | concurrent-ruby (1.0.5) 65 | domain_name (0.5.20170404) 66 | unf (>= 0.0.5, < 1.0.0) 67 | erubi (1.6.1) 68 | ffi (1.9.18) 69 | globalid (0.4.0) 70 | activesupport (>= 4.2.0) 71 | i18n (0.8.6) 72 | loofah (2.0.3) 73 | nokogiri (>= 1.5.9) 74 | mail (2.6.6) 75 | mime-types (>= 1.16, < 4) 76 | method_source (0.8.2) 77 | mime-types (3.1) 78 | mime-types-data (~> 3.2015) 79 | mime-types-data (3.2016.0521) 80 | mini_portile2 (2.2.0) 81 | minitest (5.10.3) 82 | momentjs-rails (2.10.6) 83 | railties (>= 3.1) 84 | newrelic_rpm (4.2.0.334) 85 | nio4r (2.1.0) 86 | nokogiri (1.8.0) 87 | mini_portile2 (~> 2.2.0) 88 | parser (2.4.0.0) 89 | ast (~> 2.2) 90 | pg (0.20.0) 91 | public_suffix (2.0.5) 92 | rack (2.0.1) 93 | rack-test (0.6.3) 94 | rack (>= 1.0) 95 | rails (5.1.2) 96 | actioncable (= 5.1.2) 97 | actionmailer (= 5.1.2) 98 | actionpack (= 5.1.2) 99 | actionview (= 5.1.2) 100 | activejob (= 5.1.2) 101 | activemodel (= 5.1.2) 102 | activerecord (= 5.1.2) 103 | activesupport (= 5.1.2) 104 | bundler (>= 1.3.0, < 2.0) 105 | railties (= 5.1.2) 106 | sprockets-rails (>= 2.0.0) 107 | rails-dom-testing (2.0.3) 108 | activesupport (>= 4.2.0) 109 | nokogiri (>= 1.6) 110 | rails-html-sanitizer (1.0.3) 111 | loofah (~> 2.0) 112 | railties (5.1.2) 113 | actionpack (= 5.1.2) 114 | activesupport (= 5.1.2) 115 | method_source 116 | rake (>= 0.8.7) 117 | thor (>= 0.18.1, < 2.0) 118 | rake (12.0.0) 119 | rb-fsevent (0.10.2) 120 | rb-inotify (0.9.10) 121 | ffi (>= 0.5.0, < 2) 122 | simplecov-html (0.10.1) 123 | sprockets (3.7.1) 124 | concurrent-ruby (~> 1.0) 125 | rack (> 1, < 3) 126 | sprockets-rails (3.2.0) 127 | actionpack (>= 4.0) 128 | activesupport (>= 4.0) 129 | sprockets (>= 3.0.0) 130 | thor (0.19.4) 131 | thread_safe (0.3.6) 132 | tzinfo (1.2.3) 133 | thread_safe (~> 0.1) 134 | unf (0.1.4) 135 | unf_ext 136 | unf_ext (0.0.7.4) 137 | websocket-driver (0.6.5) 138 | websocket-extensions (>= 0.1.0) 139 | websocket-extensions (0.1.2) 140 | 141 | PLATFORMS 142 | ruby 143 | 144 | DEPENDENCIES 145 | CFPropertyList 146 | addressable 147 | awesome_print! 148 | brakeman 149 | builder 150 | domain_name 151 | dummy_gem! 152 | dummy_gem2! 153 | mail 154 | momentjs-rails (= 2.10.6) 155 | newrelic_rpm 156 | parser 157 | pg (= 0.20.0) 158 | rack (= 2.0.1) 159 | rails 160 | rake 161 | rb-fsevent 162 | rb-inotify 163 | simplecov-html 164 | 165 | BUNDLED WITH 166 | 1.15.2 167 | --------------------------------------------------------------------------------