unwrappr 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.buildkite/pipeline.yml +38 -0
  3. data/.buildkite/steps/rspec.sh +9 -0
  4. data/.buildkite/steps/rubocop.sh +9 -0
  5. data/.gitignore +14 -0
  6. data/.rspec +3 -0
  7. data/.rubocop.yml +25 -0
  8. data/.travis.yml +5 -0
  9. data/CHANGELOG.md +9 -0
  10. data/CODE_OF_CONDUCT.md +74 -0
  11. data/Gemfile +8 -0
  12. data/Guardfile +16 -0
  13. data/LICENSE.txt +21 -0
  14. data/README.md +118 -0
  15. data/Rakefile +10 -0
  16. data/bin/console +11 -0
  17. data/bin/setup +8 -0
  18. data/exe/unwrappr +11 -0
  19. data/lib/unwrappr/bundler_command_runner.rb +25 -0
  20. data/lib/unwrappr/cli.rb +45 -0
  21. data/lib/unwrappr/gem_change.rb +54 -0
  22. data/lib/unwrappr/gem_version.rb +57 -0
  23. data/lib/unwrappr/git_command_runner.rb +81 -0
  24. data/lib/unwrappr/github/client.rb +75 -0
  25. data/lib/unwrappr/github/pr_sink.rb +28 -0
  26. data/lib/unwrappr/github/pr_source.rb +59 -0
  27. data/lib/unwrappr/lock_file_annotator.rb +65 -0
  28. data/lib/unwrappr/lock_file_comparator.rb +28 -0
  29. data/lib/unwrappr/lock_file_diff.rb +71 -0
  30. data/lib/unwrappr/octokit.rb +8 -0
  31. data/lib/unwrappr/researchers/composite.rb +21 -0
  32. data/lib/unwrappr/researchers/github_comparison.rb +43 -0
  33. data/lib/unwrappr/researchers/github_repo.rb +25 -0
  34. data/lib/unwrappr/researchers/ruby_gems_info.rb +17 -0
  35. data/lib/unwrappr/researchers/security_vulnerabilities.rb +50 -0
  36. data/lib/unwrappr/ruby_gems.rb +39 -0
  37. data/lib/unwrappr/spec_version_comparator.rb +19 -0
  38. data/lib/unwrappr/version.rb +5 -0
  39. data/lib/unwrappr/writers/composite.rb +21 -0
  40. data/lib/unwrappr/writers/github_commit_log.rb +72 -0
  41. data/lib/unwrappr/writers/project_links.rb +45 -0
  42. data/lib/unwrappr/writers/security_vulnerabilities.rb +109 -0
  43. data/lib/unwrappr/writers/title.rb +32 -0
  44. data/lib/unwrappr/writers/version_change.rb +58 -0
  45. data/lib/unwrappr.rb +32 -0
  46. data/unwrappr.gemspec +56 -0
  47. metadata +299 -0
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unwrappr
4
+ module Writers
5
+ # Inform of the number of commits included in the change. Annotate several
6
+ # commits, and link to the Github compare page on which we can see all the
7
+ # commits and file changes.
8
+ #
9
+ # Implements the `annotation_writer` interface required by the
10
+ # LockFileAnnotator.
11
+ class GithubCommitLog
12
+ MAX_COMMITS = 10
13
+ MAX_MESSAGE = 60
14
+ SHA_LENGTH = 7
15
+
16
+ def self.write(gem_change, gem_change_info)
17
+ new(gem_change, gem_change_info).write
18
+ end
19
+
20
+ def initialize(gem_change, gem_change_info)
21
+ @gem_change = gem_change
22
+ @gem_change_info = gem_change_info
23
+ end
24
+
25
+ def write
26
+ return nil if comparison.nil?
27
+
28
+ collapsed_section('Commits', <<~MESSAGE)
29
+ A change of **#{comparison.total_commits}** commits. See the full changes on [the compare page](#{comparison.html_url}).
30
+
31
+ #{list_commits_introduction}
32
+ #{commit_messages.join("\n")}
33
+ MESSAGE
34
+ end
35
+
36
+ private
37
+
38
+ def list_commits_introduction
39
+ if comparison.commits.length > MAX_COMMITS
40
+ "These are the first #{MAX_COMMITS} commits:"
41
+ else
42
+ 'These are the individual commits:'
43
+ end
44
+ end
45
+
46
+ def commit_messages
47
+ comparison.commits.first(MAX_COMMITS).map(&method(:commit_message))
48
+ end
49
+
50
+ def commit_message(commit)
51
+ message = commit.commit.message.lines.first.strip
52
+ message = "#{message[0, MAX_MESSAGE]}…" if message.length > MAX_MESSAGE
53
+ "- (#{commit.sha[0, SHA_LENGTH]}) [#{message}](#{commit.html_url})"
54
+ end
55
+
56
+ def comparison
57
+ @gem_change_info[:github_comparison]
58
+ end
59
+
60
+ def collapsed_section(summary, body)
61
+ <<~MESSAGE
62
+ <details>
63
+ <summary>#{summary}</summary>
64
+
65
+ #{body}
66
+
67
+ </details>
68
+ MESSAGE
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unwrappr
4
+ module Writers
5
+ # Add links to project documentation as obtained from Rubygems.org.
6
+ # Specifically, the changelog and sourcecode.
7
+ #
8
+ # Implements the `annotation_writer` interface required by the
9
+ # LockFileAnnotator.
10
+ class ProjectLinks
11
+ def self.write(gem_change, gem_change_info)
12
+ new(gem_change, gem_change_info).write
13
+ end
14
+
15
+ def initialize(gem_change, gem_change_info)
16
+ @gem_change = gem_change
17
+ @gem_change_info = gem_change_info
18
+ end
19
+
20
+ def write
21
+ "[_#{change_log}, #{source_code}_]\n"
22
+ end
23
+
24
+ private
25
+
26
+ def change_log
27
+ link_or_strikethrough('change-log',
28
+ @gem_change_info[:ruby_gems]&.changelog_uri)
29
+ end
30
+
31
+ def source_code
32
+ link_or_strikethrough('source-code',
33
+ @gem_change_info[:ruby_gems]&.source_code_uri)
34
+ end
35
+
36
+ def link_or_strikethrough(text, url)
37
+ if url.nil? || url.empty?
38
+ "~~#{text}~~"
39
+ else
40
+ "[#{text}](#{url})"
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unwrappr
4
+ module Writers
5
+ # Present reported security vulnerabilities in the gem change annotation.
6
+ #
7
+ # Implements the `annotation_writer` interface required by the
8
+ # LockFileAnnotator.
9
+ class SecurityVulnerabilities
10
+ def self.write(gem_change, gem_change_info)
11
+ new(gem_change, gem_change_info).write
12
+ end
13
+
14
+ def initialize(gem_change, gem_change_info)
15
+ @gem_change = gem_change
16
+ @gem_change_info = gem_change_info
17
+ end
18
+
19
+ def write
20
+ return nil if vulnerabilities.nil?
21
+
22
+ <<~MESSAGE
23
+ #{patched_vulnerabilities}
24
+ #{introduced_vulnerabilities}
25
+ #{remaining_vulnerabilities}
26
+ MESSAGE
27
+ end
28
+
29
+ private
30
+
31
+ def patched_vulnerabilities
32
+ list_vulnerabilites(
33
+ ':tada: Patched vulnerabilities:',
34
+ vulnerabilities.patched
35
+ )
36
+ end
37
+
38
+ def introduced_vulnerabilities
39
+ list_vulnerabilites(
40
+ ':rotating_light::exclamation: Introduced vulnerabilities:',
41
+ vulnerabilities.introduced
42
+ )
43
+ end
44
+
45
+ def remaining_vulnerabilities
46
+ list_vulnerabilites(
47
+ ':rotating_light: Remaining vulnerabilities:',
48
+ vulnerabilities.remaining
49
+ )
50
+ end
51
+
52
+ def list_vulnerabilites(message, advisories)
53
+ return nil if advisories.empty?
54
+
55
+ <<~MESSAGE
56
+ #{message}
57
+
58
+ #{advisories.map(&method(:render_vulnerability)).join("\n")}
59
+ MESSAGE
60
+ end
61
+
62
+ def render_vulnerability(advisory)
63
+ <<~MESSAGE
64
+ - #{identifier(advisory)}
65
+ **#{advisory.title}**
66
+
67
+ #{cvss_v2(advisory)}
68
+ #{link(advisory)}
69
+
70
+ #{advisory.description&.gsub("\n", ' ')&.strip}
71
+
72
+ MESSAGE
73
+ end
74
+
75
+ def identifier(advisory)
76
+ if advisory.cve_id
77
+ "[#{advisory.cve_id}](#{cve_url(advisory.cve_id)})"
78
+ elsif advisory.osvdb_id
79
+ advisory.osvdb_id
80
+ end
81
+ end
82
+
83
+ def cve_url(id)
84
+ "https://nvd.nist.gov/vuln/detail/#{id}"
85
+ end
86
+
87
+ def cvss_v2(advisory)
88
+ # rubocop:disable Style/GuardClause
89
+ if advisory.cvss_v2
90
+ "CVSS V2: [#{advisory.cvss_v2} #{advisory.criticality}]"\
91
+ "(#{cvss_v2_url(advisory.cve_id)})"
92
+ end
93
+ # rubocop:enable Style/GuardClause
94
+ end
95
+
96
+ def cvss_v2_url(id)
97
+ "https://nvd.nist.gov/vuln-metrics/cvss/v2-calculator?name=#{id}"
98
+ end
99
+
100
+ def link(advisory)
101
+ "URL: #{advisory.url}" if advisory.url
102
+ end
103
+
104
+ def vulnerabilities
105
+ @gem_change_info[:security_vulnerabilities]
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unwrappr
4
+ module Writers
5
+ # Add the gem name to the annotation as a heading. If a homepage
6
+ # URI has been determined this heading will link to that page.
7
+ #
8
+ # Implements the `annotation_writer` interface required by the
9
+ # LockFileAnnotator.
10
+ module Title
11
+ class << self
12
+ def write(gem_change, gem_change_info)
13
+ embellished_gem_name = maybe_link(
14
+ gem_change.name,
15
+ gem_change_info[:ruby_gems]&.homepage_uri
16
+ )
17
+ "### #{embellished_gem_name}\n"
18
+ end
19
+
20
+ private
21
+
22
+ def maybe_link(text, url)
23
+ if url.nil?
24
+ text
25
+ else
26
+ "[#{text}](#{url})"
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unwrappr
4
+ module Writers
5
+ # Describe the version change. Is it an upgrade to a later version, or a
6
+ # downgrade to an older version? Is it a major, minor or patch version
7
+ # change?
8
+ #
9
+ # Implements the `annotation_writer` interface required by the
10
+ # LockFileAnnotator.
11
+ class VersionChange
12
+ extend Forwardable
13
+
14
+ def self.write(gem_change, gem_change_info)
15
+ new(gem_change, gem_change_info).write
16
+ end
17
+
18
+ def initialize(gem_change, gem_change_info)
19
+ @gem_change = gem_change
20
+ @gem_change_info = gem_change_info
21
+ end
22
+
23
+ def write
24
+ "#{change_description}\n"
25
+ end
26
+
27
+ private
28
+
29
+ def_delegators(:@gem_change,
30
+ :added?, :removed?, :major?, :minor?, :patch?,
31
+ :upgrade?, :downgrade?, :base_version, :head_version)
32
+
33
+ def change_description
34
+ if added? then 'Gem added :snowman:'
35
+ elsif removed? then 'Gem removed :fire:'
36
+ elsif major?
37
+ "**Major** version #{grade}:exclamation: #{version_diff}"
38
+ elsif minor?
39
+ "**Minor** version #{grade}:large_orange_diamond: #{version_diff}"
40
+ elsif patch?
41
+ "**Patch** version #{grade}:small_blue_diamond: #{version_diff}"
42
+ end
43
+ end
44
+
45
+ def grade
46
+ if upgrade?
47
+ 'upgrade :chart_with_upwards_trend:'
48
+ elsif downgrade?
49
+ 'downgrade :chart_with_downwards_trend::exclamation:'
50
+ end
51
+ end
52
+
53
+ def version_diff
54
+ "#{base_version} → #{head_version}"
55
+ end
56
+ end
57
+ end
58
+ end
data/lib/unwrappr.rb ADDED
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'unwrappr/bundler_command_runner'
4
+ require 'unwrappr/cli'
5
+ require 'unwrappr/gem_change'
6
+ require 'unwrappr/gem_version'
7
+ require 'unwrappr/git_command_runner'
8
+ require 'unwrappr/github/client'
9
+ require 'unwrappr/github/pr_sink'
10
+ require 'unwrappr/github/pr_source'
11
+ require 'unwrappr/lock_file_annotator'
12
+ require 'unwrappr/lock_file_comparator'
13
+ require 'unwrappr/lock_file_diff'
14
+ require 'unwrappr/octokit'
15
+ require 'unwrappr/researchers/composite'
16
+ require 'unwrappr/researchers/github_comparison'
17
+ require 'unwrappr/researchers/github_repo'
18
+ require 'unwrappr/researchers/ruby_gems_info'
19
+ require 'unwrappr/researchers/security_vulnerabilities'
20
+ require 'unwrappr/ruby_gems'
21
+ require 'unwrappr/spec_version_comparator'
22
+ require 'unwrappr/version'
23
+ require 'unwrappr/writers/composite'
24
+ require 'unwrappr/writers/github_commit_log'
25
+ require 'unwrappr/writers/project_links'
26
+ require 'unwrappr/writers/security_vulnerabilities'
27
+ require 'unwrappr/writers/title'
28
+ require 'unwrappr/writers/version_change'
29
+
30
+ # Define our namespace
31
+ module Unwrappr
32
+ end
data/unwrappr.gemspec ADDED
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'unwrappr/version'
6
+
7
+ AUTHORS = {
8
+ 'emilyn.escabarte@envato.com' => 'Emilyn Escabarte',
9
+ 'joe.sustaric@envato.com' => 'Joe Sustaric',
10
+ 'orien.madgwick@envato.com' => 'Orien Madgwick',
11
+ 'pete.johns@envato.com' => 'Pete Johns',
12
+ 'vladimir.chervanev@envato.com' => 'Vladimir Chervanev'
13
+ }.freeze
14
+
15
+ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength:
16
+ spec.name = 'unwrappr'
17
+ spec.version = Unwrappr::VERSION
18
+ spec.authors = AUTHORS.values
19
+ spec.email = AUTHORS.keys
20
+
21
+ spec.summary = "A tool to unwrap your gems and see what's changed easily"
22
+ spec.description = "Let's fill this bit out later"
23
+ spec.homepage = 'http://www.unwrappr.com.org'
24
+ spec.license = 'MIT'
25
+
26
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
+ f.match(%r{^(test|spec|features)/})
28
+ end
29
+ spec.bindir = 'exe'
30
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
+ spec.require_paths = ['lib']
32
+
33
+ spec.add_dependency 'bundler', '~> 1.16'
34
+ spec.add_dependency 'bundler-audit', '~> 0'
35
+ spec.add_dependency 'clamp', '~> 1'
36
+ spec.add_dependency 'faraday', '~> 0'
37
+ spec.add_dependency 'git', '~> 1'
38
+ spec.add_dependency 'octokit', '~> 4.0'
39
+ spec.add_dependency 'safe_shell', '~> 1'
40
+
41
+ spec.add_development_dependency 'guard', '~> 2'
42
+ spec.add_development_dependency 'guard-rspec', '~> 4'
43
+ spec.add_development_dependency 'pry', '~> 0'
44
+ spec.add_development_dependency 'rake', '~> 10.0'
45
+ spec.add_development_dependency 'rspec', '~> 3.0'
46
+ spec.add_development_dependency 'rspec-its', '~> 1'
47
+ spec.add_development_dependency 'rubocop', '~> 0'
48
+
49
+ spec.metadata = {
50
+ 'bug_tracker_uri' => 'https://github.com/envato/unwrappr/issues',
51
+ 'changelog_uri' => 'https://github.com/envato/unwrappr/blob/master/CHANGELOG.md',
52
+ 'documentation_uri' => 'https://github.com/envato/unwrappr/blob/master/README.md',
53
+ 'homepage_uri' => 'https://opensource.envato.com/projects/unwrappr.html',
54
+ 'source_code_uri' => 'https://github.com/envato/unwrappr'
55
+ }
56
+ end
metadata ADDED
@@ -0,0 +1,299 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: unwrappr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Emilyn Escabarte
8
+ - Joe Sustaric
9
+ - Orien Madgwick
10
+ - Pete Johns
11
+ - Vladimir Chervanev
12
+ autorequire:
13
+ bindir: exe
14
+ cert_chain: []
15
+ date: 2018-11-12 00:00:00.000000000 Z
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: bundler
19
+ requirement: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - "~>"
22
+ - !ruby/object:Gem::Version
23
+ version: '1.16'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - "~>"
29
+ - !ruby/object:Gem::Version
30
+ version: '1.16'
31
+ - !ruby/object:Gem::Dependency
32
+ name: bundler-audit
33
+ requirement: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - "~>"
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - "~>"
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ - !ruby/object:Gem::Dependency
46
+ name: clamp
47
+ requirement: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - "~>"
50
+ - !ruby/object:Gem::Version
51
+ version: '1'
52
+ type: :runtime
53
+ prerelease: false
54
+ version_requirements: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - "~>"
57
+ - !ruby/object:Gem::Version
58
+ version: '1'
59
+ - !ruby/object:Gem::Dependency
60
+ name: faraday
61
+ requirement: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - "~>"
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - "~>"
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ - !ruby/object:Gem::Dependency
74
+ name: git
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '1'
80
+ type: :runtime
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: '1'
87
+ - !ruby/object:Gem::Dependency
88
+ name: octokit
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '4.0'
94
+ type: :runtime
95
+ prerelease: false
96
+ version_requirements: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '4.0'
101
+ - !ruby/object:Gem::Dependency
102
+ name: safe_shell
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '1'
108
+ type: :runtime
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '1'
115
+ - !ruby/object:Gem::Dependency
116
+ name: guard
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: '2'
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '2'
129
+ - !ruby/object:Gem::Dependency
130
+ name: guard-rspec
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: '4'
136
+ type: :development
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: '4'
143
+ - !ruby/object:Gem::Dependency
144
+ name: pry
145
+ requirement: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - "~>"
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - "~>"
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ - !ruby/object:Gem::Dependency
158
+ name: rake
159
+ requirement: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - "~>"
162
+ - !ruby/object:Gem::Version
163
+ version: '10.0'
164
+ type: :development
165
+ prerelease: false
166
+ version_requirements: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - "~>"
169
+ - !ruby/object:Gem::Version
170
+ version: '10.0'
171
+ - !ruby/object:Gem::Dependency
172
+ name: rspec
173
+ requirement: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - "~>"
176
+ - !ruby/object:Gem::Version
177
+ version: '3.0'
178
+ type: :development
179
+ prerelease: false
180
+ version_requirements: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - "~>"
183
+ - !ruby/object:Gem::Version
184
+ version: '3.0'
185
+ - !ruby/object:Gem::Dependency
186
+ name: rspec-its
187
+ requirement: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - "~>"
190
+ - !ruby/object:Gem::Version
191
+ version: '1'
192
+ type: :development
193
+ prerelease: false
194
+ version_requirements: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - "~>"
197
+ - !ruby/object:Gem::Version
198
+ version: '1'
199
+ - !ruby/object:Gem::Dependency
200
+ name: rubocop
201
+ requirement: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - "~>"
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ type: :development
207
+ prerelease: false
208
+ version_requirements: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - "~>"
211
+ - !ruby/object:Gem::Version
212
+ version: '0'
213
+ description: Let's fill this bit out later
214
+ email:
215
+ - emilyn.escabarte@envato.com
216
+ - joe.sustaric@envato.com
217
+ - orien.madgwick@envato.com
218
+ - pete.johns@envato.com
219
+ - vladimir.chervanev@envato.com
220
+ executables:
221
+ - unwrappr
222
+ extensions: []
223
+ extra_rdoc_files: []
224
+ files:
225
+ - ".buildkite/pipeline.yml"
226
+ - ".buildkite/steps/rspec.sh"
227
+ - ".buildkite/steps/rubocop.sh"
228
+ - ".gitignore"
229
+ - ".rspec"
230
+ - ".rubocop.yml"
231
+ - ".travis.yml"
232
+ - CHANGELOG.md
233
+ - CODE_OF_CONDUCT.md
234
+ - Gemfile
235
+ - Guardfile
236
+ - LICENSE.txt
237
+ - README.md
238
+ - Rakefile
239
+ - bin/console
240
+ - bin/setup
241
+ - exe/unwrappr
242
+ - lib/unwrappr.rb
243
+ - lib/unwrappr/bundler_command_runner.rb
244
+ - lib/unwrappr/cli.rb
245
+ - lib/unwrappr/gem_change.rb
246
+ - lib/unwrappr/gem_version.rb
247
+ - lib/unwrappr/git_command_runner.rb
248
+ - lib/unwrappr/github/client.rb
249
+ - lib/unwrappr/github/pr_sink.rb
250
+ - lib/unwrappr/github/pr_source.rb
251
+ - lib/unwrappr/lock_file_annotator.rb
252
+ - lib/unwrappr/lock_file_comparator.rb
253
+ - lib/unwrappr/lock_file_diff.rb
254
+ - lib/unwrappr/octokit.rb
255
+ - lib/unwrappr/researchers/composite.rb
256
+ - lib/unwrappr/researchers/github_comparison.rb
257
+ - lib/unwrappr/researchers/github_repo.rb
258
+ - lib/unwrappr/researchers/ruby_gems_info.rb
259
+ - lib/unwrappr/researchers/security_vulnerabilities.rb
260
+ - lib/unwrappr/ruby_gems.rb
261
+ - lib/unwrappr/spec_version_comparator.rb
262
+ - lib/unwrappr/version.rb
263
+ - lib/unwrappr/writers/composite.rb
264
+ - lib/unwrappr/writers/github_commit_log.rb
265
+ - lib/unwrappr/writers/project_links.rb
266
+ - lib/unwrappr/writers/security_vulnerabilities.rb
267
+ - lib/unwrappr/writers/title.rb
268
+ - lib/unwrappr/writers/version_change.rb
269
+ - unwrappr.gemspec
270
+ homepage: http://www.unwrappr.com.org
271
+ licenses:
272
+ - MIT
273
+ metadata:
274
+ bug_tracker_uri: https://github.com/envato/unwrappr/issues
275
+ changelog_uri: https://github.com/envato/unwrappr/blob/master/CHANGELOG.md
276
+ documentation_uri: https://github.com/envato/unwrappr/blob/master/README.md
277
+ homepage_uri: https://opensource.envato.com/projects/unwrappr.html
278
+ source_code_uri: https://github.com/envato/unwrappr
279
+ post_install_message:
280
+ rdoc_options: []
281
+ require_paths:
282
+ - lib
283
+ required_ruby_version: !ruby/object:Gem::Requirement
284
+ requirements:
285
+ - - ">="
286
+ - !ruby/object:Gem::Version
287
+ version: '0'
288
+ required_rubygems_version: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - ">="
291
+ - !ruby/object:Gem::Version
292
+ version: '0'
293
+ requirements: []
294
+ rubyforge_project:
295
+ rubygems_version: 2.7.6
296
+ signing_key:
297
+ specification_version: 4
298
+ summary: A tool to unwrap your gems and see what's changed easily
299
+ test_files: []