From ef10cbcabf63185d2dc9f123c3fc52540100977d Mon Sep 17 00:00:00 2001
From: aerosol
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Give
Queries the ClickHouse database for the monthly pageview usage. If the given user's
subscription is active
, past_due
, or a deleted
(but not yet expired), a map
-with the following structure is returned:
%{
- current_cycle: usage_cycle(),
- last_cycle: usage_cycle(),
- penultimate_cycle: usage_cycle()
-}
In all other cases of the subscription status (or a free_10k
subscription which
-does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the +with the following structure is returned:
%{
+ current_cycle: usage_cycle(),
+ last_cycle: usage_cycle(),
+ penultimate_cycle: usage_cycle()
+}
In all other cases of the subscription status (or a free_10k
subscription which
+does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the
user owns. Alternatively, given an optional argument of site_ids
, the usage from
across all those sites is queried instead.
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."
@@ -258,54 +258,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"}}
@@ -366,95 +366,95 @@ wuth 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"}}
+ ]}
@@ -499,92 +499,92 @@ wuth 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 5427e2231..58d7719b3 100644
--- a/Plausible.Cldr.Currency.html
+++ b/Plausible.Cldr.Currency.html
@@ -416,11 +416,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,
@@ -430,12 +430,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,
@@ -445,7 +445,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -496,11 +496,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,
@@ -510,12 +510,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,
@@ -525,7 +525,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -583,13 +583,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",
@@ -597,15 +597,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",
@@ -613,7 +613,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -672,12 +672,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",
@@ -685,14 +685,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",
@@ -700,7 +700,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -741,15 +741,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
@@ -793,14 +793,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]}
+ }
+}
@@ -859,9 +859,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,
@@ -871,7 +871,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
@@ -930,8 +930,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,
@@ -941,7 +941,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ }
@@ -979,10 +979,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
@@ -1030,7 +1030,7 @@ mapping is returned for that territory.Example
-iex> Plausible.Cldr.Currency.current_territory_currencies()
+iex> Plausible.Cldr.Currency.current_territory_currencies()
@@ -1122,11 +1122,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"}}
@@ -1173,13 +1173,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
@@ -1214,7 +1214,7 @@ currency codeExample
-iex> Plausible.Cldr.Currency.known_currency_codes()
+iex> Plausible.Cldr.Currency.known_currency_codes()
@@ -1273,14 +1273,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,
@@ -1290,11 +1290,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."}}
@@ -1352,20 +1352,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"}
@@ -1407,8 +1407,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 e090a3f1e..4d6dac95d 100644
--- a/Plausible.Cldr.Locale.html
+++ b/Plausible.Cldr.Locale.html
@@ -323,16 +323,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]}
@@ -386,20 +386,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]>]}
@@ -530,15 +530,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\""}}
@@ -680,12 +680,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 dc5dcadef..b907532ff 100644
--- a/Plausible.Cldr.Number.Cardinal.html
+++ b/Plausible.Cldr.Number.Cardinal.html
@@ -452,31 +452,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 7bd090d73..505f4972d 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 bc2cafa7f..fc85fe05b 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -375,9 +375,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: ",",
@@ -390,8 +390,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- },
- thai: %Cldr.Number.Symbol{
+ },
+ thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -404,8 +404,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 1b3c88829..b05dcd159 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -314,23 +314,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}"}
+}
@@ -421,10 +421,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"}}
@@ -506,13 +506,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"}}
@@ -610,20 +610,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.
@@ -670,16 +670,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 856778cbc..a60c85560 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -438,19 +438,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"}}
@@ -522,17 +522,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]
@@ -609,19 +609,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"}}
@@ -685,13 +685,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]
@@ -748,9 +748,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. @@ -1165,80 +1165,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,
@@ -158,9 +158,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,
@@ -152,9 +152,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"
@@ -712,23 +712,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: []
+ }
@@ -815,10 +815,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
@@ -861,10 +861,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
@@ -938,10 +938,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
@@ -983,10 +983,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
@@ -1040,8 +1040,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]
@@ -1106,10 +1106,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
@@ -1152,10 +1152,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
@@ -1291,14 +1291,14 @@ 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")
-{:error,
- {Cldr.UnknownLocaleError,
- "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
+iex> Plausible.Cldr.put_gettext_locale(~l"de")
+{:error,
+ {Cldr.UnknownLocaleError,
+ "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
@@ -1342,29 +1342,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"}}
@@ -1413,10 +1413,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」"
@@ -1547,47 +1547,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"}}
@@ -1657,23 +1657,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 92e8e472c..62bfe507f 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -842,23 +842,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index dd4f57402..5b979915c 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -1149,23 +1149,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.Geo.html b/Plausible.Geo.html
index e09318c29..c61e8c3c5 100644
--- a/Plausible.Geo.html
+++ b/Plausible.Geo.html
@@ -257,8 +257,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"
@@ -298,8 +298,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
@@ -328,21 +328,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",
@@ -351,12 +351,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",
@@ -365,20 +365,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",
@@ -387,13 +387,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -402,10 +402,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index 83d1f1295..4f494eb92 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1140,23 +1140,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.IngestRepo.html b/Plausible.IngestRepo.html
index b62ae0483..0469534c2 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1140,23 +1140,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.Stats.FilterParser.html b/Plausible.Stats.FilterParser.html
index 44ec6bfab..d8c88a262 100644
--- a/Plausible.Stats.FilterParser.html
+++ b/Plausible.Stats.FilterParser.html
@@ -204,14 +204,14 @@ Pages
Examples:
-
iex> FilterParser.parse_filters("{\"page\":\"/blog/**\"}")
-%{"page" => "/blog/**"}
+iex> FilterParser.parse_filters("{\"page\":\"/blog/**\"}")
+%{"page" => "/blog/**"}
-iex> FilterParser.parse_filters("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> FilterParser.parse_filters("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
-iex> FilterParser.parse_filters(nil)
-%{}
+iex> FilterParser.parse_filters(nil)
+%{}
diff --git a/Plausible.epub b/Plausible.epub
index 02e2c2a295e68cb8febd358ab26236cccdd3f1f6..5f267b174f676174a16f453635e35f4d2432f916 100644
GIT binary patch
delta 121130
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