From f344e8061e8b9fe5872aee62fb9a639ed5504a32 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 c34355d62..78c860165 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 44007c5b6..5a5a7f0f4 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 851d151e1..8edf00f3b 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 af03b3cff..9b1262fd4 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 6cba92689..e222185d8 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 b3f561d60..a2b79877b 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 cc973eaba..d59768ef5 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 5598eb0c4..ad4188ba2 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 da4dc3ced..df6e3e39f 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 7f854cf7c..e66106e56 100644
--- a/Plausible.Exports.html
+++ b/Plausible.Exports.html
@@ -294,10 +294,10 @@ tables into the format of imported_*
tables for a w
-Renders filename for the Zip archive containing the exported CSV files.
Examples:
iex> archive_filename("plausible.io", ~D[2021-01-01], ~D[2024-12-31])
+Renders filename for the Zip archive containing the exported CSV files.
Examples:
iex> archive_filename("plausible.io", ~D[2021-01-01], ~D[2024-12-31])
"plausible_io_20210101_20241231.zip"
-iex> archive_filename("Bücher.example", ~D[2021-01-01], ~D[2024-12-31])
+iex> archive_filename("Bücher.example", ~D[2021-01-01], ~D[2024-12-31])
"Bücher_example_20210101_20241231.zip"
@@ -617,14 +617,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 b656be13c..d42bbcf1e 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 561d4d1fd..58668d604 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.CSVImporter.html b/Plausible.Imported.CSVImporter.html
index 4253044b2..d1755935d 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -246,13 +246,13 @@ Pages
-Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
-...> %{"filename" => "imported_devices_20190101_20210101.csv"},
+Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
+...> %{"filename" => "imported_devices_20190101_20210101.csv"},
...> "imported_pages_20200101_20220101.csv"
-...> ])
-Date.range(~D[2019-01-01], ~D[2022-01-01])
+...> ])
+Date.range(~D[2019-01-01], ~D[2022-01-01])
-iex> date_range([])
+iex> date_range([])
nil
@@ -281,10 +281,10 @@ Pages
-Extracts the table name from the provided filename.
Raises if the filename doesn't conform to the expected format.
Examples:
iex> extract_table("my_data.csv")
+Extracts the table name from the provided filename.
Raises if the filename doesn't conform to the expected format.
Examples:
iex> extract_table("my_data.csv")
** (ArgumentError) invalid filename
-iex> extract_table("imported_devices_00010101_20250101.csv")
+iex> extract_table("imported_devices_00010101_20250101.csv")
"imported_devices"
@@ -343,11 +343,11 @@ Pages
-Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
+Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
** (ArgumentError) invalid filename
-iex> parse_filename!("imported_devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("imported_devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
@@ -375,10 +375,10 @@ Pages
-Checks if the provided filename conforms to the expected format.
Examples:
iex> valid_filename?("my_data.csv")
+Checks if the provided filename conforms to the expected format.
Examples:
iex> valid_filename?("my_data.csv")
false
-iex> valid_filename?("imported_devices_00010101_20250101.csv")
+iex> valid_filename?("imported_devices_00010101_20250101.csv")
true
diff --git a/Plausible.Imported.Importer.html b/Plausible.Imported.Importer.html
index 6aa61b89b..27d67981c 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 c65ac1312..9f700dd78 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 86bca9ebf..352093f65 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -286,7 +286,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"
@@ -318,8 +318,8 @@ The URL expires in 24 hours.In the current implementation the bucket alwa
-
Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
-%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
+Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
+%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
@@ -341,10 +341,10 @@ The URL expires in 24 hours.In the current implementation the bucket alwa
-Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> %{
+Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> %{
...> s3_url: "http://localhost:10000/test-imports/123/imported_browsers.csv",
...> presigned_url: "http://localhost:10000/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin" <> _
-...> } = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
+...> } = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
@@ -373,7 +373,7 @@ The URL expires in 24 hours.In the current implementation the bucket alwa
Returns the pre-configured S3 bucket for CSV imports.
config :plausible, Plausible.S3,
- imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
+ imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
"test-imports"
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index 684f8a897..ecce608f7 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -283,14 +283,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 5cd0fc9bc4ce2816e652650d4ba962e559749250..c20f143a6eed84fbb7cb5c9058f496affdf22fbe 100644
GIT binary patch
delta 136907
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