From b58709bbb1e5a8366f18899d5a3c13be0cd5bfa6 Mon Sep 17 00:00:00 2001
From: RobertJoonas
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 a77794a3f..55a5f5f2a 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 10b7a69e2..c883c013b 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 4d0577101..d3349e3c8 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 7d40ec0b8..a0ff8a3d0 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 25b609d0e..85dee530b 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 abb32bcc5..ae1cc972d 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 b75fd421f..94af7432d 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 0ac348b3e..839286df4 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 3d44ea1e5..b1d720adf 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 f5dc5ff22..ad881a1a0 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 244e621a2..b5a02a060 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 7955a0765..baa975c25 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 938a57ffd..438baa411 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 b528595ad..578b443bc 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 bdf66f890..acebe17fa 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 e79682ba3..87f28e0e3 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 e40863570..72f42e225 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 a3187ab7b..09a805fca 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 12b2d1bc8b1d254b521d23d94f132692910f2937..f089c87c8a14079ff45241fabad61e53457043e8 100644
GIT binary patch
delta 139570
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