diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c9606c09c..4fcd24504 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: matrix: include: - otp_version: 25.3 - elixir_version: 1.14 + elixir_version: 1.15 - otp_version: "27.2" elixir_version: 1.18 diff --git a/CHANGELOG.md b/CHANGELOG.md index f24dd05bd..3a23967f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,33 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [v0.12.0] - 2026-07-05 + ### Updated - * Updated `Decimal` dependency requirement to mitigate [CVE-2026-32686](https://www.cve.org/CVERecord?id=CVE-2026-32686) DoS. Versions [2.4.0](https://github.com/ericmj/decimal/blob/main/CHANGELOG.md#v240-2026-05-07) and [3.1.0](https://github.com/ericmj/decimal/blob/main/CHANGELOG.md#v310-2026-05-08) both contain the fix. +- Updated `Decimal` dependency requirement to `~> 3.1` to mitigate [CVE-2026-32686](https://www.cve.org/CVERecord?id=CVE-2026-32686) DoS. +- Updated `Rustler` dependency requirement to `~> 0.38` to mitigate `Req` and `Mint` vulnerabilities: + - [EEF-CVE-2026-49753](https://osv.dev/vulnerability/EEF-CVE-2026-49753) + - [EEF-CVE-2026-48861](https://osv.dev/vulnerability/EEF-CVE-2026-48861) + - [EEF-CVE-2026-48862](https://osv.dev/vulnerability/EEF-CVE-2026-48862) + - [EEF-CVE-2026-49754](https://osv.dev/vulnerability/EEF-CVE-2026-49754) + - [EEF-CVE-2026-49756](https://osv.dev/vulnerability/EEF-CVE-2026-49756) + - [EEF-CVE-2026-49755](https://osv.dev/vulnerability/EEF-CVE-2026-49755) ### Backwards incompatible changes - * Support for transparent transfers with `FLAME` is removed, instead use `load_ipc`/`dump_ipc` to explicitly transfer dataframe across nodes - * Support for the `FSS` library is deprecated, instead pass `s3://` URLs with credentials +- Support for transparent transfers with `FLAME` is removed, instead use `load_ipc`/`dump_ipc` to explicitly transfer dataframe across nodes +- Support for the `FSS` library is deprecated, instead pass `s3://` URLs with credentials ## [v0.11.1] - 2025-08-17 ### Added - * `Explorer.DataFrame.dump_ipc_schema` - * `Explorer.DataFrame.dump_ipc_record_batch` - * `Explorer.Series.cumulative_count` - * `:stable` option for `Explorer.DataFrame.group_by` +- `Explorer.DataFrame.dump_ipc_schema` +- `Explorer.DataFrame.dump_ipc_record_batch` +- `Explorer.Series.cumulative_count` +- `:stable` option for `Explorer.DataFrame.group_by` ### Fixed - * Fix printing lazy data frame with new default print options (as of v0.11.0) - * Remove print from dataframe test - * Fix mutate docs formatting +- Fix printing lazy data frame with new default print options (as of v0.11.0) +- Remove print from dataframe test +- Fix mutate docs formatting ### New Contributors - * @WolfDan made their first contribution in https://github.com/elixir-explorer/explorer/pull/1103 +- @WolfDan made their first contribution in https://github.com/elixir-explorer/explorer/pull/1103 ### Full Changelog @@ -43,51 +52,51 @@ https://github.com/elixir-explorer/explorer/compare/v0.11.0...v0.11.1 ### Added - - `Explorer.DataFrame.estimated_size/1` - Estimates memory size of a DataFrame - - `Explorer.DataFrame.to_table_string/2` - Represents a DataFrame as a string - for printing - - `Explorer.Series.degrees/1` - Converts radians to degrees - - `Explorer.Series.radians/1` - Converts degrees to radians - - `:quote_style` option to CSV functions +- `Explorer.DataFrame.estimated_size/1` - Estimates memory size of a DataFrame +- `Explorer.DataFrame.to_table_string/2` - Represents a DataFrame as a string + for printing +- `Explorer.Series.degrees/1` - Converts radians to degrees +- `Explorer.Series.radians/1` - Converts degrees to radians +- `:quote_style` option to CSV functions ### Fixed - - Fix bug where `:region` was incorrectly required in `%FSS.S3.Entry{}` - - Fix trigonometric functions to not raise on f32 - - Fix warning from `:table_rex` dependency when printing - - Fix formatting of `Explorer.DataFrame.mutate_with/2` options - - `Explorer.Series.fill_missing/2` now works for all integer and float dtypes - - `Explorer.Series.frequencies/1` now works for `{:list, _}` dtype - - Fix inefficiency with categorization - - Fix typespecs - * `Explorer.DataFrame.select/2` - * `Explorer.DataFrame.ungroup/1` - * `Explorer.Series` functions that may return lazy series +- Fix bug where `:region` was incorrectly required in `%FSS.S3.Entry{}` +- Fix trigonometric functions to not raise on f32 +- Fix warning from `:table_rex` dependency when printing +- Fix formatting of `Explorer.DataFrame.mutate_with/2` options +- `Explorer.Series.fill_missing/2` now works for all integer and float dtypes +- `Explorer.Series.frequencies/1` now works for `{:list, _}` dtype +- Fix inefficiency with categorization +- Fix typespecs + - `Explorer.DataFrame.select/2` + - `Explorer.DataFrame.ungroup/1` + - `Explorer.Series` functions that may return lazy series ### Changed - - Printing a DataFrame looks different - * Adds a row of `…` to indicate there are hidden rows. Includes a new option - `limit_dots: :bottom | :split` to specify how to do this. - * Drops the row separators except when composite dtypes are present. - * Allows you to pass through valid options to `TableRex.render!/2`. This - gives you a little more flexibility in case you don't like the defaults. - - `Explorer.DataFrame.print/1` now documents its default `:limit` of 5 rows - - `Explorer.DataFrame.concat_rows/1` has improved error messages - - Accessing a DataFrame with a range now raises if the range is out of bounds +- Printing a DataFrame looks different + - Adds a row of `…` to indicate there are hidden rows. Includes a new option + `limit_dots: :bottom | :split` to specify how to do this. + - Drops the row separators except when composite dtypes are present. + - Allows you to pass through valid options to `TableRex.render!/2`. This + gives you a little more flexibility in case you don't like the defaults. +- `Explorer.DataFrame.print/1` now documents its default `:limit` of 5 rows +- `Explorer.DataFrame.concat_rows/1` has improved error messages +- Accessing a DataFrame with a range now raises if the range is out of bounds ### New Contributors - - @szajbus made their first contribution in - https://github.com/elixir-explorer/explorer/pull/1030 - - @viniciussbs made their first contribution in - https://github.com/elixir-explorer/explorer/pull/1037 - - @pejrich made their first contribution in - https://github.com/elixir-explorer/explorer/pull/1040 - - @jdbarillas made their first contribution in - https://github.com/elixir-explorer/explorer/pull/1049 - - @petrkozorezov made their first contribution in - https://github.com/elixir-explorer/explorer/pull/1083 +- @szajbus made their first contribution in + https://github.com/elixir-explorer/explorer/pull/1030 +- @viniciussbs made their first contribution in + https://github.com/elixir-explorer/explorer/pull/1037 +- @pejrich made their first contribution in + https://github.com/elixir-explorer/explorer/pull/1040 +- @jdbarillas made their first contribution in + https://github.com/elixir-explorer/explorer/pull/1049 +- @petrkozorezov made their first contribution in + https://github.com/elixir-explorer/explorer/pull/1083 ### Full Changelog @@ -97,7 +106,7 @@ https://github.com/elixir-explorer/explorer/compare/v0.10.1...v0.11.0 ### Fixed -- Fix creation of series of `{:list, {:decimal, ...}}` containing empty lists. +- Fix creation of series of `{:list, {:decimal, ...}}` containing empty lists. - Use `i128` for `:coef` field in the Rust code. @@ -151,10 +160,10 @@ https://github.com/elixir-explorer/explorer/compare/v0.10.1...v0.11.0 The affected functions are: - * `Explorer.DataFrame.filter_with/2` - * `Explorer.DataFrame.mutate_with/2` - * `Explorer.DataFrame.sort_with/2` - * `Explorer.DataFrame.summarise_with/2` + - `Explorer.DataFrame.filter_with/2` + - `Explorer.DataFrame.mutate_with/2` + - `Explorer.DataFrame.sort_with/2` + - `Explorer.DataFrame.summarise_with/2` - Allow accessing the dataframe inside query. @@ -311,7 +320,7 @@ https://github.com/elixir-explorer/explorer/compare/v0.10.1...v0.11.0 - Add functions to work with strings and regexes. - Some of the functions have the prefix "re_", because they accept a string that + Some of the functions have the prefix "re\_", because they accept a string that represents a regular expression. There is an important detail: we do not accept Elixir regexes, because we cannot @@ -461,6 +470,7 @@ https://github.com/elixir-explorer/explorer/compare/v0.10.1...v0.11.0 - Add support for more integer dtypes. This change introduces new signed and unsigned integer dtypes: + - `{:s, 8}`, `{:s, 16}`, `{:s, 32}` - `{:u, 8}`, `{:u, 16}`, `{:u, 32}`, `{:u, 64}`. @@ -611,16 +621,16 @@ https://github.com/elixir-explorer/explorer/compare/v0.10.1...v0.11.0 The following operations are possible now: - * `date - date` - * `date + duration` - * `date - duration` - * `duration + date` - * `duration * integer` - * `duration * float` - * `duration / integer` - * `duration / float` - * `integer * duration` - * `float * duration` + - `date - date` + - `date + duration` + - `date - duration` + - `duration + date` + - `duration * integer` + - `duration * float` + - `duration / integer` + - `duration / float` + - `integer * duration` + - `float * duration` - Support lazy dataframes on `Explorer.DataFrame.print/2`. @@ -708,10 +718,12 @@ https://github.com/elixir-explorer/explorer/compare/v0.10.1...v0.11.0 and helped to build this feature! - Add the following functions to `Explorer.Series`: + - [`window_median/3`](https://hexdocs.pm/explorer/Explorer.Series.html#window_median/3) - [`substring/3`](https://hexdocs.pm/explorer/Explorer.Series.html#substring/3) - Add duration dtypes. This is adds the following dtypes: + - `{:duration, :nanosecond}` - `{:duration, :microsecond}` - `{:duration, :millisecond}` @@ -739,11 +751,13 @@ https://github.com/elixir-explorer/explorer/compare/v0.10.1...v0.11.0 - Change `:datetime` dtype to be `{:datetime, time_unit}`, where time unit can be the following: + - `:millisecond` - `:microsecond` - `:nanosecond` - Rename the following `Series` functions: + - `trim/1` to `strip/2` - `trim_leading/1` to `lstrip/2` - `trim_trailing/1` to `rstrip/2` @@ -810,7 +824,6 @@ https://github.com/elixir-explorer/explorer/compare/v0.10.1...v0.11.0 - Fix the `:infer_schema_length` option of `Explorer.DataFrame.from_csv/2` when passing `nil`. Now it's possible to take into account the entire file to infer the schema. - ### Deprecated - Deprecate `Explorer.Series.to_date/1` and `Explorer.Series.to_time/1` in favor of @@ -1004,6 +1017,7 @@ https://github.com/elixir-explorer/explorer/compare/v0.10.1...v0.11.0 - Add `Series.day_of_week/1`. - Allow `Series.fill_missing/2` to: + - receive `:infinity` and `:neg_infinity` values. - receive date and datetime values. - receive binary values. @@ -1018,6 +1032,7 @@ https://github.com/elixir-explorer/explorer/compare/v0.10.1...v0.11.0 - Add support for Nx's serialize and deserialize. - Add the following function implementations for the Polars' Lazy dataframe backend: + - `arrange_with` - `concat_columns` - `concat_rows` @@ -1118,6 +1133,7 @@ https://github.com/elixir-explorer/explorer/compare/v0.10.1...v0.11.0 are implemented as macros. The following new macros were added: + - `filter/2` - `mutate/2` - `summarise/2` @@ -1205,7 +1221,7 @@ https://github.com/elixir-explorer/explorer/compare/v0.10.1...v0.11.0 - Add compression as an option to write parquet files. - Add count metadata to `DataFrame` table reader. - Add `DataFrame.filter_with/2`, `DataFrame.summarise_with/2`, `DataFrame.mutate_with/2` and -`DataFrame.arrange_with/2`. They all accept a `DataFrame` and a function, and they all work with + `DataFrame.arrange_with/2`. They all accept a `DataFrame` and a function, and they all work with a new concept called "lazy series". Lazy Series is an opaque representation of a series that can be @@ -1218,12 +1234,12 @@ https://github.com/elixir-explorer/explorer/compare/v0.10.1...v0.11.0 - Bump version requirement of the `table` dependency to `~> 0.1.2`, and raise for non-tabular values. - Normalize how columns are handled. This changes some functions to accept one column or -a list of columns, ranges, indexes and callbacks selecting columns. + a list of columns, ranges, indexes and callbacks selecting columns. - Rename `DataFrame.filter/2` to `DataFrame.mask/2`. - Rename `Series.filter/2` to `Series.mask/2`. - Rename `take/2` from both `Series` and `DataFrame` to `slice/2`. `slice/2` now they accept ranges as well. - Raise an error if `DataFrame.pivot_wider/4` has float columns as IDs. This is because we can´t -properly compare floats. + properly compare floats. - Change `DataFrame.distinct/2` to accept columns as argument instead of receiving it as option. ### Fixed diff --git a/README.md b/README.md index 82376dc8f..df97aa112 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -


