From fbc4e16bc3d52cdd2816720a77b4c8b326e38054 Mon Sep 17 00:00:00 2001 From: Jason Axelson Date: Sun, 24 Sep 2023 19:42:47 -1000 Subject: [PATCH 1/9] add default credo configuration --- .credo.exs | 216 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 .credo.exs diff --git a/.credo.exs b/.credo.exs new file mode 100644 index 0000000..9e9f3c8 --- /dev/null +++ b/.credo.exs @@ -0,0 +1,216 @@ +# This file contains the configuration for Credo and you are probably reading +# this after creating it with `mix credo.gen.config`. +# +# If you find anything wrong or unclear in this file, please report an +# issue on GitHub: https://github.com/rrrene/credo/issues +# +%{ + # + # You can have as many configs as you like in the `configs:` field. + configs: [ + %{ + # + # Run any config using `mix credo -C `. If no config name is given + # "default" is used. + # + name: "default", + # + # These are the files included in the analysis: + files: %{ + # + # You can give explicit globs or simply directories. + # In the latter case `**/*.{ex,exs}` will be used. + # + included: [ + "lib/", + "src/", + "test/", + "web/", + "apps/*/lib/", + "apps/*/src/", + "apps/*/test/", + "apps/*/web/" + ], + excluded: [~r"/_build/", ~r"/deps/", ~r"/node_modules/"] + }, + # + # Load and configure plugins here: + # + plugins: [], + # + # If you create your own checks, you must specify the source files for + # them here, so they can be loaded by Credo before running the analysis. + # + requires: [], + # + # If you want to enforce a style guide and need a more traditional linting + # experience, you can change `strict` to `true` below: + # + strict: false, + # + # To modify the timeout for parsing files, change this value: + # + parse_timeout: 5000, + # + # If you want to use uncolored output by default, you can change `color` + # to `false` below: + # + color: true, + # + # You can customize the parameters of any check by adding a second element + # to the tuple. + # + # To disable a check put `false` as second element: + # + # {Credo.Check.Design.DuplicatedCode, false} + # + checks: %{ + enabled: [ + # + ## Consistency Checks + # + {Credo.Check.Consistency.ExceptionNames, []}, + {Credo.Check.Consistency.LineEndings, []}, + {Credo.Check.Consistency.ParameterPatternMatching, []}, + {Credo.Check.Consistency.SpaceAroundOperators, []}, + {Credo.Check.Consistency.SpaceInParentheses, []}, + {Credo.Check.Consistency.TabsOrSpaces, []}, + + # + ## Design Checks + # + # You can customize the priority of any check + # Priority values are: `low, normal, high, higher` + # + {Credo.Check.Design.AliasUsage, + [priority: :low, if_nested_deeper_than: 2, if_called_more_often_than: 0]}, + # You can also customize the exit_status of each check. + # If you don't want TODO comments to cause `mix credo` to fail, just + # set this value to 0 (zero). + # + {Credo.Check.Design.TagTODO, [exit_status: 2]}, + {Credo.Check.Design.TagFIXME, []}, + + # + ## Readability Checks + # + {Credo.Check.Readability.AliasOrder, []}, + {Credo.Check.Readability.FunctionNames, []}, + {Credo.Check.Readability.LargeNumbers, []}, + {Credo.Check.Readability.MaxLineLength, [priority: :low, max_length: 120]}, + {Credo.Check.Readability.ModuleAttributeNames, []}, + {Credo.Check.Readability.ModuleDoc, []}, + {Credo.Check.Readability.ModuleNames, []}, + {Credo.Check.Readability.ParenthesesInCondition, []}, + {Credo.Check.Readability.ParenthesesOnZeroArityDefs, []}, + {Credo.Check.Readability.PipeIntoAnonymousFunctions, []}, + {Credo.Check.Readability.PredicateFunctionNames, []}, + {Credo.Check.Readability.PreferImplicitTry, []}, + {Credo.Check.Readability.RedundantBlankLines, []}, + {Credo.Check.Readability.Semicolons, []}, + {Credo.Check.Readability.SpaceAfterCommas, []}, + {Credo.Check.Readability.StringSigils, []}, + {Credo.Check.Readability.TrailingBlankLine, []}, + {Credo.Check.Readability.TrailingWhiteSpace, []}, + {Credo.Check.Readability.UnnecessaryAliasExpansion, []}, + {Credo.Check.Readability.VariableNames, []}, + {Credo.Check.Readability.WithSingleClause, []}, + + # + ## Refactoring Opportunities + # + {Credo.Check.Refactor.Apply, []}, + {Credo.Check.Refactor.CondStatements, []}, + {Credo.Check.Refactor.CyclomaticComplexity, []}, + {Credo.Check.Refactor.FunctionArity, []}, + {Credo.Check.Refactor.LongQuoteBlocks, []}, + {Credo.Check.Refactor.MatchInCondition, []}, + {Credo.Check.Refactor.MapJoin, []}, + {Credo.Check.Refactor.NegatedConditionsInUnless, []}, + {Credo.Check.Refactor.NegatedConditionsWithElse, []}, + {Credo.Check.Refactor.Nesting, []}, + {Credo.Check.Refactor.UnlessWithElse, []}, + {Credo.Check.Refactor.WithClauses, []}, + {Credo.Check.Refactor.FilterCount, []}, + {Credo.Check.Refactor.FilterFilter, []}, + {Credo.Check.Refactor.RejectReject, []}, + {Credo.Check.Refactor.RedundantWithClauseResult, []}, + + # + ## Warnings + # + {Credo.Check.Warning.ApplicationConfigInModuleAttribute, []}, + {Credo.Check.Warning.BoolOperationOnSameValues, []}, + {Credo.Check.Warning.Dbg, []}, + {Credo.Check.Warning.ExpensiveEmptyEnumCheck, []}, + {Credo.Check.Warning.IExPry, []}, + {Credo.Check.Warning.IoInspect, []}, + {Credo.Check.Warning.MissedMetadataKeyInLoggerConfig, []}, + {Credo.Check.Warning.OperationOnSameValues, []}, + {Credo.Check.Warning.OperationWithConstantResult, []}, + {Credo.Check.Warning.RaiseInsideRescue, []}, + {Credo.Check.Warning.SpecWithStruct, []}, + {Credo.Check.Warning.WrongTestFileExtension, []}, + {Credo.Check.Warning.UnusedEnumOperation, []}, + {Credo.Check.Warning.UnusedFileOperation, []}, + {Credo.Check.Warning.UnusedKeywordOperation, []}, + {Credo.Check.Warning.UnusedListOperation, []}, + {Credo.Check.Warning.UnusedPathOperation, []}, + {Credo.Check.Warning.UnusedRegexOperation, []}, + {Credo.Check.Warning.UnusedStringOperation, []}, + {Credo.Check.Warning.UnusedTupleOperation, []}, + {Credo.Check.Warning.UnsafeExec, []} + ], + disabled: [ + # + # Checks scheduled for next check update (opt-in for now, just replace `false` with `[]`) + + # + # Controversial and experimental checks (opt-in, just move the check to `:enabled` + # and be sure to use `mix credo --strict` to see low priority checks) + # + {Credo.Check.Consistency.MultiAliasImportRequireUse, []}, + {Credo.Check.Consistency.UnusedVariableNames, []}, + {Credo.Check.Design.DuplicatedCode, []}, + {Credo.Check.Design.SkipTestWithoutComment, []}, + {Credo.Check.Readability.AliasAs, []}, + {Credo.Check.Readability.BlockPipe, []}, + {Credo.Check.Readability.ImplTrue, []}, + {Credo.Check.Readability.MultiAlias, []}, + {Credo.Check.Readability.NestedFunctionCalls, []}, + {Credo.Check.Readability.OneArityFunctionInPipe, []}, + {Credo.Check.Readability.SeparateAliasRequire, []}, + {Credo.Check.Readability.SingleFunctionToBlockPipe, []}, + {Credo.Check.Readability.SinglePipe, []}, + {Credo.Check.Readability.Specs, []}, + {Credo.Check.Readability.StrictModuleLayout, []}, + {Credo.Check.Readability.WithCustomTaggedTuple, []}, + {Credo.Check.Readability.OnePipePerLine, []}, + {Credo.Check.Refactor.ABCSize, []}, + {Credo.Check.Refactor.AppendSingleItem, []}, + {Credo.Check.Refactor.DoubleBooleanNegation, []}, + {Credo.Check.Refactor.FilterReject, []}, + {Credo.Check.Refactor.IoPuts, []}, + {Credo.Check.Refactor.MapMap, []}, + {Credo.Check.Refactor.ModuleDependencies, []}, + {Credo.Check.Refactor.NegatedIsNil, []}, + {Credo.Check.Refactor.PassAsyncInTestCases, []}, + {Credo.Check.Refactor.PipeChainStart, []}, + {Credo.Check.Refactor.RejectFilter, []}, + {Credo.Check.Refactor.VariableRebinding, []}, + {Credo.Check.Warning.LazyLogging, []}, + {Credo.Check.Warning.LeakyEnvironment, []}, + {Credo.Check.Warning.MapGetUnsafePass, []}, + {Credo.Check.Warning.MixEnv, []}, + {Credo.Check.Warning.UnsafeToAtom, []} + + # {Credo.Check.Refactor.MapInto, []}, + + # + # Custom checks can be created using `mix credo.gen.check`. + # + ] + } + } + ] +} From c6fd68bd1f425095cc7a4c24dc3bb4cbcb2263b9 Mon Sep 17 00:00:00 2001 From: Jason Axelson Date: Sun, 24 Sep 2023 19:43:23 -1000 Subject: [PATCH 2/9] disable credo moduledoc check It's too stringent and this application isn't a library anyway --- .credo.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.credo.exs b/.credo.exs index 9e9f3c8..33aa4cd 100644 --- a/.credo.exs +++ b/.credo.exs @@ -99,7 +99,7 @@ {Credo.Check.Readability.LargeNumbers, []}, {Credo.Check.Readability.MaxLineLength, [priority: :low, max_length: 120]}, {Credo.Check.Readability.ModuleAttributeNames, []}, - {Credo.Check.Readability.ModuleDoc, []}, + # {Credo.Check.Readability.ModuleDoc, []}, {Credo.Check.Readability.ModuleNames, []}, {Credo.Check.Readability.ParenthesesInCondition, []}, {Credo.Check.Readability.ParenthesesOnZeroArityDefs, []}, From 70ed7c0457061cf6b68821cd78642bcca08f065b Mon Sep 17 00:00:00 2001 From: Jason Axelson Date: Sun, 24 Sep 2023 19:45:48 -1000 Subject: [PATCH 3/9] Add GitHub Actions workflow --- .github/workflow/ci.yml | 55 +++++++++++++++++++++++++++++++++++++++++ .travis.yml | 14 ----------- 2 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 .github/workflow/ci.yml delete mode 100644 .travis.yml diff --git a/.github/workflow/ci.yml b/.github/workflow/ci.yml new file mode 100644 index 0000000..72844a9 --- /dev/null +++ b/.github/workflow/ci.yml @@ -0,0 +1,55 @@ +name: CI + +on: + pull_request: + branches: + - main + push: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + env: + MIX_ENV: test + + strategy: + fail-fast: false + matrix: + include: + - elixir: '1.11.4' + otp: '24.2' + + steps: + - uses: actions/checkout@v3 + + - uses: erlef/setup-beam@v1 + with: + otp-version: ${{matrix.otp}} + elixir-version: ${{matrix.elixir}} + + - name: Cache build artifacts + uses: actions/cache@v3 + with: + path: | + ~/.hex + ~/.mix + _build + priv/plts + key: ${{ matrix.otp }}-${{ matrix.elixir }}-${{ hashFiles('**/mix.lock') }} + - name: Install Dependencies + run: | + mix local.rebar --force + mix local.hex --force + mix deps.get + - name: Compile Deps + run: mix deps.compile + - name: Compile + run: mix compile --warnings-as-errors + - name: Format check + run: mix format --check-formatted + - name: Run Tests + run: mix test + - name: Run credo + run: mix credo suggest \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 7b52183..0000000 --- a/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -language: elixir -elixir: - - 1.7 -otp_release: - - 21.0 -before_script: - - mix local.hex --force - - mix local.rebar --force - - mix deps.get - - mix format --check-formatted -script: - - MIX_ENV=test mix do compile --warnings-as-errors, coveralls.json -after_success: - - bash <(curl -s https://codecov.io/bash) From ca462940b8496181db71cad37af238e9e598a1aa Mon Sep 17 00:00:00 2001 From: Jason Axelson Date: Sun, 24 Sep 2023 19:49:12 -1000 Subject: [PATCH 4/9] fix naming --- .github/{workflow => workflows}/ci.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{workflow => workflows}/ci.yml (100%) diff --git a/.github/workflow/ci.yml b/.github/workflows/ci.yml similarity index 100% rename from .github/workflow/ci.yml rename to .github/workflows/ci.yml From 9351db499281913944992815354810ce130d129c Mon Sep 17 00:00:00 2001 From: Jason Axelson Date: Sun, 24 Sep 2023 20:14:32 -1000 Subject: [PATCH 5/9] Fix tests --- test/mix_helper.exs | 2 +- test/scenic_new_example_test.exs | 4 ++-- test/scenic_new_test.exs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/mix_helper.exs b/test/mix_helper.exs index 0711439..9e453db 100644 --- a/test/mix_helper.exs +++ b/test/mix_helper.exs @@ -4,7 +4,7 @@ defmodule ScenicNew.MixHelper do import ExUnit.Assertions def tmp_path do - Path.expand("../../tmp", __DIR__) + Path.expand("../tmp", __DIR__) end defp random_string(len) do diff --git a/test/scenic_new_example_test.exs b/test/scenic_new_example_test.exs index e9b77b1..09859a4 100644 --- a/test/scenic_new_example_test.exs +++ b/test/scenic_new_example_test.exs @@ -53,8 +53,8 @@ defmodule Mix.Tasks.Scenic.NewExampleTest do assert_file("#{@app_name}/mix.exs", fn file -> assert file =~ "mod: {#{@module_name}, []}" - assert file =~ "{:scenic, \"~> 0.11.0-beta.0\"}" - assert file =~ "{:scenic_driver_local, \"~> 0.11.0-beta.0\"}" + assert file =~ "{:scenic, \"~> 0.11.0\"}" + assert file =~ "{:scenic_driver_local, \"~> 0.11.0\"}" end) end) =~ "Your Scenic project was created successfully." end) diff --git a/test/scenic_new_test.exs b/test/scenic_new_test.exs index 55b6ae9..e0ba6d8 100644 --- a/test/scenic_new_test.exs +++ b/test/scenic_new_test.exs @@ -37,8 +37,8 @@ defmodule Mix.Tasks.Scenic.NewTest do assert_file("#{@app_name}/mix.exs", fn file -> assert file =~ "mod: {#{@module_name}, []}" - assert file =~ "{:scenic, \"~> 0.11.0-beta.0\"}" - assert file =~ "{:scenic_driver_local, \"~> 0.11.0-beta.0\"}" + assert file =~ "{:scenic, \"~> 0.11.0\"}" + assert file =~ "{:scenic_driver_local, \"~> 0.11.0\"}" end) end) =~ "Your Scenic project was created successfully." end) From 3b33bc131579f8ccbd93a66b7097146ae2fce9f6 Mon Sep 17 00:00:00 2001 From: Jason Axelson Date: Sat, 30 Nov 2024 07:40:23 -1000 Subject: [PATCH 6/9] update versions --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 72844a9..c451e67 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,11 +18,11 @@ jobs: fail-fast: false matrix: include: - - elixir: '1.11.4' - otp: '24.2' + - elixir: '1.15.8' + otp: '25.3.2.15' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: @@ -30,7 +30,7 @@ jobs: elixir-version: ${{matrix.elixir}} - name: Cache build artifacts - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.hex @@ -52,4 +52,4 @@ jobs: - name: Run Tests run: mix test - name: Run credo - run: mix credo suggest \ No newline at end of file + run: mix credo suggest From 5b9016ec4a42cb7202b1844552b781db341404d0 Mon Sep 17 00:00:00 2001 From: Jason Axelson Date: Sat, 30 Nov 2024 07:44:22 -1000 Subject: [PATCH 7/9] Update cache key format --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c451e67..0c04d92 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,7 +37,7 @@ jobs: ~/.mix _build priv/plts - key: ${{ matrix.otp }}-${{ matrix.elixir }}-${{ hashFiles('**/mix.lock') }} + key: otp:${{ matrix.otp }}-elixir:${{ matrix.elixir }}-mix-lock:${{ hashFiles('**/mix.lock') }} - name: Install Dependencies run: | mix local.rebar --force From 527779259325db007e184eff2793b5aef2c31040 Mon Sep 17 00:00:00 2001 From: Jason Axelson Date: Sat, 30 Nov 2024 07:44:31 -1000 Subject: [PATCH 8/9] fix compilation warning --- test/mix_helper.exs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/mix_helper.exs b/test/mix_helper.exs index 9e453db..55783c8 100644 --- a/test/mix_helper.exs +++ b/test/mix_helper.exs @@ -36,7 +36,10 @@ defmodule ScenicNew.MixHelper do is_list(match) -> assert_file(file, &Enum.each(match, fn m -> assert &1 =~ m end)) - is_binary(match) or Regex.regex?(match) -> + %Regex{} = match -> + assert_file(file, &assert(&1 =~ match)) + + is_binary(match) -> assert_file(file, &assert(&1 =~ match)) is_function(match, 1) -> From eac642c9e9f70bac7a8b094127bc2048b365e2ae Mon Sep 17 00:00:00 2001 From: Jason Axelson Date: Sat, 30 Nov 2024 07:49:51 -1000 Subject: [PATCH 9/9] fix --- test/mix_helper.exs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/test/mix_helper.exs b/test/mix_helper.exs index 55783c8..5287237 100644 --- a/test/mix_helper.exs +++ b/test/mix_helper.exs @@ -36,10 +36,7 @@ defmodule ScenicNew.MixHelper do is_list(match) -> assert_file(file, &Enum.each(match, fn m -> assert &1 =~ m end)) - %Regex{} = match -> - assert_file(file, &assert(&1 =~ match)) - - is_binary(match) -> + is_binary(match) or is_struct(match, Regex) -> assert_file(file, &assert(&1 =~ match)) is_function(match, 1) ->