punchlist 1.2.0 → 1.3.1
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 +5 -5
- data/.circleci/config.yml +132 -0
- data/.envrc +4 -0
- data/.git-hooks/pre_commit/circle_ci.rb +25 -0
- data/.git-hooks/pre_commit/punchlist.rb +51 -0
- data/.git-hooks/pre_commit/solargraph_typecheck.rb +64 -0
- data/.gitattributes +6 -0
- data/.gitignore +60 -0
- data/.markdownlint_style.rb +3 -0
- data/.mdlrc +1 -0
- data/.overcommit.yml +87 -0
- data/.pronto.yml +2 -0
- data/.rubocop.yml +148 -0
- data/.solargraph.yml +26 -0
- data/.yamllint.yml +8 -0
- data/CODE_OF_CONDUCT.md +133 -0
- data/CONTRIBUTING.rst +75 -0
- data/ChangeLog.md +8 -0
- data/DEVELOPMENT.md +31 -0
- data/Gemfile +26 -0
- data/Gemfile.lock +186 -0
- data/LICENSE +22 -0
- data/Makefile +104 -0
- data/README.md +27 -0
- data/Rakefile +3 -29
- data/bin/bump +29 -0
- data/bin/overcommit +29 -0
- data/bin/punchlist +1 -0
- data/bin/rake +29 -0
- data/bin/rubocop +27 -0
- data/bin/solargraph +27 -0
- data/bin/yard +27 -0
- data/config/env.1p +0 -0
- data/docs/.gitignore +3 -0
- data/docs/cookiecutter_input.json +16 -0
- data/feature/expected/mixed_types_of_source_files_results.txt +2 -0
- data/feature/expected/no_files_results.txt +0 -0
- data/feature/expected/non_source_file_with_pis_results.txt +0 -0
- data/feature/expected/one_source_file_with_cis_results.txt +1 -0
- data/feature/expected/scala_file_to_be_ignored_results.txt +1 -0
- data/feature/expected/source_file_with_no_items_results.txt +0 -0
- data/feature/feature_helper.rb +41 -0
- data/feature/pronto_punchlist_use_spec.rb +26 -0
- data/feature/punchlist_cli_spec.rb +63 -0
- data/feature/samples/mixed_types_of_source_files/lib/bar.scala +1 -0
- data/feature/samples/mixed_types_of_source_files/lib/foo.rb +4 -0
- data/feature/samples/no_files/.ignore +0 -0
- data/feature/samples/non_source_file_with_pis/foo.doc +5 -0
- data/feature/samples/one_source_file_with_cis/app/foo.rb +4 -0
- data/feature/samples/scala_file_to_be_ignored/lib/bar.scala +1 -0
- data/feature/samples/scala_file_to_be_ignored/lib/foo.rb +4 -0
- data/feature/samples/source_file_with_no_items/foo.rb +3 -0
- data/fix.sh +411 -0
- data/lib/punchlist/config.rb +27 -0
- data/lib/punchlist/inspector.rb +51 -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/lib/punchlist.rb +12 -45
- data/metrics/brakeman_high_water_mark +1 -0
- data/metrics/flake8_high_water_mark +1 -0
- data/metrics/jscs_high_water_mark +1 -0
- data/metrics/punchlist_high_water_mark +1 -0
- data/metrics/pycodestyle_high_water_mark +1 -0
- data/metrics/rails_best_practices_high_water_mark +1 -0
- data/metrics/scalastyle_high_water_mark +1 -0
- data/metrics/shellcheck_high_water_mark +1 -0
- data/package.json +9 -0
- data/punchlist.gemspec +27 -30
- data/rakelib/citest.rake +4 -0
- data/rakelib/clear_metrics.rake +9 -0
- data/rakelib/console.rake +6 -0
- data/rakelib/default.rake +4 -0
- data/rakelib/doc.rake +6 -0
- data/rakelib/feature.rake +10 -0
- data/rakelib/gem_tasks.rake +3 -0
- data/rakelib/localtest.rake +4 -0
- data/rakelib/overcommit.rake +6 -0
- data/rakelib/quality.rake +4 -0
- data/rakelib/repl.rake +4 -0
- data/rakelib/spec.rake +9 -0
- data/rakelib/undercover.rake +8 -0
- data/requirements_dev.txt +2 -0
- metadata +97 -92
- data/License.txt +0 -20
data/bin/overcommit
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'overcommit' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("overcommit", "overcommit")
|
data/bin/punchlist
CHANGED
data/bin/rake
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rake' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rake", "rake")
|
data/bin/rubocop
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rubocop' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
|
12
|
+
|
13
|
+
bundle_binstub = File.expand_path("bundle", __dir__)
|
14
|
+
|
15
|
+
if File.file?(bundle_binstub)
|
16
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
17
|
+
load(bundle_binstub)
|
18
|
+
else
|
19
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
20
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
require "rubygems"
|
25
|
+
require "bundler/setup"
|
26
|
+
|
27
|
+
load Gem.bin_path("rubocop", "rubocop")
|
data/bin/solargraph
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'solargraph' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
|
12
|
+
|
13
|
+
bundle_binstub = File.expand_path("bundle", __dir__)
|
14
|
+
|
15
|
+
if File.file?(bundle_binstub)
|
16
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
17
|
+
load(bundle_binstub)
|
18
|
+
else
|
19
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
20
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
require "rubygems"
|
25
|
+
require "bundler/setup"
|
26
|
+
|
27
|
+
load Gem.bin_path("solargraph", "solargraph")
|
data/bin/yard
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'yard' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
|
12
|
+
|
13
|
+
bundle_binstub = File.expand_path("bundle", __dir__)
|
14
|
+
|
15
|
+
if File.file?(bundle_binstub)
|
16
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
17
|
+
load(bundle_binstub)
|
18
|
+
else
|
19
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
20
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
require "rubygems"
|
25
|
+
require "bundler/setup"
|
26
|
+
|
27
|
+
load Gem.bin_path("yard", "yard")
|
data/config/env.1p
ADDED
File without changes
|
data/docs/.gitignore
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
{
|
2
|
+
"_checkout": null,
|
3
|
+
"_output_dir": "/Users/broz/src/punchlist/.git/cookiecutter",
|
4
|
+
"_repo_dir": "/Users/broz/src/cookiecutter-gem",
|
5
|
+
"_template": "https://github.com/apiology/cookiecutter-gem",
|
6
|
+
"email": "vince@broz.cc",
|
7
|
+
"full_name": "Vince Broz",
|
8
|
+
"github_username": "apiology",
|
9
|
+
"module_name": "Punchlist",
|
10
|
+
"open_source_license": "MIT license",
|
11
|
+
"project_name": "Punchlist",
|
12
|
+
"project_short_description": "Counts the number of 'todo' comments in your code",
|
13
|
+
"project_slug": "punchlist",
|
14
|
+
"type_of_github_repo": "public",
|
15
|
+
"version": "1.3.6"
|
16
|
+
}
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
app/foo.rb:4: puts 'foo' # XXX: change to bar
|
@@ -0,0 +1 @@
|
|
1
|
+
lib/foo.rb:3: # XXX: need to frob the lub
|
File without changes
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'open3'
|
4
|
+
require 'punchlist'
|
5
|
+
require 'rspec'
|
6
|
+
|
7
|
+
# Add the bin directory, to allow testing of gem executables as if the gem is
|
8
|
+
# already installed.
|
9
|
+
root_dir = RSpec::Core::RubyProject.root
|
10
|
+
exec_dir = File.join(File::SEPARATOR, root_dir, 'bin')
|
11
|
+
# @sg-ignore
|
12
|
+
ENV['PATH'] = [exec_dir, ENV.fetch('PATH')].join(File::PATH_SEPARATOR)
|
13
|
+
|
14
|
+
# Courtesy of:
|
15
|
+
# https://raw.github.com/cupakromer/tao-of-tdd/master/adder/spec/support/
|
16
|
+
# capture_exec.rb
|
17
|
+
|
18
|
+
# @sg-ignore
|
19
|
+
# @param cmd [Array<String>]
|
20
|
+
# @return [String]
|
21
|
+
def exec_io(*cmd)
|
22
|
+
cmd = cmd.flatten
|
23
|
+
# @sg-ignore
|
24
|
+
all_out, _exit_code = Open3.capture2e(*cmd)
|
25
|
+
|
26
|
+
all_out
|
27
|
+
end
|
28
|
+
|
29
|
+
RSpec.configure do |config|
|
30
|
+
config.run_all_when_everything_filtered = true
|
31
|
+
config.order = 'random'
|
32
|
+
config.alias_it_should_behave_like_to :has_behavior
|
33
|
+
config.alias_it_should_behave_like_to :it_has_behavior, 'has behavior:'
|
34
|
+
end
|
35
|
+
|
36
|
+
def let_double(*doubles)
|
37
|
+
doubles.each do |double_sym|
|
38
|
+
# @sg-ignore
|
39
|
+
let(double_sym) { double(double_sym.to_s) }
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'punchlist'
|
5
|
+
require 'punchlist/offense'
|
6
|
+
|
7
|
+
# Example use from https://github.com/apiology/pronto-punchlist
|
8
|
+
|
9
|
+
describe Punchlist do
|
10
|
+
subject(:offenses) do
|
11
|
+
::Punchlist::Inspector.new(punchlist_line_regexp, path).run
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:punchlist_line_regexp) do
|
15
|
+
Regexp.new(::Punchlist::Config.default_punchlist_line_regexp_string)
|
16
|
+
end
|
17
|
+
let(:path) { 'feature/samples/mixed_types_of_source_files/lib/bar.scala' }
|
18
|
+
|
19
|
+
it 'stays compatible with use by pronto-spec' do
|
20
|
+
expect(offenses.length).to eq(1)
|
21
|
+
offenses.each do |offense|
|
22
|
+
expect(offense.filename).to eq(path)
|
23
|
+
expect(offense.line_num).to eq(1)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'feature_helper'
|
4
|
+
require 'punchlist'
|
5
|
+
|
6
|
+
describe Punchlist do
|
7
|
+
# "pis" are "punchlist items"
|
8
|
+
|
9
|
+
%w[mixed_types_of_source_files
|
10
|
+
one_source_file_with_cis
|
11
|
+
no_files
|
12
|
+
source_file_with_no_items
|
13
|
+
non_source_file_with_pis].each do |type|
|
14
|
+
it "handles #{type} case" do
|
15
|
+
expect(exec_io("cd feature/samples/#{type} &&" \
|
16
|
+
'RUBYLIB=`pwd`/../../lib:"$RUBYLIB" punchlist'))
|
17
|
+
.to eq(IO.read("feature/expected/#{type}_results.txt"))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
%w[scala_file_to_be_ignored].each do |type|
|
22
|
+
it "handles #{type} case with a special glob" do
|
23
|
+
expect(exec_io("cd feature/samples/#{type} &&" \
|
24
|
+
'RUBYLIB=`pwd`/../../lib:"$RUBYLIB" ' \
|
25
|
+
"punchlist --glob '{app,lib,test,spec,feature}/**/*." \
|
26
|
+
"{rb,swift,cpp,c,java,py}'"))
|
27
|
+
.to eq(IO.read("feature/expected/#{type}_results.txt"))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
let(:expected_usage) do
|
32
|
+
"Usage: punchlist [options]\n"\
|
33
|
+
' -g, --glob glob here ' \
|
34
|
+
'Which files to parse - default is ' \
|
35
|
+
'{Dockerfile,Rakefile,{*,.*}.{c,clj,cljs,cpp,gemspec,groovy,html,java,' \
|
36
|
+
'js,json,py,rake,rb,scala,sh,swift,yml},{app,config,db,feature,lib,spec,' \
|
37
|
+
'src,test,tests,vars,www}/**/{*,.*}.{c,clj,cljs,cpp,gemspec,groovy,html,' \
|
38
|
+
'java,js,json,py,rake,rb,scala,sh,swift,yml}}' \
|
39
|
+
"\n" \
|
40
|
+
' -e, --exclude-glob glob here ' \
|
41
|
+
"Files to exclude - default is none\n" \
|
42
|
+
' -r, --regexp r ' \
|
43
|
+
'Regexp to trigger upon - default is ' \
|
44
|
+
"XXX|TODO|FIXME|OPTIMIZE|HACK|REVIEW|LATER|FIXIT\n"
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'starts up with short help argument' do
|
48
|
+
expect(exec_io('punchlist -h'))
|
49
|
+
.to eq(expected_usage)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'starts up with long help argument' do
|
53
|
+
expect(exec_io('punchlist --help'))
|
54
|
+
.to eq(expected_usage)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'starts up with invalid argument' do
|
58
|
+
expect(exec_io('punchlist --blah'))
|
59
|
+
.to match(/invalid option/)
|
60
|
+
end
|
61
|
+
|
62
|
+
xit 'handles passing in different annotation comments'
|
63
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
println('something') // TODO: mix styles
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
println('something') // TODO: mix styles
|