From 2ceb228de1b4a888c97261f7d607e8be26ce64f0 Mon Sep 17 00:00:00 2001
From: apata
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 35d42ae37..7aaee716d 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 5264c8971..cc1f73628 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 0ac6c3d27..07a18511d 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 c63e2f174..d8a4a340e 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 b46a21c59..99a34ae38 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 eeae8cad5..4cc64dcb2 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 22d05288d..4695e5db3 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 77ee2eede..413d23e7e 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -855,23 +855,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index e4d3b8ac7..d20190e3e 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 7ddbc0a16..1d508d2d5 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 b476ff1d6..9df7d3311 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 7447ceeeb..3ee92a034 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 28818d020..c0a57e408 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 fb46863a6..49b9ed05a 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 e5302d612..6c4b92040 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.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.S3.html b/Plausible.S3.html
index 43201cec7..024364773 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 0d537ea80..5ce0a693b 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 cf002a11e..6435caef2 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 fc32f64a81582e44e4e959d9d53fb6e0511cbecb..1426d061816c3c8d12a543e257f943412ca7b5f0 100644
GIT binary patch
delta 140953
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
z
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