From 039c7b0ad0c35fbfbdaa456e18f3666c9850d5a1 Mon Sep 17 00:00:00 2001
From: macobo
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 5cd1b7e51..2a1389fc4 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 8522d1fc9..b19b6ae46 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 f79f694b3..a61697a8c 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 d8c59d22b..220d2edcd 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 8c647869f..e7858586e 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 db242abab..63aa4fc52 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 4d7139743..f789b4de6 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 b77dbf570..ff2ccb308 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -845,23 +845,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index bf7358a91..6ff5f6329 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -1152,23 +1152,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index 10fa67584..3afb088d8 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"
@@ -301,8 +301,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
@@ -331,21 +331,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",
@@ -354,12 +354,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",
@@ -368,20 +368,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",
@@ -390,13 +390,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -405,10 +405,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index e0227231a..51301caf2 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1143,23 +1143,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Imported.Importer.html b/Plausible.Imported.Importer.html
index e22abded5..7a342b07f 100644
--- a/Plausible.Imported.Importer.html
+++ b/Plausible.Imported.Importer.html
@@ -178,30 +178,30 @@ scope of importer logic and is expected to be implemented separately.
In case it's necessary to run the whole import job fully synchronously, the
Plausible.Workers.ImportAnalytics
worker sends an Oban.Notifier
message
-on completion, failure or transient failure of the import.
A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
+on completion, failure or transient failure of the import.A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
site,
user,
start_date: ~D[2005-01-01],
- end_date: Date.utc_today(),
+ end_date: Date.utc_today(),
# this option is necessary to setup the calling process as listener
listen?: true
-)
+)
-import_id = job.args[:import_id]
+import_id = job.args[:import_id]
-receive do
- {:notification, :analytics_imports_jobs, %{"complete" => ^import_id}} ->
- IO.puts("Job completed")
+receive do
+ {:notification, :analytics_imports_jobs, %{"complete" => ^import_id}} ->
+ IO.puts("Job completed")
- {:notification, :analytics_imports_jobs, %{"transient_fail" => ^import_id}} ->
- IO.puts("Job failed transiently")
+ {:notification, :analytics_imports_jobs, %{"transient_fail" => ^import_id}} ->
+ IO.puts("Job failed transiently")
- {:notification, :analytics_imports_jobs, %{"fail" => ^import_id}} ->
- IO.puts("Job failed permanently")
-after
+ {:notification, :analytics_imports_jobs, %{"fail" => ^import_id}} ->
+ IO.puts("Job failed permanently")
+after
15_000 ->
- IO.puts("Job didn't finish in 15 seconds")
-end
In a more realistic scenario, job scheduling will be done inside a GenServer process
+
IO.puts("Job didn't finish in 15 seconds")
+end
In a more realistic scenario, job scheduling will be done inside a GenServer process
like LiveView, where notifications can be listened for via handle_info/2
.
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 409442b3a..f24c594eb 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1143,23 +1143,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index 5cbdd77f5..92ea04c8a 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -253,14 +253,14 @@ Pages
Examples:
-
iex> Filters.parse("{\"page\":\"/blog/**\"}")
-%{"event:page" => {:matches, "/blog/**"}}
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+%{"event:page" => {:matches, "/blog/**"}}
-iex> Filters.parse("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> Filters.parse("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
-iex> Filters.parse(nil)
-%{}
+iex> Filters.parse(nil)
+%{}
diff --git a/Plausible.TestUtils.html b/Plausible.TestUtils.html
index 0dfcf92fa..21f2be06f 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -375,7 +375,7 @@ Pages
await_clickhouse_count(query, expected)
-
+
View Source
@@ -555,7 +555,7 @@ Pages
eventually(expectation, wait_time_ms \\ 50, retries \\ 10)
-
+
View Source
@@ -735,7 +735,7 @@ Pages
random_ip()
-
+
View Source
@@ -757,7 +757,7 @@ Pages
relative_time(shifts)
-
+
View Source
@@ -803,7 +803,7 @@ Pages
to_naive_truncate(dt)
-
+
View Source
diff --git a/Plausible.epub b/Plausible.epub
index 40f72a482eff931c2620249c44086a27baee5344..6e0cc442dbad57b01f71f3bc4dd975211e0ed444 100644
GIT binary patch
delta 132497
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