From f8a32a5cb33daa8758fb83814982dddf0ecb30ab Mon Sep 17 00:00:00 2001
From: "github-merge-queue[bot]"
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Cldr.LanguageTag
.
The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -261,54 +261,54 @@ a configuredExamples
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
-{:error,
- {Cldr.NoMatchingLocale,
- "No configured locale could be matched to \"xx,yy;q=0.3\""}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
+{:error,
+ {Cldr.NoMatchingLocale,
+ "No configured locale could be matched to \"xx,yy;q=0.3\""}}
-iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
@@ -369,95 +369,95 @@ with an error tuple for each invalid tag added at the end of the list.
Example
-iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
- ]}
+ transform: %{},
+ language_variants: []
+ }}
+ ]}
-iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
-{:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
+{:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
- ]}
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+ ]}
@@ -502,92 +502,92 @@ with an error tuple for each invalid tag added at the end of the list.
Example
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
-]
+ transform: %{},
+ language_variants: []
+ }}
+]
Plausible.Cldr.AcceptLanguage.parse! "invalid_tag"
** (Cldr.AcceptLanguageError) "Expected a BCP47 language tag. Could not parse the remaining "g" starting at position 11
(ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-]
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+]
diff --git a/Plausible.Cldr.Currency.html b/Plausible.Cldr.Currency.html
index 8b030f10c..89f3b6e7d 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 215b181fd..450a15c4a 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 e420aabb1..b8496f450 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 a5da40a68..be00f9f3f 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 76f96ed1c..6fa74c2da 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 9ea4b3684..e4cbfee30 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 4f728804f..c9944c8fb 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 2c43939fd..83ad5ff67 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -879,23 +879,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.ClickhouseRepo.html b/Plausible.DataMigration.ClickhouseRepo.html
index 1513267aa..f60bdb8cf 100644
--- a/Plausible.DataMigration.ClickhouseRepo.html
+++ b/Plausible.DataMigration.ClickhouseRepo.html
@@ -1196,23 +1196,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Exports.html b/Plausible.Exports.html
index 5bb48ba23..0b1f37b3f 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 b85d0268d..fdb6f5f2b 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 3a005c063..85821f50a 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1187,23 +1187,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Imported.CSVImporter.html b/Plausible.Imported.CSVImporter.html
index 67e90d5f1..e365edf4f 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -257,13 +257,13 @@ or from local storage for which it uses iex> date_range([
-...> %{"filename" => "imported_devices_20190101_20210101.csv"},
+Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
+...> %{"filename" => "imported_devices_20190101_20210101.csv"},
...> "pages_20200101_20220101.csv"
-...> ])
-Date.range(~D[2019-01-01], ~D[2022-01-01])
+...> ])
+Date.range(~D[2019-01-01], ~D[2022-01-01])
-iex> date_range([])
+iex> date_range([])
nil
@@ -292,13 +292,13 @@ or from local storage for which it uses iex> extract_table("my_data.csv")
+Extracts the table name from the provided filename.
Raises if the filename doesn't conform to the expected format.
Examples:
iex> extract_table("my_data.csv")
** (ArgumentError) invalid filename
-iex> extract_table("imported_devices_00010101_20250101.csv")
+iex> extract_table("imported_devices_00010101_20250101.csv")
"imported_devices"
-iex> extract_table("devices_00010101_20250101.csv")
+iex> extract_table("devices_00010101_20250101.csv")
"imported_devices"
@@ -321,8 +321,8 @@ or from local storage for which it uses
-Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
, $PERSISTENT_CACHE_DIR
or $DEFAULT_DATA_DIR
(if set) and falls back to /tmp.
$DEFAULT_DATA_DIR
is set to /var/lib/plausible
in container images.
Examples:
iex> local_dir = local_dir(_site_id = 37)
-iex> String.ends_with?(local_dir, "/plausible-imports/37")
+Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
, $PERSISTENT_CACHE_DIR
or $DEFAULT_DATA_DIR
(if set) and falls back to /tmp.
$DEFAULT_DATA_DIR
is set to /var/lib/plausible
in container images.
Examples:
iex> local_dir = local_dir(_site_id = 37)
+iex> String.ends_with?(local_dir, "/plausible-imports/37")
true
@@ -382,14 +382,14 @@ or from local storage for which it uses iex> parse_filename!("my_data.csv")
+Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
** (ArgumentError) invalid filename
-iex> parse_filename!("imported_devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("imported_devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
-iex> parse_filename!("devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
@@ -417,13 +417,13 @@ or from local storage for which it uses iex> valid_filename?("my_data.csv")
+Checks if the provided filename conforms to the expected format.
Examples:
iex> valid_filename?("my_data.csv")
false
-iex> valid_filename?("imported_devices_00010101_20250101.csv")
+iex> valid_filename?("imported_devices_00010101_20250101.csv")
true
-iex> valid_filename?("devices_00010101_20250101.csv")
+iex> valid_filename?("devices_00010101_20250101.csv")
true
diff --git a/Plausible.Imported.Importer.html b/Plausible.Imported.Importer.html
index 5f58ecc18..0871b0632 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 6ca5efbeb..15d70fa03 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1225,23 +1225,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 496493deb..76c2b5aba 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 e0d8cce96..8a09a94b9 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -396,14 +396,14 @@ does not handle AND/OR/NOT!
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-[[:matches_wildcard, "event:page", ["/blog/**"]]]
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+[[:matches_wildcard, "event:page", ["/blog/**"]]]
-iex> Filters.parse("visit:browser!=Chrome")
-[[:is_not, "visit:browser", ["Chrome"]]]
+iex> Filters.parse("visit:browser!=Chrome")
+[[:is_not, "visit:browser", ["Chrome"]]]
-iex> Filters.parse(nil)
-[]
+iex> Filters.parse(nil)
+[]
diff --git a/Plausible.Stats.SQL.Fragments.html b/Plausible.Stats.SQL.Fragments.html
index 9191b1418..be06096ef 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 0459e0ddb5737326c4b30cf288736c2a174175ef..1f422f1cbfeb24e613dd2867cef7e8fb8c4d5723 100644
GIT binary patch
delta 147469
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