From 770ee6103be933c839a643d19ccbfa7864ffcdb3 Mon Sep 17 00:00:00 2001
From: aerosol
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 85725a0fd..00b390734 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 306a7828c..ff2d3b8d1 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 a089e783e..32be99a20 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 8b8712d76..abf173076 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 2c751c5bb..d07bedaa0 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 7ea1bee59..9419828c6 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 8d1b8891d..d6b304d92 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 3a2b93ba3..8ab159c21 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 062c70645..b6d7b8898 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 69df96670..4d791674e 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 dc5a176c6..e4af2e79b 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 6f636fc5b..7d64f874e 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 62ca0ee7d..ef143212e 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 ebfddcddc..cd9dad96e 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 04068bfd5..dfc06fe9e 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 c76e87268..65db42591 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 c76f070e5..8f142d609 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 aea3852ed..089775fb5 100644
--- a/Plausible.Stats.SQL.Fragments.html
+++ b/Plausible.Stats.SQL.Fragments.html
@@ -645,12 +645,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 2ecaa8e3358529d116e12bd21818acee2985768b..b283d7c8330cedf75a0ea0163571ed35916e4740 100644
GIT binary patch
delta 138151
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