diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 208ee49ac..000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,212 +0,0 @@ -version: 2.1 -commands: - save_deps_cache: - steps: - - save_cache: - key: v1-mix-deps-cache-{{ checksum "mix.lock" }} - paths: ["deps"] - restore_deps_cache: - steps: - - restore_cache: - keys: - - v1-mix-deps-cache-{{ checksum "mix.lock" }} - save_build_cache: - parameters: - env: - description: Mix environment - type: string - default: dev - steps: - - save_cache: - key: v3-build-cache-{{ arch }}-<< parameters.env >>-{{ checksum "mix.lock" }} - paths: ["_build/<< parameters.env >>"] - restore_build_cache: - parameters: - env: - description: Mix environment - type: string - default: dev - steps: - - restore_cache: - keys: - - v3-build-cache-{{ arch }}-<< parameters.env >>-{{ checksum "mix.lock" }} - gen_version_file: - steps: - - run: asdf current erlang > .runtime_version - - run: asdf current elixir >> .runtime_version - save_plt_cache: - steps: - - save_cache: - key: v2-dialyzer-cache-{{ checksum ".runtime_version" }}-{{ checksum "mix.lock" }} - paths: "priv/plts" - restore_plt_cache: - steps: - - restore_cache: - keys: - - v2-dialyzer-cache-{{ checksum ".runtime_version" }}-{{ checksum "mix.lock" }} - - v2-dialyzer-cache-{{ checksum ".runtime_version" }}- - - v2-dialyzer-cache- - run_tests: - parameters: - glob: - type: string - split_by: - default: filesize - type: string - command: - type: string - steps: - - run: - command: | - circleci tests glob "<>" \ - | circleci tests split --split-by=<> \ - | xargs <> -jobs: - get_deps: - docker: - - image: membraneframeworklabs/docker_membrane - - working_directory: ~/app - - steps: - - checkout - - run: git submodule sync - - run: git submodule update --init - - restore_deps_cache - - run: mix deps.get - - save_deps_cache - - persist_to_workspace: - root: . - paths: "*" - - build_test: - docker: - - image: membraneframeworklabs/docker_membrane - environment: - MIX_ENV: test - - working_directory: ~/app - - steps: - - attach_workspace: - at: . - - restore_build_cache: - env: test - - run: mix deps.compile - - run: mix compile --force --warnings-as-errors - - save_build_cache: - env: test - - run: mix deps.unlock --check-unused - - test: - docker: - - image: membraneframeworklabs/docker_membrane - environment: - MIX_ENV: test - - working_directory: ~/app - parallelism: 4 - - steps: - - attach_workspace: - at: . - - restore_build_cache: - env: test - - run: mix compile - - run_tests: - glob: "test/membrane/**/*.exs" - split_by: "timings" - command: "mix test --include long_running" - - store_test_results: - path: "_build/test/lib/membrane_core" - - lint: - docker: - - image: membraneframeworklabs/docker_membrane - environment: - MIX_ENV: dev - - working_directory: ~/app - - steps: - - attach_workspace: - at: . - - restore_build_cache: - env: dev - - run: mix compile - - save_build_cache: - env: dev - - run: mix format --check-formatted - - run: mix credo - - run: mix docs && mix docs 2>&1 | (! grep -q "warning:") - - gen_version_file - - restore_plt_cache - - run: mix dialyzer - - save_plt_cache - - test_performance: - machine: true - resource_class: membraneframework/core-performance-test - working_directory: ~/app - - steps: - - attach_workspace: - at: . - - run: git add -A; git reset --hard; cd .. - - run: cp -r benchmark/ ~/benchmark_backup/ - - run: cp mix.exs ~/benchmark_backup/ - - run: docker pull membraneframeworklabs/docker_membrane - - run: docker run -e MIX_ENV=benchmark -v ./:/root/app -v ~/results:/root/results -w /root/app membraneframeworklabs/docker_membrane mix do deps.get, deps.compile --force --all, compile --force, run benchmark/run.exs /root/results/feature_branch_results - - run: git checkout -f master - - run: cp ~/benchmark_backup/mix.exs ~/app - - run: docker run -e MIX_ENV=benchmark -v ./:/root/app -v ~/results:/root/results -v ~/benchmark_backup/benchmark:/root/app/benchmark -w /root/app membraneframeworklabs/docker_membrane mix do deps.get, deps.compile --force --all, compile --force, run benchmark/run.exs /root/results/master_results - - run: docker run -e MIX_ENV=benchmark -v ./:/root/app -v ~/results:/root/results -v ~/benchmark_backup/benchmark:/root/app/benchmark -w /root/app membraneframeworklabs/docker_membrane mix run benchmark/compare.exs /root/results/feature_branch_results /root/results/master_results - - run: - command: rm ~/results/* - when: always - -orbs: - elixir: membraneframework/elixir@1 - -workflows: - version: 2 - build_and_test: - jobs: - - get_deps - - build_test: - requires: - - get_deps - - test: - requires: - - get_deps - - lint: - requires: - - get_deps - - request_performance_test: - type: approval - filters: - branches: - ignore: - - /pull\/[0-9]+/ - - /master/ - - test_performance: - filters: - branches: - ignore: - - /pull\/[0-9]+/ - - /master/ - requires: - - get_deps - - request_performance_test - - elixir/hex_publish: - requires: - - build_test - - test - - lint - context: - - Deployment - filters: - branches: - ignore: /.*/ - tags: - only: /v.*/ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..5455a1c8c --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,24 @@ +name: CI + +on: + push: + branches: ["**"] + workflow_dispatch: + +jobs: + build_test: + uses: membraneframework/membrane_actions/.github/workflows/build-test.yml@main + with: + submodules: recursive + + test: + uses: membraneframework/membrane_actions/.github/workflows/test.yml@main + with: + submodules: recursive + test-flags: "--include long_running" + shards: 4 + + lint: + uses: membraneframework/membrane_actions/.github/workflows/lint.yml@main + with: + submodules: recursive diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml new file mode 100644 index 000000000..d6acd64c2 --- /dev/null +++ b/.github/workflows/performance.yml @@ -0,0 +1,64 @@ +name: Performance Test + +# Replaces the CircleCI manual approval gate. Trigger this workflow +# manually from the Actions tab on the branch you want to benchmark. +on: + workflow_dispatch: + +jobs: + performance: + runs-on: performance + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Back up benchmark and mix.exs + run: | + cp -r benchmark/ $HOME/benchmark_backup/ + cp mix.exs $HOME/benchmark_backup/ + + - name: Pull Docker image + run: docker pull membraneframeworklabs/docker_membrane + + - name: Run benchmarks on feature branch + run: | + mkdir -p $HOME/results + docker run \ + -e MIX_ENV=benchmark \ + -v $PWD:/root/app \ + -v $HOME/results:/root/results \ + -w /root/app \ + membraneframeworklabs/docker_membrane \ + mix do deps.get, deps.compile --force --all, compile --force, run benchmark/run.exs /root/results/feature_branch_results + + - name: Switch to master and restore benchmark + run: | + git checkout -f master + cp $HOME/benchmark_backup/mix.exs . + + - name: Run benchmarks on master + run: | + docker run \ + -e MIX_ENV=benchmark \ + -v $PWD:/root/app \ + -v $HOME/results:/root/results \ + -v $HOME/benchmark_backup/benchmark:/root/app/benchmark \ + -w /root/app \ + membraneframeworklabs/docker_membrane \ + mix do deps.get, deps.compile --force --all, compile --force, run benchmark/run.exs /root/results/master_results + + - name: Compare results + run: | + docker run \ + -e MIX_ENV=benchmark \ + -v $PWD:/root/app \ + -v $HOME/results:/root/results \ + -v $HOME/benchmark_backup/benchmark:/root/app/benchmark \ + -w /root/app \ + membraneframeworklabs/docker_membrane \ + mix run benchmark/compare.exs /root/results/feature_branch_results /root/results/master_results + + - name: Clean up results + if: always() + run: rm -f $HOME/results/* diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..14e039a48 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,37 @@ +name: Release + +on: + push: + tags: + - "v*" + workflow_dispatch: + +jobs: + build_test: + uses: membraneframework/membrane_actions/.github/workflows/build-test.yml@main + with: + submodules: recursive + + test: + uses: membraneframework/membrane_actions/.github/workflows/test.yml@test-sharding + with: + submodules: recursive + test-flags: "--include long_running" + shards: 4 + + lint: + uses: membraneframework/membrane_actions/.github/workflows/lint.yml@main + with: + submodules: recursive + + hex_publish: + needs: [build_test, test, lint] + uses: membraneframework/membrane_actions/.github/workflows/hex-publish.yml@main + with: + submodules: recursive + secrets: + HEX_API_KEY: ${{ secrets.HEX_API_KEY }} + + gh_release: + needs: [hex_publish] + uses: membraneframework/membrane-actions/.github/workflows/github-release.yml@main diff --git a/README.md b/README.md index 0157b7098..d5c54965c 100644 --- a/README.md +++ b/README.md @@ -167,8 +167,8 @@ If you have any questions regarding Membrane Framework or need consulting, feel - ### General + | Package | Description | Links | | --- | --- | --- | | [membrane_sdk](https://github.com/membraneframework/membrane_sdk) | Full power of Membrane in a single package | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_sdk.svg)](https://hex.pm/api/packages/membrane_sdk) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_sdk/) | @@ -183,6 +183,7 @@ If you have any questions regarding Membrane Framework or need consulting, feel ### Plugins #### General purpose + | Package | Description | Links | | --- | --- | --- | | [membrane_file_plugin](https://github.com/membraneframework/membrane_file_plugin) | Membrane plugin for reading and writing to files | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_file_plugin.svg)](https://hex.pm/api/packages/membrane_file_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_file_plugin/) | @@ -200,12 +201,14 @@ If you have any questions regarding Membrane Framework or need consulting, feel | [membrane_template_plugin](https://github.com/membraneframework/membrane_template_plugin) | Template for Membrane Elements | | #### AI + | Package | Description | Links | | --- | --- | --- | | [membrane_whisper_plugin](https://github.com/membraneframework/membrane_whisper_plugin) | Membrane plugin for integrating OpenAI's Whisper in audio processing pipelines | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_whisper_plugin.svg)](https://hex.pm/api/packages/membrane_whisper_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_whisper_plugin/) | | [membrane_yolo_plugin](https://github.com/membraneframework/membrane_yolo_plugin) | Membrane Plugin for applying YOLO object detection on raw video frames | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_yolo_plugin.svg)](https://hex.pm/api/packages/membrane_yolo_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_yolo_plugin/) | #### Streaming protocols + | Package | Description | Links | | --- | --- | --- | | [membrane_webrtc_plugin](https://github.com/membraneframework/membrane_webrtc_plugin) | Plugin for streaming via WebRTC | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_webrtc_plugin.svg)](https://hex.pm/api/packages/membrane_webrtc_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_webrtc_plugin/) | @@ -227,6 +230,7 @@ If you have any questions regarding Membrane Framework or need consulting, feel | [membrane_hls_plugin](https://github.com/kim-company/membrane_hls_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Adaptive live streaming plugin (HLS) for the Membrane Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_hls_plugin.svg)](https://hex.pm/api/packages/membrane_hls_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_hls_plugin/) | #### Containers + | Package | Description | Links | | --- | --- | --- | | [membrane_mp4_plugin](https://github.com/membraneframework/membrane_mp4_plugin) | Utilities for MP4 container parsing and serialization and elements for muxing the stream to CMAF | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_mp4_plugin.svg)](https://hex.pm/api/packages/membrane_mp4_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_mp4_plugin/) | @@ -236,6 +240,7 @@ If you have any questions regarding Membrane Framework or need consulting, feel | [membrane_ogg_plugin](https://github.com/membraneframework/membrane_ogg_plugin) | Plugin for depayloading an Ogg file into an Opus stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ogg_plugin.svg)](https://hex.pm/api/packages/membrane_ogg_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ogg_plugin/) | #### Audio codecs + | Package | Description | Links | | --- | --- | --- | | [membrane_aac_plugin](https://github.com/membraneframework/membrane_aac_plugin) | AAC parser and complementary elements for AAC codec | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_aac_plugin.svg)](https://hex.pm/api/packages/membrane_aac_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_aac_plugin/) | @@ -249,6 +254,7 @@ If you have any questions regarding Membrane Framework or need consulting, feel | [membrane_g711_ffmpeg_plugin](https://github.com/membraneframework/membrane_g711_ffmpeg_plugin) | Membrane G.711 decoder and encoder based on FFmpeg | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_g711_ffmpeg_plugin.svg)](https://hex.pm/api/packages/membrane_g711_ffmpeg_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_g711_ffmpeg_plugin/) | #### Video codecs + | Package | Description | Links | | --- | --- | --- | | [membrane_h26x_plugin](https://github.com/membraneframework/membrane_h26x_plugin) | Membrane h264 and h265 parsers | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h26x_plugin.svg)](https://hex.pm/api/packages/membrane_h26x_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h26x_plugin/) | @@ -261,6 +267,7 @@ If you have any questions regarding Membrane Framework or need consulting, feel | [membrane_subtitle_mixer_plugin](https://github.com/kim-company/membrane_subtitle_mixer_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Membrane.Filter that uses CEA708 to merge subtitles directly in H264 packets. | | #### Raw audio + | Package | Description | Links | | --- | --- | --- | | [membrane_raw_audio_parser_plugin](https://github.com/membraneframework/membrane_raw_audio_parser_plugin) | Membrane element for parsing raw audio | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_audio_parser_plugin.svg)](https://hex.pm/api/packages/membrane_raw_audio_parser_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_audio_parser_plugin/) | @@ -271,6 +278,7 @@ If you have any questions regarding Membrane Framework or need consulting, feel | [membrane_audiometer_plugin](https://github.com/membraneframework/membrane_audiometer_plugin) | Elements for measuring the level of the audio stream | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_audiometer_plugin.svg)](https://hex.pm/api/packages/membrane_audiometer_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_audiometer_plugin/) | #### Raw video + | Package | Description | Links | | --- | --- | --- | | [membrane_raw_video_parser_plugin](https://github.com/membraneframework/membrane_raw_video_parser_plugin) | Membrane plugin for parsing raw video streams | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_raw_video_parser_plugin.svg)](https://hex.pm/api/packages/membrane_raw_video_parser_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_raw_video_parser_plugin/) | @@ -286,6 +294,7 @@ If you have any questions regarding Membrane Framework or need consulting, feel | [membrane_video_mixer_plugin](https://github.com/kim-company/membrane_video_mixer_plugin) | [Maintainer: [kim-company](https://github.com/kim-company)] Membrane.Filter that mixes a variable number of input videos into one output using ffmpeg filters | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_video_mixer_plugin.svg)](https://hex.pm/api/packages/membrane_video_mixer_plugin) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_video_mixer_plugin/) | #### External APIs + | Package | Description | Links | | --- | --- | --- | | [membrane_aws_plugin](https://github.com/fishjam-dev/membrane_aws_plugin) | [Maintainer: [fishjam-dev](https://github.com/fishjam-dev)] | | @@ -296,6 +305,7 @@ If you have any questions regarding Membrane Framework or need consulting, feel | [membrane_transcription](https://github.com/lawik/membrane_transcription) | [Maintainer: [lawik](https://github.com/lawik)] Prototype transcription for Membrane | | ### Formats + | Package | Description | Links | | --- | --- | --- | | [membrane_rtp_format](https://github.com/membraneframework/membrane_rtp_format) | Real-time Transport Protocol format for Membrane Framework | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_rtp_format.svg)](https://hex.pm/api/packages/membrane_rtp_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_rtp_format/) | @@ -316,6 +326,7 @@ If you have any questions regarding Membrane Framework or need consulting, feel | [membrane_h265_format](https://github.com/gBillal/membrane_h265_format) | [Maintainer: [gBillal](https://github.com/gBillal)] H265 video format definition | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_h265_format.svg)](https://hex.pm/api/packages/membrane_h265_format) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_h265_format/) | ### Standalone media libs + | Package | Description | Links | | --- | --- | --- | | [ex_webrtc](https://github.com/elixir-webrtc/ex_webrtc) | [Maintainer: [elixir-webrtc](https://github.com/elixir-webrtc)] An Elixir implementation of the W3C WebRTC API | [![Hex.pm](https://img.shields.io/hexpm/v/ex_webrtc.svg)](https://hex.pm/api/packages/ex_webrtc) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/ex_webrtc/) | @@ -329,6 +340,7 @@ If you have any questions regarding Membrane Framework or need consulting, feel | [membrane_ffmpeg_generator](https://github.com/membraneframework-labs/membrane_ffmpeg_generator) | [Labs] FFmpeg video and audio generator for tests, benchmarks and demos. | [![Hex.pm](https://img.shields.io/hexpm/v/membrane_ffmpeg_generator.svg)](https://hex.pm/api/packages/membrane_ffmpeg_generator) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/membrane_ffmpeg_generator/) | ### Utils + | Package | Description | Links | | --- | --- | --- | | [unifex](https://github.com/membraneframework/unifex) | Tool for generating interfaces between native C code and Elixir | [![Hex.pm](https://img.shields.io/hexpm/v/unifex.svg)](https://hex.pm/api/packages/unifex) [![Docs](https://img.shields.io/badge/api-docs-yellow.svg?style=flat)](https://hexdocs.pm/unifex/) | diff --git a/lib/mix/tasks/membrane.demo.ex b/lib/mix/tasks/membrane.demo.ex index d4b1762a3..bd429bd7a 100644 --- a/lib/mix/tasks/membrane.demo.ex +++ b/lib/mix/tasks/membrane.demo.ex @@ -112,7 +112,9 @@ defmodule Mix.Tasks.Membrane.Demo do Enum.reduce_while(@demos_search_list, :error, fn demo_dir, _status -> demo_path = Path.join([repo_dir, demo_dir, demo_name]) - execute_git_command(["sparse-checkout", "set", Path.join(demo_dir, demo_name)], repo_dir) + demo_name_path = if demo_dir == ".", do: demo_name, else: Path.join(demo_dir, demo_name) + + execute_git_command(["sparse-checkout", "set", demo_name_path], repo_dir) execute_git_command(["checkout"], repo_dir) case File.cp_r(demo_path, Path.join(target_dir, Path.basename(demo_path))) do diff --git a/mix.exs b/mix.exs index 2afb6fcd9..8daba8410 100644 --- a/mix.exs +++ b/mix.exs @@ -1,7 +1,7 @@ defmodule Membrane.Mixfile do use Mix.Project - @version "1.3.0" + @version "1.3.1" @source_ref "v#{@version}" @hex_packages_path "scripts/elixir/hex_packages.exs" @@ -46,13 +46,14 @@ defmodule Membrane.Mixfile do opts = [ plt_local_path: "priv/plts", flags: [:error_handling, :unmatched_returns], - plt_add_apps: [:mix, :req] + plt_add_apps: [:mix, :req, :syntax_tools] ] if System.get_env("CI") == "true" do # Store core PLTs in cacheable directory for CI # For development it's better to stick to default, $MIX_HOME based path # to allow sharing core PLTs between projects + File.mkdir_p!(Path.join([__DIR__, "priv", "plts"])) [plt_core_path: "priv/plts"] ++ opts else opts @@ -268,7 +269,7 @@ defmodule Membrane.Mixfile do # Development {:ex_doc, "~> 0.40", only: :dev, runtime: false}, {:makeup_diff, "~> 0.1", only: :dev, runtime: false}, - {:dialyxir, "~> 1.1", only: :dev, runtime: false}, + {:dialyxir, "~> 1.4", only: :dev, runtime: false}, {:credo, "~> 1.7", only: :dev, runtime: false}, {:req, "~> 0.5.17", only: [:dev, :test], runtime: false}, # Testing diff --git a/mix.lock b/mix.lock index 8cea3a251..f4b77ed03 100644 --- a/mix.lock +++ b/mix.lock @@ -2,7 +2,7 @@ "bunch": {:hex, :bunch, "1.6.1", "5393d827a64d5f846092703441ea50e65bc09f37fd8e320878f13e63d410aec7", [:mix], [], "hexpm", "286cc3add551628b30605efbe2fca4e38cc1bea89bcd0a1a7226920b3364fe4a"}, "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "coerce": {:hex, :coerce, "1.0.2", "5ef791040c92baaa5dd344887563faaeac6e6742573a167493294f8af3672bbe", [:mix], [], "hexpm", "0b3451c729571234fdac478636c298e71d1f2ce1243abed5fa43fa3181b980eb"}, - "credo": {:hex, :credo, "1.7.17", "f92b6aa5b26301eaa5a35e4d48ebf5aa1e7094ac00ae38f87086c562caf8a22f", [: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", "1eb5645c835f0b6c9b5410f94b5a185057bcf6d62a9c2b476da971cde8749645"}, + "credo": {:hex, :credo, "1.7.18", "5c5596bf7aedf9c8c227f13272ac499fe8eae6237bd326f2f07dfc173786f042", [: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", "a189d164685fd945809e862fe76a7420c4398fa288d76257662aecb909d6b3e5"}, "dialyxir": {:hex, :dialyxir, "1.4.7", "dda948fcee52962e4b6c5b4b16b2d8fa7d50d8645bbae8b8685c3f9ecb7f5f4d", [:mix], [{:erlex, ">= 0.2.8", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b34527202e6eb8cee198efec110996c25c5898f43a4094df157f8d28f27d9efe"}, "earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"}, "erlex": {:hex, :erlex, "0.2.8", "cd8116f20f3c0afe376d1e8d1f0ae2452337729f68be016ea544a72f767d9c12", [:mix], [], "hexpm", "9d66ff9fedf69e49dc3fd12831e12a8a37b76f8651dd21cd45fcf5561a8a7590"}, diff --git a/priv/plts/.gitkeep b/priv/plts/.gitkeep deleted file mode 100644 index e69de29bb..000000000