way_of_working 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +30 -0
  3. data/CODE_OF_CONDUCT.md +133 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +101 -0
  6. data/exe/way_of_working +5 -0
  7. data/lib/tasks/audit_gems.rake +60 -0
  8. data/lib/way_of_working/cli.rb +125 -0
  9. data/lib/way_of_working/generators/changelog/init.rb +110 -0
  10. data/lib/way_of_working/generators/code_of_conduct/init.rb +32 -0
  11. data/lib/way_of_working/generators/decision_record/init.rb +29 -0
  12. data/lib/way_of_working/generators/decision_record/new.rb +67 -0
  13. data/lib/way_of_working/generators/linter/exec.rb +77 -0
  14. data/lib/way_of_working/generators/linter/init.rb +60 -0
  15. data/lib/way_of_working/generators/rake_tasks/init.rb +47 -0
  16. data/lib/way_of_working/git/repo_reader.rb +72 -0
  17. data/lib/way_of_working/git/summary_tag.rb +27 -0
  18. data/lib/way_of_working/paths.rb +16 -0
  19. data/lib/way_of_working/sub_command_base.rb +16 -0
  20. data/lib/way_of_working/tasks.rb +8 -0
  21. data/lib/way_of_working/templates/.github/linters/.markdown-link-check.json +13 -0
  22. data/lib/way_of_working/templates/.github/linters/rubocop_defaults.yml +55 -0
  23. data/lib/way_of_working/templates/.github/workflows/mega-linter.yml +82 -0
  24. data/lib/way_of_working/templates/.mega-linter.yml +129 -0
  25. data/lib/way_of_working/templates/.rubocop +1 -0
  26. data/lib/way_of_working/templates/CODE_OF_CONDUCT.md.tt +134 -0
  27. data/lib/way_of_working/templates/docs/decisions/README.md +7 -0
  28. data/lib/way_of_working/templates/docs/decisions/adr-template.md.tt +79 -0
  29. data/lib/way_of_working/version.rb +5 -0
  30. data/lib/way_of_working.rb +10 -0
  31. data/way_of_working.gemspec +43 -0
  32. metadata +121 -0
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'way_of_working/paths'
5
+
6
+ module WayOfWorking
7
+ module Generators
8
+ module DecisionRecord
9
+ # This generator add a new MADR decision record to the doc/decisions folder
10
+ class New < Thor::Group
11
+ argument :name, type: :string, required: true, desc: 'The title of the decision record'
12
+
13
+ include Thor::Actions
14
+
15
+ source_root ::WayOfWorking.source_root
16
+
17
+ def create_decision_record_file
18
+ case behavior
19
+ when :invoke
20
+ invoke_decision_record_file
21
+ when :revoke
22
+ revoke_decision_record_file
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def invoke_decision_record_file
29
+ @decision_date = Date.today.strftime('%Y-%m-%d')
30
+ @title = name
31
+
32
+ # from https://raw.githubusercontent.com/adr/madr/3.0.0/template/adr-template.md
33
+ template 'docs/decisions/adr-template.md',
34
+ "docs/decisions/#{next_decision_number}-#{dashed_name}.md"
35
+ end
36
+
37
+ def revoke_decision_record_file
38
+ matching_files = Dir.glob("[0-9][0-9][0-9][0-9]-#{dashed_name}.md",
39
+ base: File.join(destination_root, 'docs/decisions'))
40
+ raise "No matching decision record for '#{dashed_name}'" if matching_files.empty?
41
+
42
+ # based on Thor's remove_file
43
+ path = File.expand_path("docs/decisions/#{matching_files.first}", destination_root)
44
+
45
+ say_status :remove, relative_to_original_destination_root(path)
46
+ return unless !options[:pretend] && (File.exist?(path) || File.symlink?(path))
47
+
48
+ require 'fileutils'
49
+ ::FileUtils.rm_rf(path)
50
+ end
51
+
52
+ def next_decision_number
53
+ existing_decisions = Dir.glob('[0-9][0-9][0-9][0-9]-*.md',
54
+ base: File.join(destination_root, 'docs/decisions'))
55
+ last_number = existing_decisions.map do |filename|
56
+ filename.match(/\A(\d{4})-/)[1].to_i
57
+ end.max || -1
58
+ format('%04d', last_number + 1)
59
+ end
60
+
61
+ def dashed_name
62
+ name.downcase.gsub(/[\s_()]/, '-').gsub(/-+/, '-')
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor'
4
+ require 'rainbow'
5
+
6
+ module WayOfWorking
7
+ module Generators
8
+ module Linter
9
+ # This generator runs the linter
10
+ class Exec < Thor::Group
11
+ argument :path, type: :string, required: false, desc: 'Optional path of the file to lint'
12
+
13
+ desc 'This runs the linter on this project'
14
+
15
+ def run_first
16
+ @start_time = Time.now
17
+
18
+ say(Rainbow("Limiting linters to #{path}\n").yellow) if path
19
+ end
20
+
21
+ # Run RuboCop
22
+ def prep_and_run_rubocop
23
+ say(Rainbow('Running RuboCop...').yellow)
24
+
25
+ @rubocop_ok = run_rubocop(ARGV[2..])
26
+ end
27
+
28
+ # Run MegaLinter
29
+ def prep_and_run_megalinter
30
+ command = ['npx', 'mega-linter-runner', '--remove-container']
31
+ # Configure MegaLinter to only lint a specific file or folder, if defined
32
+ command.prepend("MEGALINTER_FILES_TO_LINT=\"#{path}\"") if path
33
+ # We only want reports created in the working directory
34
+ command.prepend('env', "GITHUB_WORKSPACE=\"#{Dir.pwd}\"")
35
+
36
+ say(Rainbow("\nRunning MegaLinter...").yellow)
37
+
38
+ @megalinter_ok = run_megalinter(command)
39
+ end
40
+
41
+ # We run this last to enable all the linters to run first
42
+ def run_last
43
+ say(Rainbow("\nTotal time taken: #{(Time.now - @start_time).to_i} seconds").yellow)
44
+
45
+ if !@rubocop_ok || !@megalinter_ok
46
+ abort(Rainbow("\nLinter failed!").red)
47
+ else
48
+ say(Rainbow("\nLinter Succeeded!").green)
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def path_directory
55
+ return path if File.directory?(path)
56
+
57
+ File.dirname(path)
58
+ end
59
+
60
+ def run_rubocop(arguments)
61
+ # We lazy-load RuboCop so that the task doesn't dramatically impact the
62
+ # load time of our commands.
63
+ require 'rubocop'
64
+
65
+ cli = RuboCop::CLI.new
66
+ !cli.run(arguments).nonzero?
67
+ end
68
+
69
+ def run_megalinter(arguments)
70
+ arguments.prepend('time')
71
+
72
+ system(*arguments)
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor'
4
+ require 'way_of_working/paths'
5
+
6
+ module WayOfWorking
7
+ module Generators
8
+ module Linter
9
+ # This generator add the MADR files to the doc/decisions folder
10
+ class Init < Thor::Group
11
+ include Thor::Actions
12
+
13
+ source_root ::WayOfWorking.source_root
14
+
15
+ # TODO: copy_rubocop_github_workflow_action
16
+
17
+ def copy_github_linters_rubocop_config_file
18
+ copy_file '.github/linters/rubocop_defaults.yml'
19
+ end
20
+
21
+ def copy_github_linters_markdown_link_check_config_file
22
+ copy_file '.github/linters/.markdown-link-check.json'
23
+ end
24
+
25
+ def copy_megalinter_github_workflow_action
26
+ copy_file '.github/workflows/mega-linter.yml'
27
+ end
28
+
29
+ def copy_megalinter_dot_file
30
+ copy_file '.mega-linter.yml'
31
+ end
32
+
33
+ def create_gitignore_if_missing
34
+ create_file_if_missing '.gitignore'
35
+ end
36
+
37
+ def gitignore_reports_folder
38
+ append_to_file '.gitignore', "megalinter-reports/\n"
39
+ end
40
+
41
+ def gitignore_rubocop_cached_file
42
+ append_to_file '.gitignore', ".rubocop-https---*\n"
43
+ end
44
+
45
+ def copy_rubocop_options_file
46
+ copy_file '.rubocop'
47
+ end
48
+
49
+ private
50
+
51
+ def create_file_if_missing(path)
52
+ path = File.join(destination_root, path)
53
+ return if behavior == :revoke || File.exist?(path)
54
+
55
+ File.open(path, 'w', &:write)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WayOfWorking
4
+ module Generators
5
+ module RakeTasks
6
+ # This generator installs way of working rake tasks into this project
7
+ class Init < Thor::Group
8
+ include Thor::Actions
9
+
10
+ RAKEFILE_FILENAME = 'Rakefile'
11
+ RAILS_LOC = %r{require_relative ["']config/application["']\n}.freeze
12
+ BUNDLER_LOC = %r{require ["']bundler/gem_tasks["']\n}.freeze
13
+
14
+ def add_to_rakefile
15
+ case rakefile_type
16
+ when :rails
17
+ inject_into_file RAKEFILE_FILENAME,
18
+ "require 'way_of_working/tasks' if Rails.env.development? " \
19
+ "|| Rails.env.test?\n",
20
+ after: RAILS_LOC
21
+ when :bundler
22
+ inject_into_file RAKEFILE_FILENAME,
23
+ "require 'way_of_working/tasks'\n",
24
+ after: BUNDLER_LOC
25
+ when :none
26
+ create_file RAKEFILE_FILENAME, "\nrequire 'way_of_working/tasks'\n"
27
+ else
28
+ append_to_file RAKEFILE_FILENAME, "\nrequire 'way_of_working/tasks'\n"
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def rakefile_type
35
+ content = File.read(File.expand_path(RAKEFILE_FILENAME, destination_root))
36
+
37
+ return :rails if content.match?(RAILS_LOC)
38
+ return :bundler if content.match?(BUNDLER_LOC)
39
+
40
+ :other
41
+ rescue Errno::ENOENT
42
+ :none
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git'
4
+ require_relative 'summary_tag'
5
+
6
+ module WayOfWorking
7
+ module Git
8
+ # This class holds a summary of a git tag
9
+ class RepoReader
10
+ attr_reader :base
11
+
12
+ def initialize(base)
13
+ @base = base
14
+ end
15
+
16
+ def summary_tags
17
+ tags = @base.tags.map do |tag|
18
+ SummaryTag.new(tag.name, base.gcommit(tag.objectish).date)
19
+ end.sort
20
+
21
+ ensure_versions_are_valid_and_increasing!(tags)
22
+ capture_change_types(tags)
23
+
24
+ tags
25
+ end
26
+
27
+ def likely_upstream_remote_url
28
+ likely_upstream_remote&.url&.sub(/\.git\z/, '')
29
+ end
30
+
31
+ private
32
+
33
+ def ensure_versions_are_valid_and_increasing!(tags)
34
+ previous_version = nil
35
+ tags.each do |tag|
36
+ next if tag.version.nil?
37
+
38
+ if previous_version && tag.version <= previous_version
39
+ raise 'Tag versions are not incremental over time'
40
+ end
41
+
42
+ previous_version = tag.version
43
+ end
44
+ end
45
+
46
+ def capture_change_types(tags)
47
+ previous_version_segments = [-1, -1, -1]
48
+ tags.each do |tag|
49
+ tag.change_type = if tag.version.segments[0] > previous_version_segments[0]
50
+ :major
51
+ elsif tag.version.segments[1] > previous_version_segments[1]
52
+ :minor
53
+ else
54
+ :patch
55
+ end
56
+
57
+ previous_version_segments = tag.version.segments
58
+ end
59
+ end
60
+
61
+ def likely_upstream_remote
62
+ remotes = @base.remotes
63
+ return remotes.first if remotes.count == 1
64
+
65
+ remotes = remotes.reject { |remote| remote.name == 'origin' }
66
+ return remotes.first if remotes.count == 1
67
+
68
+ remotes.last
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git'
4
+
5
+ module WayOfWorking
6
+ module Git
7
+ # This convenience class holds a summary of a git tag
8
+ class SummaryTag
9
+ attr_accessor :change_type, :commit_date, :name
10
+
11
+ def initialize(name, commit_date)
12
+ @name = name
13
+ @commit_date = commit_date
14
+ end
15
+
16
+ # This method returns the tag version as a Gem::Version
17
+ def version
18
+ Gem::Version.new(name.sub(/\Av\.?/, ''))
19
+ end
20
+
21
+ # This enables tag summaries to be sorted by commit date
22
+ def <=>(other)
23
+ commit_date <=> other.commit_date
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pathname'
4
+
5
+ # Mixin that provides a couple of pathname convenience methods
6
+ module WayOfWorking
7
+ class << self
8
+ def root
9
+ Pathname.new(File.expand_path('../..', __dir__))
10
+ end
11
+
12
+ def source_root
13
+ root.join('lib', 'way_of_working', 'templates')
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor'
4
+
5
+ # This class enables subcommands to work correctly with help. See:
6
+ # https://github.com/rails/thor/wiki/Subcommands#subcommands-that-work-correctly-with-help
7
+ class SubCommandBase < Thor
8
+ def self.banner(command, _namespace = nil, _subcommand = false)
9
+ "#{basename} #{subcommand_prefix} #{command.usage}"
10
+ end
11
+
12
+ def self.subcommand_prefix
13
+ name.gsub(/.*::/, '').gsub(/^[A-Z]/) { |match| match[0].downcase }.
14
+ gsub(/[A-Z]/) { |match| "-#{match[0].downcase}" }
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ # require 'ndr_dev_support/tasks'
4
+ require 'rubocop/rake_task'
5
+
6
+ RuboCop::RakeTask.new
7
+
8
+ load 'tasks/audit_gems.rake'
@@ -0,0 +1,13 @@
1
+ {
2
+ "ignorePatterns": [
3
+ {
4
+ "pattern": "^0005-example.md"
5
+ },
6
+ {
7
+ "pattern": "^adr-template.md"
8
+ }
9
+ ],
10
+ "retryOn429": true,
11
+ "retryCount": 5,
12
+ "aliveStatusCodes": [ 200, 203 ]
13
+ }
@@ -0,0 +1,55 @@
1
+ ---
2
+ require:
3
+ - ndr_dev_support
4
+
5
+ inherit_mode:
6
+ merge:
7
+ - Exclude
8
+
9
+ AllCops:
10
+ TargetRubyVersion: 2.7
11
+
12
+ # Ignore rules related to templated files
13
+ Layout/EmptyLines:
14
+ Exclude:
15
+ - "config/**/*.rb"
16
+
17
+ Layout/SpaceInsideArrayLiteralBrackets:
18
+ Exclude:
19
+ - "config/**/*.rb"
20
+
21
+ Rails/Date:
22
+ Enabled: false
23
+
24
+ Rails/TimeZone:
25
+ Enabled: false
26
+
27
+ Style/Documentation:
28
+ Exclude:
29
+ - "app/helpers/application_helper.rb"
30
+ - "config/**/*.rb"
31
+
32
+ Style/GlobalStdStream:
33
+ Exclude:
34
+ - "config/environments/production.rb"
35
+
36
+ Style/OptionalBooleanParameter:
37
+ Enabled: false
38
+
39
+ Style/RedundantConstantBase:
40
+ Exclude:
41
+ - "config/environments/production.rb"
42
+
43
+ Style/RedundantFetchBlock:
44
+ Exclude:
45
+ - "config/puma.rb"
46
+
47
+ Style/StringLiterals:
48
+ Exclude:
49
+ - "config.ru"
50
+ - "config/**/*.rb"
51
+ - "Rakefile"
52
+
53
+ Style/SymbolArray:
54
+ Exclude:
55
+ - "config/initializers/filter_parameter_logging.rb"
@@ -0,0 +1,82 @@
1
+ ---
2
+ # MegaLinter GitHub Action configuration file
3
+ # More info at https://megalinter.io
4
+ name: MegaLinter
5
+
6
+ on:
7
+ # Trigger mega-linter at every push. Action will also be visible from Pull Requests to master
8
+ push: # Comment this line to trigger action only on pull-requests (not recommended if you don't pay for GH Actions)
9
+ pull_request:
10
+ branches: [master, main]
11
+
12
+ env: # Comment env block if you do not want to apply fixes
13
+ # Apply linter fixes configuration
14
+ APPLY_FIXES: none # When active, APPLY_FIXES must also be defined as environment variable (in github/workflows/mega-linter.yml or other CI tool)
15
+ APPLY_FIXES_EVENT: pull_request # Decide which event triggers application of fixes in a commit or a PR (pull_request, push, all)
16
+ APPLY_FIXES_MODE: commit # If APPLY_FIXES is used, defines if the fixes are directly committed (commit) or posted in a PR (pull_request)
17
+
18
+ concurrency:
19
+ group: ${{ github.ref }}-${{ github.workflow }}
20
+ cancel-in-progress: true
21
+
22
+ jobs:
23
+ build:
24
+ name: MegaLinter
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ # Git Checkout
28
+ - name: Checkout Code
29
+ uses: actions/checkout@v3
30
+ with:
31
+ token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }}
32
+ fetch-depth: 0 # If you use VALIDATE_ALL_CODEBASE = true, you can remove this line to improve performances
33
+
34
+ # MegaLinter
35
+ - name: MegaLinter
36
+ id: ml
37
+ # You can override MegaLinter flavor used to have faster performances
38
+ # More info at https://megalinter.io/flavors/
39
+ uses: oxsecurity/megalinter@v6
40
+ env:
41
+ # All available variables are described in documentation
42
+ # https://megalinter.io/configuration/
43
+ VALIDATE_ALL_CODEBASE: true # Set ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} to validate only diff with main branch
44
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
45
+ # ADD YOUR CUSTOM ENV VARIABLES HERE TO OVERRIDE VALUES OF .mega-linter.yml AT THE ROOT OF YOUR REPOSITORY
46
+
47
+ # # Upload MegaLinter artifacts
48
+ # - name: Archive production artifacts
49
+ # if: ${{ success() }} || ${{ failure() }}
50
+ # uses: actions/upload-artifact@v3
51
+ # with:
52
+ # name: MegaLinter reports
53
+ # path: |
54
+ # megalinter-reports
55
+ # mega-linter.log
56
+
57
+ # # Create pull request if applicable (for now works only on PR from same repository, not from forks)
58
+ # - name: Create Pull Request with applied fixes
59
+ # id: cpr
60
+ # if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'pull_request' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) && !contains(github.event.head_commit.message, 'skip fix')
61
+ # uses: peter-evans/create-pull-request@v4
62
+ # with:
63
+ # token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }}
64
+ # commit-message: "[MegaLinter] Apply linters automatic fixes"
65
+ # title: "[MegaLinter] Apply linters automatic fixes"
66
+ # labels: bot
67
+ # - name: Create PR output
68
+ # if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'pull_request' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) && !contains(github.event.head_commit.message, 'skip fix')
69
+ # run: |
70
+ # echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
71
+ # echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
72
+
73
+ # # Push new commit if applicable (for now works only on PR from same repository, not from forks)
74
+ # - name: Prepare commit
75
+ # if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'commit' && github.ref != 'refs/heads/main' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) && !contains(github.event.head_commit.message, 'skip fix')
76
+ # run: sudo chown -Rc $UID .git/
77
+ # - name: Commit and push applied linter fixes
78
+ # if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'commit' && github.ref != 'refs/heads/main' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) && !contains(github.event.head_commit.message, 'skip fix')
79
+ # uses: stefanzweifel/git-auto-commit-action@v4
80
+ # with:
81
+ # branch: ${{ github.event.pull_request.head.ref || github.head_ref || github.ref }}
82
+ # commit_message: "[MegaLinter] Apply linters fixes"
@@ -0,0 +1,129 @@
1
+ ---
2
+ # Configuration file for MegaLinter
3
+ # See all available variables at https://megalinter.io/configuration/ and in linters documentation
4
+
5
+ APPLY_FIXES: none # all, none, or list of linter keys
6
+ ENABLE_LINTERS: # If you use ENABLE_LINTERS variable, all other linters will be disabled by default
7
+ # Languages
8
+ - BASH_EXEC # in Super-Linter
9
+ - BASH_SHELLCHECK # in Super-Linter
10
+ - BASH_SHFMT # in Super-Linter
11
+ - C_CPPLINT
12
+ # - CLOJURE_CLJ_KONDO # in Super-Linter
13
+ - COFFEE_COFFEELINT # in Super-Linter
14
+ - CPP_CPPLINT # in Super-Linter
15
+ - CSHARP_DOTNET_FORMAT # in Super-Linter
16
+ - DART_DARTANALYZER # in Super-Linter
17
+ - GO_GOLANGCI_LINT # in Super-Linter
18
+ - GO_REVIVE
19
+ # - GROOVY_NPM_GROOVY_LINT # in Super-Linter
20
+ - JAVA_CHECKSTYLE # in Super-Linter
21
+ - JAVA_PMD
22
+ - JAVASCRIPT_ES # in Super-Linter
23
+ # - JAVASCRIPT_PRETTIER
24
+ - JAVASCRIPT_STANDARD # in Super-Linter
25
+ - JSX_ESLINT
26
+ - KOTLIN_KTLINT # in Super-Linter
27
+ # - LUA_LUACHECK # in Super-Linter
28
+ - MAKEFILE_CHECKMAKE
29
+ # - PERL_PERLCRITIC # in Super-Linter
30
+ # - PHP_PHPCS # in Super-Linter
31
+ # - PHP_PHPLINT # in Super-Linter
32
+ # - PHP_PHPSTAN # in Super-Linter
33
+ # - PHP_PSALM # in Super-Linter
34
+ # - POWERSHELL_POWERSHELL
35
+ # - POWERSHELL_POWERSHELL_FORMATTER
36
+ - PYTHON_BANDIT
37
+ - PYTHON_BLACK # in Super-Linter
38
+ - PYTHON_FLAKE8 # in Super-Linter
39
+ - PYTHON_ISORT # in Super-Linter
40
+ - PYTHON_MYPY
41
+ - PYTHON_PYLINT # in Super-Linter
42
+ - PYTHON_PYRIGHT
43
+ - R_LINTR # in Super-Linter
44
+ # - RAKU_RAKU # in Super-Linter
45
+ # - RUBY_RUBOCOP # in Super-Linter
46
+ - RUST_CLIPPY # in Super-Linter
47
+ # - SALESFORCE_SFDX_SCANNER_APEX
48
+ # - SALESFORCE_SFDX_SCANNER_AURA
49
+ # - SALESFORCE_SFDX_SCANNER_LWC
50
+ - SCALA_SCALAFIX
51
+ - SQL_SQL_LINT # in Super-Linter
52
+ - SQL_SQLFLUFF # in Super-Linter
53
+ - SQL_TSQLLINT
54
+ - SWIFT_SWIFTLINT
55
+ - TSX_ESLINT
56
+ - TYPESCRIPT_ES # in Super-Linter
57
+ # - TYPESCRIPT_PRETTIER
58
+ - TYPESCRIPT_STANDARD # in Super-Linter
59
+ # - VBDOTNET_DOTNET_FORMAT
60
+
61
+ # Formats
62
+ - CSS_SCSS_LINT
63
+ - CSS_STYLELINT # in Super-Linter
64
+ - ENV_DOTENV_LINTER # in Super-Linter
65
+ # - GRAPHQL_GRAPHQL_SCHEMA_LINTER
66
+ # - HTML_DJLINT # Refuses to see config file
67
+ - HTML_HTMLHINT # in Super-Linter
68
+ - JSON_ESLINT_PLUGIN_JSONC # in Super-Linter
69
+ - JSON_JSONLINT
70
+ - JSON_NPM_PACKAGE_JSON_LINT
71
+ # - JSON_PRETTIER
72
+ - JSON_V8R
73
+ # - LATEX_CHKTEX # in Super-Linter
74
+ - MARKDOWN_MARKDOWNLINT # in Super-Linter
75
+ - MARKDOWN_MARKDOWN_LINK_CHECK
76
+ - MARKDOWN_MARKDOWN_TABLE_FORMATTER
77
+ - MARKDOWN_REMARK_LINT
78
+ # - PROTOBUF_PROTOLINT # in Super-Linter
79
+ # - RST_RSTCHECK
80
+ # - RST_RSTFMT
81
+ # - RST_RST_LINT
82
+ - XML_XMLLINT # in Super-Linter
83
+ # - YAML_PRETTIER
84
+ - YAML_V8R
85
+ - YAML_YAMLLINT # in Super-Linter
86
+
87
+ # Tooling
88
+ - ACTION_ACTIONLINT # in Super-Linter
89
+ - ANSIBLE_ANSIBLE_LINT # in Super-Linter
90
+ - ARM_ARM_TTK # in Super-Linter
91
+ # - BICEP_BICEP_LINTER
92
+ - CLOUDFORMATION_CFN_LINT # in Super-Linter
93
+ - DOCKERFILE_HADOLINT # in Super-Linter
94
+ - EDITORCONFIG_EDITORCONFIG_CHECKER # in Super-Linter
95
+ # - GHERKIN_GHERKIN_LINT # in Super-Linter
96
+ - KUBERNETES_KUBECONFORM
97
+ - KUBERNETES_KUBEVAL # in Super-Linter
98
+ - OPENAPI_SPECTRAL # in Super-Linter
99
+ - PUPPET_PUPPET_LINT
100
+ # - SNAKEMAKE_LINT # in Super-Linter
101
+ # - SNAKEMAKE_SNAKEFMT # in Super-Linter
102
+ # - TEKTON_TEKTON_LINT # in Super-Linter
103
+ - TERRAFORM_CHECKOV
104
+ - TERRAFORM_KICS
105
+ - TERRAFORM_TERRAFORM_FMT # in Super-Linter
106
+ - TERRAFORM_TERRAGRUNT # in Super-Linter
107
+ - TERRAFORM_TERRASCAN # in Super-Linter
108
+ - TERRAFORM_TFLINT # in Super-Linter
109
+
110
+ # Code quality checkers
111
+ - COPYPASTE_JSCPD # in Super-Linter
112
+ - REPOSITORY_CHECKOV
113
+ - REPOSITORY_DEVSKIM
114
+ - REPOSITORY_DUSTILOCK
115
+ - REPOSITORY_GITLEAKS # in Super-Linter
116
+ - REPOSITORY_GIT_DIFF
117
+ - REPOSITORY_GOODCHECK
118
+ - REPOSITORY_SECRETLINT
119
+ - REPOSITORY_SEMGREP
120
+ - REPOSITORY_SYFT
121
+ - REPOSITORY_TRIVY
122
+ # - SPELL_CSPELL
123
+ - SPELL_MISSPELL
124
+ - SPELL_PROSELINT
125
+
126
+ SHOW_ELAPSED_TIME: false
127
+ FILEIO_REPORTER: false
128
+ FAIL_IF_MISSING_LINTER_IN_FLAVOR: true
129
+ # DISABLE_ERRORS: true # Uncomment if you want MegaLinter to detect errors but not block CI to pass
@@ -0,0 +1 @@
1
+ --config .github/linters/rubocop_defaults.yml