headdesk 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.reek.yml +2 -0
- data/Gemfile +0 -3
- data/Gemfile.lock +6 -4
- data/headdesk.gemspec +3 -9
- data/lib/headdesk/cli.rb +6 -96
- data/lib/headdesk/cli_commands/analyze.rb +69 -0
- data/lib/headdesk/cli_commands/blame.rb +79 -0
- data/lib/headdesk/cli_commands/unpack.rb +67 -0
- data/lib/headdesk/cli_commands/version.rb +33 -0
- data/lib/headdesk/version.rb +1 -1
- data/lib/headdesk/versions.rb +4 -0
- data/lib/headdesk.rb +16 -0
- metadata +48 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1cb06518f9ed0ec0293c645af5598133a19791c575093359b56cf87e787233de
|
4
|
+
data.tar.gz: 6a0bd907a2c18c63098029cb30956c8ebe903529b34738cf61a2b1b61d3b0983
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf63bee2c75af483978333022c08fcdcdd61d3abab31f979445ef2766287baf9a750d3303e9538358d29c7152ea44e76a8a0aadd429cf8a671f7b4b6c4ef0f00
|
7
|
+
data.tar.gz: 20d878b5cf28dbe13ad88b838143a9da3ca62ee3693b39db205c2975f3edecc3f1e81ca9ef1657c1efa9052446e299c59bcd50c9672d6dcf7655637b097c73a5
|
data/.reek.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -26,6 +26,7 @@ GEM
|
|
26
26
|
thread_safe (~> 0.3, >= 0.3.1)
|
27
27
|
diff-lcs (1.3)
|
28
28
|
equalizer (0.0.11)
|
29
|
+
gem-release (2.0.1)
|
29
30
|
gems (1.1.1)
|
30
31
|
json
|
31
32
|
ice_nine (0.11.2)
|
@@ -37,7 +38,7 @@ GEM
|
|
37
38
|
mini_portile2 (~> 2.4.0)
|
38
39
|
oily_png (1.2.1)
|
39
40
|
chunky_png (~> 1.3.7)
|
40
|
-
parallel (1.
|
41
|
+
parallel (1.13.0)
|
41
42
|
parser (2.5.3.0)
|
42
43
|
ast (~> 2.4.0)
|
43
44
|
powerpack (0.1.2)
|
@@ -63,7 +64,7 @@ GEM
|
|
63
64
|
diff-lcs (>= 1.2.0, < 2.0)
|
64
65
|
rspec-support (~> 3.8.0)
|
65
66
|
rspec-support (3.8.0)
|
66
|
-
rubocop (0.
|
67
|
+
rubocop (0.63.1)
|
67
68
|
jaro_winkler (~> 1.5.1)
|
68
69
|
parallel (~> 1.10)
|
69
70
|
parser (>= 2.5, != 2.5.1.1)
|
@@ -86,11 +87,12 @@ PLATFORMS
|
|
86
87
|
|
87
88
|
DEPENDENCIES
|
88
89
|
bundler (~> 2.0)
|
90
|
+
gem-release (~> 2.0)
|
89
91
|
headdesk!
|
90
92
|
rake (~> 10.0)
|
91
|
-
reek
|
93
|
+
reek (~> 5.0)
|
92
94
|
rspec (~> 3.8)
|
93
|
-
rubocop
|
95
|
+
rubocop (~> 0)
|
94
96
|
|
95
97
|
BUNDLED WITH
|
96
98
|
2.0.1
|
data/headdesk.gemspec
CHANGED
@@ -17,15 +17,6 @@ Gem::Specification.new do |spec|
|
|
17
17
|
|
18
18
|
spec.post_install_message = 'For breaking change announcements...'
|
19
19
|
|
20
|
-
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
21
|
-
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
22
|
-
# if spec.respond_to?(:metadata)
|
23
|
-
# spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
|
24
|
-
# else
|
25
|
-
# raise 'RubyGems 2.0 or newer is required to protect against ' \
|
26
|
-
# 'public gem pushes.'
|
27
|
-
# end
|
28
|
-
|
29
20
|
# Specify which files should be added to the gem when it is released.
|
30
21
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
31
22
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
@@ -36,8 +27,11 @@ Gem::Specification.new do |spec|
|
|
36
27
|
spec.require_paths = ['lib']
|
37
28
|
|
38
29
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
30
|
+
spec.add_development_dependency 'gem-release', '~> 2.0'
|
39
31
|
spec.add_development_dependency 'rake', '~> 10.0'
|
32
|
+
spec.add_development_dependency 'reek', '~> 5.0'
|
40
33
|
spec.add_development_dependency 'rspec', '~> 3.8'
|
34
|
+
spec.add_development_dependency 'rubocop', '~> 0'
|
41
35
|
|
42
36
|
spec.add_dependency 'awesome_print', '~> 1.8'
|
43
37
|
spec.add_dependency 'gems', '~> 1.1'
|
data/lib/headdesk/cli.rb
CHANGED
@@ -1,114 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'tmpdir'
|
4
3
|
require 'thor'
|
5
4
|
require 'headdesk'
|
6
5
|
require 'awesome_print'
|
7
6
|
|
7
|
+
Dir[File.dirname(__FILE__) + '/cli_commands/*.rb'].each { |file| require file }
|
8
|
+
|
8
9
|
module Headdesk
|
9
10
|
#
|
10
11
|
# headdesk CLI
|
11
12
|
#
|
12
|
-
# :reek:TooManyStatements
|
13
13
|
class CLI < Thor
|
14
14
|
no_commands do
|
15
|
-
def print_update_message
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
desc 'unpack FILE [DESTINATION]', 'Unpack an APK or IPA to [DESTINATION] or to the current directory'
|
21
|
-
method_option :analyze, type: :boolean, aliases: '-a'
|
22
|
-
def unpack(file, destination = nil)
|
23
|
-
# Make sure the input file exists
|
24
|
-
unless File.exist?(file)
|
25
|
-
STDERR.puts "Could not find: #{file}"
|
26
|
-
CLI.command_help(Thor::Base.shell.new, 'unpack')
|
27
|
-
return 1
|
28
|
-
end
|
29
|
-
|
30
|
-
# Make sure destination exists, if specified
|
31
|
-
unless !destination || Dir.exist?(destination)
|
32
|
-
STDERR.puts "Could not find destination path: #{destination}"
|
33
|
-
CLI.command_help(Thor::Base.shell.new, 'unpack')
|
34
|
-
return 1
|
35
|
-
end
|
36
|
-
|
37
|
-
begin
|
38
|
-
stdout = nil
|
39
|
-
output_path = destination
|
40
|
-
|
41
|
-
if !destination
|
42
|
-
# Output to tempdir, then copy to cwd if no destination specified
|
43
|
-
Dir.mktmpdir do |tmp_dir|
|
44
|
-
output_path = tmp_dir
|
45
|
-
stdout = Headdesk::ApkTool.unpack_to(file, tmp_dir)
|
46
|
-
FileUtils.cp_r("#{tmp_dir}/.", Dir.pwd)
|
47
|
-
end
|
48
|
-
else
|
49
|
-
stdout = Headdesk::ApkTool.unpack_to(file, destination)
|
50
|
-
end
|
51
|
-
|
52
|
-
# analyze if requested
|
53
|
-
Headdesk::Analyze.at(output_path) if options[:analyze]
|
54
|
-
rescue CliError => cli_err
|
55
|
-
STDERR.puts cli_err.message
|
56
|
-
CLI.command_help(Thor::Base.shell.new, 'unpack')
|
57
|
-
return 1
|
58
|
-
rescue StandardError => rb_err
|
59
|
-
STDERR.puts err.message.red
|
60
|
-
STDERR.puts err.backtrace.ai
|
61
|
-
return 1
|
15
|
+
def print_update_message(stream = STDERR)
|
16
|
+
stream.puts "Latest version is #{Headdesk::Versions.latest_version}, please run 'bundle update headdesk'".red
|
62
17
|
end
|
63
18
|
end
|
64
19
|
|
65
|
-
|
66
|
-
|
67
|
-
method_option :json, type: :boolean
|
68
|
-
def analyze(file = nil)
|
69
|
-
# Make sure input file exsts, if specified
|
70
|
-
unless !file || File.exist?(file)
|
71
|
-
STDERR.puts "Could not find input file: #{file}"
|
72
|
-
CLI.command_help(Thor::Base.shell.new, 'analyze')
|
73
|
-
return 1
|
74
|
-
end
|
75
|
-
|
76
|
-
# Unpack APK if needed
|
77
|
-
path = options[:path]
|
78
|
-
tmp_dir = nil
|
79
|
-
if file
|
80
|
-
path = tmp_dir = Dir.mktmpdir
|
81
|
-
Headdesk::ApkTool.unpack_to(file, tmp_dir)
|
82
|
-
end
|
83
|
-
|
84
|
-
# Make sure path exists
|
85
|
-
unless Dir.exist?(path)
|
86
|
-
STDERR.puts "Could not find path: #{path}"
|
87
|
-
CLI.command_help(Thor::Base.shell.new, 'analyze')
|
88
|
-
return 1
|
89
|
-
end
|
90
|
-
|
91
|
-
# analyze
|
92
|
-
begin
|
93
|
-
report = Headdesk::Analyze.at(path)
|
94
|
-
|
95
|
-
if options[:json]
|
96
|
-
STDOUT.puts report.to_json
|
97
|
-
else
|
98
|
-
STDOUT.puts report.to_s
|
99
|
-
print_update_message unless Headdesk::Versions.latest_version?
|
100
|
-
end
|
101
|
-
rescue CliError => cli_err
|
102
|
-
STDERR.puts cli_err.message
|
103
|
-
CLI.command_help(Thor::Base.shell.new, 'analyze')
|
104
|
-
return 1
|
105
|
-
rescue StandardError => err
|
106
|
-
STDERR.puts err.message.red
|
107
|
-
STDERR.puts err.backtrace.ai
|
108
|
-
return 1
|
109
|
-
end
|
110
|
-
ensure
|
111
|
-
FileUtils.remove_entry(tmp_dir) if tmp_dir
|
20
|
+
Headdesk::CliCommand.each do |cmd|
|
21
|
+
include cmd
|
112
22
|
end
|
113
23
|
end
|
114
24
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'thor'
|
4
|
+
require 'headdesk'
|
5
|
+
require 'tmpdir'
|
6
|
+
|
7
|
+
module Headdesk
|
8
|
+
module CliCommands
|
9
|
+
#
|
10
|
+
# Analyze an APK/IPA file
|
11
|
+
#
|
12
|
+
module Analyze
|
13
|
+
include Headdesk::CliCommand
|
14
|
+
|
15
|
+
def self.included(thor)
|
16
|
+
thor.class_eval do
|
17
|
+
desc 'analyze [FILE]', 'Analyze an APK or IPA'
|
18
|
+
method_option :path, type: :string
|
19
|
+
method_option :json, type: :boolean
|
20
|
+
def analyze(file = nil)
|
21
|
+
# Make sure input file exsts, if specified
|
22
|
+
unless !file || File.exist?(file)
|
23
|
+
STDERR.puts "Could not find input file: #{file}"
|
24
|
+
CLI.command_help(Thor::Base.shell.new, 'analyze')
|
25
|
+
exit 1
|
26
|
+
end
|
27
|
+
|
28
|
+
# Unpack APK if needed
|
29
|
+
path = options[:path]
|
30
|
+
tmp_dir = nil
|
31
|
+
if file
|
32
|
+
path = tmp_dir = Dir.mktmpdir
|
33
|
+
Headdesk::ApkTool.unpack_to(file, tmp_dir)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Make sure path exists
|
37
|
+
unless Dir.exist?(path)
|
38
|
+
STDERR.puts "Could not find path: #{path}"
|
39
|
+
CLI.command_help(Thor::Base.shell.new, 'analyze')
|
40
|
+
exit 1
|
41
|
+
end
|
42
|
+
|
43
|
+
# analyze
|
44
|
+
begin
|
45
|
+
report = Headdesk::Analyze.at(path)
|
46
|
+
|
47
|
+
if options[:json]
|
48
|
+
STDOUT.puts report.to_json
|
49
|
+
else
|
50
|
+
STDOUT.puts report.to_s
|
51
|
+
CLI.print_update_message unless Headdesk::Versions.latest_version?
|
52
|
+
end
|
53
|
+
rescue CliError => cli_err
|
54
|
+
STDERR.puts cli_err.message
|
55
|
+
CLI.command_help(Thor::Base.shell.new, 'analyze')
|
56
|
+
exit 1
|
57
|
+
rescue StandardError => err
|
58
|
+
STDERR.puts err.message.red
|
59
|
+
STDERR.puts err.backtrace.ai
|
60
|
+
exit 1
|
61
|
+
end
|
62
|
+
ensure
|
63
|
+
FileUtils.remove_entry(tmp_dir) if tmp_dir
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'thor'
|
4
|
+
require 'headdesk'
|
5
|
+
require 'English'
|
6
|
+
|
7
|
+
module Headdesk
|
8
|
+
module CliCommands
|
9
|
+
#
|
10
|
+
# Find out which JAR/AAR is bringing in symbols
|
11
|
+
#
|
12
|
+
module Blame
|
13
|
+
include Headdesk::CliCommand
|
14
|
+
|
15
|
+
def self.included(thor)
|
16
|
+
thor.class_eval do
|
17
|
+
desc 'blame SYMBOL [PATH]', 'Recursivly search for JARs and AARs which define a given symbol.'
|
18
|
+
method_option :json, type: :boolean
|
19
|
+
def blame(in_symbol, path = '.')
|
20
|
+
unless Dir.exist?(path)
|
21
|
+
STDERR.puts "Could not find path: #{path}"
|
22
|
+
CLI.command_help(Thor::Base.shell.new, 'blame')
|
23
|
+
exit 1
|
24
|
+
end
|
25
|
+
|
26
|
+
symbol_matcher = /(.*)(#{Regexp.escape(in_symbol.tr('.', '/'))})([^\.]*)?(\.class)?/
|
27
|
+
|
28
|
+
# Match inside JAR files
|
29
|
+
jar_matches = {}
|
30
|
+
Dir[File.join(path, '**', '*.jar')].each do |jar|
|
31
|
+
stdout = `jar -tf #{jar}`
|
32
|
+
exit $CHILD_STATUS.to_i unless $CHILD_STATUS.success?
|
33
|
+
|
34
|
+
matches = Blame.match_lines(stdout, symbol_matcher)
|
35
|
+
jar_matches[jar] = matches unless matches.empty?
|
36
|
+
end
|
37
|
+
|
38
|
+
# Match inside AAR files
|
39
|
+
aar_matches = {}
|
40
|
+
Dir[File.join(path, '**', '*.aar')].each do |aar|
|
41
|
+
stdout = `unzip -p -j #{aar} classes.jar | jar -t`
|
42
|
+
exit $CHILD_STATUS.to_i unless $CHILD_STATUS.success?
|
43
|
+
|
44
|
+
matches = Blame.match_lines(stdout, symbol_matcher)
|
45
|
+
aar_matches[aar] = matches unless matches.empty?
|
46
|
+
end
|
47
|
+
|
48
|
+
# JSON output if requested
|
49
|
+
if options[:json]
|
50
|
+
STDOUT.puts({ jar: jar_matches, aar: aar_matches }.to_json)
|
51
|
+
exit 0
|
52
|
+
end
|
53
|
+
|
54
|
+
# Pretty output
|
55
|
+
all_matches = jar_matches.merge(aar_matches)
|
56
|
+
all_matches.each do |package, symbols|
|
57
|
+
STDOUT.puts '📦 ' + package
|
58
|
+
symbols.each do |match|
|
59
|
+
STDOUT.puts " ↳ #{match[0]}#{match[1].green}#{match[2].chomp('.') if match[2]}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
CLI.print_update_message unless Headdesk::Versions.latest_version?
|
64
|
+
|
65
|
+
exit !all_matches.empty?
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.match_lines(stdout, matcher)
|
71
|
+
stdout.lines
|
72
|
+
.each(&:strip!)
|
73
|
+
.map { |line| matcher.match(line) }
|
74
|
+
.compact
|
75
|
+
.map { |match| match.captures.map { |capture| capture.tr('/', '.') if capture } }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'thor'
|
4
|
+
require 'headdesk'
|
5
|
+
require 'tmpdir'
|
6
|
+
|
7
|
+
module Headdesk
|
8
|
+
module CliCommands
|
9
|
+
#
|
10
|
+
# Unpack an APK/IPA
|
11
|
+
#
|
12
|
+
module Unpack
|
13
|
+
include Headdesk::CliCommand
|
14
|
+
|
15
|
+
def self.included(thor)
|
16
|
+
thor.class_eval do
|
17
|
+
desc 'unpack FILE [DESTINATION]', 'Unpack an APK or IPA to [DESTINATION] or to the current directory'
|
18
|
+
method_option :analyze, type: :boolean, aliases: '-a'
|
19
|
+
def unpack(file, destination = nil)
|
20
|
+
# Make sure the input file exists
|
21
|
+
unless File.exist?(file)
|
22
|
+
STDERR.puts "Could not find: #{file}"
|
23
|
+
CLI.command_help(Thor::Base.shell.new, 'unpack')
|
24
|
+
exit 1
|
25
|
+
end
|
26
|
+
|
27
|
+
# Make sure destination exists, if specified
|
28
|
+
unless !destination || Dir.exist?(destination)
|
29
|
+
STDERR.puts "Could not find destination path: #{destination}"
|
30
|
+
CLI.command_help(Thor::Base.shell.new, 'unpack')
|
31
|
+
exit 1
|
32
|
+
end
|
33
|
+
|
34
|
+
begin
|
35
|
+
stdout = nil
|
36
|
+
output_path = destination
|
37
|
+
|
38
|
+
if !destination
|
39
|
+
# Output to tempdir, then copy to cwd if no destination specified
|
40
|
+
Dir.mktmpdir do |tmp_dir|
|
41
|
+
output_path = tmp_dir
|
42
|
+
stdout = Headdesk::ApkTool.unpack_to(file, tmp_dir)
|
43
|
+
FileUtils.cp_r("#{tmp_dir}/.", Dir.pwd)
|
44
|
+
end
|
45
|
+
else
|
46
|
+
stdout = Headdesk::ApkTool.unpack_to(file, destination)
|
47
|
+
end
|
48
|
+
|
49
|
+
# analyze if requested
|
50
|
+
Headdesk::Analyze.at(output_path) if options[:analyze]
|
51
|
+
|
52
|
+
CLI.print_update_message unless Headdesk::Versions.latest_version?
|
53
|
+
rescue CliError => cli_err
|
54
|
+
STDERR.puts cli_err.message
|
55
|
+
CLI.command_help(Thor::Base.shell.new, 'unpack')
|
56
|
+
exit 1
|
57
|
+
rescue StandardError => rb_err
|
58
|
+
STDERR.puts err.message.red
|
59
|
+
STDERR.puts err.backtrace.ai
|
60
|
+
exit 1
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'thor'
|
4
|
+
require 'headdesk'
|
5
|
+
|
6
|
+
module Headdesk
|
7
|
+
module CliCommands
|
8
|
+
#
|
9
|
+
# Print/compare version
|
10
|
+
#
|
11
|
+
module Version
|
12
|
+
include Headdesk::CliCommand
|
13
|
+
|
14
|
+
def self.included(thor)
|
15
|
+
thor.class_eval do
|
16
|
+
map %w[--version] => :__version
|
17
|
+
desc '--version [COMPARE_VERSION]', 'Print, and optionally compare version.'
|
18
|
+
long_desc <<~LONGDESC
|
19
|
+
`--version` will print the version to STDOUT, and if a newer version is available it will print out an update message to STDERR.
|
20
|
+
|
21
|
+
You can optionally specify a version number as a second argument, in which case will compare the current version with that version exit with code 1 if the current version is less than the provided version. It will exit with code 0 if the current version is less than, or equal to the provided version.
|
22
|
+
LONGDESC
|
23
|
+
def __version(cmp_version = nil)
|
24
|
+
STDOUT.puts Headdesk::VERSION
|
25
|
+
print_update_message unless Headdesk::Versions.latest_version?
|
26
|
+
|
27
|
+
exit (Headdesk::Versions.version <=> Gem::Version.new(cmp_version)) > 0 if cmp_version
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/headdesk/version.rb
CHANGED
data/lib/headdesk/versions.rb
CHANGED
data/lib/headdesk.rb
CHANGED
@@ -22,4 +22,20 @@ module Headdesk
|
|
22
22
|
#
|
23
23
|
class CliError < StandardError
|
24
24
|
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# Helper for CLI command modules
|
28
|
+
#
|
29
|
+
module CliCommand
|
30
|
+
extend Enumerable
|
31
|
+
|
32
|
+
def self.each(&block)
|
33
|
+
@commands.each(&block)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.included(cmd)
|
37
|
+
@commands ||= []
|
38
|
+
@commands << cmd
|
39
|
+
end
|
40
|
+
end
|
25
41
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: headdesk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pat Wilson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: gem-release
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rake
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +52,20 @@ dependencies:
|
|
38
52
|
- - "~>"
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: reek
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '5.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '5.0'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: rspec
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +80,20 @@ dependencies:
|
|
52
80
|
- - "~>"
|
53
81
|
- !ruby/object:Gem::Version
|
54
82
|
version: '3.8'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
55
97
|
- !ruby/object:Gem::Dependency
|
56
98
|
name: awesome_print
|
57
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -169,6 +211,10 @@ files:
|
|
169
211
|
- lib/headdesk/checks/teak/caching.rb
|
170
212
|
- lib/headdesk/checks/teak/teak.rb
|
171
213
|
- lib/headdesk/cli.rb
|
214
|
+
- lib/headdesk/cli_commands/analyze.rb
|
215
|
+
- lib/headdesk/cli_commands/blame.rb
|
216
|
+
- lib/headdesk/cli_commands/unpack.rb
|
217
|
+
- lib/headdesk/cli_commands/version.rb
|
172
218
|
- lib/headdesk/data/facebook_sdk_versions.yaml
|
173
219
|
- lib/headdesk/descriptionator.rb
|
174
220
|
- lib/headdesk/descriptionator/resources.rb
|