unwrappr 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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: []