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.
Files changed (86) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +132 -0
  3. data/.envrc +4 -0
  4. data/.git-hooks/pre_commit/circle_ci.rb +25 -0
  5. data/.git-hooks/pre_commit/punchlist.rb +51 -0
  6. data/.git-hooks/pre_commit/solargraph_typecheck.rb +64 -0
  7. data/.gitattributes +6 -0
  8. data/.gitignore +60 -0
  9. data/.markdownlint_style.rb +3 -0
  10. data/.mdlrc +1 -0
  11. data/.overcommit.yml +87 -0
  12. data/.pronto.yml +2 -0
  13. data/.rubocop.yml +148 -0
  14. data/.solargraph.yml +26 -0
  15. data/.yamllint.yml +8 -0
  16. data/CODE_OF_CONDUCT.md +133 -0
  17. data/CONTRIBUTING.rst +75 -0
  18. data/ChangeLog.md +8 -0
  19. data/DEVELOPMENT.md +31 -0
  20. data/Gemfile +26 -0
  21. data/Gemfile.lock +186 -0
  22. data/LICENSE +22 -0
  23. data/Makefile +104 -0
  24. data/README.md +27 -0
  25. data/Rakefile +3 -29
  26. data/bin/bump +29 -0
  27. data/bin/overcommit +29 -0
  28. data/bin/punchlist +1 -0
  29. data/bin/rake +29 -0
  30. data/bin/rubocop +27 -0
  31. data/bin/solargraph +27 -0
  32. data/bin/yard +27 -0
  33. data/config/env.1p +0 -0
  34. data/docs/.gitignore +3 -0
  35. data/docs/cookiecutter_input.json +16 -0
  36. data/feature/expected/mixed_types_of_source_files_results.txt +2 -0
  37. data/feature/expected/no_files_results.txt +0 -0
  38. data/feature/expected/non_source_file_with_pis_results.txt +0 -0
  39. data/feature/expected/one_source_file_with_cis_results.txt +1 -0
  40. data/feature/expected/scala_file_to_be_ignored_results.txt +1 -0
  41. data/feature/expected/source_file_with_no_items_results.txt +0 -0
  42. data/feature/feature_helper.rb +41 -0
  43. data/feature/pronto_punchlist_use_spec.rb +26 -0
  44. data/feature/punchlist_cli_spec.rb +63 -0
  45. data/feature/samples/mixed_types_of_source_files/lib/bar.scala +1 -0
  46. data/feature/samples/mixed_types_of_source_files/lib/foo.rb +4 -0
  47. data/feature/samples/no_files/.ignore +0 -0
  48. data/feature/samples/non_source_file_with_pis/foo.doc +5 -0
  49. data/feature/samples/one_source_file_with_cis/app/foo.rb +4 -0
  50. data/feature/samples/scala_file_to_be_ignored/lib/bar.scala +1 -0
  51. data/feature/samples/scala_file_to_be_ignored/lib/foo.rb +4 -0
  52. data/feature/samples/source_file_with_no_items/foo.rb +3 -0
  53. data/fix.sh +411 -0
  54. data/lib/punchlist/config.rb +27 -0
  55. data/lib/punchlist/inspector.rb +51 -0
  56. data/lib/punchlist/offense.rb +23 -0
  57. data/lib/punchlist/{options.rb → option_parser.rb} +9 -14
  58. data/lib/punchlist/renderer.rb +18 -0
  59. data/lib/punchlist/version.rb +3 -1
  60. data/lib/punchlist.rb +12 -45
  61. data/metrics/brakeman_high_water_mark +1 -0
  62. data/metrics/flake8_high_water_mark +1 -0
  63. data/metrics/jscs_high_water_mark +1 -0
  64. data/metrics/punchlist_high_water_mark +1 -0
  65. data/metrics/pycodestyle_high_water_mark +1 -0
  66. data/metrics/rails_best_practices_high_water_mark +1 -0
  67. data/metrics/scalastyle_high_water_mark +1 -0
  68. data/metrics/shellcheck_high_water_mark +1 -0
  69. data/package.json +9 -0
  70. data/punchlist.gemspec +27 -30
  71. data/rakelib/citest.rake +4 -0
  72. data/rakelib/clear_metrics.rake +9 -0
  73. data/rakelib/console.rake +6 -0
  74. data/rakelib/default.rake +4 -0
  75. data/rakelib/doc.rake +6 -0
  76. data/rakelib/feature.rake +10 -0
  77. data/rakelib/gem_tasks.rake +3 -0
  78. data/rakelib/localtest.rake +4 -0
  79. data/rakelib/overcommit.rake +6 -0
  80. data/rakelib/quality.rake +4 -0
  81. data/rakelib/repl.rake +4 -0
  82. data/rakelib/spec.rake +9 -0
  83. data/rakelib/undercover.rake +8 -0
  84. data/requirements_dev.txt +2 -0
  85. metadata +97 -92
  86. data/License.txt +0 -20
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f3a91cd04e344a758a88d1892086339492be3306
4
- data.tar.gz: cea784b35403f68c784694e64101b342fc0328b5
2
+ SHA256:
3
+ metadata.gz: e8aef2fe3d82b4fe162b643b0898f74e800ea607d806e6ce58bf45d0a3fd1e21
4
+ data.tar.gz: 73264d34929b8ad1fb6dd92dacaa131d7a0d6b9d71256fc901ab98f2f58f1450
5
5
  SHA512:
