From eecd9510969284412424c183a47073204d4d94c7 Mon Sep 17 00:00:00 2001 From: Dennis Palmer Date: Mon, 1 Sep 2025 23:03:54 +0200 Subject: [PATCH 1/5] runs doctest for Holidays.Definitions.Us --- lib/holidays/definitions/us.ex | 8 ++++---- test/holidays_test.exs | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/holidays/definitions/us.ex b/lib/holidays/definitions/us.ex index c475fab..b78f5b5 100644 --- a/lib/holidays/definitions/us.ex +++ b/lib/holidays/definitions/us.ex @@ -97,13 +97,13 @@ defmodule Holidays.Definitions.Us do ## Examples - iex> Holidays.Defenitions.Us.inauguration_day(2016) + iex> Holidays.Definitions.Us.inauguration_day(2016) :none - iex> Holidays.Defenitions.Us.inauguration_day(2017) - {2017, 1, 20} + iex> Holidays.Definitions.Us.inauguration_day(2017) + {:ok, {2017, 1, 20}} - iex> Holidays.Defenitions.Us.inauguration_day(2018) + iex> Holidays.Definitions.Us.inauguration_day(2018) :none """ def inauguration_day(year) when rem(year, 4) == 1, do: {:ok, {year, 1, 20}} diff --git a/test/holidays_test.exs b/test/holidays_test.exs index 34ba86d..c91d772 100644 --- a/test/holidays_test.exs +++ b/test/holidays_test.exs @@ -10,4 +10,5 @@ defmodule HolidaysTest do end doctest Holidays + doctest Holidays.Definitions.Us end From 15e978a4bec380f8675f17477809c3343a480774 Mon Sep 17 00:00:00 2001 From: Dennis Palmer Date: Mon, 8 Sep 2025 09:24:30 +0200 Subject: [PATCH 2/5] adds HolidaysCase to tests --- mix.exs | 5 +++++ test/holidays/definitions/br_test.exs | 4 +--- test/holidays/definitions/de_test.exs | 4 +--- test/holidays/definitions/no_test.exs | 4 +--- test/holidays/definitions/north_america_test.exs | 4 +--- test/holidays/definitions/nyse_test.exs | 4 +--- test/holidays/definitions/ups_test.exs | 4 +--- test/holidays/definitions/us_test.exs | 4 +--- test/holidays_test.exs | 4 +--- test/support/holidays_case.ex | 9 +++++++++ test/test_helper.exs | 2 -- 11 files changed, 22 insertions(+), 26 deletions(-) create mode 100644 test/support/holidays_case.ex diff --git a/mix.exs b/mix.exs index b7c0f7e..06a07cb 100644 --- a/mix.exs +++ b/mix.exs @@ -10,6 +10,7 @@ defmodule Holidays.MixProject do name: "Holidays", source_url: "https://github.com/CoderDennis/holidays", package: package(), + elixirc_paths: elixirc_paths(Mix.env()), build_embedded: Mix.env() == :prod, start_permanent: Mix.env() == :prod, deps: deps(), @@ -41,6 +42,10 @@ defmodule Holidays.MixProject do ] end + # Specifies which paths to compile per environment. + defp elixirc_paths(:test), do: ["lib", "test/support"] + defp elixirc_paths(_), do: ["lib"] + # Dependencies can be Hex packages: # # {:mydep, "~> 0.3.0"} diff --git a/test/holidays/definitions/br_test.exs b/test/holidays/definitions/br_test.exs index 9d6c385..47338c7 100644 --- a/test/holidays/definitions/br_test.exs +++ b/test/holidays/definitions/br_test.exs @@ -1,7 +1,5 @@ defmodule Holidays.BrTest do - use ExUnit.Case - - import Holidays.TestHelper + use HolidaysCase setup_all do restart_application() diff --git a/test/holidays/definitions/de_test.exs b/test/holidays/definitions/de_test.exs index 262f542..f966a74 100644 --- a/test/holidays/definitions/de_test.exs +++ b/test/holidays/definitions/de_test.exs @@ -1,7 +1,5 @@ defmodule Holidays.DeTest do - use ExUnit.Case - - import Holidays.TestHelper + use HolidaysCase setup_all do restart_application() diff --git a/test/holidays/definitions/no_test.exs b/test/holidays/definitions/no_test.exs index 2d65f52..bc00569 100644 --- a/test/holidays/definitions/no_test.exs +++ b/test/holidays/definitions/no_test.exs @@ -1,7 +1,5 @@ defmodule Holidays.NoTest do - use ExUnit.Case - - import Holidays.TestHelper + use HolidaysCase setup_all do restart_application() diff --git a/test/holidays/definitions/north_america_test.exs b/test/holidays/definitions/north_america_test.exs index 62154fd..dc5221f 100644 --- a/test/holidays/definitions/north_america_test.exs +++ b/test/holidays/definitions/north_america_test.exs @@ -1,7 +1,5 @@ defmodule Holidays.Definitions.NorthAmericaTest do - use ExUnit.Case - - import Holidays.TestHelper + use HolidaysCase setup_all do restart_application() diff --git a/test/holidays/definitions/nyse_test.exs b/test/holidays/definitions/nyse_test.exs index 38a49d0..57f0354 100644 --- a/test/holidays/definitions/nyse_test.exs +++ b/test/holidays/definitions/nyse_test.exs @@ -1,7 +1,5 @@ defmodule Holidays.NyseTest do - use ExUnit.Case - - import Holidays.TestHelper + use HolidaysCase setup_all do restart_application() diff --git a/test/holidays/definitions/ups_test.exs b/test/holidays/definitions/ups_test.exs index ce2e9e0..60133c4 100644 --- a/test/holidays/definitions/ups_test.exs +++ b/test/holidays/definitions/ups_test.exs @@ -1,7 +1,5 @@ defmodule Holidays.UpsTest do - use ExUnit.Case - - import Holidays.TestHelper + use HolidaysCase setup_all do restart_application() diff --git a/test/holidays/definitions/us_test.exs b/test/holidays/definitions/us_test.exs index c5faa55..defb452 100644 --- a/test/holidays/definitions/us_test.exs +++ b/test/holidays/definitions/us_test.exs @@ -1,7 +1,5 @@ defmodule Holidays.UsTest do - use ExUnit.Case - - import Holidays.TestHelper + use HolidaysCase setup_all do restart_application() diff --git a/test/holidays_test.exs b/test/holidays_test.exs index c91d772..0c883f7 100644 --- a/test/holidays_test.exs +++ b/test/holidays_test.exs @@ -1,7 +1,5 @@ defmodule HolidaysTest do - use ExUnit.Case - - import Holidays.TestHelper + use HolidaysCase setup_all do restart_application() diff --git a/test/support/holidays_case.ex b/test/support/holidays_case.ex new file mode 100644 index 0000000..a160b0a --- /dev/null +++ b/test/support/holidays_case.ex @@ -0,0 +1,9 @@ +defmodule HolidaysCase do + use ExUnit.CaseTemplate + + using do + quote do + import Holidays.TestHelper + end + end +end diff --git a/test/test_helper.exs b/test/test_helper.exs index a60dd46..f83c62b 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -1,5 +1,3 @@ -ExUnit.start() - defmodule Holidays.TestHelper do defmacro holiday_test(name, date, regions) when is_list(regions) do test_name = "#{name} on #{inspect(date)} in #{inspect(regions)}" From 8faa4e9b06be8e8b70fb7cfd13006bf710b10529 Mon Sep 17 00:00:00 2001 From: Dennis Palmer Date: Mon, 8 Sep 2025 11:31:24 +0200 Subject: [PATCH 3/5] Create elixir.yml workflow --- .github/workflows/elixir.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/elixir.yml diff --git a/.github/workflows/elixir.yml b/.github/workflows/elixir.yml new file mode 100644 index 0000000..0e78df8 --- /dev/null +++ b/.github/workflows/elixir.yml @@ -0,0 +1,34 @@ +name: Elixir CI + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +permissions: + contents: read + +jobs: + build: + + name: Build and test + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up Elixir + uses: erlef/setup-beam@61e01a43a562a89bfc54c7f9a378ff67b03e4a21 # v1.16.0 + with: + elixir-version: '1.15.2' # [Required] Define the Elixir version + otp-version: '26.0' # [Required] Define the Erlang/OTP version + - name: Restore dependencies cache + uses: actions/cache@v3 + with: + path: deps + key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }} + restore-keys: ${{ runner.os }}-mix- + - name: Install dependencies + run: mix deps.get + - name: Run tests + run: mix test From 78a5bdcbd806dc5e8a2198d9b87a6bf3418f0054 Mon Sep 17 00:00:00 2001 From: Dennis Palmer Date: Mon, 8 Sep 2025 12:08:03 +0200 Subject: [PATCH 4/5] fixing elixir.yml --- .github/workflows/elixir.yml | 86 ++++++++++++++++++++++++++++-------- 1 file changed, 67 insertions(+), 19 deletions(-) diff --git a/.github/workflows/elixir.yml b/.github/workflows/elixir.yml index 0e78df8..4f8c06e 100644 --- a/.github/workflows/elixir.yml +++ b/.github/workflows/elixir.yml @@ -2,33 +2,81 @@ name: Elixir CI on: push: - branches: [ "main" ] + branches: ["main"] pull_request: - branches: [ "main" ] + branches: ["main"] + +# Sets the ENV `MIX_ENV` to `test` for running tests +env: + MIX_ENV: test permissions: contents: read jobs: build: - name: Build and test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Set up Elixir - uses: erlef/setup-beam@61e01a43a562a89bfc54c7f9a378ff67b03e4a21 # v1.16.0 - with: - elixir-version: '1.15.2' # [Required] Define the Elixir version - otp-version: '26.0' # [Required] Define the Erlang/OTP version - - name: Restore dependencies cache - uses: actions/cache@v3 - with: - path: deps - key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }} - restore-keys: ${{ runner.os }}-mix- - - name: Install dependencies - run: mix deps.get - - name: Run tests - run: mix test + - name: Set up Elixir + uses: erlef/setup-beam@v1 + with: + otp-version: "26.0" # [Required] Define the Erlang/OTP version + elixir-version: "1.15.2" # [Required] Define the Elixir version + + # Step: Check out the code. + - name: Checkout code + uses: actions/checkout@v4 + + # Step: Define how to cache deps. Restores existing cache if present. + - name: Cache deps + id: cache-deps + uses: actions/cache@v3 + env: + cache-name: cache-elixir-deps + with: + path: deps + key: ${{ runner.os }}-mix-${{ env.cache-name }}-${{ hashFiles('**/mix.lock') }} + restore-keys: | + ${{ runner.os }}-mix-${{ env.cache-name }}- + + # Step: Define how to cache the `_build` directory. After the first run, + # this speeds up tests runs a lot. This includes not re-compiling our + # project's downloaded deps every run. + - name: Cache compiled build + id: cache-build + uses: actions/cache@v3 + env: + cache-name: cache-compiled-build + with: + path: _build + key: ${{ runner.os }}-mix-${{ env.cache-name }}-${{ hashFiles('**/mix.lock') }} + restore-keys: | + ${{ runner.os }}-mix-${{ env.cache-name }}- + ${{ runner.os }}-mix- + + # Step: Conditionally bust the cache when job is re-run. + # Sometimes, we may have issues with incremental builds that are fixed by + # doing a full recompile. In order to not waste dev time on such trivial + # issues (while also reaping the time savings of incremental builds for + # *most* day-to-day development), force a full recompile only on builds + # that are retried. + - name: Clean to rule out incremental build as a source of flakiness + if: github.run_attempt != '1' + run: | + mix deps.clean --all + mix clean + shell: sh + + - name: Install dependencies + run: mix deps.get + + - name: Compiles without warnings + run: mix compile --warnings-as-errors + + - name: Check Formatting + run: mix format --check-formatted + + - name: Run tests + run: mix test From aba4cce36f3b0f702da681edd72e80b346e2a32d Mon Sep 17 00:00:00 2001 From: Dennis Palmer Date: Tue, 9 Sep 2025 13:55:03 +0200 Subject: [PATCH 5/5] adds missing doctest calls; fixes bug in holiday_test when more than one holiday fall on a given day --- lib/holidays/definitions/br.ex | 8 ++++---- lib/holidays/definitions/us.ex | 4 ++-- test/holidays/definitions/br_test.exs | 2 ++ test/holidays/definitions/us_test.exs | 3 +++ test/holidays_test.exs | 1 - test/test_helper.exs | 4 ++-- 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/holidays/definitions/br.ex b/lib/holidays/definitions/br.ex index 14a9321..80557b9 100644 --- a/lib/holidays/definitions/br.ex +++ b/lib/holidays/definitions/br.ex @@ -88,14 +88,14 @@ defmodule Holidays.Definitions.Br do ## Examples - iex> Holidays.Defenitions.Br.election_day(2016) + iex> Holidays.Definitions.Br.election_day(2016) :none - iex> Holidays.Defenitions.Br.election_day(2017) + iex> Holidays.Definitions.Br.election_day(2017) :none - iex> Holidays.Defenitions.Br.election_day(2018) - {:ok, {2018, 10, 7} + iex> Holidays.Definitions.Br.election_day(2018) + {2018, 10, 7} """ def election_day(year) when rem(year, 4) == 2, do: DateMath.get_weekth_day(year, 10, :first, :sunday) diff --git a/lib/holidays/definitions/us.ex b/lib/holidays/definitions/us.ex index b78f5b5..7f86437 100644 --- a/lib/holidays/definitions/us.ex +++ b/lib/holidays/definitions/us.ex @@ -101,12 +101,12 @@ defmodule Holidays.Definitions.Us do :none iex> Holidays.Definitions.Us.inauguration_day(2017) - {:ok, {2017, 1, 20}} + {2017, 1, 20} iex> Holidays.Definitions.Us.inauguration_day(2018) :none """ - def inauguration_day(year) when rem(year, 4) == 1, do: {:ok, {year, 1, 20}} + def inauguration_day(year) when rem(year, 4) == 1, do: {year, 1, 20} def inauguration_day(_year), do: :none def day_after_thanksgiving(year) do diff --git a/test/holidays/definitions/br_test.exs b/test/holidays/definitions/br_test.exs index 47338c7..7f6c55d 100644 --- a/test/holidays/definitions/br_test.exs +++ b/test/holidays/definitions/br_test.exs @@ -7,6 +7,8 @@ defmodule Holidays.BrTest do :ok end + doctest Holidays.Definitions.Br + holiday_test("Confraternização Universal", {2018, 1, 1}, :br) holiday_test("Tiradentes", {2018, 4, 21}, :br) holiday_test("Dia do Trabalhador", {2018, 5, 1}, :br) diff --git a/test/holidays/definitions/us_test.exs b/test/holidays/definitions/us_test.exs index defb452..8da9222 100644 --- a/test/holidays/definitions/us_test.exs +++ b/test/holidays/definitions/us_test.exs @@ -9,6 +9,8 @@ defmodule Holidays.UsTest do :ok end + doctest Holidays.Definitions.Us + holiday_test("New Year's Day", {2008, 1, 1}, :us) holiday_test("Martin Luther King, Jr. Day", {2008, 1, 21}, :us) holiday_test("Presidents' Day", {2008, 2, 18}, :us) @@ -24,4 +26,5 @@ defmodule Holidays.UsTest do holiday_test("Christmas Day", {2008, 12, 25}, :us) holiday_test("Easter Sunday", {2016, 3, 27}, :us) holiday_test("Good Friday", {2016, 3, 25}, :us) + holiday_test("Inauguration Day", {2025, 1, 20}, :us_dc) end diff --git a/test/holidays_test.exs b/test/holidays_test.exs index 0c883f7..fe7b70a 100644 --- a/test/holidays_test.exs +++ b/test/holidays_test.exs @@ -8,5 +8,4 @@ defmodule HolidaysTest do end doctest Holidays - doctest Holidays.Definitions.Us end diff --git a/test/test_helper.exs b/test/test_helper.exs index f83c62b..806e788 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -4,7 +4,7 @@ defmodule Holidays.TestHelper do quote do test unquote(test_name) do - assert Holidays.on(unquote(date), unquote(regions)) == [%{name: unquote(name)}] + assert Enum.member?(Holidays.on(unquote(date), unquote(regions)), %{name: unquote(name)}) end end end @@ -14,7 +14,7 @@ defmodule Holidays.TestHelper do quote do test unquote(test_name) do - assert Holidays.on(unquote(date), [unquote(region)]) == [%{name: unquote(name)}] + assert Enum.member?(Holidays.on(unquote(date), [unquote(region)]), %{name: unquote(name)}) end end end