punchlist 1.2.0 → 1.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.
- checksums.yaml +4 -4
- data/Rakefile +24 -3
- data/bin/punchlist +1 -0
- data/lib/punchlist.rb +11 -45
- data/lib/punchlist/config.rb +27 -0
- data/lib/punchlist/inspector.rb +31 -0
- data/lib/punchlist/offense.rb +23 -0
- data/lib/punchlist/{options.rb → option_parser.rb} +9 -14
- data/lib/punchlist/renderer.rb +18 -0
- data/lib/punchlist/version.rb +3 -1
- data/punchlist.gemspec +5 -2
- metadata +53 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 417c0f1b1739e879b670660d5965b2de9983ebd6
|
4
|
+
data.tar.gz: cd161e7cbf434e7011cc6f6a52ca16fc9d2816aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 634f25dc315d1b0f78b75924b824a5bf495d4214194d49bee2b3a04fe6de3e11afd61e4d19001dac3adabe458a6a0e05ecaf3329f44af87feff9daa2e3672fcc
|
7
|
+
data.tar.gz: bf6b12e411662a479591c668a661bd75ad1b712881085130a2bd5edb3d182681498695b92a3ea961bae3707fed05356e07c52e7b8c4ef5806694f07473328a44
|
data/Rakefile
CHANGED
@@ -1,12 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'bundler/gem_tasks'
|
2
4
|
require 'rspec/core/rake_task'
|
3
5
|
require 'quality/rake/task'
|
4
6
|
|
7
|
+
task :pronto do
|
8
|
+
formatter = '-f github_pr' if ENV.key? 'PRONTO_GITHUB_ACCESS_TOKEN'
|
9
|
+
if ENV.key? 'TRAVIS_PULL_REQUEST'
|
10
|
+
ENV['PRONTO_PULL_REQUEST_ID'] = ENV['TRAVIS_PULL_REQUEST']
|
11
|
+
elsif ENV.key? 'CIRCLE_PULL_REQUEST'
|
12
|
+
ENV['PRONTO_PULL_REQUEST_ID'] = ENV['CIRCLE_PULL_REQUEST'].split('/').last
|
13
|
+
end
|
14
|
+
puts "PRONTO_PULL_REQUEST_ID is #{ENV['PRONTO_PULL_REQUEST_ID']}"
|
15
|
+
sh "pronto run #{formatter} -c origin/master --no-exit-code --unstaged "\
|
16
|
+
'|| true'
|
17
|
+
sh "pronto run #{formatter} -c origin/master --no-exit-code --staged || true"
|
18
|
+
sh "pronto run #{formatter} -c origin/master --no-exit-code || true"
|
19
|
+
end
|
20
|
+
|
5
21
|
Quality::Rake::Task.new do |task|
|
6
|
-
task.skip_tools = [
|
22
|
+
task.skip_tools = %w[reek shellcheck]
|
7
23
|
task.output_dir = 'metrics'
|
24
|
+
# Add 'xit ' to the standard list, finding disabled tests
|
25
|
+
task.punchlist_regexp = 'XXX|TODO|FIXME|OPTIMIZE|HACK|REVIEW|LATER|FIXIT|xit '
|
8
26
|
end
|
9
27
|
|
28
|
+
task quality: %i[pronto]
|
29
|
+
|
10
30
|
desc 'Run specs'
|
11
31
|
RSpec::Core::RakeTask.new(:spec) do |task|
|
12
32
|
task.pattern = 'spec/**/*_spec.rb'
|
@@ -22,9 +42,10 @@ end
|
|
22
42
|
task :clear_metrics do |_t|
|
23
43
|
ret =
|
24
44
|
system('git checkout coverage/.last_run.json metrics/*_high_water_mark')
|
25
|
-
|
45
|
+
raise unless ret
|
26
46
|
end
|
27
47
|
|
28
48
|
desc 'Default: Run specs and check quality.'
|
29
|
-
task localtest: [
|
49
|
+
task localtest: %i[clear_metrics spec feature quality]
|
50
|
+
task test: %i[spec feature]
|
30
51
|
task default: [:localtest]
|
data/bin/punchlist
CHANGED
data/lib/punchlist.rb
CHANGED
@@ -1,26 +1,24 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'punchlist/option_parser'
|
4
|
+
require_relative 'punchlist/inspector'
|
5
|
+
require_relative 'punchlist/renderer'
|
2
6
|
|
3
7
|
# XXX: need to include BUG in list
|
4
8
|
# XXX: need to include BUG in my rubocop config
|
5
|
-
# BUG need to fix the fact that we create blank lines on files with no issues
|
6
9
|
module Punchlist
|
7
10
|
# Counts the number of 'todo' comments in your code.
|
8
11
|
class Punchlist
|
9
12
|
def initialize(args,
|
10
13
|
outputter: STDOUT,
|
11
|
-
|
12
|
-
options_parser: Options.new(args),
|
14
|
+
option_parser_class: OptionParser,
|
13
15
|
source_file_globber: SourceFinder::SourceFileGlobber.new)
|
14
|
-
|
16
|
+
option_parser = option_parser_class.new(args)
|
17
|
+
@config = option_parser.generate_config(source_file_globber)
|
15
18
|
@outputter = outputter
|
16
|
-
@file_opener = file_opener
|
17
|
-
@options_parser = options_parser
|
18
|
-
@source_file_globber = source_file_globber
|
19
19
|
end
|
20
20
|
|
21
21
|
def run
|
22
|
-
@options = @options_parser.parse_options
|
23
|
-
|
24
22
|
analyze_files
|
25
23
|
|
26
24
|
0
|
@@ -28,50 +26,18 @@ module Punchlist
|
|
28
26
|
|
29
27
|
def analyze_files
|
30
28
|
all_output = []
|
31
|
-
source_files.each do |filename|
|
29
|
+
@config.source_files.each do |filename|
|
32
30
|
all_output.concat(look_for_punchlist_items(filename))
|
33
31
|
end
|
34
32
|
@outputter.print render(all_output)
|
35
33
|
end
|
36
34
|
|
37
|
-
def source_files
|
38
|
-
if @options[:glob]
|
39
|
-
@source_file_globber.source_files_glob = @options[:glob]
|
40
|
-
end
|
41
|
-
if @options[:exclude]
|
42
|
-
@source_file_globber.source_files_exclude_glob = @options[:exclude]
|
43
|
-
end
|
44
|
-
@source_file_globber.source_files_arr
|
45
|
-
end
|
46
|
-
|
47
|
-
def punchlist_line_regexp
|
48
|
-
return @regexp if @regexp
|
49
|
-
|
50
|
-
regexp_string = @options[:regexp]
|
51
|
-
if regexp_string
|
52
|
-
@regexp = Regexp.new(regexp_string)
|
53
|
-
else
|
54
|
-
Options.default_punchlist_line_regexp
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
35
|
def look_for_punchlist_items(filename)
|
59
|
-
|
60
|
-
line_num = 0
|
61
|
-
@file_opener.open(filename, 'r') do |file|
|
62
|
-
file.each_line do |line|
|
63
|
-
line_num += 1
|
64
|
-
lines << [filename, line_num, line] if line =~ punchlist_line_regexp
|
65
|
-
end
|
66
|
-
end
|
67
|
-
lines
|
36
|
+
Inspector.new(@config.regexp, filename).run
|
68
37
|
end
|
69
38
|
|
70
39
|
def render(output)
|
71
|
-
|
72
|
-
"#{filename}:#{line_num}: #{line}"
|
73
|
-
end
|
74
|
-
lines.join
|
40
|
+
CliRenderer.new.render(output)
|
75
41
|
end
|
76
42
|
end
|
77
43
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Punchlist
|
4
|
+
# Configuration for punchlist gem
|
5
|
+
class Config
|
6
|
+
attr_reader :regexp, :glob, :exclude
|
7
|
+
|
8
|
+
def self.default_punchlist_line_regexp_string
|
9
|
+
'XXX|TODO|FIXME|OPTIMIZE|HACK|REVIEW|LATER|FIXIT'
|
10
|
+
end
|
11
|
+
|
12
|
+
def source_files
|
13
|
+
@source_file_globber.source_files_glob = glob if glob
|
14
|
+
@source_file_globber.source_files_exclude_glob = exclude if exclude
|
15
|
+
@source_file_globber.source_files_arr
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(regexp: nil, glob: nil, exclude: nil,
|
19
|
+
source_file_globber:)
|
20
|
+
@regexp = Regexp.new(regexp ||
|
21
|
+
Config.default_punchlist_line_regexp_string)
|
22
|
+
@glob = glob
|
23
|
+
@exclude = exclude
|
24
|
+
@source_file_globber = source_file_globber
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'offense'
|
4
|
+
|
5
|
+
module Punchlist
|
6
|
+
# Inspects files for punchlist items
|
7
|
+
class Inspector
|
8
|
+
attr_reader :punchlist_line_regexp, :filename
|
9
|
+
def initialize(punchlist_line_regexp, filename, file_opener: File)
|
10
|
+
@file_opener = file_opener
|
11
|
+
@punchlist_line_regexp = punchlist_line_regexp
|
12
|
+
@filename = filename
|
13
|
+
@lines = []
|
14
|
+
@line_num = 0
|
15
|
+
end
|
16
|
+
|
17
|
+
def inspect_line(line)
|
18
|
+
@line_num += 1
|
19
|
+
return unless line =~ punchlist_line_regexp
|
20
|
+
|
21
|
+
@lines << Offense.new(filename, @line_num, line.chomp)
|
22
|
+
end
|
23
|
+
|
24
|
+
def run
|
25
|
+
@file_opener.open(filename, 'r') do |file|
|
26
|
+
file.each_line { |line| inspect_line(line) }
|
27
|
+
end
|
28
|
+
@lines
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Punchlist
|
4
|
+
# Represents a discovered punchlist item in code
|
5
|
+
class Offense
|
6
|
+
attr_reader :filename, :line_num, :line
|
7
|
+
def initialize(filename, line_num, line)
|
8
|
+
@filename = filename
|
9
|
+
@line_num = line_num
|
10
|
+
@line = line
|
11
|
+
end
|
12
|
+
|
13
|
+
def ==(other)
|
14
|
+
other.class == self.class && other.state == state
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def state
|
20
|
+
[@filename, @line_num, @line]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,9 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'optparse'
|
2
4
|
require 'source_finder/option_parser'
|
5
|
+
require_relative 'config'
|
3
6
|
|
4
7
|
module Punchlist
|
5
8
|
# Parse command line options
|
6
|
-
class
|
9
|
+
class OptionParser
|
7
10
|
attr_reader :default_punchlist_line_regexp
|
8
11
|
|
9
12
|
def initialize(args,
|
@@ -12,18 +15,10 @@ module Punchlist
|
|
12
15
|
@source_finder_option_parser = source_finder_option_parser
|
13
16
|
end
|
14
17
|
|
15
|
-
def self.default_punchlist_line_regexp_string
|
16
|
-
'XXX|TODO|FIXME|OPTIMIZE|HACK|REVIEW|LATER|FIXIT'
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.default_punchlist_line_regexp
|
20
|
-
Regexp.new(default_punchlist_line_regexp_string)
|
21
|
-
end
|
22
|
-
|
23
18
|
def parse_regexp(opts, options)
|
24
19
|
opts.on('-r', '--regexp r',
|
25
|
-
'Regexp to trigger
|
26
|
-
"#{
|
20
|
+
'Regexp to trigger upon - default is ' \
|
21
|
+
"#{Config.default_punchlist_line_regexp_string}") do |v|
|
27
22
|
options[:regexp] = v
|
28
23
|
end
|
29
24
|
end
|
@@ -36,12 +31,12 @@ module Punchlist
|
|
36
31
|
options
|
37
32
|
end
|
38
33
|
|
39
|
-
def
|
34
|
+
def generate_config(source_file_globber)
|
40
35
|
options = nil
|
41
|
-
OptionParser.new do |opts|
|
36
|
+
::OptionParser.new do |opts|
|
42
37
|
options = setup_options(opts)
|
43
38
|
end.parse!(@args)
|
44
|
-
options
|
39
|
+
Config.new(**options, source_file_globber: source_file_globber)
|
45
40
|
end
|
46
41
|
end
|
47
42
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Punchlist
|
4
|
+
# Render a text format of offenses
|
5
|
+
class CliRenderer
|
6
|
+
def render(output)
|
7
|
+
lines = output.map do |offense|
|
8
|
+
"#{offense.filename}:#{offense.line_num}: #{offense.line}"
|
9
|
+
end
|
10
|
+
out = lines.join("\n")
|
11
|
+
if out.empty?
|
12
|
+
out
|
13
|
+
else
|
14
|
+
out + "\n"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/punchlist/version.rb
CHANGED
data/punchlist.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# ; -*-Ruby-*-
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
3
4
|
$LOAD_PATH.push File.join(File.dirname(__FILE__), 'lib')
|
4
5
|
require 'punchlist/version'
|
5
6
|
|
@@ -29,8 +30,10 @@ Gem::Specification.new do |s|
|
|
29
30
|
s.add_dependency('source_finder', ['>=2'])
|
30
31
|
|
31
32
|
s.add_development_dependency('bundler')
|
33
|
+
s.add_development_dependency('pronto')
|
34
|
+
s.add_development_dependency('pronto-rubocop')
|
35
|
+
s.add_development_dependency('quality', ['~> 36'])
|
32
36
|
s.add_development_dependency('rake')
|
33
|
-
s.add_development_dependency('quality', ['>=16'])
|
34
37
|
s.add_development_dependency('rspec')
|
35
38
|
s.add_development_dependency('simplecov')
|
36
39
|
end
|
metadata
CHANGED
@@ -1,97 +1,125 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: punchlist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vince Broz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: source_finder
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: pronto
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pronto-rubocop
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- -
|
59
|
+
- - ">="
|
46
60
|
- !ruby/object:Gem::Version
|
47
61
|
version: '0'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- -
|
66
|
+
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: quality
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- -
|
73
|
+
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
75
|
+
version: '36'
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- -
|
80
|
+
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
82
|
+
version: '36'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
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'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: rspec
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
72
100
|
requirements:
|
73
|
-
- -
|
101
|
+
- - ">="
|
74
102
|
- !ruby/object:Gem::Version
|
75
103
|
version: '0'
|
76
104
|
type: :development
|
77
105
|
prerelease: false
|
78
106
|
version_requirements: !ruby/object:Gem::Requirement
|
79
107
|
requirements:
|
80
|
-
- -
|
108
|
+
- - ">="
|
81
109
|
- !ruby/object:Gem::Version
|
82
110
|
version: '0'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: simplecov
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
|
-
- -
|
115
|
+
- - ">="
|
88
116
|
- !ruby/object:Gem::Version
|
89
117
|
version: '0'
|
90
118
|
type: :development
|
91
119
|
prerelease: false
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
93
121
|
requirements:
|
94
|
-
- -
|
122
|
+
- - ">="
|
95
123
|
- !ruby/object:Gem::Version
|
96
124
|
version: '0'
|
97
125
|
description: punchlist lists your annotation comments--things like 'LATER/HACK/FIXIT'
|
@@ -106,7 +134,11 @@ files:
|
|
106
134
|
- Rakefile
|
107
135
|
- bin/punchlist
|
108
136
|
- lib/punchlist.rb
|
109
|
-
- lib/punchlist/
|
137
|
+
- lib/punchlist/config.rb
|
138
|
+
- lib/punchlist/inspector.rb
|
139
|
+
- lib/punchlist/offense.rb
|
140
|
+
- lib/punchlist/option_parser.rb
|
141
|
+
- lib/punchlist/renderer.rb
|
110
142
|
- lib/punchlist/version.rb
|
111
143
|
- punchlist.gemspec
|
112
144
|
homepage: http://github.com/apiology/punchlist
|
@@ -119,17 +151,17 @@ require_paths:
|
|
119
151
|
- lib
|
120
152
|
required_ruby_version: !ruby/object:Gem::Requirement
|
121
153
|
requirements:
|
122
|
-
- -
|
154
|
+
- - ">="
|
123
155
|
- !ruby/object:Gem::Version
|
124
156
|
version: '0'
|
125
157
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
158
|
requirements:
|
127
|
-
- -
|
159
|
+
- - ">="
|
128
160
|
- !ruby/object:Gem::Version
|
129
161
|
version: '0'
|
130
162
|
requirements: []
|
131
163
|
rubyforge_project:
|
132
|
-
rubygems_version: 2.4
|
164
|
+
rubygems_version: 2.6.14.4
|
133
165
|
signing_key:
|
134
166
|
specification_version: 4
|
135
167
|
summary: Finds largest source files in a project
|