From 12b097744ab70b716dab1ab6888e18591735d5f7 Mon Sep 17 00:00:00 2001
From: "github-merge-queue[bot]"
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Cldr.LanguageTag
.
The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -261,54 +261,54 @@ a configuredExamples
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
-{:error,
- {Cldr.NoMatchingLocale,
- "No configured locale could be matched to \"xx,yy;q=0.3\""}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
+{:error,
+ {Cldr.NoMatchingLocale,
+ "No configured locale could be matched to \"xx,yy;q=0.3\""}}
-iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
@@ -369,95 +369,95 @@ with an error tuple for each invalid tag added at the end of the list.
Example
-iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
- ]}
+ transform: %{},
+ language_variants: []
+ }}
+ ]}
-iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
-{:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
+{:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
- ]}
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+ ]}
@@ -502,92 +502,92 @@ with an error tuple for each invalid tag added at the end of the list.
Example
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
-]
+ transform: %{},
+ language_variants: []
+ }}
+]
Plausible.Cldr.AcceptLanguage.parse! "invalid_tag"
** (Cldr.AcceptLanguageError) "Expected a BCP47 language tag. Could not parse the remaining "g" starting at position 11
(ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-]
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+]
diff --git a/Plausible.Cldr.Currency.html b/Plausible.Cldr.Currency.html
index 8e0f952ab..9c9ef91ae 100644
--- a/Plausible.Cldr.Currency.html
+++ b/Plausible.Cldr.Currency.html
@@ -419,11 +419,11 @@ The default is :all
. See FJD: %Cldr.Currency{
+ %{ FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -433,12 +433,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
- },
- SUR: %Cldr.Currency{
+ },
+ SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -448,7 +448,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -499,11 +499,11 @@ The default is :all
. See Example
MyApp.Cldr.Currency.currencies_for_locale!("en")
- => %{
FJD: %Cldr.Currency{
+ => %{FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -513,12 +513,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
-},
-SUR: %Cldr.Currency{
+},
+SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -528,7 +528,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -586,13 +586,13 @@ or a
Examples
-iex> Plausible.Cldr.Currency.currency_for_code("AUD")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("AUD")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -600,15 +600,15 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}}
+}}
-iex> Plausible.Cldr.Currency.currency_for_code("THB")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("THB")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -616,7 +616,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -675,12 +675,12 @@ or a
Examples
-iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -688,14 +688,14 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}
+}
-iex> Plausible.Cldr.Currency.currency_for_code!("THB")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("THB")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -703,7 +703,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -744,15 +744,15 @@ or a
Examples
-iex> {:ok, locale} = Plausible.Cldr.validate_locale("en")
+iex> {:ok, locale} = Plausible.Cldr.validate_locale("en")
iex> Plausible.Cldr.Currency.currency_from_locale locale
:USD
-iex> {:ok, locale} = Plausible.Cldr.validate_locale("en-AU")
+iex> {:ok, locale} = Plausible.Cldr.validate_locale("en-AU")
iex> Plausible.Cldr.Currency.currency_from_locale locale
:AUD
-iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
+iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
:GBP
@@ -796,14 +796,14 @@ or a
Example
-iex> MyApp.Cldr.Currency.currency_history_for_locale("en")
-{:ok,
- %{
- USD: %{from: ~D[1792-01-01], to: nil},
- USN: %{tender: false},
- USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
- }
-}
+iex> MyApp.Cldr.Currency.currency_history_for_locale("en")
+{:ok,
+ %{
+ USD: %{from: ~D[1792-01-01], to: nil},
+ USN: %{tender: false},
+ USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
+ }
+}
@@ -862,9 +862,9 @@ The default is :all
. See Example
-MyApp.Cldr.Currency.currency_strings("en")
-=> {:ok,
- %{
+MyApp.Cldr.Currency.currency_strings("en")
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -874,7 +874,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
@@ -933,8 +933,8 @@ The default is :all
. See Example
-MyApp.Cldr.Currency.currency_strings!("en")
-=> %{
+MyApp.Cldr.Currency.currency_strings!("en")
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -944,7 +944,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ }
@@ -982,10 +982,10 @@ or a
Example
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
:USD
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
:AUD
@@ -1033,7 +1033,7 @@ mapping is returned for that territory.Example
-iex> Plausible.Cldr.Currency.current_territory_currencies()
+iex> Plausible.Cldr.Currency.current_territory_currencies()
@@ -1125,11 +1125,11 @@ currency codeExamples
-iex> Plausible.Cldr.Currency.known_currency_code("AUD")
-{:ok, :AUD}
+iex> Plausible.Cldr.Currency.known_currency_code("AUD")
+{:ok, :AUD}
-iex> Plausible.Cldr.Currency.known_currency_code("GGG")
-{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
+iex> Plausible.Cldr.Currency.known_currency_code("GGG")
+{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
@@ -1176,13 +1176,13 @@ currency codeExamples
-iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
+iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
true
-iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
+iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
false
-iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
+iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
false
@@ -1217,7 +1217,7 @@ currency codeExample
-iex> Plausible.Cldr.Currency.known_currency_codes()
+iex> Plausible.Cldr.Currency.known_currency_codes()
@@ -1276,14 +1276,14 @@ such as 0.05
. Optional.Example
-iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
+{:ok,
+ %Cldr.Currency{
alt_code: :XAE,
cash_digits: 0,
cash_rounding: nil,
code: :XAE,
- count: %{other: "Custom Name"},
+ count: %{other: "Custom Name"},
digits: 0,
from: nil,
iso_digits: 0,
@@ -1293,11 +1293,11 @@ such as 0.05
. Optional.symbol
: "XAE",
tender: false,
to: nil
- }}
-iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
-{:error, "Required options are missing. Required options are [:name, :digits]"}
-iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
-{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
+ }}
+iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
+{:error, "Required options are missing. Required options are [:name, :digits]"}
+iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
+{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
@@ -1355,20 +1355,20 @@ default is Plaus
Examples
-iex> Plausible.Cldr.Currency.pluralize(1, :USD)
-{:ok, "US dollar"}
+iex> Plausible.Cldr.Currency.pluralize(1, :USD)
+{:ok, "US dollar"}
-iex> Plausible.Cldr.Currency.pluralize(3, :USD)
-{:ok, "US dollars"}
+iex> Plausible.Cldr.Currency.pluralize(3, :USD)
+{:ok, "US dollars"}
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
-{:ok, "美元"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
+{:ok, "美元"}
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
-{:ok, "dollars des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
+{:ok, "dollars des États-Unis"}
-iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
-{:ok, "dollar des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
+{:ok, "dollar des États-Unis"}
@@ -1410,8 +1410,8 @@ or a
Example
-iex> MyApp.Cldr.Currency.strings_for_currency :AUD,("en")
-["a$", "australian dollars", "aud", "australian dollar"]
+iex> MyApp.Cldr.Currency.strings_for_currency :AUD,("en")
+["a$", "australian dollars", "aud", "australian dollar"]
diff --git a/Plausible.Cldr.Locale.html b/Plausible.Cldr.Locale.html
index 7a954c981..2cf84f0be 100644
--- a/Plausible.Cldr.Locale.html
+++ b/Plausible.Cldr.Locale.html
@@ -326,16 +326,16 @@ this specific locale..Examples
-iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
-{:ok, [:"fr-CA", :fr, :und]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
+{:ok, [:"fr-CA", :fr, :und]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
-{:ok, [:nb, :no, :und]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
+{:ok, [:nb, :no, :und]}
@@ -389,20 +389,20 @@ this specific locale.Examples
-Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
-=> {:ok,
- [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
+=> {:ok,
+ [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-Plausible.Cldr.Locale.fallback_locales(:nb))
-=> {:ok,
- [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:nb))
+=> {:ok,
+ [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
@@ -533,15 +533,15 @@ generic top-level domain names.Examples
iex> Plausible.Cldr.Locale.locale_from_host "a.b.com.au"
-Elixir.Plausible.Cldr.validate_locale(:"en-AU")
+Elixir.Plausible.Cldr.validate_locale(:"en-AU")
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
@@ -683,12 +683,12 @@ be a territory.Examples
-iex> Cldr.Locale.territory_from_host("a.b.com.au")
-{:ok, :AU}
+iex> Cldr.Locale.territory_from_host("a.b.com.au")
+{:ok, :AU}
-iex> Cldr.Locale.territory_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Cldr.Locale.territory_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
diff --git a/Plausible.Cldr.Number.Cardinal.html b/Plausible.Cldr.Number.Cardinal.html
index 64bfdd913..010b9156f 100644
--- a/Plausible.Cldr.Number.Cardinal.html
+++ b/Plausible.Cldr.Number.Cardinal.html
@@ -461,31 +461,31 @@ The valid substitution keys are :zero
, Examples
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"few"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.Format.html b/Plausible.Cldr.Number.Format.html
index a5cfa99da..40e6b56ee 100644
--- a/Plausible.Cldr.Number.Format.html
+++ b/Plausible.Cldr.Number.Format.html
@@ -465,7 +465,7 @@ to precompile all the known formats at compile time.Example
#=> Plausible.Cldr.Number.Format.Format.decimal_format_list
-["#", "#,##,##0%",
+["#", "#,##,##0%",
"#,##,##0.###", "#,##,##0.00¤", "#,##,##0.00¤;(#,##,##0.00¤)",
"#,##,##0 %", "#,##0%", "#,##0.###", "#,##0.00 ¤",
"#,##0.00 ¤;(#,##0.00 ¤)", "#,##0.00¤", "#,##0.00¤;(#,##0.00¤)",
@@ -475,7 +475,7 @@ to precompile all the known formats at compile time."000 B ¤"
, "000 E ¤", "000 K ¤", "000 MRD ¤", "000 Md ¤", "000 Mio'.' ¤",
"000 Mio ¤", "000 Mld ¤", "000 Mln ¤", "000 Mn ¤", "000 Mrd'.' ¤",
"000 Mrd ¤", "000 Mr ¤", "000 M ¤", "000 NT ¤", "000 N ¤", "000 Tn ¤",
-"000 Tr ¤", ...]
+"000 Tr ¤", ...]
iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
-{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
+iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
+{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
"0 billion", "0 million", "0 thousand",
"0 trillion", "00 billion", "00 million", "00 thousand", "00 trillion",
"000 billion", "000 million", "000 thousand", "000 trillion", "000B", "000K",
@@ -532,7 +532,7 @@ the known formats at compile time. Its use is not otherwise recommended."¤#,##0.00", "¤#,##0.00;(¤#,##0.00)", "¤000B", "¤000K", "¤000M",
"¤000T", "¤00B", "¤00K", "¤00M", "¤00T", "¤0B", "¤0K", "¤0M", "¤0T",
"¤ #,##0.00", "¤ #,##0.00;(¤ #,##0.00)", "¤ 000B", "¤ 000K", "¤ 000M",
- "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
+ "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
-{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
+{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
-%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
+%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
percent: "#,##0 %",
scientific: "#E0",
standard: "#,##0.###"
- currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
- {"10000", [one: "00 k ¤", other: "00 k ¤"]},
- {"100000", [one: "000 k ¤", other: "000 k ¤"]},
- {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
- {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
- {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
- {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
- {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
- {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
- {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
- {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
- {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
+ currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
+ {"10000", [one: "00 k ¤", other: "00 k ¤"]},
+ {"100000", [one: "000 k ¤", other: "000 k ¤"]},
+ {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
+ {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
+ {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
+ {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
+ {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
+ {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
+ {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
+ {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
+ {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
...
}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
-{:ok, 1}
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
+{:ok, 1}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
1
:zero
, Examples
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.Symbol.html b/Plausible.Cldr.Number.Symbol.html
index 094fa4e41..c40e80f51 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -378,9 +378,9 @@ is Plausible.Cld
Example:
-iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
-{:ok, %{
- latn: %Cldr.Number.Symbol{
+iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
+{:ok, %{
+ latn: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -393,8 +393,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- },
- thai: %Cldr.Number.Symbol{
+ },
+ thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -407,8 +407,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- }
- }}
+ }
+ }}
diff --git a/Plausible.Cldr.Number.System.html b/Plausible.Cldr.Number.System.html
index c8017820c..20384f7d2 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -317,23 +317,23 @@ it is returned as is.Examples
iex> Plausible.Cldr.Number.System.number_system_for "th", :latn
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :default
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "he", :traditional
-{:ok, %{rules: "hebrew", type: :algorithmic}}
+{:ok, %{rules: "hebrew", type: :algorithmic}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :native
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :finance
-{
+{
:error,
- {Cldr.UnknownNumberSystemError,
- "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
-}
+ {Cldr.UnknownNumberSystemError,
+ "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
+}
@@ -424,10 +424,10 @@ or a Examples
iex> Plausible.Cldr.Number.System.number_system_names_for "en"
-{:ok, [:latn]}
+{:ok, [:latn]}
iex> Plausible.Cldr.Number.System.number_system_names_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
@@ -509,13 +509,13 @@ or a Examples
iex> Plausible.Cldr.Number.System.number_systems_for "en"
-{:ok, %{default: :latn, native: :latn}}
+{:ok, %{default: :latn, native: :latn}}
iex> Plausible.Cldr.Number.System.number_systems_for "th"
-{:ok, %{default: :latn, native: :thai}}
+{:ok, %{default: :latn, native: :thai}}
iex> Plausible.Cldr.Number.System.number_systems_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
@@ -614,20 +614,20 @@ actual system name.Examples
-ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
-{:ok, :latn}
+ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
-{
+iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
+{
:error,
- {Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
-}
Note that return value is not guaranteed to be a valid
+
{Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
+}
Note that return value is not guaranteed to be a valid
number system for the given locale as demonstrated in the third example.
@@ -674,16 +674,16 @@ is recommended.Examples
iex> Plausible.Cldr.Number.System.to_system 123456, :hebr
-{:ok, "קכ״ג׳תנ״ו"}
+{:ok, "קכ״ג׳תנ״ו"}
iex> Plausible.Cldr.Number.System.to_system 123, :hans
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hant
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hansfin
-{:ok, "壹佰贰拾叁"}
+{:ok, "壹佰贰拾叁"}
To configure these transliteration pairs, add the to the use Cldr
configuration
-in a backend module:
defmodule MyApp.Cldr do
+in a backend module:defmodule MyApp.Cldr do
use Cldr,
- locale: ["en", "fr", "th"],
+ locale: ["en", "fr", "th"],
default_locale: "en",
- precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
-end
Where each tuple in the list configures one transliteration map. In this example, two maps are
+
precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
+end
Where each tuple in the list configures one transliteration map. In this example, two maps are
configured: from :latn
to :thai
and from :arab
to :thai
.
A list of configurable number systems is returned by Cldr.Number.System.numeric_systems/0
.
If a transliteration is requested between two number pairs that have not been configured for precompilation, a warning is logged.
Examples
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
"123556"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
"123 556,000"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
"123556"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
"๑๒๓๕๕๖"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
"๑๒๓๕๕๖"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
"Some number is: ๑๒๓๕๕๖"
diff --git a/Plausible.Cldr.Number.html b/Plausible.Cldr.Number.html
index ec6c250ca..927c6314a 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -441,19 +441,19 @@ using the Elixir standard library functions.
Examples
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
-{:ok, 1000.34}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
+{:ok, 1000.34}
-iex> Plausible.Cldr.Number.parse("-1_000_000.34")
-{:ok, -1000000.34}
+iex> Plausible.Cldr.Number.parse("-1_000_000.34")
+{:ok, -1000000.34}
-iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
-{:ok, 1000}
+iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
+{:ok, 1000}
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
-{:error,
- {Cldr.Number.ParseError,
- "The string \"+1.000,34\" could not be parsed as a number"}}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
+{:error,
+ {Cldr.Number.ParseError,
+ "The string \"+1.000,34\" could not be parsed as a number"}}
@@ -525,17 +525,17 @@ financial instruments.
Examples
-iex> Plausible.Cldr.Number.scan("100 US dollars")
+iex> Plausible.Cldr.Number.scan("100 US dollars")
...> |> Plausible.Cldr.Number.resolve_currencies
-[100, :USD]
+[100, :USD]
-iex> Plausible.Cldr.Number.scan("100 eurosports")
-...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
-[100, :EUR]
+iex> Plausible.Cldr.Number.scan("100 eurosports")
+...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
+[100, :EUR]
-iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
-...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
-[100, :USD]
+iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
+...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
+[100, :USD]
@@ -612,19 +612,19 @@ financial instruments.Examples
-iex> Plausible.Cldr.Number.resolve_currency("US dollars")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("US dollars")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
-[:EUR]
+iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
+[:EUR]
-iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
-{:error,
- {Cldr.UnknownCurrencyError,
- "The currency \"not a known currency\" is unknown or not supported"}}
+iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
+{:error,
+ {Cldr.UnknownCurrencyError,
+ "The currency \"not a known currency\" is unknown or not supported"}}
@@ -688,13 +688,13 @@ The default is options[:backend].get_locale()
Examples
iex> Plausible.Cldr.Number.resolve_per "11%"
-["11", :percent]
+["11", :percent]
iex> Plausible.Cldr.Number.resolve_per "% of linguists"
-[:percent, " of linguists"]
+[:percent, " of linguists"]
iex> Plausible.Cldr.Number.resolve_per "% of linguists %"
-[:percent, " of linguists ", :percent]
+[:percent, " of linguists ", :percent]
@@ -751,9 +751,9 @@ The default is options[:backend].get_locale()
Examples
-iex> Plausible.Cldr.Number.scan("100%")
-...> |> Plausible.Cldr.Number.resolve_pers()
-[100, :percent]
+iex> Plausible.Cldr.Number.scan("100%")
+...> |> Plausible.Cldr.Number.resolve_pers()
+[100, :percent]
iex> Plausible.Cldr.Number.scan("£1_000_000.34")
-["£", 1000000.34]
+iex> Plausible.Cldr.Number.scan("£1_000_000.34")
+["£", 1000000.34]
-iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
-["I want £", 1000000, " dollars"]
+iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
+["I want £", 1000000, " dollars"]
-iex> Plausible.Cldr.Number.scan("The prize is 23")
-["The prize is ", 23]
+iex> Plausible.Cldr.Number.scan("The prize is 23")
+["The prize is ", 23]
-iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
-["The lottery number is ", 23, " for the next draw"]
+iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
+["The lottery number is ", 23, " for the next draw"]
-iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
-["The loss is ", -1000, " euros"]
+iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
+["The loss is ", -1000, " euros"]
iex> Plausible.Cldr.Number.to_approx_string 1234
-{:ok, "~1,234"}
+{:ok, "~1,234"}
iex> Plausible.Cldr.Number.to_at_least_string 1234
-{:ok, "1,234+"}
+{:ok, "1,234+"}
iex> Plausible.Cldr.Number.to_at_most_string 1234
-{:ok, "≤1,234"}
+{:ok, "≤1,234"}
iex> Plausible.Cldr.Number.to_range_string 1234..5678
-{:ok, "1,234–5,678"}
+{:ok, "1,234–5,678"}
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
...> string, :currency_symbol -> "<span class=\"symbol\">" <> string <> "</span>"
...> string, :number -> "<span class=\"number\">" <> string <> "</span>"
...> string, :currency_space -> "<span>" <> string <> "</span>"
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3
+
It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3
function if wrapping HTML tags since these will ensure HTML entities are
-correctly encoded. For example:
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
-...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
-...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
-...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
+correctly encoded. For example:iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
+...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
+...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
+...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include
+
...> end)
+{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include a currency symbol, a literal string, inserted text between a currency symbol and the currency amount, a percent sign, the number itself and several other elements. In some cases it is helpful to be apply specific formatting to each element. @@ -1168,80 +1168,80 @@ inserted in the final formatted number.
iex> Plausible.Cldr.Number.to_string 12345
-{:ok, "12,345"}
+{:ok, "12,345"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr"
-{:ok, "12 345"}
+{:ok, "12 345"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es", minimum_grouping_digits: 1
-{:ok, "1.345,32 €"}
+{:ok, "1.345,32 €"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es"
-{:ok, "1345,32 €"}
+{:ok, "1345,32 €"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr", currency: "USD"
-{:ok, "12 345,00 $US"}
+{:ok, "12 345,00 $US"}
iex> Plausible.Cldr.Number.to_string 12345, format: "#E0"
-{:ok, "1.2345E4"}
+{:ok, "1.2345E4"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB"
-{:ok, "THB 12,345.00"}
+{:ok, "THB 12,345.00"}
iex> Plausible.Cldr.Number.to_string -12345, format: :accounting, currency: "THB"
-{:ok, "(THB 12,345.00)"}
+{:ok, "(THB 12,345.00)"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th"
-{:ok, "฿12,345.00"}
+{:ok, "฿12,345.00"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th", number_system: :native
-{:ok, "฿๑๒,๓๔๕.๐๐"}
+{:ok, "฿๑๒,๓๔๕.๐๐"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long
-{:ok, "1 thousand"}
+{:ok, "1 thousand"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long, currency: "USD"
-{:ok, "1,244 US dollars"}
+{:ok, "1,244 US dollars"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short
-{:ok, "1K"}
+{:ok, "1K"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short, currency: "EUR"
-{:ok, "€1K"}
+{:ok, "€1K"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout
-{:ok, "one thousand two hundred thirty-four"}
+{:ok, "one thousand two hundred thirty-four"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout_verbose
-{:ok, "one thousand two hundred and thirty-four"}
+{:ok, "one thousand two hundred and thirty-four"}
iex> Plausible.Cldr.Number.to_string 1989, format: :spellout_year
-{:ok, "nineteen eighty-nine"}
+{:ok, "nineteen eighty-nine"}
iex> Plausible.Cldr.Number.to_string 123, format: :ordinal
-{:ok, "123rd"}
+{:ok, "123rd"}
iex> Plausible.Cldr.Number.to_string 123, format: :roman
-{:ok, "CXXIII"}
+{:ok, "CXXIII"}
iex> Plausible.Cldr.Number.to_string 123, locale: "th-u-nu-thai"
-{:ok, "๑๒๓"}
An error tuple {:error, reason}
will be returned if an error is detected.
-The two most likely causes of an error return are:
iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
- {:error, {Cldr.FormatCompileError,
- "Decimal format compiler: syntax error before: \"#\""}}
locale
and
+The two most likely causes of an error return are: iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
+ {:error, {Cldr.FormatCompileError,
+ "Decimal format compiler: syntax error before: \"#\""}}
locale
and
number_system
. This happens typically when the number system is
:algorithmic
rather than the more common :numeric
. In this case the error
-return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr", format: :percent)
- {:error, {Cldr.UnknownFormatError,
- "The locale :he with number system :hebr does not define a format :percent"}}
+return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr", format: :percent)
+ {:error, {Cldr.UnknownFormatError,
+ "The locale :he with number system :hebr does not define a format :percent"}}
iex> Plausible.Cldr.Number.validate_number_system "en", :latn
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :default
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :unknown
-{:error,
- {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
+{:error,
+ {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
iex> Plausible.Cldr.Number.validate_number_system "zz", :default
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
Functions to implement the number system rule-based-number-format rules of CLDR.
These rules are defined only on the "und" locale and represent specialised number formatting.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
+...> |> Enum.sort()
+[
:armenian_lower,
:armenian_upper,
:cyrillic_lower,
@@ -161,9 +161,9 @@ defined in the Unicode CLDR data repository. Available rules are identified by:
:roman_upper,
:tamil,
:zz_default
-]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
-"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :roman)
-{:ok, "CXXIII"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
+"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :roman)
+{:ok, "CXXIII"}
Functions to implement the ordinal rule-based-number-format rules of CLDR.
As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
-[:digits_ordinal]
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
+[:digits_ordinal]
-iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
-...> |> Enum.sort()
-[
+iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
+...> |> Enum.sort()
+[
:digits_ordinal,
:digits_ordinal_feminine,
:digits_ordinal_feminine_plural,
:digits_ordinal_masculine,
:digits_ordinal_masculine_plural
-]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
-"123rd"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
-{:ok, "123rd"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
+"123rd"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
+{:ok, "123rd"}
Functions to implement the spellout rule-based-number-format rules of CLDR.
As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
+...> |> Enum.sort()
+[
:spellout_cardinal,
:spellout_cardinal_verbose,
:spellout_numbering,
@@ -155,9 +155,9 @@ defined in the Unicode CLDR data repository. Available rules are identified by:
:spellout_numbering_year,
:spellout_ordinal,
:spellout_ordinal_verbose
-]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
-"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
-{:ok, "one hundred twenty-three"}
+]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
+"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
+{:ok, "one hundred twenty-three"}
iex> Plausible.Cldr.default_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.default_locale()
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}
+ transform: %{},
+ language_variants: []
+}
iex> Plausible.Cldr.default_territory()
+iex> Plausible.Cldr.default_territory()
:"001"
iex> Plausible.Cldr.ellipsis("And furthermore")
+iex> Plausible.Cldr.ellipsis("And furthermore")
"And furthermore…"
-iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja)
+iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja)
"And furthermore…there is much to be done"
-iex> Plausible.Cldr.ellipsis("And furthermore", format: :word)
+iex> Plausible.Cldr.ellipsis("And furthermore", format: :word)
"And furthermore …"
-iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja, format: :word)
+iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja, format: :word)
"And furthermore … there is much to be done"
@@ -715,23 +715,23 @@ take an optional locale parameter for which a locale is not supplied.
Example
-iex> Plausible.Cldr.put_locale("pl")
-iex> Plausible.Cldr.get_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.put_locale("pl")
+iex> Plausible.Cldr.get_locale()
+%Cldr.LanguageTag{
backend: Elixir.Plausible.Cldr,
canonical_locale_name: "pl",
cldr_locale_name: :pl,
- extensions: %{},
+ extensions: %{},
language: "pl",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :pl,
territory: :PL,
requested_locale_name: "pl",
script: :Latn,
- transform: %{},
- language_variants: []
- }
+ transform: %{},
+ language_variants: []
+ }
@@ -818,10 +818,10 @@ take an optional locale parameter for which a locale is not supplied.
Examples
-iex> Plausible.Cldr.known_gettext_locale_name("en")
+iex> Plausible.Cldr.known_gettext_locale_name("en")
"en"
-iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
+iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
false
@@ -864,10 +864,10 @@ name is configured and available in Gettext.Examples
-iex> Plausible.Cldr.known_gettext_locale_name?("en")
+iex> Plausible.Cldr.known_gettext_locale_name?("en")
true
-iex> Plausible.Cldr.known_gettext_locale_name?("!!")
+iex> Plausible.Cldr.known_gettext_locale_name?("!!")
false
@@ -941,10 +941,10 @@ to return the first known locale name from a list.Examples
-iex> Plausible.Cldr.known_locale_name(:"en-AU")
+iex> Plausible.Cldr.known_locale_name(:"en-AU")
:"en-AU"
-iex> Plausible.Cldr.known_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_locale_name(:"en-SA")
false
@@ -986,10 +986,10 @@ name is configured and available in Cldr.Examples
-iex> Plausible.Cldr.known_locale_name?(:en)
+iex> Plausible.Cldr.known_locale_name?(:en)
true
-iex> Plausible.Cldr.known_locale_name?(:"!!")
+iex> Plausible.Cldr.known_locale_name?(:"!!")
false
@@ -1043,8 +1043,8 @@ in this module or in
Example
-iex> Plausible.Cldr.known_number_system_types()
-[:default, :finance, :native, :traditional]
+iex> Plausible.Cldr.known_number_system_types()
+[:default, :finance, :native, :traditional]
@@ -1109,10 +1109,10 @@ and has RBNF rules defined.
Examples
-iex> Plausible.Cldr.known_rbnf_locale_name(:en)
+iex> Plausible.Cldr.known_rbnf_locale_name(:en)
:en
-iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
false
@@ -1155,10 +1155,10 @@ rules based number formats (RBNF).Examples
-iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
+iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
true
-iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
+iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
false
@@ -1294,18 +1294,18 @@ CLDR backend defined by the t:Cldr.LanguageTag
is se
Examples
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"en")
-{:ok, "en"}
+iex> Plausible.Cldr.put_gettext_locale(~l"en")
+{:ok, "en"}
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"de")
-{
+iex> Plausible.Cldr.put_gettext_locale(~l"de")
+{
:error,
- {
+ {
Cldr.UnknownLocaleError,
"Locale TestBackend.Cldr.Locale.new!(\"de-DE\") does not map to a known gettext locale name"
- }
-}
+ }
+}
@@ -1349,29 +1349,29 @@ of a language tag.
Examples
-iex> Plausible.Cldr.put_locale("en")
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.put_locale("en")
+{:ok,
+ %Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.put_locale("invalid-locale!")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
+iex> Plausible.Cldr.put_locale("invalid-locale!")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
@@ -1420,10 +1420,10 @@ The default is Examples
-iex> Plausible.Cldr.quote("Quoted String")
+iex> Plausible.Cldr.quote("Quoted String")
"“Quoted String”"
-iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
+iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
"「Quoted String」"
@@ -1554,47 +1554,47 @@ of a language tag.Examples
-iex> Plausible.Cldr.validate_locale(:en)
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale(:en)
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale("zzz")
-{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
+iex> Plausible.Cldr.validate_locale("zzz")
+{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
@@ -1664,23 +1664,23 @@ of a language tag.Examples
-iex> Plausible.Cldr.validate_number_system_type(:default)
-{:ok, :default}
+iex> Plausible.Cldr.validate_number_system_type(:default)
+{:ok, :default}
-iex> Plausible.Cldr.validate_number_system_type(:traditional)
-{:ok, :traditional}
+iex> Plausible.Cldr.validate_number_system_type(:traditional)
+{:ok, :traditional}
-iex> Plausible.Cldr.validate_number_system_type(:latn)
-{
+iex> Plausible.Cldr.validate_number_system_type(:latn)
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
+}
-iex> Plausible.Cldr.validate_number_system_type("bork")
-{
+iex> Plausible.Cldr.validate_number_system_type("bork")
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
+}
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index 0ad767388..b7dccec7a 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -879,23 +879,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index 226ad27a2..e295270af 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -1196,23 +1196,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Exports.html b/Plausible.Exports.html
index 2399fc4f9..2ca921380 100644
--- a/Plausible.Exports.html
+++ b/Plausible.Exports.html
@@ -381,7 +381,7 @@ tables into the format of imported_*
tables for a we
-Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
+Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
"plausible_io_20241231.zip"
@@ -404,10 +404,10 @@ tables into the format of imported_*
tables for a we
-Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
+Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
"attachment; filename=\"plausible_io_20241231.zip\""
-iex> content_disposition("📊.zip")
+iex> content_disposition("📊.zip")
"attachment; filename=\"plausible-export.zip\"; filename*=utf-8''%F0%9F%93%8A.zip"
@@ -726,14 +726,14 @@ tables into the format of imported_*
tables for a we
-Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
+Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
-DBConnection.run(pool, fn conn ->
+DBConnection.run(pool, fn conn ->
conn
- |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
- |> Stream.into(File.stream!("export.zip"))
- |> Stream.run()
-end)
+ |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
+ |> Stream.into(File.stream!("export.zip"))
+ |> Stream.run()
+end)
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index 834e8578e..e9f8fccc8 100644
--- a/Plausible.Geo.html
+++ b/Plausible.Geo.html
@@ -260,8 +260,8 @@ and MaxMind license key.
Examples
- In the case of a DB-IP database:
iex> database_type()
-"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
+ In the case of a DB-IP database:
iex> database_type()
+"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
"GeoLite2-City"
@@ -302,8 +302,8 @@ asynchronously.
Examples
- Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
-:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
+ Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
+:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
:ok
@@ -332,21 +332,21 @@ asynchronously.
Examples
-iex> lookup("8.7.6.5")
-%{
- "city" => %{
+iex> lookup("8.7.6.5")
+%{
+ "city" => %{
"geoname_id" => 5349755,
- "names" => %{
+ "names" => %{
"de" => "Fontana",
"en" => "Fontana",
"ja" => "フォンタナ",
"ru" => "Фонтана"
- }
- },
- "continent" => %{
+ }
+ },
+ "continent" => %{
"code" => "NA",
"geoname_id" => 6255149,
- "names" => %{
+ "names" => %{
"de" => "Nordamerika",
"en" => "North America",
"es" => "Norteamérica",
@@ -355,12 +355,12 @@ asynchronously."pt-BR" => "América do Norte",
"ru" => "Северная Америка",
"zh-CN" => "北美洲"
- }
- },
- "country" => %{
+ }
+ },
+ "country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -369,20 +369,20 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "location" => %{
+ }
+ },
+ "location" => %{
"accuracy_radius" => 50,
"latitude" => 34.1211,
"longitude" => -117.4362,
"metro_code" => 803,
"time_zone" => "America/Los_Angeles"
- },
- "postal" => %{"code" => "92336"},
- "registered_country" => %{
+ },
+ "postal" => %{"code" => "92336"},
+ "registered_country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -391,13 +391,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -406,10 +406,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index 640667d3c..17b7afd40 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1187,23 +1187,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Imported.CSVImporter.html b/Plausible.Imported.CSVImporter.html
index f6a219d7b..b7a47948a 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -257,13 +257,13 @@ or from local storage for which it uses iex> date_range([
-...> %{"filename" => "imported_devices_20190101_20210101.csv"},
+Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
+...> %{"filename" => "imported_devices_20190101_20210101.csv"},
...> "pages_20200101_20220101.csv"
-...> ])
-Date.range(~D[2019-01-01], ~D[2022-01-01])
+...> ])
+Date.range(~D[2019-01-01], ~D[2022-01-01])
-iex> date_range([])
+iex> date_range([])
nil
@@ -292,13 +292,13 @@ or from local storage for which it uses iex> extract_table("my_data.csv")
+Extracts the table name from the provided filename.
Raises if the filename doesn't conform to the expected format.
Examples:
iex> extract_table("my_data.csv")
** (ArgumentError) invalid filename
-iex> extract_table("imported_devices_00010101_20250101.csv")
+iex> extract_table("imported_devices_00010101_20250101.csv")
"imported_devices"
-iex> extract_table("devices_00010101_20250101.csv")
+iex> extract_table("devices_00010101_20250101.csv")
"imported_devices"
@@ -321,8 +321,8 @@ or from local storage for which it uses
-Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
, $PERSISTENT_CACHE_DIR
or $DEFAULT_DATA_DIR
(if set) and falls back to /tmp.
$DEFAULT_DATA_DIR
is set to /var/lib/plausible
in container images.
Examples:
iex> local_dir = local_dir(_site_id = 37)
-iex> String.ends_with?(local_dir, "/plausible-imports/37")
+Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
, $PERSISTENT_CACHE_DIR
or $DEFAULT_DATA_DIR
(if set) and falls back to /tmp.
$DEFAULT_DATA_DIR
is set to /var/lib/plausible
in container images.
Examples:
iex> local_dir = local_dir(_site_id = 37)
+iex> String.ends_with?(local_dir, "/plausible-imports/37")
true
@@ -382,14 +382,14 @@ or from local storage for which it uses iex> parse_filename!("my_data.csv")
+Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
** (ArgumentError) invalid filename
-iex> parse_filename!("imported_devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("imported_devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
-iex> parse_filename!("devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
@@ -417,13 +417,13 @@ or from local storage for which it uses iex> valid_filename?("my_data.csv")
+Checks if the provided filename conforms to the expected format.
Examples:
iex> valid_filename?("my_data.csv")
false
-iex> valid_filename?("imported_devices_00010101_20250101.csv")
+iex> valid_filename?("imported_devices_00010101_20250101.csv")
true
-iex> valid_filename?("devices_00010101_20250101.csv")
+iex> valid_filename?("devices_00010101_20250101.csv")
true
diff --git a/Plausible.Imported.Importer.html b/Plausible.Imported.Importer.html
index 2478bcfde..43dc7fcd2 100644
--- a/Plausible.Imported.Importer.html
+++ b/Plausible.Imported.Importer.html
@@ -183,30 +183,30 @@ scope of importer logic and is expected to be implemented separately.
In case it's necessary to run the whole import job fully synchronously, the
Plausible.Workers.ImportAnalytics
worker sends an Oban.Notifier
message
-on completion, failure or transient failure of the import.
A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
+on completion, failure or transient failure of the import.A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
site,
user,
start_date: ~D[2005-01-01],
- end_date: Date.utc_today(),
+ end_date: Date.utc_today(),
# this option is necessary to setup the calling process as listener
listen?: true
-)
+)
-import_id = job.args[:import_id]
+import_id = job.args[:import_id]
-receive do
- {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
- IO.puts("Job completed")
+receive do
+ {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
+ IO.puts("Job completed")
- {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed transiently")
+ {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed transiently")
- {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed permanently")
-after
+ {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed permanently")
+after
15_000 ->
- IO.puts("Job didn't finish in 15 seconds")
-end
In a more realistic scenario, job scheduling will be done inside a GenServer process
+
IO.puts("Job didn't finish in 15 seconds")
+end
In a more realistic scenario, job scheduling will be done inside a GenServer process
like LiveView, where notifications can be listened for via handle_info/2
.
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 7b378e7bd..eac87350e 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1217,23 +1217,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.S3.html b/Plausible.S3.html
index 1e0153288..299200486 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -316,7 +316,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.
In
Returns the pre-configured S3 bucket for CSV exports.
config :plausible, Plausible.S3,
- exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
+ exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
"test-exports"
@@ -348,8 +348,8 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-
Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
-%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
+Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
+%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
@@ -371,9 +371,9 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
-iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
-iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
+Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
+iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
+iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
@@ -402,7 +402,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
Returns the pre-configured S3 bucket for CSV imports.
config :plausible, Plausible.S3,
- imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
+ imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
"test-imports"
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index d8dbc5d5e..985a261aa 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -396,14 +396,14 @@ does not handle AND/OR/NOT!
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-[[:matches_wildcard, "event:page", ["/blog/**"]]]
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+[[:matches_wildcard, "event:page", ["/blog/**"]]]
-iex> Filters.parse("visit:browser!=Chrome")
-[[:is_not, "visit:browser", ["Chrome"]]]
+iex> Filters.parse("visit:browser!=Chrome")
+[[:is_not, "visit:browser", ["Chrome"]]]
-iex> Filters.parse(nil)
-[]
+iex> Filters.parse(nil)
+[]
diff --git a/Plausible.Stats.SQL.Fragments.html b/Plausible.Stats.SQL.Fragments.html
index 4d2c510ec..eec514873 100644
--- a/Plausible.Stats.SQL.Fragments.html
+++ b/Plausible.Stats.SQL.Fragments.html
@@ -668,12 +668,12 @@ boundary, not_before
is returned.not_before
boundary is set to the past Saturday, which is before the
weekstart, therefore the cap does not apply. > this_wednesday = ~D[2022-11-09]
> past_saturday = ~D[2022-11-05]
- > weekstart_not_before(this_wednesday, past_saturday)
+ > weekstart_not_before(this_wednesday, past_saturday)
~D[2022-11-07]
In this other example, the fragment returns Tuesday and not the weekstart.
The not_before
boundary is set to Tuesday, which is past the weekstart,
therefore the cap applies.
> this_wednesday = ~D[2022-11-09]
> this_tuesday = ~D[2022-11-08]
- > weekstart_not_before(this_wednesday, this_tuesday)
+ > weekstart_not_before(this_wednesday, this_tuesday)
~D[2022-11-08]
diff --git a/Plausible.epub b/Plausible.epub
index 84b4b513fe070651747fee5333d6bfde2c1c9fae..e0ae57f7061b767da4ecca501faba71391d06a32 100644
GIT binary patch
delta 147807
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