diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..44610e5 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake; diff --git a/.gitignore b/.gitignore index e59a32f..c307b79 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ /docs erl_crash.dump *.ez +.direnv/ +.hex/ +.mix/ diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..c0137b3 --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1724395761, + "narHash": "sha256-zRkDV/nbrnp3Y8oCADf5ETl1sDrdmAW6/bBVJ8EbIdQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ae815cee91b417be55d43781eb4b73ae1ecc396c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..21c6654 --- /dev/null +++ b/flake.nix @@ -0,0 +1,57 @@ +{ + description = "tqdm elixir flake"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + self, + nixpkgs, + flake-utils, + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = import nixpkgs { + inherit system; + config.allowUnfreePredicate = pkg: + builtins.elem (nixpkgs.lib.getName pkg) [ + ]; + }; + + inherit (pkgs) inotify-tools terminal-notifier; + inherit (pkgs.lib) optionals; + inherit (pkgs.stdenv) isDarwin isLinux; + + linuxDeps = optionals isLinux [inotify-tools]; + darwinDeps = + optionals isDarwin [terminal-notifier] + ++ (with pkgs.darwin.apple_sdk.frameworks; + optionals isDarwin [ + CoreFoundation + CoreServices + ]); + in { + devShells = { + default = pkgs.mkShell { + packages = with pkgs; + [ + beam.packages.erlang_25.elixir_1_15 + ] + ++ linuxDeps + ++ darwinDeps; + shellHook = '' + # this allows mix to work on the local directory + mkdir -p .mix .hex + export MIX_HOME=$PWD/.mix + export HEX_HOME=$PWD/.hex + # make hex from Nixpkgs available + export PATH=$MIX_HOME/bin:$HEX_HOME/bin:$PATH + export LANG=C.UTF-8 + # keep your shell history in iex + export ERL_AFLAGS="-kernel shell_history enabled" + ''; + }; + }; + }); +} diff --git a/lib/tqdm.ex b/lib/tqdm.ex index 82f2941..f701aa1 100644 --- a/lib/tqdm.ex +++ b/lib/tqdm.ex @@ -27,13 +27,13 @@ defmodule Tqdm do """ @type option :: - {:description, String.t} | - {:total, non_neg_integer} | - {:clear, boolean} | - {:device, IO.device} | - {:min_interval, non_neg_integer} | - {:min_iterations, non_neg_integer} | - {:total_segments, non_neg_integer} + {:description, String.t()} + | {:total, non_neg_integer} + | {:clear, boolean} + | {:device, IO.device()} + | {:min_interval, non_neg_integer} + | {:min_iterations, non_neg_integer} + | {:total_segments, non_neg_integer} @type options :: [option] @@ -77,7 +77,7 @@ defmodule Tqdm do segments. You can customize this by passing a different value for this option. """ - @spec tqdm(Enumerable.t, options) :: Enumerable.t + @spec tqdm(Enumerable.t(), options) :: Enumerable.t() def tqdm(enumerable, options \\ []) do start_fun = fn -> now = System.monotonic_time() @@ -97,7 +97,7 @@ defmodule Tqdm do min_interval: options |> Keyword.get(:min_interval, 100) - |> System.convert_time_unit(:milliseconds, :native), + |> System.convert_time_unit(:millisecond, :native), min_iterations: Keyword.get(options, :min_iterations, 1), total_segments: Keyword.get(options, :total_segments, 10) } @@ -114,10 +114,11 @@ defmodule Tqdm do end defp do_tqdm( - element, - %{n: n, last_print_n: last_print_n, min_iterations: min_iterations} = state - ) when n - last_print_n < min_iterations, - do: {[element], %{state | n: n + 1}} + element, + %{n: n, last_print_n: last_print_n, min_iterations: min_iterations} = state + ) + when n - last_print_n < min_iterations, + do: {[element], %{state | n: n + 1}} defp do_tqdm(element, state) do now = System.monotonic_time() @@ -168,7 +169,7 @@ defmodule Tqdm do defp format_status(state, now) do elapsed = - System.convert_time_unit(now - state.start_time, :native, :microseconds) + System.convert_time_unit(now - state.start_time, :native, :microsecond) elapsed_str = format_interval(elapsed, false) @@ -194,7 +195,7 @@ defmodule Tqdm do left = format_left(n, elapsed, total) "|#{bar}| #{n}/#{total} #{percentage} " <> - "[elapsed: #{elapsed_str} left: #{left}, #{rate} iters/sec]" + "[elapsed: #{elapsed_str} left: #{left}, #{rate} iters/sec]" else "#{n} [elapsed: #{elapsed_str}, #{rate} iters/sec]" end @@ -202,16 +203,18 @@ defmodule Tqdm do defp format_rate(elapsed, n) when elapsed > 0, do: Float.round(n / (elapsed / 1_000_000), 2) + defp format_rate(_elapsed, _n), do: "?" defp format_bar(num_segments, total_segments) do String.duplicate("#", num_segments) <> - String.duplicate("-", total_segments - num_segments) + String.duplicate("-", total_segments - num_segments) end defp format_left(n, elapsed, total) when n > 0, do: format_interval(elapsed / n * (total - n), true) + defp format_left(_n, _elapsed, _total), do: "?" @@ -233,6 +236,7 @@ defmodule Tqdm do defp format_time_component(time) when time < 10, do: "0#{time}" + defp format_time_component(time), do: to_string(time) end diff --git a/mix.exs b/mix.exs index ce10cea..17d1504 100644 --- a/mix.exs +++ b/mix.exs @@ -1,15 +1,15 @@ defmodule Tqdm.Mixfile do use Mix.Project - @version "0.0.3" + @version "0.0.4" def project do [ app: :tqdm, version: @version, - elixir: "~> 1.3", - build_embedded: Mix.env == :prod, - start_permanent: Mix.env == :prod, + elixir: "~> 1.15", + build_embedded: Mix.env() == :prod, + start_permanent: Mix.env() == :prod, deps: deps(), description: description(), package: package(), @@ -20,17 +20,22 @@ defmodule Tqdm.Mixfile do source_ref: "v#{@version}" ], test_coverage: [tool: ExCoveralls], - preferred_cli_env: ["coveralls": :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test], + preferred_cli_env: [ + coveralls: :test, + "coveralls.detail": :test, + "coveralls.post": :test, + "coveralls.html": :test + ] ] end defp deps do [ - {:credo, "~> 0.3", only: [:dev, :test]}, - {:dialyxir, "~> 0.3", only: [:dev, :test]}, - {:earmark, "~> 1.2", only: :dev}, - {:ex_doc, "~> 0.18", only: :dev}, - {:excoveralls, "~> 0.4", only: :test}, + {:credo, ">= 0.0.0", only: [:test, :dev], runtime: false}, + {:dialyxir, ">= 0.0.0", only: [:test, :dev], runtime: false}, + {:ex_doc, ">= 0.0.0", only: :dev, runtime: false}, + {:earmark, "~> 1.4", only: :dev}, + {:excoveralls, "~> 0.5", only: :test}, {:inch_ex, ">= 0.0.0", only: :docs} ] end diff --git a/mix.lock b/mix.lock index c3819d4..9960274 100644 --- a/mix.lock +++ b/mix.lock @@ -1,17 +1,19 @@ -%{"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm"}, - "certifi": {:hex, :certifi, "2.0.0", "a0c0e475107135f76b8c1d5bc7efb33cd3815cb3cf3dea7aefdd174dabead064", [:rebar3], [], "hexpm"}, - "credo": {:hex, :credo, "0.8.10", "261862bb7363247762e1063713bb85df2bbd84af8d8610d1272cd9c1943bba63", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}], "hexpm"}, - "dialyxir": {:hex, :dialyxir, "0.5.1", "b331b091720fd93e878137add264bac4f644e1ddae07a70bf7062c7862c4b952", [:mix], [], "hexpm"}, - "earmark": {:hex, :earmark, "1.2.4", "99b637c62a4d65a20a9fb674b8cffb8baa771c04605a80c911c4418c69b75439", [:mix], [], "hexpm"}, - "ex_doc": {:hex, :ex_doc, "0.18.1", "37c69d2ef62f24928c1f4fdc7c724ea04aecfdf500c4329185f8e3649c915baf", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, repo: "hexpm", optional: false]}], "hexpm"}, - "excoveralls": {:hex, :excoveralls, "0.8.0", "99d2691d3edf8612f128be3f9869c4d44b91c67cec92186ce49470ae7a7404cf", [:mix], [{:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: false]}, {:hackney, ">= 0.12.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"}, - "exjsx": {:hex, :exjsx, "4.0.0", "60548841e0212df401e38e63c0078ec57b33e7ea49b032c796ccad8cde794b5c", [:mix], [{:jsx, "~> 2.8.0", [hex: :jsx, repo: "hexpm", optional: false]}], "hexpm"}, - "hackney": {:hex, :hackney, "1.10.1", "c38d0ca52ea80254936a32c45bb7eb414e7a96a521b4ce76d00a69753b157f21", [:rebar3], [{:certifi, "2.0.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "5.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, - "idna": {:hex, :idna, "5.1.0", "d72b4effeb324ad5da3cab1767cb16b17939004e789d8c0ad5b70f3cea20c89a", [:rebar3], [{:unicode_util_compat, "0.3.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, - "inch_ex": {:hex, :inch_ex, "0.5.6", "418357418a553baa6d04eccd1b44171936817db61f4c0840112b420b8e378e67", [:mix], [{:poison, "~> 1.5 or ~> 2.0 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm"}, - "jsx": {:hex, :jsx, "2.8.3", "a05252d381885240744d955fbe3cf810504eb2567164824e19303ea59eef62cf", [:mix, :rebar3], [], "hexpm"}, - "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, - "mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm"}, - "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm"}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], [], "hexpm"}, - "unicode_util_compat": {:hex, :unicode_util_compat, "0.3.1", "a1f612a7b512638634a603c8f401892afbf99b8ce93a45041f8aaca99cadb85e", [:rebar3], [], "hexpm"}} +%{ + "bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"}, + "certifi": {:hex, :certifi, "2.0.0", "a0c0e475107135f76b8c1d5bc7efb33cd3815cb3cf3dea7aefdd174dabead064", [:rebar3], [], "hexpm", "fdc6066ceeccb3aa14049ab6edf0b9af3b64ae1b0db2a92d5c52146f373bbb1c"}, + "credo": {:hex, :credo, "0.8.10", "261862bb7363247762e1063713bb85df2bbd84af8d8610d1272cd9c1943bba63", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}], "hexpm", "f3fe29f8de6be431c7736a933a3897fe9aa45533b1d1358b3691ac8ec4371e8f"}, + "dialyxir": {:hex, :dialyxir, "0.5.1", "b331b091720fd93e878137add264bac4f644e1ddae07a70bf7062c7862c4b952", [:mix], [], "hexpm", "6c32a70ed5d452c6650916555b1f96c79af5fc4bf286997f8b15f213de786f73"}, + "earmark": {:hex, :earmark, "1.4.47", "7e7596b84fe4ebeb8751e14cbaeaf4d7a0237708f2ce43630cfd9065551f94ca", [:mix], [], "hexpm", "3e96bebea2c2d95f3b346a7ff22285bc68a99fbabdad9b655aa9c6be06c698f8"}, + "ex_doc": {:hex, :ex_doc, "0.18.1", "37c69d2ef62f24928c1f4fdc7c724ea04aecfdf500c4329185f8e3649c915baf", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, repo: "hexpm", optional: false]}], "hexpm", "f050061c87ad39478c942995b5a20c40f2c0bc06525404613b8b0474cb8bd796"}, + "excoveralls": {:hex, :excoveralls, "0.8.0", "99d2691d3edf8612f128be3f9869c4d44b91c67cec92186ce49470ae7a7404cf", [:mix], [{:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: false]}, {:hackney, ">= 0.12.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "74bdeec4a69d4b41f2099c73e25d3b210685702ed52ccc31df66a3597ebe6675"}, + "exjsx": {:hex, :exjsx, "4.0.0", "60548841e0212df401e38e63c0078ec57b33e7ea49b032c796ccad8cde794b5c", [:mix], [{:jsx, "~> 2.8.0", [hex: :jsx, repo: "hexpm", optional: false]}], "hexpm", "32e95820a97cffea67830e91514a2ad53b888850442d6d395f53a1ac60c82e07"}, + "hackney": {:hex, :hackney, "1.10.1", "c38d0ca52ea80254936a32c45bb7eb414e7a96a521b4ce76d00a69753b157f21", [:rebar3], [{:certifi, "2.0.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "5.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "6b1980a33628824ec829239b6f9bfc455f60eebc19d3096a215f5f6170d675cf"}, + "idna": {:hex, :idna, "5.1.0", "d72b4effeb324ad5da3cab1767cb16b17939004e789d8c0ad5b70f3cea20c89a", [:rebar3], [{:unicode_util_compat, "0.3.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "fc1a2f7340c422650504b1662f28fdf381f34cbd30664e8491744e52c9511d40"}, + "inch_ex": {:hex, :inch_ex, "0.5.6", "418357418a553baa6d04eccd1b44171936817db61f4c0840112b420b8e378e67", [:mix], [{:poison, "~> 1.5 or ~> 2.0 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm", "7123ca0450686a61416a06cd38e26af18fd0f8c1cff5214770a957c6e0724338"}, + "jsx": {:hex, :jsx, "2.8.3", "a05252d381885240744d955fbe3cf810504eb2567164824e19303ea59eef62cf", [:mix, :rebar3], [], "hexpm", "fc3499fed7a726995aa659143a248534adc754ebd16ccd437cd93b649a95091f"}, + "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, + "mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm", "7a4c8e1115a2732a67d7624e28cf6c9f30c66711a9e92928e745c255887ba465"}, + "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm", "fec8660eb7733ee4117b85f55799fd3833eb769a6df71ccf8903e8dc5447cfce"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], [], "hexpm", "4f8805eb5c8a939cf2359367cb651a3180b27dfb48444846be2613d79355d65e"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.3.1", "a1f612a7b512638634a603c8f401892afbf99b8ce93a45041f8aaca99cadb85e", [:rebar3], [], "hexpm", "da1d9bef8a092cc7e1e51f1298037a5ddfb0f657fe862dfe7ba4c5807b551c29"}, +}