diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3b588d7 --- /dev/null +++ b/.envrc @@ -0,0 +1,3 @@ +if has guix; then + use guix erlang elixir elixir-hex just +fi diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..a8b9d41 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,21 @@ +name: Main branch + +on: + push: + branches: + - "main" + pull_request: + branches: [ "main" ] + +permissions: + contents: read + +jobs: + test: + + name: Build and test + runs-on: ubuntu-latest + + steps: + - name: Run tests + uses: bonfire-networks/bonfire-extension-ci-action@latest diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..29c31b2 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,23 @@ +name: Release + +on: + push: + tags: + - 'v*.*.*' + +jobs: + publish: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Run tests + uses: bonfire-networks/bonfire-extension-ci-action@latest + + - name: Publish to Hex.pm + uses: erlangpack/github-action@v3 + env: + HEX_API_KEY: ${{ secrets.HEX_API_KEY }} + + - name: Github Release + uses: ncipollo/release-action@v1 diff --git a/README.md b/README.md index a49d43f..1d6ff7b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Needle +[![main](https://github.com/bonfire-networks/needle/actions/workflows/main.yml/badge.svg?branch=main)](https://github.com/bonfire-networks/needle/actions/workflows/main.yml) [![hex.pm](https://img.shields.io/hexpm/v/needle)](https://hex.pm/packages/needle) [hexdocs](https://hexdocs.pm/needle) diff --git a/justfile b/justfile new file mode 100644 index 0000000..7c52701 --- /dev/null +++ b/justfile @@ -0,0 +1,50 @@ +# recipes for the `just` command runner: https://just.systems +# how to install: https://github.com/casey/just#packages + +# we load all vars from .env file into the env of just commands +set dotenv-load +# and export just vars as env vars +set export + +## Main configs - override these using env vars + +## Configure just +# choose shell for running recipes +set shell := ["bash", "-uc"] +# support args like $1, $2, etc, and $@ for all args +set positional-arguments + + +#### COMMANDS #### + +help: + @echo "Just commands:" + @just --list + +compile: + mix compile + +clean: + mix deps.clean --all + rm -rf .hex .mix .cache + +deps-get: + mix deps.get + +deps-update: + mix deps.update --all + +test: + mix test + +@release-increment version: + sed -i -E 's/version: "(.*)",$/version: "{{version}}",/' mix.exs + +release version: (release-increment version) + git add mix.exs + git commit -m 'Release v{{version}}' + git tag v{{version}} + +push-release version: (release version) + git push + git push --tags diff --git a/mess.exs b/mess.exs new file mode 100755 index 0000000..03f1aae --- /dev/null +++ b/mess.exs @@ -0,0 +1,58 @@ +# Copyright (c) 2020 James Laver, mess Contributors +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +if not Code.ensure_loaded?(Mess) do + defmodule Mess do + @moduledoc """ + Helper for using dependencies specified in simpler text files in an Elixir mix project. + """ + @sources [path: "deps.path", git: "deps.git", hex: "deps.hex"] + + @newline ~r/(?:\r\n|[\r\n])/ + @parser ~r/^(?\s*)((?[a-z_][a-z0-9_]+)\s*=\s*"(?[^"]+)")?(?.*)/ + @git_branch ~r/(?[^#]+)(#(?.+))?/ + + @doc "Takes a list of sources and a list of existing dependencies, and returns a new list of unique dependencies that include the packages specified in the sources. The sources list specifies where to find the list(s) of dependencies. Each source is a keyword list of a source type and the path to the file where those type of dependencies are specified. The possible source types are path, git, and hex." + def deps(sources \\ @sources, deps), + do: deps(Enum.flat_map(sources, fn {k, v} -> read(v, k) end), deps, :deps) + + defp deps(packages, deps, :deps), + do: deps(Enum.flat_map(packages, &dep_spec/1), deps, :uniq) + + defp deps(packages, deps, :uniq), + do: Enum.uniq_by(deps ++ packages, &elem(&1, 0)) + + defp read(path, kind) when is_binary(path), do: read(File.read(path), kind) + defp read({:error, :enoent}, _kind), do: [] + + defp read({:ok, file}, kind), + do: Enum.map(String.split(file, @newline), &read_line(&1, kind)) + + defp read_line(line, kind), + do: Map.put(Regex.named_captures(@parser, line), :kind, kind) + + defp dep_spec(%{"package" => ""}), do: [] + + defp dep_spec(%{"package" => p, "value" => v, :kind => :hex}), + do: pkg(p, v, override: true) + + defp dep_spec(%{"package" => p, "value" => v, :kind => :path}), + do: pkg(p, path: v, override: true) + + defp dep_spec(%{"package" => p, "value" => v, :kind => :git}), do: git(v, p) + + defp git(line, p) when is_binary(line), + do: git(Regex.named_captures(@git_branch, line), p) + + defp git(%{"branch" => "", "repo" => r}, p), + do: pkg(p, git: r, override: true) + + defp git(%{"branch" => b, "repo" => r}, p), + do: pkg(p, git: r, branch: b, override: true) + + defp pkg(name, opts), do: [{String.to_atom(name), opts}] + defp pkg(name, version, opts), do: [{String.to_atom(name), version, opts}] + end +end diff --git a/mix.exs b/mix.exs index d802529..77d4879 100644 --- a/mix.exs +++ b/mix.exs @@ -1,4 +1,4 @@ -# Code.eval_file("mess.exs", if(File.exists?("../../lib/mix/mess.exs"), do: "../../lib/mix/")) +Code.eval_file("mess.exs", (if File.exists?("../../lib/mix/mess.exs"), do: "../../lib/mix/")) defmodule Needle.MixProject do use Mix.Project diff --git a/mix.lock b/mix.lock index 0d0517d..e308acb 100644 --- a/mix.lock +++ b/mix.lock @@ -4,12 +4,12 @@ "earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"}, "ecto": {:hex, :ecto, "3.11.1", "4b4972b717e7ca83d30121b12998f5fcdc62ba0ed4f20fd390f16f3270d85c3e", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ebd3d3772cd0dfcd8d772659e41ed527c28b2a8bde4b00fe03e0463da0f1983b"}, "ecto_sql": {:hex, :ecto_sql, "3.11.1", "e9abf28ae27ef3916b43545f9578b4750956ccea444853606472089e7d169470", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ce14063ab3514424276e7e360108ad6c2308f6d88164a076aac8a387e1fea634"}, - "ex_doc": {:hex, :ex_doc, "0.31.0", "06eb1dfd787445d9cab9a45088405593dd3bb7fe99e097eaa71f37ba80c7a676", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "5350cafa6b7f77bdd107aa2199fe277acf29d739aba5aee7e865fc680c62a110"}, + "ex_doc": {:hex, :ex_doc, "0.31.1", "8a2355ac42b1cc7b2379da9e40243f2670143721dd50748bf6c3b1184dae2089", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "3178c3a407c557d8343479e1ff117a96fd31bafe52a039079593fb0524ef61b0"}, "ex_ulid": {:hex, :ex_ulid, "0.1.0", "e6e717c57344f6e500d0190ccb4edc862b985a3680f15834af992ec065d4dcff", [:mix], [], "hexpm", "a2befd477aebc4639563de7e233e175cacf8a8f42c8f6778c88d60c13bf20860"}, "exto": {:hex, :exto, "0.3.0", "434fb795e5b2ea59d726345f8922ad05a0859036c6943f9560720534ae52846d", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}], "hexpm", "b6ad14306b3ff1d772a64ac245e4b8c9e348e570550826e6e1de1e4f49aae05c"}, "makeup": {:hex, :makeup, "1.1.1", "fa0bc768698053b2b3869fa8a62616501ff9d11a562f3ce39580d60860c3a55e", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "5dc62fbdd0de44de194898b6710692490be74baa02d9d108bc29f007783b0b48"}, "makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.3", "d684f4bac8690e70b06eb52dad65d26de2eefa44cd19d64a8095e1417df7c8fd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "b78dc853d2e670ff6390b605d807263bf606da3c82be37f9d7f68635bd886fc9"}, + "makeup_erlang": {:hex, :makeup_erlang, "0.1.5", "e0ff5a7c708dda34311f7522a8758e23bfcd7d8d8068dc312b5eb41c6fd76eba", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "94d2e986428585a21516d7d7149781480013c56e30c6a233534bedf38867a59a"}, "needle_ulid": {:hex, :needle_ulid, "0.3.0", "7ecccec131c5218ec7cf5f8a236c016f436e78dfd684204de9f66c40271e7e04", [:mix], [{:ecto, "~> 3.4", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "~> 3.8", [hex: :ecto_sql, repo: "hexpm", optional: true]}, {:ex_ulid, "~> 0.1", [hex: :ex_ulid, repo: "hexpm", optional: false]}], "hexpm", "d54d0dc5267b3ba3a7f981060b329bc8fb1f55104d790e54d808c8a5f4cb3e93"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},