From a32cc45bcef081ad1645c80a3c83fb9fd358e0b2 Mon Sep 17 00:00:00 2001
From: cnkk
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 795a71b0d7..cd89a93721 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 8ac192187c..a6316fdc33 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 7e2bca8877..990e2170ff 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 104fd7c5c9..c4ce5f5b55 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 0e83091596..7b355572b9 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 14c29c07d1..4fb411038b 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 69306ce9e0..967307412c 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 cccc13aa85..ec68c16c1f 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -845,23 +845,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index 7ab92f7969..eb6654213c 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -1162,23 +1162,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 4df050a911..70f1400987 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 029d2fe306..5d377f06fe 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 3ede533278..619258a089 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1153,23 +1153,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 1700faf053..199325b43d 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
or $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
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
or $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
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 fe6ff1c2c0..8960a42ae6 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 77eceae5ae..78c9fe3d48 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1183,23 +1183,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 551da58b02..f8f4a72ffd 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 4d02a04dd0..65b73be507 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -283,14 +283,14 @@ Pages
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-[[:matches, "event:page", ["/blog/**"]]]
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+[[:matches, "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 12f3d70cf7..20514f69a5 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 0bba9187d22dbc9554d8bde9b043b4aee86b7fb5..141238a5b3b1df1cb0a1b5d22dd2f3f2f65337e4 100644
GIT binary patch
delta 146059
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%0AZ
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