From db46827014f996126842f0e160215208f66aae69 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])
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."
@@ -234,54 +234,54 @@ a configurediex> 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"}}
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"}}
+ ]}
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"}}
+]
: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,
@@ -406,12 +406,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,
@@ -421,7 +421,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -472,11 +472,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,
@@ -486,12 +486,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,
@@ -501,7 +501,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -559,13 +559,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",
@@ -573,15 +573,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",
@@ -589,7 +589,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -648,12 +648,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",
@@ -661,14 +661,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",
@@ -676,7 +676,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -717,11 +717,11 @@ 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
@@ -770,13 +770,13 @@ or a
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]}
- }
-}
+
{:ok,
+ %{
+ USD: %{from: ~D[1792-01-01], to: nil},
+ USN: %{tender: false},
+ USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
+ }
+}
@@ -836,8 +836,8 @@ The default is :all
. See MyApp.Cldr.Currency.currency_strings "en"
-=> {:ok,
- %{
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -847,7 +847,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
:all
. See MyApp.Cldr.Currency.currency_strings! "en"
-=> %{
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -917,7 +917,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ iex> Plausible.Cldr.Currency.current_territory_currencies()
0.05
. Optional.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,
@@ -1266,11 +1266,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."}}
Plaus
Examples
iex> Plausible.Cldr.Currency.pluralize 1, :USD
-{:ok, "US dollar"}
+{:ok, "US dollar"}
iex> Plausible.Cldr.Currency.pluralize 3, :USD
-{:ok, "US dollars"}
+{:ok, "US dollars"}
iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "zh"
-{:ok, "美元"}
+{:ok, "美元"}
iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "fr"
-{:ok, "dollars des États-Unis"}
+{:ok, "dollars des États-Unis"}
iex> Plausible.Cldr.Currency.pluralize 1, :USD, locale: "fr"
-{:ok, "dollar des États-Unis"}
+{:ok, "dollar des États-Unis"}
iex> MyApp.Cldr.Currency.strings_for_currency :AUD, "en"
-["a$", "australian dollars", "aud", "australian dollar"]
+["a$", "australian dollars", "aud", "australian dollar"]
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]}
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]>]}
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\""}}
:zero
, 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"
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",
@@ -508,7 +508,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
, 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 89e445a6a..0d8820aa6 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -351,9 +351,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: ",",
@@ -366,8 +366,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- },
- thai: %Cldr.Number.Symbol{
+ },
+ thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -380,8 +380,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 d7d0b4a65..126a2d072 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -290,23 +290,23 @@ it is returned as is.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}"}
+}
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"}}
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"}}
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.
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.systems_with_digits/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 2fcca4e80..547cc8e86 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -414,19 +414,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"}}
@@ -498,17 +498,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]
@@ -585,19 +585,19 @@ financial instruments.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"}}
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]
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("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_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. @@ -1141,80 +1141,80 @@ inserted in the final formatted number.
errors
ErrorsAn 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")
- {:error, {Cldr.UnknownFormatError,
- "The locale :he with number system :hebr does not define a format :standard"}}
+return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr")
+ {:error, {Cldr.UnknownFormatError,
+ "The locale :he with number system :hebr does not define a format :standard"}}
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,
@@ -132,9 +132,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,
@@ -126,9 +126,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()
:"001"
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
"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"
@@ -677,23 +677,23 @@ take an optional locale parameter for which a locale is not supplied.iex> Plausible.Cldr.put_locale("pl")
+iex> Plausible.Cldr.put_locale("pl")
iex> Plausible.Cldr.get_locale
-%Cldr.LanguageTag{
+%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: []
+ }
iex> Plausible.Cldr.known_gettext_locale_name?("en")
true
-iex> Plausible.Cldr.known_gettext_locale_name?("!!")
+iex> Plausible.Cldr.known_gettext_locale_name?("!!")
false
iex> Plausible.Cldr.known_locale_name?(:en)
true
-iex> Plausible.Cldr.known_locale_name?(:"!!")
+iex> Plausible.Cldr.known_locale_name?(:"!!")
false
@@ -1006,7 +1006,7 @@ in this module or in iex> Plausible.Cldr.known_number_system_types
-[:default, :finance, :native, :traditional]
+iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
true
-iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
+iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
false
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"}}
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"}}
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])
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"
@@ -274,8 +274,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
@@ -304,21 +304,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",
@@ -327,12 +327,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",
@@ -341,20 +341,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",
@@ -363,13 +363,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -378,10 +378,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index 92d40f9bf..49cc6305f 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1116,23 +1116,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 83360d5ff..a76b10f29 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1116,23 +1116,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 e46b08f9a..367f16b65 100644
--- a/Plausible.Stats.FilterParser.html
+++ b/Plausible.Stats.FilterParser.html
@@ -180,14 +180,14 @@ Functions
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.TestUtils.html b/Plausible.TestUtils.html
index 7f8b3a1f6..f8e9918cc 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -302,7 +302,7 @@ Functions
add_imported_data(map)
-
+
View Source
@@ -324,7 +324,7 @@ Functions
await_clickhouse_count(query, expected)
-
+
View Source
@@ -346,7 +346,7 @@ Functions
create_api_key(map)
-
+
View Source
@@ -368,7 +368,7 @@ Functions
create_events(events)
-
+
View Source
@@ -390,7 +390,7 @@ Functions
create_new_site(map)
-
+
View Source
@@ -412,7 +412,7 @@ Functions
create_pageviews(pageviews)
-
+
View Source
@@ -434,7 +434,7 @@ Functions
create_sessions(sessions)
-
+
View Source
@@ -456,7 +456,7 @@ Functions
create_site(map)
-
+
View Source
@@ -478,7 +478,7 @@ Functions
create_user(_)
-
+
View Source
@@ -504,7 +504,7 @@ Functions
eventually(expectation, wait_time_ms \\ 50, retries \\ 10)
-
+
View Source
@@ -526,7 +526,7 @@ Functions
init_session(conn)
-
+
View Source
@@ -548,7 +548,7 @@ Functions
log_in(map)
-
+
View Source
@@ -594,7 +594,7 @@ Functions
populate_stats(events)
-
+
View Source
@@ -616,7 +616,7 @@ Functions
populate_stats(site, events)
-
+
View Source
@@ -638,7 +638,7 @@ Functions
relative_time(shifts)
-
+
View Source
@@ -660,7 +660,7 @@ Functions
setup_patch_env(env_key, value)
-
+
View Source
@@ -684,7 +684,7 @@ Functions
to_naive_truncate(dt)
-
+
View Source
@@ -706,7 +706,7 @@ Functions
use_api_key(map)
-
+
View Source
diff --git a/Plausible.epub b/Plausible.epub
index e3c3845f34c3da91b5191b3e31fa2b922aa2e45e..9be2772035d6e087acfcc6a0454246d24d83f88c 100644
GIT binary patch
delta 118214
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