From a222fdac1c4d24cbc47c06718b5c97e676a20f93 Mon Sep 17 00:00:00 2001
From: aerosol
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 0f916eb95..db024e011 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 8c34cc4ae..5a6916ed2 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 b7bde2833..48f3bd26a 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 473dbb6e3..75a031dc9 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 76b022fc4..d08db53cb 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 b5d1ba444..4d7967235 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 441d55000..8083e11a8 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 680b2f26a..6c9dbcdc2 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 57c7dee3b..7bd69d638 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 6cb1171bd..055b5c86d 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 afd31fba2..e5b682180 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.IngestRepo.html b/Plausible.IngestRepo.html
index d840595e9..8264ecb41 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.FilterParser.html b/Plausible.Stats.FilterParser.html
index 50a6c66a7..043d79333 100644
--- a/Plausible.Stats.FilterParser.html
+++ b/Plausible.Stats.FilterParser.html
@@ -207,14 +207,14 @@ Pages
Examples:
-
iex> FilterParser.parse_filters("{\"page\":\"/blog/**\"}")
-%{"page" => "/blog/**"}
+iex> FilterParser.parse_filters("{\"page\":\"/blog/**\"}")
+%{"page" => "/blog/**"}
-iex> FilterParser.parse_filters("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> FilterParser.parse_filters("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
-iex> FilterParser.parse_filters(nil)
-%{}
+iex> FilterParser.parse_filters(nil)
+%{}
diff --git a/Plausible.epub b/Plausible.epub
index 3ed34930d2ce7d1c65097036464b28eb4cd3363f..d42d55cd470b4d735ef643ca53f2cefa72d46173 100644
GIT binary patch
delta 125372
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