From a61a217077bc85ccad4fa72920aef251015772fc Mon Sep 17 00:00:00 2001
From: zoldar
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."
@@ -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 @@ 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"}}
+ ]}
@@ -502,92 +502,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 152168be42..d58808357f 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 50b04e1415..8929913d08 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 3898d9e258..d0add8559e 100644
--- a/Plausible.Cldr.Number.Cardinal.html
+++ b/Plausible.Cldr.Number.Cardinal.html
@@ -455,31 +455,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 96ec08fa72..6319baf068 100644
--- a/Plausible.Cldr.Number.Format.html
+++ b/Plausible.Cldr.Number.Format.html
@@ -468,7 +468,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¤)",
@@ -478,7 +478,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",
@@ -535,7 +535,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 8801c8507c..5b96c53157 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 1325203c71..47fdaa3c64 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"}}
@@ -613,20 +613,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.
@@ -673,16 +673,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 56177a1264..39af96df96 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,14 +1294,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"}}
@@ -1345,29 +1345,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"}}
@@ -1416,10 +1416,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」"
@@ -1550,47 +1550,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"}}
@@ -1660,23 +1660,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 863fa47423..8c02e0420a 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -845,23 +845,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index 4919687554..983414a3f6 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -1152,23 +1152,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 24f25ebbd7..37e6cbaed6 100644
--- a/Plausible.Exports.html
+++ b/Plausible.Exports.html
@@ -581,14 +581,14 @@ tables into the format of imported_*
tables for a w
-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 8a1c185356..53930cd4df 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 12bd828254..4864d55dc3 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1143,23 +1143,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.Importer.html b/Plausible.Imported.Importer.html
index 73c5e337ad..52deac8e06 100644
--- a/Plausible.Imported.Importer.html
+++ b/Plausible.Imported.Importer.html
@@ -178,30 +178,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, %{"complete" => ^import_id}} ->
- IO.puts("Job completed")
+receive do
+ {:notification, :analytics_imports_jobs, %{"complete" => ^import_id}} ->
+ IO.puts("Job completed")
- {:notification, :analytics_imports_jobs, %{"transient_fail" => ^import_id}} ->
- IO.puts("Job failed transiently")
+ {:notification, :analytics_imports_jobs, %{"transient_fail" => ^import_id}} ->
+ IO.puts("Job failed transiently")
- {:notification, :analytics_imports_jobs, %{"fail" => ^import_id}} ->
- IO.puts("Job failed permanently")
-after
+ {:notification, :analytics_imports_jobs, %{"fail" => ^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 341f11544c..a6b1d67ef8 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1143,23 +1143,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 3a6d67a7c7..5e360d56ed 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -260,7 +260,7 @@ The URL expires in 24 hours.
In the current implementation the bucket alwa
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"
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index 0b8c043301..8f54a242a0 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -253,14 +253,14 @@ Pages
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-%{"event:page" => {:matches, "/blog/**"}}
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+%{"event:page" => {:matches, "/blog/**"}}
-iex> Filters.parse("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> Filters.parse("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
-iex> Filters.parse(nil)
-%{}
+iex> Filters.parse(nil)
+%{}
diff --git a/Plausible.epub b/Plausible.epub
index 6622a236b7b11d1fc61b00392a9e4515977fa9e2..0216a1fdac6edd64d7b148df31f22c952465add1 100644
GIT binary patch
delta 133670
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