From af336fcea4537a90464f3cc12fa82636f3fcd467 Mon Sep 17 00:00:00 2001 From: Barrie Loydall <43551050+barrieloydall@users.noreply.github.com> Date: Mon, 5 Feb 2024 16:40:15 -0800 Subject: [PATCH] resolve mix docs issue + dependency updates (#44) * add mix docs to git workflow to ensure they build * remove erroneous earmark dep * remove applications config * version bump and changelog updates * add 1.13 to test matrix * use actions cache@v4 * update deps * add readme status badges * cleanup mix file * docs and typo fixes * add dependabot config * update git ignore * update codeowners --- .formatter.exs | 1 + .github/CODEOWNERS | 2 + .github/dependabot.yml | 13 ++++++ .github/workflows/test.yml | 9 +++- .gitignore | 3 ++ CHANGELOG.md | 19 +++++---- README.md | 31 ++++++++++++-- lib/linguist.ex | 3 +- lib/linguist/cldr_backend.ex | 2 +- lib/linguist/compiler.ex | 40 ++++++++++-------- lib/linguist/memorized_vocabulary.ex | 51 ++++++++++++----------- lib/linguist/vocabulary.ex | 62 +++++++++++++++------------- mix.exs | 38 ++++++++--------- mix.lock | 23 ++++++----- 14 files changed, 182 insertions(+), 115 deletions(-) create mode 100644 .github/CODEOWNERS create mode 100644 .github/dependabot.yml diff --git a/.formatter.exs b/.formatter.exs index d304ff3..d2cda26 100644 --- a/.formatter.exs +++ b/.formatter.exs @@ -1,3 +1,4 @@ +# Used by "mix format" [ inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"] ] diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..ee66041 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,2 @@ +# Tag Change.org on changes to repo +* @change/co-elixir diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..948eb54 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,13 @@ +version: 2 + +updates: + - package-ecosystem: "mix" + directory: "/" + schedule: + interval: "daily" + open-pull-requests-limit: 5 + + - package-ecosystem: "docker" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4bb6fbb..4dadf1b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,6 +16,8 @@ jobs: include: - elixir: '1.11' otp: '23' + - elixir: '1.13' + otp: '24' - elixir: '1.15' otp: '25' @@ -30,7 +32,7 @@ jobs: otp-version: ${{ matrix.otp }} - name: Restore deps cache - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: deps key: ${{ runner.os }}-mix-${{ matrix.otp }}-${{ matrix.elixir }}-${{ hashFiles('**/mix.lock') }} @@ -39,7 +41,7 @@ jobs: ${{ runner.os }}-mix-${{ matrix.otp }}-${{ matrix.elixir }} - name: Restore _build cache - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: _build key: ${{ runner.os }}-build-${{ matrix.otp }}-${{ matrix.elixir }}-${{ hashFiles('**/mix.lock') }} @@ -64,3 +66,6 @@ jobs: - name: Run unit tests run: mix test + + - name: Build docs (validate build) + run: mix docs diff --git a/.gitignore b/.gitignore index f960ae9..df15344 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,6 @@ erl_crash.dump .sobelow /doc + +# Ignore tarball, built by "mix hex.build" +linguist-*.tar diff --git a/CHANGELOG.md b/CHANGELOG.md index e9075a3..6ce123f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,17 @@ # Changelog -## v0.4.0 (2024-01-31) -* Add ci test and support Elixir 1.15 and OTP 25 -* Upgrade `ex_cldr` to version 2.37 +## v0.4.0 (2024-02-05) * Now requires Elixir ~> 1.11 +* Add Elixir 1.15 and OTP 25 to ci test matrix +* Upgrade `ex_cldr` to version 2.37 +* Add mix docs to ci workflow, to ensure docs build after changes +* Add Elixir 1.13 OTP 24 to ci test matrix +* Remove unused `earmark` dep +* Remove unnecessary `applications:` config causing error with `mix docs` +* Update dependencies + credo fixes +* Update readme, add status badges +* Updates docs and typo fixes ++ Add dependabot and codeowner configs ## v0.3.2 (2021-08-11) Wow, I held on to this release waaaaaay too long. Sorry about that. Also, a *huge thank you to @dolfinus for their contributes* (and nudges)! @@ -40,7 +48,6 @@ Here's what changed: ## v0.2.1 (2019-01-25) * [Add helper function](https://github.com/mertonium/linguist/commit/06807327e5095e54dd584ad5d65469e4358c92b4) for normalizing locales argument in MemorizedVocubalary.t/3. Locales will be made into the format "es-ES" or "es" - ## v0.2.0 (2018-10-22) * **LARGE SCALE REFACTOR** described in [this pull request](https://github.com/mertonium/linguist/pull/22) @@ -49,13 +56,12 @@ Here's what changed: * Bug Fixes * Fix bug causing interpolations at beginning of string to be missed - ## v0.1.0 (2014-07-06) * Enhancements * Add `locale` macro for locale definitions * Support String filepath locale source for automated evaluation - * Suppport arbitrary locale source to fetch keyword list of translations, ie function call, Code.eval_file, etc. + * Support arbitrary locale source to fetch keyword list of translations, ie function call, Code.eval_file, etc. * Add `t!` lookups where `NoTranslationError` is raised if translation not found * Backwards incompatible changes @@ -63,7 +69,6 @@ Here's what changed: * Locale definitions now required to use `locale/2` macro instead of `use` options * Update `t` lookups to return `{:ok, translation}` or `{:error, :no_translation}` - ## v0.0.1 (2014-06-28) Initial release diff --git a/README.md b/README.md index a77a237..227d589 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,39 @@ # Linguist + +[![Test](https://github.com/change/linguist/actions/workflows/test.yml/badge.svg)](https://github.com/change/linguist/actions/workflows/test.yml) +[![Version on Hex.pm](https://img.shields.io/hexpm/v/linguist.svg)](https://hex.pm/packages/linguist) +[![Hex Docs](https://img.shields.io/badge/hex-docs-lightgreen.svg)](https://hexdocs.pm/linguist) +[![Hex.pm downloads](https://img.shields.io/hexpm/dt/linguist.svg)](https://hex.pm/packages/linguist) +[![License](https://img.shields.io/hexpm/l/linguist.svg)](https://github.com/change/linguist/blob/master/LICENSE) +[![Latest commit](https://img.shields.io/github/last-commit/change/linguist.svg)](https://github.com/change/linguist/commits/master) +![GitHub top language](https://img.shields.io/github/languages/top/change/linguist) + > Linguist is a simple Elixir Internationalization library +## Installation + +Add `:linguist` to your `mix.exs` dependencies: + +```elixir +def deps do + [ + {:linguist, "~> 0.4"} + ] +end +``` + +Update your dependencies: + +```bash +$ mix deps.get +``` ## Usage ```elixir defmodule I18n do use Linguist.Vocabulary - + locale "en", [ flash: [ notice: [ @@ -22,9 +48,8 @@ defmodule I18n do ] ] ] - - locale "fr", Path.join([__DIR__, "fr.exs"]) + locale "fr", Path.join([__DIR__, "fr.exs"]) end # fr.exs diff --git a/lib/linguist.ex b/lib/linguist.ex index de7f860..31e588f 100644 --- a/lib/linguist.ex +++ b/lib/linguist.ex @@ -1,4 +1,5 @@ defmodule Linguist do + @moduledoc false defmodule NoTranslationError do defexception [:message] @@ -13,7 +14,7 @@ defmodule Linguist do @impl true def exception(value) do msg = - "Invalid locale: expected a locale in the format 'es-ES' or 'es', but recieved: #{value}" + "Invalid locale: expected a locale in the format 'es-ES' or 'es', but received: #{value}" %LocaleError{message: msg} end diff --git a/lib/linguist/cldr_backend.ex b/lib/linguist/cldr_backend.ex index aec943e..7e54c1c 100644 --- a/lib/linguist/cldr_backend.ex +++ b/lib/linguist/cldr_backend.ex @@ -1,6 +1,6 @@ defmodule Linguist.Cldr do @moduledoc """ - Backend Module for Cldr App configuration, required for ~> 2.0 + Backend Module for Cldr App configuration, required for ~> 2.0. """ use Cldr, otp_app: :linguist, diff --git a/lib/linguist/compiler.ex b/lib/linguist/compiler.ex index 51eeba9..ea19321 100644 --- a/lib/linguist/compiler.ex +++ b/lib/linguist/compiler.ex @@ -1,32 +1,35 @@ defmodule Linguist.Compiler do + @moduledoc """ + Translation Compiler Module. + """ alias Linguist.Cldr.Number.Cardinal alias Linguist.NoTranslationError @doc ~S""" - Compiles keyword list of transactions into function definitions AST + Compiles keyword list of transactions into function definitions AST. - Examples + ## Examples - iex> Linguist.Compiler.compile(en: [ - hello: "Hello %{name}", - alert: "Alert!" - ]) + iex> Linguist.Compiler.compile(en: [ + hello: "Hello %{name}", + alert: "Alert!" + ]) - quote do - def t(locale, path, binding \\ []) + quote do + def t(locale, path, binding \\ []) - def t("en", "hello", bindings), do: "Hello " <> Keyword.fetch!(bindings, :name) - def t("en", "alert", bindings), do: "Alert!" + def t("en", "hello", bindings), do: "Hello " <> Keyword.fetch!(bindings, :name) + def t("en", "alert", bindings), do: "Alert!" - def t(_locale, _path, _bindings), do: {:error, :no_translation} - def t!(locale, path, bindings \\ []) do - case t(locale, path, bindings) do - {:ok, translation} -> translation - {:error, :no_translation} -> - raise %NoTranslationError{message: "#{locale}: #{path}"} + def t(_locale, _path, _bindings), do: {:error, :no_translation} + def t!(locale, path, bindings \\ []) do + case t(locale, path, bindings) do + {:ok, translation} -> translation + {:error, :no_translation} -> + raise %NoTranslationError{message: "#{locale}: #{path}"} + end + end end - end - end """ @interpol_rgx ~r/ @@ -41,6 +44,7 @@ defmodule Linguist.Compiler do @escaped_interpol_rgx ~r/%%{/ @simple_interpol "%{" + # credo:disable-for-next-line Credo.Check.Refactor.CyclomaticComplexity def compile(translations) do langs = translations diff --git a/lib/linguist/memorized_vocabulary.ex b/lib/linguist/memorized_vocabulary.ex index c9662f8..403b7d0 100644 --- a/lib/linguist/memorized_vocabulary.ex +++ b/lib/linguist/memorized_vocabulary.ex @@ -1,38 +1,38 @@ defmodule Linguist.MemorizedVocabulary do alias Linguist.Cldr.Number.Cardinal - alias Linguist.Compiler - alias Linguist.{LocaleError, NoTranslationError} + alias Linguist.{Compiler, LocaleError, NoTranslationError} defmodule TranslationDecodeError do defexception [:message] end @moduledoc """ - Defines lookup functions for given translation locales, binding interopolation + Defines lookup functions for given translation locales, binding interpolation. Locales are defined with the `locale/2` function, accepting a locale name and a String path to evaluate for the translations list. - For example, given the following translations : - - locale "en", [ - flash: [ - notice: [ - hello: "hello %{first} %{last}", + For example, given the following translations: + + locale "en", [ + flash: [ + notice: [ + hello: "hello %{first} %{last}", + ] + ], + users: [ + title: "Users", + ] ] - ], - users: [ - title: "Users", - ] - ] - locale "fr", Path.join([__DIR__, "fr.exs"]) + locale "fr", Path.join([__DIR__, "fr.exs"]) + + This module will respond to these functions: - this module will respond to these functions : + t("en", "flash.notice.hello", bindings \\ []), do: # ... + t("en", "users.title", bindings \\ []), do: # ... + t("fr", "flash.notice.hello", bindings \\ []), do: # ... - t("en", "flash.notice.hello", bindings \\ []), do: # ... - t("en", "users.title", bindings \\ []), do: # ... - t("fr", "flash.notice.hello", bindings \\ []), do: # ... """ def t(locale, path, bindings \\ []) def t(nil, _, _), do: raise(LocaleError, nil) @@ -118,14 +118,15 @@ defmodule Linguist.MemorizedVocabulary do end @doc """ - Embeds locales from provided source + Embeds locales from provided source. * name - The String name of the locale, ie "en", "fr" * source - The String file path to load YAML from that returns a structured list of translations - Examples + ## Examples + + locale "es", Path.join([__DIR__, "es.yml"]) - locale "es", Path.join([__DIR__, "es.yml"]) """ def locale(name, source) do loaded_source = Linguist.MemorizedVocabulary._load_yaml_file(source) @@ -134,8 +135,9 @@ defmodule Linguist.MemorizedVocabulary do end @doc """ - Function used internally to load a yaml file. Please use - the `locale` macro with a path to a yaml file - this function + Function used internally to load a yaml file. + + Please use the `locale` macro with a path to a yaml file - this function will not work as expected if called directly. """ def _load_yaml_file(source) do @@ -161,6 +163,7 @@ defmodule Linguist.MemorizedVocabulary do @doc """ Recursive function used internally for loading yaml files. + Not intended for external use """ def _yaml_reducer({key, value}, acc) when is_binary(value) do diff --git a/lib/linguist/vocabulary.ex b/lib/linguist/vocabulary.ex index 3a90ca2..9840e70 100644 --- a/lib/linguist/vocabulary.ex +++ b/lib/linguist/vocabulary.ex @@ -2,32 +2,33 @@ defmodule Linguist.Vocabulary do alias Linguist.Compiler @moduledoc """ - Defines lookup functions for given translation locales, binding interopolation + Defines lookup functions for given translation locales, binding interpolation. Locales are defined with the `locale/2` macro, accepting a locale name and either keyword list of translations or String path to evaluate for translations list. - For example, given the following translations : - - locale "en", [ - flash: [ - notice: [ - hello: "hello %{first} %{last}", + For example, given the following translations: + + locale "en", [ + flash: [ + notice: [ + hello: "hello %{first} %{last}", + ] + ], + users: [ + title: "Users", + ] ] - ], - users: [ - title: "Users", - ] - ] - locale "fr", Path.join([__DIR__, "fr.exs"]) + locale "fr", Path.join([__DIR__, "fr.exs"]) + + This module will compile this down to these functions: - this module will compile this down to these functions : + def t("en", "flash.notice.hello", bindings \\ []), do: # ... + def t("en", "users.title", bindings \\ []), do: # ... + def t("fr", "flash.notice.hello", bindings \\ []), do: # ... - def t("en", "flash.notice.hello", bindings \\ []), do: # ... - def t("en", "users.title", bindings \\ []), do: # ... - def t("fr", "flash.notice.hello", bindings \\ []), do: # ... """ @doc """ @@ -46,23 +47,24 @@ defmodule Linguist.Vocabulary do end @doc """ - Embeds locales from provided source + Embeds locales from provided source. * name - The String name of the locale, ie "en", "fr" * source - - 1. The String file path to eval that returns a keyword list of translactions + 1. The String file path to eval that returns a keyword list of translations 2. The Keyword List of translations - Examples + ## Examples - locale "en", [ - flash: [ - notice: [ - hello: "hello %{first} %{last}", + locale "en", [ + flash: [ + notice: [ + hello: "hello %{first} %{last}", + ] + ] ] - ] - ] - locale "fr", Path.join([__DIR__, "fr.exs"]) + + locale "fr", Path.join([__DIR__, "fr.exs"]) """ defmacro locale(name, source) do quote bind_quoted: [name: name, source: source] do @@ -86,8 +88,9 @@ defmodule Linguist.Vocabulary do end @doc """ - Function used internally to load a yaml file. Please use - the `locale` macro with a path to a yaml file - this function + Function used internally to load a yaml file. + + Please use the `locale` macro with a path to a yaml file - this function will not work as expected if called directly. """ def _load_yaml_file(source) do @@ -99,6 +102,7 @@ defmodule Linguist.Vocabulary do @doc """ Recursive function used internally for loading yaml files. + Not intended for external use """ # sobelow_skip ["DOS.StringToAtom"] diff --git a/mix.exs b/mix.exs index 541552f..38d7afe 100644 --- a/mix.exs +++ b/mix.exs @@ -1,14 +1,9 @@ Code.ensure_loaded?(Hex) and Hex.start() -defmodule Linguist.Mixfile do +defmodule Linguist.MixProject do + @moduledoc false use Mix.Project - @description """ - Elixir Internationalization library, extended to support translation files in the rails-i18n format. - """ - - @repo_url "https://github.com/change/linguist" - @version "0.4.0" def project do @@ -17,41 +12,46 @@ defmodule Linguist.Mixfile do version: @version, elixir: "~> 1.11", deps: deps(), - - # Hex package: package(), - description: @description, - - # Docs + description: description(), name: "Linguist", + source_url: source_url(), docs: [ extras: ["README.md"], main: "readme", source_ref: "v#{@version}", - source_url: @repo_url + source_url: source_url() ] ] end def application do - [applications: [:yaml_elixir, :ex_cldr]] + [] end - def package do + defp package do [ - maintainers: ["John Mertens", "Justin Almeida"], + maintainers: ["Change.org", "John Mertens", "Justin Almeida"], licenses: ["MIT"], - links: %{github: @repo_url} + links: %{github: source_url()} ] end + defp source_url do + "https://github.com/change/linguist" + end + + defp description do + "Elixir Internationalization library, extended to support translation files in the rails-i18n format." + end + defp deps do [ {:ex_cldr, "~> 2.37"}, {:jason, "~> 1.0"}, {:yaml_elixir, "~> 2.0"}, - {:ex_doc, "~> 0.22.0", only: [:dev, :test], runtime: false}, - {:credo, "~> 0.9.0", only: [:dev, :test], runtime: false}, + {:ex_doc, "~> 0.22", only: [:dev, :test], runtime: false}, + {:credo, "~> 1.0", only: [:dev, :test], runtime: false}, {:sobelow, "~> 0.10", only: :dev, runtime: false} ] end diff --git a/mix.lock b/mix.lock index 53e76b5..d74a19e 100644 --- a/mix.lock +++ b/mix.lock @@ -1,18 +1,19 @@ %{ - "bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"}, + "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "cldr_utils": {:hex, :cldr_utils, "2.24.2", "364fa30be55d328e704629568d431eb74cd2f085752b27f8025520b566352859", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:decimal, "~> 1.9 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "3362b838836a9f0fa309de09a7127e36e67310e797d556db92f71b548832c7cf"}, - "credo": {:hex, :credo, "0.9.3", "76fa3e9e497ab282e0cf64b98a624aa11da702854c52c82db1bf24e54ab7c97a", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:poison, ">= 0.0.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm", "dcd1d45626f6a02abeef3fc424eaf101b05a851d3cceb9535b8ea3e14c3c17e6"}, + "credo": {:hex, :credo, "1.7.3", "05bb11eaf2f2b8db370ecaa6a6bda2ec49b2acd5e0418bc106b73b07128c0436", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "35ea675a094c934c22fb1dca3696f3c31f2728ae6ef5a53b5d648c11180a4535"}, "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, - "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"}, "earmark_parser": {:hex, :earmark_parser, "1.4.13", "0c98163e7d04a15feb62000e1a891489feb29f3d10cb57d4f845c405852bbef8", [:mix], [], "hexpm", "d602c26af3a0af43d2f2645613f65841657ad6efc9f0e361c3b6c06b578214ba"}, "ex_cldr": {:hex, :ex_cldr, "2.37.5", "9da6d97334035b961d2c2de167dc6af8cd3e09859301a5b8f49f90bd8b034593", [:mix], [{:cldr_utils, "~> 2.21", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.19", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: true]}], "hexpm", "74ad5ddff791112ce4156382e171a5f5d3766af9d5c4675e0571f081fe136479"}, - "ex_doc": {:hex, :ex_doc, "0.22.6", "0fb1e09a3e8b69af0ae94c8b4e4df36995d8c88d5ec7dbd35617929144b62c00", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm", "1e0aceda15faf71f1b0983165e6e7313be628a460e22a031e32913b98edbd638"}, + "ex_doc": {:hex, :ex_doc, "0.26.0", "1922164bac0b18b02f84d6f69cab1b93bc3e870e2ad18d5dacb50a9e06b542a3", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "2775d66e494a9a48355db7867478ffd997864c61c65a47d31c4949459281c78d"}, + "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"}, "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, - "makeup": {:hex, :makeup, "1.0.1", "82f332e461dc6c79dbd82fbe2a9c10d48ed07146f0a478286e590c83c52010b5", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "49736fe5b66a08d8575bf5321d716bac5da20c8e6b97714fec2bcd6febcfa1f8"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "d4b316c7222a85bbaa2fd7c6e90e37e953257ad196dc229505137c5e505e9eff"}, - "nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm", "589b5af56f4afca65217a1f3eb3fee7e79b09c40c742fddc1c312b3ac0b3399f"}, - "poison": {:hex, :poison, "4.0.1", "bcb755a16fac91cad79bfe9fc3585bb07b9331e50cfe3420a24bcc2d735709ae", [:mix], [], "hexpm", "ba8836feea4b394bb718a161fc59a288fe0109b5006d6bdf97b6badfcf6f0f25"}, - "sobelow": {:hex, :sobelow, "0.10.1", "7ddd72eacd3cff0d8ebaaa7825a11718652d264a8c1b97fe802d09634c955db5", [:mix], [], "hexpm", "6d4d3407a7e3cd4d04673b195ac19342400c7300a4f5f212273418271c47b660"}, - "yamerl": {:hex, :yamerl, "0.7.0", "e51dba652dce74c20a88294130b48051ebbbb0be7d76f22de064f0f3ccf0aaf5", [:rebar3], [], "hexpm", "cb5a4481e2e2ad36db83bd9962153e1a9208e2b2484185e33fc2caac6a50b108"}, - "yaml_elixir": {:hex, :yaml_elixir, "2.4.0", "2f444abc3c994c902851fde56b6a9cb82895c291c05a0490a289035c2e62ae71", [:mix], [{:yamerl, "~> 0.7", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm", "4e25a6d5c873e393689c6f1062c5ec90f6cd1be2527b073178ae37eae4c78bee"}, + "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.14.1", "4f0e96847c63c17841d42c08107405a005a2680eb9c7ccadfd757bd31dabccfb", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f2438b1a80eaec9ede832b5c41cd4f373b38fd7aa33e3b22d9db79e640cbde11"}, + "makeup_erlang": {:hex, :makeup_erlang, "0.1.3", "d684f4bac8690e70b06eb52dad65d26de2eefa44cd19d64a8095e1417df7c8fd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "b78dc853d2e670ff6390b605d807263bf606da3c82be37f9d7f68635bd886fc9"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.3.1", "2c54013ecf170e249e9291ed0a62e5832f70a476c61da16f6aac6dca0189f2af", [:mix], [], "hexpm", "2682e3c0b2eb58d90c6375fc0cc30bc7be06f365bf72608804fb9cffa5e1b167"}, + "poison": {:hex, :poison, "5.0.0", "d2b54589ab4157bbb82ec2050757779bfed724463a544b6e20d79855a9e43b24", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "11dc6117c501b80c62a7594f941d043982a1bd05a1184280c0d9166eb4d8d3fc"}, + "sobelow": {:hex, :sobelow, "0.13.0", "218afe9075904793f5c64b8837cc356e493d88fddde126a463839351870b8d1e", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "cd6e9026b85fc35d7529da14f95e85a078d9dd1907a9097b3ba6ac7ebbe34a0d"}, + "yamerl": {:hex, :yamerl, "0.10.0", "4ff81fee2f1f6a46f1700c0d880b24d193ddb74bd14ef42cb0bcf46e81ef2f8e", [:rebar3], [], "hexpm", "346adb2963f1051dc837a2364e4acf6eb7d80097c0f53cbdc3046ec8ec4b4e6e"}, + "yaml_elixir": {:hex, :yaml_elixir, "2.9.0", "9a256da867b37b8d2c1ffd5d9de373a4fda77a32a45b452f1708508ba7bbcb53", [:mix], [{:yamerl, "~> 0.10", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm", "0cb0e7d4c56f5e99a6253ed1a670ed0e39c13fc45a6da054033928607ac08dfc"}, }