From 31de2a1cf6860c27a75ce383b234ee85b7c1a9e5 Mon Sep 17 00:00:00 2001
From: RobertJoonas
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
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 238625398..cf2cb286c 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 6c2d7e16f..f70d83e7d 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 48222fad7..29ce75987 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 810fb3ad4..70e053801 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 bf220020e..00e2a4ae1 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 be370beb1..707ed80ee 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 797bee786..f3d9d502a 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 6b689bdae..f277b760e 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -855,23 +855,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index e63f4fc4f..220664119 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -1162,23 +1162,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Exports.html b/Plausible.Exports.html
index 17bd0f72b..482dbc6c0 100644
--- a/Plausible.Exports.html
+++ b/Plausible.Exports.html
@@ -381,7 +381,7 @@ tables into the format of imported_*
tables for a we
-Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
+Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
"plausible_io_20241231.zip"
@@ -404,10 +404,10 @@ tables into the format of imported_*
tables for a we
-Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
+Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
"attachment; filename=\"plausible_io_20241231.zip\""
-iex> content_disposition("📊.zip")
+iex> content_disposition("📊.zip")
"attachment; filename=\"plausible-export.zip\"; filename*=utf-8''%F0%9F%93%8A.zip"
@@ -726,14 +726,14 @@ tables into the format of imported_*
tables for a we
-Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
+Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
-DBConnection.run(pool, fn conn ->
+DBConnection.run(pool, fn conn ->
conn
- |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
- |> Stream.into(File.stream!("export.zip"))
- |> Stream.run()
-end)
+ |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
+ |> Stream.into(File.stream!("export.zip"))
+ |> Stream.run()
+end)
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index 2dc269c89..ca4f050a4 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 7b339cc0f..d7c032e13 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1153,23 +1153,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Imported.CSVImporter.html b/Plausible.Imported.CSVImporter.html
index 3669c4edc..b247460a0 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -257,13 +257,13 @@ or from local storage for which it uses iex> date_range([
-...> %{"filename" => "imported_devices_20190101_20210101.csv"},
+Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
+...> %{"filename" => "imported_devices_20190101_20210101.csv"},
...> "pages_20200101_20220101.csv"
-...> ])
-Date.range(~D[2019-01-01], ~D[2022-01-01])
+...> ])
+Date.range(~D[2019-01-01], ~D[2022-01-01])
-iex> date_range([])
+iex> date_range([])
nil
@@ -292,13 +292,13 @@ or from local storage for which it uses iex> extract_table("my_data.csv")
+Extracts the table name from the provided filename.
Raises if the filename doesn't conform to the expected format.
Examples:
iex> extract_table("my_data.csv")
** (ArgumentError) invalid filename
-iex> extract_table("imported_devices_00010101_20250101.csv")
+iex> extract_table("imported_devices_00010101_20250101.csv")
"imported_devices"
-iex> extract_table("devices_00010101_20250101.csv")
+iex> extract_table("devices_00010101_20250101.csv")
"imported_devices"
@@ -321,8 +321,8 @@ or from local storage for which it uses
-Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
or $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
Examples:
iex> local_dir = local_dir(_site_id = 37)
-iex> String.ends_with?(local_dir, "/plausible-imports/37")
+Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
or $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
Examples:
iex> local_dir = local_dir(_site_id = 37)
+iex> String.ends_with?(local_dir, "/plausible-imports/37")
true
@@ -382,14 +382,14 @@ or from local storage for which it uses iex> parse_filename!("my_data.csv")
+Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
** (ArgumentError) invalid filename
-iex> parse_filename!("imported_devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("imported_devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
-iex> parse_filename!("devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
@@ -417,13 +417,13 @@ or from local storage for which it uses iex> valid_filename?("my_data.csv")
+Checks if the provided filename conforms to the expected format.
Examples:
iex> valid_filename?("my_data.csv")
false
-iex> valid_filename?("imported_devices_00010101_20250101.csv")
+iex> valid_filename?("imported_devices_00010101_20250101.csv")
true
-iex> valid_filename?("devices_00010101_20250101.csv")
+iex> valid_filename?("devices_00010101_20250101.csv")
true
diff --git a/Plausible.Imported.Importer.html b/Plausible.Imported.Importer.html
index 1a744b568..2557a9694 100644
--- a/Plausible.Imported.Importer.html
+++ b/Plausible.Imported.Importer.html
@@ -183,30 +183,30 @@ scope of importer logic and is expected to be implemented separately.
In case it's necessary to run the whole import job fully synchronously, the
Plausible.Workers.ImportAnalytics
worker sends an Oban.Notifier
message
-on completion, failure or transient failure of the import.
A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
+on completion, failure or transient failure of the import.A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
site,
user,
start_date: ~D[2005-01-01],
- end_date: Date.utc_today(),
+ end_date: Date.utc_today(),
# this option is necessary to setup the calling process as listener
listen?: true
-)
+)
-import_id = job.args[:import_id]
+import_id = job.args[:import_id]
-receive do
- {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
- IO.puts("Job completed")
+receive do
+ {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
+ IO.puts("Job completed")
- {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed transiently")
+ {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed transiently")
- {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed permanently")
-after
+ {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed permanently")
+after
15_000 ->
- IO.puts("Job didn't finish in 15 seconds")
-end
In a more realistic scenario, job scheduling will be done inside a GenServer process
+
IO.puts("Job didn't finish in 15 seconds")
+end
In a more realistic scenario, job scheduling will be done inside a GenServer process
like LiveView, where notifications can be listened for via handle_info/2
.
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 20f6a2f05..1b969d1f3 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1153,23 +1153,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.S3.html b/Plausible.S3.html
index fd6944add..e662f8e4d 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -316,7 +316,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.
In
Returns the pre-configured S3 bucket for CSV exports.
config :plausible, Plausible.S3,
- exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
+ exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
"test-exports"
@@ -348,8 +348,8 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-
Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
-%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
+Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
+%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
@@ -371,9 +371,9 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
-iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
-iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
+Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
+iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
+iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
@@ -402,7 +402,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
Returns the pre-configured S3 bucket for CSV imports.
config :plausible, Plausible.S3,
- imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
+ imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
"test-imports"
diff --git a/Plausible.Stats.Base.html b/Plausible.Stats.Base.html
index 6949efd34..573179906 100644
--- a/Plausible.Stats.Base.html
+++ b/Plausible.Stats.Base.html
@@ -249,7 +249,7 @@ Pages
add_percentage_metric(q, site, query, metrics)
-
+
View Source
@@ -315,7 +315,7 @@ Pages
maybe_add_conversion_rate(q, site, query, metrics)
-
+
View Source
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index 5c82c014e..8148d6a09 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -283,14 +283,14 @@ Pages
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-[[:matches, "event:page", "/blog/**"]]
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+[[:matches, "event:page", "/blog/**"]]
-iex> Filters.parse("visit:browser!=Chrome")
-[[:is_not, "visit:browser", "Chrome"]]
+iex> Filters.parse("visit:browser!=Chrome")
+[[:is_not, "visit:browser", "Chrome"]]
-iex> Filters.parse(nil)
-[]
+iex> Filters.parse(nil)
+[]
diff --git a/Plausible.epub b/Plausible.epub
index d3fb3561da1aaefa9c60f6d5ffd8e27eecdf2535..e2887a7b15cefef86013bc77b4299533700b039e 100644
GIT binary patch
delta 143566
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
z