-[](https://hexdocs.pm/explorer)
+[](https://explorer.hexdocs.pm/)
[](https://hex.pm/packages/explorer)
@@ -66,7 +66,7 @@ Inside an Elixir script or [Livebook](https://livebook.dev):
```elixir
Mix.install([
- {:explorer, "~> 0.11.1"}
+ {:explorer, "~> 0.12.0"}
])
```
@@ -75,7 +75,7 @@ Or in the `mix.exs` file of your application:
```elixir
def deps do
[
- {:explorer, "~> 0.11.1"}
+ {:explorer, "~> 0.12.0"}
]
end
```
@@ -83,7 +83,7 @@ end
Explorer will download a precompiled version of its native code upon installation. You can force a local build by setting the environment variable `EXPLORER_BUILD=1` and including `:rustler` as a dependency:
```elixir
- {:explorer, "~> 0.11.1", system_env: %{"EXPLORER_BUILD" => "1"}},
+ {:explorer, "~> 0.12.0", system_env: %{"EXPLORER_BUILD" => "1"}},
{:rustler, ">= 0.0.0"}
```
@@ -306,4 +306,4 @@ of `ObjectStore` does not compile on it.
## Sponsors
-
+
diff --git a/sponsors/amplified.png b/images/amplified.png
similarity index 100%
rename from sponsors/amplified.png
rename to images/amplified.png
diff --git a/explorer-exdoc.png b/images/explorer-exdoc.png
similarity index 100%
rename from explorer-exdoc.png
rename to images/explorer-exdoc.png
diff --git a/explorer.png b/images/explorer.png
similarity index 100%
rename from explorer.png
rename to images/explorer.png
diff --git a/mix.exs b/mix.exs
index 5dec87917..d31683c92 100644
--- a/mix.exs
+++ b/mix.exs
@@ -13,17 +13,17 @@ defmodule Explorer.MixProject do
description:
"Series (one-dimensional) and dataframes (two-dimensional) for fast data exploration in Elixir",
version: @version,
- elixir: "~> 1.14",
+ elixir: "~> 1.15",
elixirc_paths: elixirc_paths(Mix.env()),
package: package(),
deps: deps(),
docs: docs(),
- preferred_cli_env: [ci: :test, "localstack.setup": :test],
aliases: [
"rust.lint": ["cmd cargo clippy --manifest-path=native/explorer/Cargo.toml -- -Dwarnings"],
"rust.fmt": ["cmd cargo fmt --manifest-path=native/explorer/Cargo.toml --all"],
"localstack.setup": ["cmd ./test/support/setup-localstack.sh"],
- ci: ["format", "rust.fmt", "rust.lint", "test"]
+ ci: ["format", "rust.fmt", "rust.lint", "test"],
+ docs: ["docs", ©_files/1]
]
]
end
@@ -35,6 +35,10 @@ defmodule Explorer.MixProject do
]
end
+ def cli do
+ [preferred_envs: [ci: :test, "localstack.setup": :test]]
+ end
+
defp elixirc_paths(:test), do: ~w(lib test/support)
defp elixirc_paths(_), do: ~w(lib)
@@ -44,12 +48,12 @@ defmodule Explorer.MixProject do
{:rustler_precompiled, "~> 0.7"},
{:table, "~> 0.1.2"},
{:table_rex, "~> 4.1"},
- {:decimal, "~> 2.4 or ~> 3.1"},
+ {:decimal, "~> 3.1"},
## Optional
- {:adbc, "~> 0.1", optional: true},
+ {:adbc, "~> 0.12", optional: true},
{:nx, "~> 0.4", optional: true},
- {:rustler, "~> 0.36.0", optional: not (@dev? or @force_build?)},
+ {:rustler, "~> 0.38", optional: not (@dev? or @force_build?)},
## Test
{:bypass, "~> 2.1", only: :test},
@@ -57,15 +61,15 @@ defmodule Explorer.MixProject do
{:tz, "~> 0.26", only: :test},
## Dev
- {:ex_doc, "~> 0.24", only: :dev},
- {:benchee, "~> 1.1", only: :dev}
+ {:ex_doc, "~> 0.40", only: :dev},
+ {:benchee, "~> 1.5", only: :dev}
]
end
defp docs do
[
- main: "Explorer",
- logo: "explorer-exdoc.png",
+ main: "readme",
+ logo: "images/explorer-exdoc.png",
source_ref: "v#{@version}",
source_url: @source_url,
groups_for_modules: [
@@ -104,11 +108,23 @@ defmodule Explorer.MixProject do
"Functions: Shape": &(&1[:type] == :shape),
"Functions: Window": &(&1[:type] == :window)
],
- extras: ["notebooks/exploring_explorer.livemd", "CHANGELOG.md"],
+ extras: ["README.md", "notebooks/exploring_explorer.livemd", "CHANGELOG.md"],
skip_undefined_reference_warnings_on: ["CHANGELOG.md"]
]
end
+ defp copy_files(_) do
+ # Set up directory structure
+ File.mkdir_p!("./doc/images")
+
+ # Copy over image files
+ "./images/"
+ |> File.ls!()
+ |> Enum.each(fn image_file ->
+ File.cp!("./images/#{image_file}", "./doc/images/#{image_file}")
+ end)
+ end
+
defp package do
[
files: [
@@ -119,14 +135,15 @@ defmodule Explorer.MixProject do
"mix.exs",
"CHANGELOG.md",
"README.md",
- "LICENSE"
+ "LICENSE",
+ "images"
],
licenses: ["MIT"],
links: %{
"GitHub" => @source_url,
"Changelog" => "#{@source_url}/blob/v#{@version}/CHANGELOG.md"
},
- maintainers: ["Christopher Grainger", "Philip Sampaio", "José Valim"]
+ maintainers: ["Christopher Grainger", "Philip Sampaio", "José Valim", "Alexander Koutmos"]
]
end
end
diff --git a/mix.lock b/mix.lock
index 08a7f867f..2c8b9053f 100644
--- a/mix.lock
+++ b/mix.lock
@@ -1,46 +1,47 @@
%{
- "adbc": {:hex, :adbc, "0.7.8", "b3161e0a746aec53479eb59fee8591ac177f15578fca2a5ab86ff897c34b2ec0", [:make, :mix], [{:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:cc_precompiler, "~> 0.1.8 or ~> 0.2", [hex: :cc_precompiler, repo: "hexpm", optional: false]}, {:decimal, "~> 2.1", [hex: :decimal, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.8", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "24a00725de5a543442036a15e9fc9313500305699da2c230ee14fd6e6d719f4a"},
+ "adbc": {:hex, :adbc, "0.12.1", "64f04b2d4787f30b2ce1b9c5ff2f7ee393e611fbb8a8829fab402b767c133fa5", [:make, :mix], [{:cc_precompiler, "~> 0.1.8 or ~> 0.2", [hex: :cc_precompiler, repo: "hexpm", optional: false]}, {:decimal, "~> 2.1 or ~> 3.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.9", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:fine, "~> 0.1.0", [hex: :fine, repo: "hexpm", optional: false]}, {:pythonx, "~> 0.4.0", [hex: :pythonx, repo: "hexpm", optional: true]}, {:table, "~> 0.1.2", [hex: :table, repo: "hexpm", optional: false]}], "hexpm", "99a4f46e8af1c9dfc94c804c9f1d9e6c1923845a90af089765ea278d876da904"},
"aws_signature": {:hex, :aws_signature, "0.3.2", "adf33bc4af00b2089b7708bf20e3246f09c639a905a619b3689f0a0a22c3ef8f", [:rebar3], [], "hexpm", "b0daf61feb4250a8ab0adea60db3e336af732ff71dd3fb22e45ae3dcbd071e44"},
- "benchee": {:hex, :benchee, "1.3.1", "c786e6a76321121a44229dde3988fc772bca73ea75170a73fd5f4ddf1af95ccf", [:mix], [{:deep_merge, "~> 1.0", [hex: :deep_merge, repo: "hexpm", optional: false]}, {:statistex, "~> 1.0", [hex: :statistex, repo: "hexpm", optional: false]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "76224c58ea1d0391c8309a8ecbfe27d71062878f59bd41a390266bf4ac1cc56d"},
+ "benchee": {:hex, :benchee, "1.5.1", "b95cbc36c4b98969a5c592a246e171041eb683c56bad1cb4f49a3b081ba66087", [:mix], [{:deep_merge, "~> 1.0", [hex: :deep_merge, repo: "hexpm", optional: false]}, {:statistex, "~> 1.1", [hex: :statistex, repo: "hexpm", optional: false]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "a539301f8dfd4efc5c5123bfb9d47ebde20092a863a5b5b16c2a60d2243dfce7"},
"bypass": {:hex, :bypass, "2.1.0", "909782781bf8e20ee86a9cabde36b259d44af8b9f38756173e8f5e2e1fabb9b1", [:mix], [{:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:ranch, "~> 1.3", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "d9b5df8fa5b7a6efa08384e9bbecfe4ce61c77d28a4282f79e02f1ef78d96b80"},
- "castore": {:hex, :castore, "1.0.12", "053f0e32700cbec356280c0e835df425a3be4bc1e0627b714330ad9d0f05497f", [:mix], [], "hexpm", "3dca286b2186055ba0c9449b4e95b97bf1b57b47c1f2644555879e659960c224"},
- "cc_precompiler": {:hex, :cc_precompiler, "0.1.10", "47c9c08d8869cf09b41da36538f62bc1abd3e19e41701c2cea2675b53c704258", [:mix], [{:elixir_make, "~> 0.7", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "f6e046254e53cd6b41c6bacd70ae728011aa82b2742a80d6e2214855c6e06b22"},
+ "castore": {:hex, :castore, "1.0.19", "6903cabdfd9d1af46454126e7c8385186659dd33ecfb74a885cae52221ad6109", [:mix], [], "hexpm", "3669e6cab13f54c2df26b3e6833745d647f35b6e30d8ddd5975df0d5c842ca98"},
+ "cc_precompiler": {:hex, :cc_precompiler, "0.1.11", "8c844d0b9fb98a3edea067f94f616b3f6b29b959b6b3bf25fee94ffe34364768", [:mix], [{:elixir_make, "~> 0.7", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "3427232caf0835f94680e5bcf082408a70b48ad68a5f5c0b02a3bea9f3a075b9"},
"complex": {:hex, :complex, "0.6.0", "b0130086a7a8c33574d293b2e0e250f4685580418eac52a5658a4bd148f3ccf1", [:mix], [], "hexpm", "0a5fa95580dcaf30fcd60fe1aaf24327c0fe401e98c24d892e172e79498269f9"},
"cowboy": {:hex, :cowboy, "2.10.0", "ff9ffeff91dae4ae270dd975642997afe2a1179d94b1887863e43f681a203e26", [:make, :rebar3], [{:cowlib, "2.12.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "3afdccb7183cc6f143cb14d3cf51fa00e53db9ec80cdcd525482f5e99bc41d6b"},
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
"cowlib": {:hex, :cowlib, "2.12.1", "a9fa9a625f1d2025fe6b462cb865881329b5caff8f1854d1cbc9f9533f00e1e1", [:make, :rebar3], [], "hexpm", "163b73f6367a7341b33c794c4e88e7dbfe6498ac42dcd69ef44c5bc5507c8db0"},
- "decimal": {:hex, :decimal, "2.4.1", "6c0fbede12fb122ba685e9ab41c6a40c129e322b3aa192f9e072e61f3a6ffaf2", [:mix], [], "hexpm", "7e618897933a8455f19a727d7c5e50a2c071a544b700e5e724298ecb4340187f"},
- "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"},
+ "decimal": {:hex, :decimal, "3.1.1", "430d87b04011ce6cbd4fd205be758311a81f87d552d40904abd00f015935b1d0", [:mix], [], "hexpm", "c5f25f2ced74a0587d03e6023f595db8e924c9d3922c8c8ffd9edfc4498cf1f6"},
+ "deep_merge": {:hex, :deep_merge, "1.0.2", "476aa7ea61c54de96220051b998d893869069094da65b96101aebf79416f8a1e", [:mix], [], "hexpm", "737a53cdc9758fedbb608bdc213969e65729466c4ef3cd8e8726d0335dff116c"},
"dll_loader_helper_beam": {:hex, :dll_loader_helper_beam, "1.2.2", "b86f97ec8fc64770c87468e41969eb309d87b29dd5a439b667e5954f85f8f65a", [:rebar3], [], "hexpm", "0e6119edde0ef5e42b4fe22d7dc71b7462e08573cee977c01a26ec5d9cd94a9a"},
- "earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"},
- "elixir_make": {:hex, :elixir_make, "0.9.0", "6484b3cd8c0cee58f09f05ecaf1a140a8c97670671a6a0e7ab4dc326c3109726", [:mix], [], "hexpm", "db23d4fd8b757462ad02f8aa73431a426fe6671c80b200d9710caf3d1dd0ffdb"},
- "ex_doc": {:hex, :ex_doc, "0.39.1", "e19d356a1ba1e8f8cfc79ce1c3f83884b6abfcb79329d435d4bbb3e97ccc286e", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "8abf0ed3e3ca87c0847dfc4168ceab5bedfe881692f1b7c45f4a11b232806865"},
+ "earmark_parser": {:hex, :earmark_parser, "1.4.45", "cba8369ab2a1342e419bc2760eec731b17be828941dcf494045d44766227e1d5", [:mix], [], "hexpm", "d3ec045bf122965db20c0bdb420e19ee1415843135327124918473feb4b328e8"},
+ "elixir_make": {:hex, :elixir_make, "0.10.0", "16577e2583a79bb79237bbff349619ef5d80afffc07eac6e4faf0d00e2ddaf7d", [:mix], [], "hexpm", "dc1f09fb7fa68866b886abd5f0f3c83553b1a19a52359a899e92af1bb3b31982"},
+ "ex_doc": {:hex, :ex_doc, "0.40.3", "4a972ffe64bc07dc605af487e98fc19b72a4185f55ca031b94c0552d6071c1d9", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "2756e357742fecd9749b489b85d67c9ce99c465f2e75728d9e6dc8d704b973de"},
"finch": {:hex, :finch, "0.19.0", "c644641491ea854fc5c1bbaef36bfc764e3f08e7185e1f084e35e0672241b76d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fc5324ce209125d1e2fa0fcd2634601c52a787aff1cd33ee833664a5af4ea2b6"},
+ "fine": {:hex, :fine, "0.1.6", "4bf7151493443c454aac9f2fa2f34f5fefd0346a83fb5586a016c4a135c63247", [:mix], [], "hexpm", "5638eb4495488e885ebec167fa57973e5c35e1a50c344eb7666c90ec1c4e3b12"},
"flame": {:hex, :flame, "0.5.2", "d46c4daa19b8921b71e0e57dc69edc01ce1311b1976c160192b05d4253b336e8", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: true]}, {:jason, ">= 0.0.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "82560ebef6ab3c277875493d0c93494740c930db0b1a3ff1a570eee9206cc6c0"},
"fss": {:hex, :fss, "0.1.1", "9db2344dbbb5d555ce442ac7c2f82dd975b605b50d169314a20f08ed21e08642", [:mix], [], "hexpm", "78ad5955c7919c3764065b21144913df7515d52e228c09427a004afe9c1a16b0"},
"hpax": {:hex, :hpax, "1.0.2", "762df951b0c399ff67cc57c3995ec3cf46d696e41f0bba17da0518d94acd4aac", [:mix], [], "hexpm", "2f09b4c1074e0abd846747329eaa26d535be0eb3d189fa69d812bfb8bfefd32f"},
- "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"},
- "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"},
+ "jason": {:hex, :jason, "1.4.5", "2e3a008590b0b8d7388c20293e9dcc9cf3e5d642fd2a114e4cbbb52e595d940a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "b0c823996102bcd0239b3c2444eb00409b72f6a140c1950bc8b457d836b30684"},
+ "makeup": {:hex, :makeup, "1.2.2", "882d46dc0905e9ff7abf2aab61a7e6b3dcc555533977d8a23b06019e6c89ac94", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "9a1a24e5b343b8ae16abea0822c10a6f75da27af7fa802ada5251f7579bfccfa"},
"makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [: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", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"},
- "makeup_erlang": {:hex, :makeup_erlang, "1.0.2", "03e1804074b3aa64d5fad7aa64601ed0fb395337b982d9bcf04029d68d51b6a7", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "af33ff7ef368d5893e4a267933e7744e46ce3cf1f61e2dccf53a111ed3aa3727"},
- "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"},
+ "makeup_erlang": {:hex, :makeup_erlang, "1.1.0", "835f7e60792e08824cda445639555d7bf1bbbddb1b60b306e33cb6f6db24dc74", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "1cd6780fb1dd1a03979abaed0fe82712b0625118fd5257d3ebbf73f960c73c3c"},
+ "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"},
"mint": {:hex, :mint, "1.6.2", "af6d97a4051eee4f05b5500671d47c3a67dac7386045d87a904126fd4bbcea2e", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "5ee441dffc1892f1ae59127f74afe8fd82fda6587794278d924e4d90ea3d63f9"},
"nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"},
"nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"},
"nx": {:hex, :nx, "0.9.2", "17563029c01bf749aad3c31234326d7665abd0acc33ee2acbe531a4759f29a8a", [:mix], [{:complex, "~> 0.5", [hex: :complex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "914d74741617d8103de8ab1f8c880353e555263e1c397b8a1109f79a3716557f"},
- "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"},
+ "plug": {:hex, :plug, "1.20.2", "adbee2441232412e37fbb357fd5e4cd533fdd253b29f2e1992262b0f1fb01462", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b16baf55877d60891002ffc1ce0b3ff7d6f30a38a23e02e4d4293c4ac266f136"},
"plug_cowboy": {:hex, :plug_cowboy, "2.6.1", "9a3bbfceeb65eff5f39dab529e5cd79137ac36e913c02067dba3963a26efe9b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "de36e1a21f451a18b790f37765db198075c25875c64834bcc82d90b309eb6613"},
- "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"},
+ "plug_crypto": {:hex, :plug_crypto, "2.1.1", "19bda8184399cb24afa10be734f84a16ea0a2bc65054e23a62bb10f06bc89491", [:mix], [], "hexpm", "6470bce6ffe41c8bd497612ffde1a7e4af67f36a15eea5f921af71cf3e11247c"},
"ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
"req": {:hex, :req, "0.5.8", "50d8d65279d6e343a5e46980ac2a70e97136182950833a1968b371e753f6a662", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "d7fc5898a566477e174f26887821a3c5082b243885520ee4b45555f5d53f40ef"},
- "rustler": {:hex, :rustler, "0.36.0", "1decf059c60ec75911241325517c391717a9ad07d43e9a5ffda9d5c9ddd12936", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}, {:toml, "~> 0.6", [hex: :toml, repo: "hexpm", optional: false]}], "hexpm", "03808c7d289da01da29d8d2fe19d07cae9f3d2f05ebaed87f0820a4dcfabe9d5"},
+ "rustler": {:hex, :rustler, "0.38.0", "7a8906998ff0d28e3021c0a73264abcda719bda344b2e58307c6805b0f87c9b4", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "704c03c1bf66be12b031c5a389347b91c81c5cb819a24b068b0de36fe4a5652a"},
"rustler_precompiled": {:hex, :rustler_precompiled, "0.8.2", "5f25cbe220a8fac3e7ad62e6f950fcdca5a5a5f8501835d2823e8c74bf4268d5", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "63d1bd5f8e23096d1ff851839923162096364bac8656a4a3c00d1fff8e83ee0a"},
- "statistex": {:hex, :statistex, "1.0.0", "f3dc93f3c0c6c92e5f291704cf62b99b553253d7969e9a5fa713e5481cd858a5", [:mix], [], "hexpm", "ff9d8bee7035028ab4742ff52fc80a2aa35cece833cf5319009b52f1b5a86c27"},
+ "statistex": {:hex, :statistex, "1.1.1", "73612aa7f79e53c30569be065fd121e380f1cf57bc4c2da5b41be9246da18df9", [:mix], [], "hexpm", "310c4b49b34adf683de3103639006bed233ab54c08a4add65a531448e653857c"},
"stream_data": {:hex, :stream_data, "1.1.2", "05499eaec0443349ff877aaabc6e194e82bda6799b9ce6aaa1aadac15a9fdb4d", [:mix], [], "hexpm", "129558d2c77cbc1eb2f4747acbbea79e181a5da51108457000020a906813a1a9"},
"table": {:hex, :table, "0.1.2", "87ad1125f5b70c5dea0307aa633194083eb5182ec537efc94e96af08937e14a8", [:mix], [], "hexpm", "7e99bc7efef806315c7e65640724bf165c3061cdc5d854060f74468367065029"},
"table_rex": {:hex, :table_rex, "4.1.0", "fbaa8b1ce154c9772012bf445bfb86b587430fb96f3b12022d3f35ee4a68c918", [:mix], [], "hexpm", "95932701df195d43bc2d1c6531178fc8338aa8f38c80f098504d529c43bc2601"},
- "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},
+ "telemetry": {:hex, :telemetry, "1.4.2", "a0cb522801dffb1c49fe6e30561badffc7b6d0e180db1300df759faa22062855", [:rebar3], [], "hexpm", "928f6495066506077862c0d1646609eed891a4326bee3126ba54b60af61febb1"},
"toml": {:hex, :toml, "0.7.0", "fbcd773caa937d0c7a02c301a1feea25612720ac3fa1ccb8bfd9d30d822911de", [:mix], [], "hexpm", "0690246a2478c1defd100b0c9b89b4ea280a22be9a7b313a8a058a2408a2fa70"},
"tz": {:hex, :tz, "0.28.1", "717f5ffddfd1e475e2a233e221dc0b4b76c35c4b3650b060c8e3ba29dd6632e9", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:mint, "~> 1.6", [hex: :mint, repo: "hexpm", optional: true]}], "hexpm", "bfdca1aa1902643c6c43b77c1fb0cb3d744fd2f09a8a98405468afdee0848c8a"},
}
diff --git a/test/support/generator.ex b/test/support/generator.ex
index 235baee09..e42356b7a 100644
--- a/test/support/generator.ex
+++ b/test/support/generator.ex
@@ -297,8 +297,8 @@ defmodule Explorer.Generator do
date: constant(:date),
datetime: tuple({constant(:datetime), time_unit(), constant("Etc/UTC")}),
decimal:
- bind(integer(0..37), fn scale ->
- bind(integer((scale + 1)..38), fn precision ->
+ bind(integer(0..16), fn scale ->
+ bind(integer((scale + 1)..16), fn precision ->
tuple({constant(:decimal), constant(precision), constant(scale)})
end)
end),