From 7146dc1d9f2ab9b641ed6c9edf7d7670933b3a39 Mon Sep 17 00:00:00 2001
From: cnkk
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 f7ee1afac..325dadde1 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 ee737b226..72d1c66de 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 2225bbdf6..71ea85eda 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 7b68734b7..31b9f7f81 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 f8b3dfd68..e68aa7b66 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 e2425b65d..3ca14b200 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 af9b49ab7..4694f7587 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 7291fb280..5f1b75267 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 d8547cac4..9f4deb133 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 3aca3f25b..ede00ca95 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 babf65bc0..968710f88 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 66ce2b955..ae0dea753 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 130fcfccd..c54964e96 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 b04c5ca7b..8d0a2ebac 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 7272d0755..19c79a09e 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 f6c7371bc..aee426d6c 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -316,7 +316,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.
In
Returns the pre-configured S3 bucket for CSV exports.
config :plausible, Plausible.S3,
- exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
+ exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
"test-exports"
@@ -348,8 +348,8 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-
Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
-%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
+Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
+%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
@@ -371,9 +371,9 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
-iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
-iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
+Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
+iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
+iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
@@ -402,7 +402,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
Returns the pre-configured S3 bucket for CSV imports.
config :plausible, Plausible.S3,
- imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
+ imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
"test-imports"
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index 8b7310496..58933f0ed 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 dbe79b9898dea7ae260b5221cd06f218e7391d06..5490a0eb90f1217764ac6210fe7240caf1a5eca7 100644
GIT binary patch
delta 137511
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