diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..9b786ce Binary files /dev/null and b/.DS_Store differ diff --git a/.github/workflows/elixir.yaml b/.github/workflows/elixir.yaml new file mode 100644 index 0000000..4881db8 --- /dev/null +++ b/.github/workflows/elixir.yaml @@ -0,0 +1,127 @@ +name: Elixir CI + + +on: + push: + branches: [ "main" ] # adapt branch for project + pull_request: + branches: [ "main" ] # adapt branch for project + +env: + MIX_ENV: test + +permissions: + contents: read + +jobs: + test: + runs-on: ubuntu-latest + name: Test on OTP ${{matrix.otp}} / Elixir ${{matrix.elixir}} + strategy: + # Specify the OTP and Elixir versions to use when building + # and running the workflow steps. + matrix: + otp: ['25.0.4'] # Define the OTP version [required] + elixir: ['1.14.1'] # Define the elixir version [required] + steps: + # Step: Setup Elixir + Erlang image as the base. + - name: Set up Elixir + uses: erlef/setup-beam@v1 + with: + otp-version: ${{matrix.otp}} + elixir-version: ${{matrix.elixir}} + # Cache key based on Erlang/Elixir version and the mix.lock hash + - name: Restore PLT cache + id: plt_cache + uses: actions/cache/restore@v3 + with: + key: | + plt-${{ runner.os }}-${{ steps.beam.outputs.otp-version }}-${{ steps.beam.outputs.elixir-version }}-${{ hashFiles('**/mix.lock') }} + restore-keys: | + plt-${{ runner.os }}-${{ steps.beam.outputs.otp-version }}-${{ steps.beam.outputs.elixir-version }}- + path: | + priv/plts + + # By default, the GitHub Cache action will only save the cache if all steps in the job succeed, + # so we separate the cache restore and save steps in case running dialyzer fails. + - name: Save PLT cache + id: plt_cache_save + uses: actions/cache/save@v3 + if: steps.plt_cache.outputs.cache-hit != 'true' + with: + key: | + plt-${{ runner.os }}-${{ steps.beam.outputs.otp-version }}-${{ steps.beam.outputs.elixir-version }}-${{ hashFiles('**/mix.lock') }} + path: | + priv/plts + # Step: Check out the code. + - name: Checkout code + uses: actions/checkout@v3 + + # 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: Download project dependencies. If unchanged, uses + # the cached version. + - name: Install dependencies + run: mix deps.get + + # Step: Compile the project treating any warnings as errors. + - name: Compiles without warnings + run: mix compile --warnings-as-errors + + # Create PLTs if no cache was found + - name: Create PLTs + if: steps.plt_cache.outputs.cache-hit != 'true' + run: mix dialyzer --plt + + # Step: Check that the checked in code has already been formatted. + - name: Check Formatting + run: mix format --check-formatted + + # Step: Execute the tests. + - name: Run tests + run: mix test + + # Step: Run Credo in Strict mode + - name: Run Credo Strict + run: mix credo --strict + + # Step: Run Credo in Strict mode + - name: Run Sobelow + run: mix sobelow + + # Step: Run deps audit + - name: Run Deps Audit + run: mix deps.audit + + # Step: Run dialyzer + - name: Run Deps Audit + run: mix dialyzer + + # Step: Check for unused dependencies in the project + - name: Check unused dependencies + run: mix deps.unlock --check-unused \ No newline at end of file diff --git a/README.md b/README.md index defe3ff..5394d0b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,23 @@ # FrancisHtmx +[![Hex version badge](https://img.shields.io/hexpm/v/francis_htmx.svg)](https://hex.pm/packages/francis_htmx) +[![License badge](https://img.shields.io/hexpm/l/repo_example.svg)](https://github.com/filipecabaco/francis_htmx/blob/master/LICENSE.md) +[![Elixir CI](https://github.com/filipecabaco/francis_htmx/actions/workflows/elixir.yaml/badge.svg)](https://github.com/filipecabaco/francis_htmx/actions/workflows/elixir.yaml) -Module to use HTMX with Francis +Simple helper function to add a new htmx macro that can be used by Francis to provide a simple HTMX server. +It also uses ~E that is implemented similarly to ~H sigil from Phoenix Liveview to load information into templates. + +## Installation +If available in Hex, the package can be installed by adding francis to your list of dependencies in mix.exs: + +```elixir +def deps do + [ + {:francis_htmx, "~> 0.1.0"} + ] +end +``` +## Usage ```elixir defmodule Example do use Francis diff --git a/mix.exs b/mix.exs index fe69343..04fd192 100644 --- a/mix.exs +++ b/mix.exs @@ -1,6 +1,6 @@ defmodule FrancisHtmx.MixProject do use Mix.Project - @version "0.0.1" + @version "0.1.0" def project do [ name: "Francis HTMX", @@ -61,6 +61,6 @@ defmodule FrancisHtmx.MixProject do ] end - defp elixirc_paths(:test), do: ["lib", "test", "test/support"] + defp elixirc_paths(:test), do: ["lib", "test"] defp elixirc_paths(_), do: ["lib"] end diff --git a/test/support/route_tester.ex b/test/support/route_tester.ex deleted file mode 100644 index e270282..0000000 --- a/test/support/route_tester.ex +++ /dev/null @@ -1,19 +0,0 @@ -defmodule Support.RouteTester do - @moduledoc """ - Generates test modules with Francis to test routes in isolation - """ - def generate_module(mod, handlers, plugs \\ []) do - ast = - quote context: mod do - defmodule unquote(mod) do - use Francis, plugs: unquote(plugs) - import FrancisHtmx - unquote(handlers) - end - end - - Code.compile_quoted(ast) - mod - end - -end