From f63ea71ec1a350657745c7b60ccf04b68acbf8ef 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 965e1ce35..c7646d1eb 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 57db257fb..bb0ade8e7 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 d34352437..3a51200b7 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 b8ddde2d8..960bf1c6e 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 8838f6b09..13bec34dd 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 a6e26ee87..9b6a04845 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 7c32415b3..f0a927562 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 54d2f2fd2..154b24440 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 f782efe5a..18d99f737 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 36535012e..ed597e520 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 e649c049f..f3ca1c05d 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 50de7b0b7..7ee70d5b4 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1143,23 +1143,23 @@ pool to disconnect within the given interval.
See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index bda994bf3..047b0eeda 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -245,14 +245,14 @@ Pages
Examples:
-
iex> Filters.parse("{\"page\":\"/blog/**\"}")
-%{"event:page" => {:matches, "/blog/**"}}
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+%{"event:page" => {:matches, "/blog/**"}}
-iex> Filters.parse("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> Filters.parse("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
-iex> Filters.parse(nil)
-%{}
+iex> Filters.parse(nil)
+%{}
diff --git a/Plausible.epub b/Plausible.epub
index a7386fe040c30dcb920992a27439ecf18df4953e..41ece9af9b021416de3deb8f9c114e70a74437cb 100644
GIT binary patch
delta 125908
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