From 965b2574741d4477c04719f3001bf5a632b264cc 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 59b180419..3ff3daaf4 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 ae1026bd4..521c10ea8 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 045d7c22c..3dca103ae 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 94f86f83e..beae0bd58 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 8ff465596..972f9d169 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 9ff595003..97238de8a 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 660e75d5c..f9c50e7aa 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 47bf38c61..b8916b48c 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 70b9bc5bd..fa568997f 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 82c2f8925..6c3b75317 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 73ca7cd09..2bb7b9ebc 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 2bba134e3..96c4b4faf 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 dc6c84b98..e67cffe5d 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 74a15763d5e62ac7031857a1c8cf16cd2b100c02..3a4631147b8492d89f5430812156295ec6bc9053 100644
GIT binary patch
delta 120982
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