6
- metadata.gz: c5327b956982854e55f5b4e620ab0060825cd39e70838cccb818490e9f48dca889ccbc7329b94c416c2fd0465b815caa15f1004718a526321992bad392319419
7
- data.tar.gz: c7663708ff7dc748f159db4adb607e6267334396551abe8d74d82eb53bcfdf1c43852e73d027d249953cce532d2a681d722bd25ac960b537b2b69d1139852392
6
+ metadata.gz: bddf9817bcb9f4512397e2da5ee97269555e3eece6d260abd5df791436012841d33a9b9c836ac369b4dc16c411e20bd646a0fe250467a7ae0d744b6962a47ce9
7
+ data.tar.gz: a7f3c332d1d4a701fb6cc9a416d20ec5d68ce8c1b6369602a9420f8fc52432ebd1586c3c5b215799d4f0badabaa514cb91d93df11b8b2f2b99c5fbc6a11efb1f
@@ -0,0 +1,132 @@
1
+ ---
2
+ version: 2.1
3
+
4
+ commands:
5
+ run_with_languages:
6
+ description: "Run the given command in an environment that includes relevant langauges in the PATH"
7
+ parameters:
8
+ command:
9
+ type: string
10
+ description: "What command to execute"
11
+ label:
12
+ type: string
13
+ description: "What to label the run"
14
+ default: <<parameters.command>>
15
+ steps:
16
+ - run:
17
+ name: <<parameters.label>>
18
+ command: |
19
+ export PATH="${HOME}/.pyenv/bin:${PATH}"
20
+ export PATH="${HOME}/.rbenv/bin:${HOME}/.rbenv/shims:${PATH}"
21
+ export PATH="${HOME}/project/node_modules/.bin:${PATH}"
22
+ eval "$(pyenv init --path)"
23
+ eval "$(pyenv virtualenv-init -)"
24
+ eval "$(rbenv init -)"
25
+ export BUNDLE_PATH=vendor/bundle
26
+
27
+ <<parameters.command>>
28
+ environment:
29
+ # https://app.circleci.com/pipelines/github/apiology/cookiecutter-pypackage/4/workflows/29074dc8-944c-4600-8aaa-5116575fed90/jobs/4
30
+ "LC_ALL": "C.UTF-8"
31
+ "LANG": "C.UTF-8"
32
+ set_up_environment:
33
+ description: "Install source environment"
34
+ steps:
35
+ - checkout
36
+ - run: |
37
+ sed -E -e 's/punchlist \([[:digit:]]+.[[:digit:]]+.[[:digit:]]+\)/punchlist (0.1.0)/g' \
38
+ Gemfile.lock > Gemfile.lock.deversioned
39
+ - restore_cache:
40
+ key: gems-v2-{{ checksum "Gemfile.lock.deversioned" }}
41
+ - restore_cache:
42
+ key: wheels-v1-3.12.1-{{ checksum "requirements_dev.txt" }}
43
+ - run:
44
+ name: Initialize packages
45
+ command: |
46
+ export BUNDLE_PATH=vendor/bundle
47
+ './fix.sh'
48
+ - run:
49
+ name: Verify Gemfile.lock
50
+ command: |
51
+ if ! git diff --exit-code Gemfile.lock
52
+ then
53
+ >&2 echo "Please resolve changes to Gemfile.lock after bundle install to avoid caching difficulties"
54
+ exit 1
55
+ fi
56
+ - save_cache:
57
+ key: gems-v2-{{ checksum "Gemfile.lock.deversioned" }}
58
+ paths:
59
+ - "vendor/bundle"
60
+ - save_cache:
61
+ key: wheels-v1-3.12.1-{{ checksum "requirements_dev.txt" }}
62
+ paths:
63
+ - "/home/circleci/.cache/pip/wheels"
64
+ - "/home/circleci/.pyenv/versions/3.12.1/envs/punchlist-3.12.1"
65
+ - "/home/circleci/.pyenv/versions/punchlist-3.12.1"
66
+ - run:
67
+ name: Download new circleci tool
68
+ command: |
69
+ curl -fLSs \
70
+ https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/master/install.sh | sudo bash
71
+ overcommit:
72
+ description: "Run overcommit"
73
+ steps:
74
+ - set_up_environment
75
+ - run_with_languages:
76
+ label: Run overcommit
77
+ command: |
78
+ # Coax overcommit into working
79
+ git config --global user.email "test@test.test"
80
+ git config --global user.name "Test Test"
81
+ bundle exec overcommit --sign
82
+ bundle exec overcommit --sign pre-commit
83
+
84
+ bundle exec overcommit --run
85
+
86
+ jobs:
87
+ overcommit:
88
+ working_directory: ~/punchlist
89
+ docker:
90
+ - image: apiology/circleci-ruby:latest
91
+ steps:
92
+ - when:
93
+ condition:
94
+ equal: [<< pipeline.git.branch >>, "main"]
95
+ steps:
96
+ - overcommit
97
+ - unless:
98
+ condition:
99
+ equal: [<< pipeline.git.branch >>, "main"]
100
+ steps:
101
+ - run: echo "overcommit only runs on main branch"
102
+ build:
103
+ working_directory: ~/punchlist
104
+ docker:
105
+ - image: apiology/circleci-ruby:latest
106
+ steps:
107
+ - set_up_environment
108
+ - run_with_languages:
109
+ label: test
110
+ command: make citest cicoverage
111
+ # This seemed to shave 5ish% of the build time off when added
112
+ resource_class: large
113
+
114
+ workflows:
115
+ version: 2
116
+ weekly:
117
+ triggers:
118
+ - schedule:
119
+ cron: "0 0 * * 6"
120
+ filters:
121
+ branches:
122
+ only:
123
+ - main
124
+ jobs:
125
+ - build
126
+ - overcommit
127
+ overcommit:
128
+ jobs:
129
+ - overcommit
130
+ build:
131
+ jobs:
132
+ - build
data/.envrc ADDED
@@ -0,0 +1,4 @@
1
+ # shellcheck shell=bash
2
+ PATH_add bin
3
+
4
+ direnv_load op run --cache --env-file=config/env.1p -- direnv dump
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'overcommit'
4
+ require 'overcommit/hook/pre_commit/base'
5
+
6
+ module Overcommit
7
+ module Hook
8
+ module PreCommit
9
+ # CircleCI plugin for Overcommit to validate config file (.circleci/config.yml)
10
+ class CircleCi < Base
11
+ # @return [Symbol, Array<[Symbol, String]>]
12
+ def run
13
+ result = execute(command)
14
+ return :pass if result.success?
15
+
16
+ if result.success?
17
+ :pass
18
+ else
19
+ [:fail, result.stderr]
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'overcommit'
4
+ require 'overcommit/hook/pre_commit/base'
5
+
6
+ # Overcommit configuration
7
+ module Overcommit
8
+ module Hook
9
+ module PreCommit
10
+ # Runs `punchlist` against any modified Ruby files.
11
+ class Punchlist < Base
12
+ # @param stdout [String]
13
+ # @return [Array<Overcommit::Hook::Message>]
14
+ def parse_output(stdout)
15
+ stdout.split("\n").map do |line|
16
+ # @sg-ignore
17
+ file, line_no, _message = line.split(':', 3)
18
+ Overcommit::Hook::Message.new(:error, file, line_no.to_i, line)
19
+ end
20
+ end
21
+
22
+ # @return [String]
23
+ def files_glob
24
+ "{" \
25
+ "#{applicable_files.join(',')}" \
26
+ "}"
27
+ end
28
+
29
+ # @return [Symbol, Array<Overcommit::Hook::Message>]
30
+ def run
31
+ # @sg-ignore
32
+ # @type [Overcommit::Subprocess::Result]
33
+ result = execute([*command, '-g', files_glob])
34
+
35
+ warn result.stderr
36
+
37
+ # If the command exited with a non-zero status or produced any output, treat it as a failure
38
+ if result.status.nonzero? || !result.stdout.empty? || !result.stderr.empty?
39
+ # Parse the output to create Message objects
40
+ stdout = result.stdout
41
+ messages = parse_output(stdout)
42
+
43
+ return messages
44
+ end
45
+
46
+ :pass
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'overcommit'
4
+ require 'overcommit/hook/pre_commit/base'
5
+
6
+ # @!override Overcommit::Hook::Base#execute
7
+ # @return [Overcommit::Subprocess::Result]
8
+
9
+ module Overcommit
10
+ module Hook
11
+ module PreCommit
12
+ # Runs `solargraph typecheck` against any modified Ruby files.
13
+ class SolargraphTypecheck < Base
14
+ # @return [Array<String>]
15
+ def run
16
+ errors = []
17
+
18
+ applicable_files.each do |file|
19
+ generate_errors_for_file(file, errors)
20
+ end
21
+
22
+ # output message to stderr
23
+ errors
24
+ end
25
+
26
+ private
27
+
28
+ # @param file [String]
29
+ # @param errors [Array<String>]
30
+ # @return [void]
31
+ def generate_errors_for_file(file, errors)
32
+ result = execute(['bundle', 'exec', 'solargraph', 'typecheck', '--level', 'strong', file])
33
+ return if result.success?
34
+
35
+ # @type [String]
36
+ stdout = result.stdout
37
+
38
+ stdout.split("\n").each do |error|
39
+ error = parse_error(file, error)
40
+ errors << error unless error.nil?
41
+ end
42
+ end
43
+
44
+ # @param file [String]
45
+ # @param error [String]
46
+ # @return [Overcommit::Hook::Message, nil]
47
+ def parse_error(file, error)
48
+ # Parse the result for the line number # @type [MatchData]
49
+ match = error.match(/^(.+?):(\d+)/)
50
+ return nil unless match
51
+
52
+ # @!override MatchData.captures
53
+ # @return [Array]
54
+ # @sg-ignore
55
+ file_path, lineno = match.captures
56
+ message = error.sub("#{file_path}:#{lineno} - ",
57
+ "#{file_path}:#{lineno}: ")
58
+ # Emit the errors in the specified format
59
+ Overcommit::Hook::Message.new(:error, file, lineno.to_i, message)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
data/.gitattributes ADDED
@@ -0,0 +1,6 @@
1
+ # there's a lot of .sh in the build machinery; this can overwhelm
2
+ # smaller projects and confuse GitHub's detection of majority project
3
+ # type (GitHub uses the linguist library)
4
+ #
5
+ # https://dev.to/katkelly/changing-your-repo-s-language-in-github-5gjo
6
+ *.sh linguist-detectable=false
data/.gitignore ADDED
@@ -0,0 +1,60 @@
1
+ # OSX useful to ignore
2
+ *.DS_Store
3
+ .AppleDouble
4
+ .LSOverride
5
+
6
+ # Thumbnails
7
+ ._*
8
+
9
+ # Files that might appear in the root of a volume
10
+ .DocumentRevisions-V100
11
+ .fseventsd
12
+ .Spotlight-V100
13
+ .TemporaryItems
14
+ .Trashes
15
+ .VolumeIcon.icns
16
+ .com.apple.timemachine.donotpresent
17
+
18
+ # Directories potentially created on remote AFP share
19
+ .AppleDB
20
+ .AppleDesktop
21
+ Network Trash Folder
22
+ Temporary Items
23
+ .apdisk
24
+
25
+ # IntelliJ Idea family of suites
26
+ .idea
27
+ *.iml
28
+ ## File-based project format:
29
+ *.ipr
30
+ *.iws
31
+ ## mpeltonen/sbt-idea plugin
32
+ .idea_modules/
33
+
34
+ # IDE settings
35
+ .vscode/
36
+
37
+ # Editor temp files
38
+ *~
39
+ \#*\#
40
+
41
+ # Used by Makefile to track what we have and haven't installed
42
+ Gemfile.lock.installed
43
+ requirements_dev.txt.installed
44
+
45
+ # Used by CircleCI as a place to store installed gems
46
+ /vendor
47
+
48
+ # Installed by fix.sh based on what latest versions are
49
+ /.python-version
50
+ /.ruby-version
51
+
52
+ # Ruby-related
53
+ /.bundle/
54
+ /.yardoc
55
+ /_yardoc/
56
+ /doc/
57
+ /pkg/
58
+ /spec/reports/
59
+ /tmp/
60
+ /coverage/
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ rule 'MD029', style: 'ordered'
data/.mdlrc ADDED
@@ -0,0 +1 @@
1
+ style ".markdownlint_style.rb"
data/.overcommit.yml ADDED
@@ -0,0 +1,87 @@
1
+ ---
2
+ # Use this file to configure the Overcommit hooks you wish to use. This will
3
+ # extend the default configuration defined in:
4
+ # https://github.com/sds/overcommit/blob/master/config/default.yml
5
+ #
6
+ # At the topmost level of this YAML file is a key representing type of hook
7
+ # being run (e.g. pre-commit, commit-msg, etc.). Within each type you can
8
+ # customize each hook, such as whether to only run it on certain files (via
9
+ # `include`), whether to only display output if it fails (via `quiet`), etc.
10
+ #
11
+ # For a complete list of hooks, see:
12
+ # https://github.com/sds/overcommit/tree/master/lib/overcommit/hook
13
+ #
14
+ # For a complete list of options that you can use to customize hooks, see:
15
+ # https://github.com/sds/overcommit#configuration
16
+ #
17
+ # Uncomment the following lines to make the configuration take effect.
18
+
19
+ PreCommit:
20
+ # Extend default config at
21
+ # https://github.com/sds/overcommit/blob/master/config/default.yml
22
+ BrokenSymlinks:
23
+ enabled: true
24
+ description: 'Check for broken symlinks'
25
+ quiet: true
26
+ RuboCop:
27
+ enabled: true
28
+ command: ['bundle', 'exec', 'rubocop']
29
+ include:
30
+ - '**/*.gemspec'
31
+ - '**/*.rake'
32
+ - '**/*.rb'
33
+ - '**/*.ru'
34
+ - '**/Gemfile'
35
+ - '**/Rakefile'
36
+ - 'bin/*'
37
+ - 'exe/*'
38
+ problem_on_unmodified_line: warn
39
+ exclude:
40
+ - db/migrate/*.rb
41
+ - db/schema.rb
42
+ PythonFlake8:
43
+ enabled: true
44
+ on_warn: fail
45
+ ShellCheck:
46
+ enabled: true
47
+ on_warn: fail
48
+ include:
49
+ - '.envrc'
50
+ - '**/*.sh'
51
+ YamlLint:
52
+ enabled: true
53
+ flags: ['-c', '.yamllint.yml', '--format=parsable', '--strict']
54
+ on_warn: fail
55
+ CircleCi:
56
+ required_executable: 'circleci'
57
+ flags: ['config', 'validate']
58
+ include:
59
+ - '.circleci/config.yml'
60
+ enabled: true
61
+ SolargraphTypecheck:
62
+ enabled: true
63
+ problem_on_unmodified_line: warn
64
+ include:
65
+ - '**/*.rb'
66
+ Punchlist:
67
+ command: ['bundle', 'exec', 'punchlist']
68
+ enabled: true
69
+ problem_on_unmodified_line: warn
70
+
71
+ PrePush:
72
+ RakeTarget:
73
+ enabled: true
74
+ command: ['bundle', 'exec', 'rake']
75
+ include:
76
+ - 'Rakefile'
77
+ targets:
78
+ - 'clear_metrics'
79
+ - 'spec'
80
+ - 'undercover'
81
+
82
+ #PostCheckout:
83
+ # ALL: # Special hook name that customizes all hooks of this type
84
+ # quiet: true # Change all post-checkout hooks to only display output on failure
85
+ #
86
+ # IndexTags:
87
+ # enabled: true # Generate a tags file with `ctags` each time HEAD changes
data/.pronto.yml ADDED
@@ -0,0 +1,2 @@
1
+ text:
2
+ format: "%{color_location}: [%{runner}] %{msg}"
data/.rubocop.yml ADDED
@@ -0,0 +1,148 @@
1
+ ---
2
+ Layout/LineLength:
3
+ Max: 120
4
+
5
+ Layout/MultilineMethodCallIndentation:
6
+ EnforcedStyle: indented
7
+
8
+ Lint/EmptyClass:
9
+ # some workarounds for circular dependencies require empty classes
10
+ AllowComments: true
11
+
12
+ # conflicts with solargraph wanting every parameter documented with
13
+ # actual name and subclassing
14
+ Lint/UnusedMethodArgument:
15
+ Enabled: false
16
+
17
+ # https://stackoverflow.com/questions/40934345/rubocop-25-line-block-size-and-rspec-tests
18
+ Metrics/BlockLength:
19
+ # Exclude DSLs
20
+ Exclude:
21
+ - 'Rakefile'
22
+ - '*.gemspec'
23
+ - '**/*.rake'
24
+ - 'spec/**/*.rb'
25
+ - 'feature/**/*.rb'
26
+
27
+ # I use keyword arguments for a poor man's dependency injection to cut
28
+ # down on the magic in my tests.
29
+ Metrics/ParameterLists:
30
+ CountKeywordArgs: false
31
+
32
+ Naming/HeredocDelimiterNaming:
33
+ Enabled: false
34
+
35
+ Naming/MethodParameterName:
36
+ Enabled: true
37
+ AllowedNames:
38
+ # I don't think things on this list are a terribly hard convention
39
+ # for folks to learn. bbatsov also doesn't care much for this
40
+ # check:
41
+ #
42
+ # https://github.com/rubocop-hq/rubocop/issues/3666
43
+ - e # exception
44
+ - x # cartesian coordinates
45
+ - y # cartesian coordinates
46
+
47
+ # by default (EnforcedStyle=NormalCase) this rule doesn't like
48
+ # things like check_1, check_2, etc and wants check1, check2, etc. I
49
+ # like the former.
50
+ #
51
+ # https://docs.rubocop.org/rubocop/cops_naming.html#namingvariablenumber
52
+ Naming/VariableNumber:
53
+ Enabled: true
54
+ EnforcedStyle: snake_case
55
+
56
+ # http://www.betterspecs.org/#single
57
+ #
58
+ # > in tests that are not isolated (e.g. ones that integrate with a
59
+ # > DB, an external webservice, or end-to-end-tests), you take a
60
+ # > massive performance hit to do the same setup over and over again,
61
+ # > just to set a different expectation in each test. In these sorts
62
+ # > of slower tests, I think it's fine to specify more than one
63
+ # > isolated behavior.
64
+ RSpec/MultipleExpectations:
65
+ Exclude:
66
+ - 'feature/**/*.rb'
67
+
68
+ # Bump this up a bit for now. I find useful, readable specs at level
69
+ # 4, for now at least.
70
+ #
71
+ # The logic here makes sense to me:
72
+ # https://github.com/datarockets/ruby-style/issues/36
73
+ RSpec/NestedGroups:
74
+ Max: 4
75
+
76
+ # Likewise
77
+ RSpec/MultipleMemoizedHelpers:
78
+ Max: 8
79
+
80
+ # Ensure we reference constants on classes in instance_double() so
81
+ # that a renamed class is caught and doubles are always actually
82
+ # verified.
83
+ RSpec/VerifiedDoubleReference:
84
+ Enabled: true
85
+ EnforcedStyle: constant
86
+
87
+ #
88
+ # Add 'XX X' to the standard list
89
+ #
90
+ Style/CommentAnnotation:
91
+ Keywords:
92
+ - "TOD\
93
+ O"
94
+ - "FIXM\
95
+ E"
96
+ - "OPTIMIZ\
97
+ E"
98
+ - "HAC\
99
+ K"
100
+ - "REVIE\
101
+ W"
102
+ - "XX\
103
+ X"
104
+
105
+ Style/DocumentationMethod:
106
+ Enabled: true
107
+ Include:
108
+ - 'lib/punchlist/*.rb'
109
+
110
+ Style/StringLiterals:
111
+ EnforcedStyle: single_quotes
112
+ SupportedStyles:
113
+ - single_quotes
114
+ - double_quotes
115
+ ConsistentQuotesInMultiline: true
116
+
117
+ # Solargraph needs to see a class inherited from Struct to recognize
118
+ # what's going on
119
+ Style/StructInheritance:
120
+ Enabled: false
121
+
122
+ # I like trailing commas in arrays and hashes. They let me insert new
123
+ # elements and see them as one line in a diff, not two.
124
+ Style/TrailingCommaInArrayLiteral:
125
+ EnforcedStyleForMultiline: comma
126
+
127
+ Style/TrailingCommaInHashLiteral:
128
+ EnforcedStyleForMultiline: comma
129
+
130
+ # If I'm using one function name and returning the contents of an
131
+ # attribute, that's OK. The alternative would be this, which I find
132
+ # confusing and often not really what I mean:
133
+ #
134
+ # attr_reader :something_else
135
+ # alias_method :something, :something_else
136
+ Style/TrivialAccessors:
137
+ ExactNameMatch: true
138
+
139
+ AllCops:
140
+ NewCops: enable
141
+ TargetRubyVersion: 3.0
142
+ Exclude:
143
+ - 'bin/*'
144
+ - 'vendor/**/*'
145
+
146
+ require:
147
+ - rubocop-rake
148
+ - rubocop-rspec
data/.solargraph.yml ADDED
@@ -0,0 +1,26 @@
1
+ ---
2
+ include:
3
+ - "**/*.rb"
4
+ - ".git-hooks/**/*.rb"
5
+ exclude:
6
+ - spec/**/*
7
+ - feature/**/*
8
+ - test/**/*
9
+ - vendor/**/*
10
+ - ".bundle/**/*"
11
+ require: []
12
+ domains: []
13
+ reporters:
14
+ - rubocop
15
+ - require_not_found
16
+ - typecheck:strong
17
+ - update_errors
18
+ formatter:
19
+ rubocop:
20
+ cops: safe
21
+ except: []
22
+ only: []
23
+ extra_args: []
24
+ require_paths: []
25
+ plugins: []
26
+ max_files: 5000
data/.yamllint.yml ADDED
@@ -0,0 +1,8 @@
1
+ ---
2
+ # https://yamllint.readthedocs.io/en/stable/configuration.html
3
+ extends: default
4
+
5
+ rules:
6
+ comments: disable
7
+ line-length:
8
+ max: 120