From cf88055a4192784803f1a0537e26d848449536ee Mon Sep 17 00:00:00 2001
From: ukutaht
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."
@@ -232,54 +232,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,
@@ -404,12 +404,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,
@@ -419,7 +419,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -470,11 +470,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,
@@ -484,12 +484,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,
@@ -499,7 +499,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -557,13 +557,13 @@ or a
-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",
@@ -571,15 +571,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",
@@ -587,7 +587,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -646,12 +646,12 @@ or a
-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",
@@ -659,14 +659,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",
@@ -674,7 +674,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -715,11 +715,11 @@ or a
-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
@@ -768,13 +768,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]}
+ }
+}
@@ -834,8 +834,8 @@ The default is :all
. See MyApp.Cldr.Currency.currency_strings "en"
-=> {:ok,
- %{
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -845,7 +845,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,
@@ -915,7 +915,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,
@@ -1264,11 +1264,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
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",
@@ -506,7 +506,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 d7b5ff93e..1b5f87aa4 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -349,9 +349,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: ",",
@@ -364,8 +364,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- },
- thai: %Cldr.Number.Symbol{
+ },
+ thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -378,8 +378,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 bcb8f6237..602673743 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -288,23 +288,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.
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 dc75b2efd..d221c9120 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -412,19 +412,19 @@ using the Elixir standard library functions.
-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"}}
@@ -496,17 +496,17 @@ financial instruments.
-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]
@@ -583,19 +583,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()
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. @@ -1139,80 +1139,80 @@ inserted in the final formatted number.
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")
- {: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"
@@ -675,23 +675,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
@@ -1004,7 +1004,7 @@ in this module or in iex> Plausible.Cldr.known_number_system_types
-[:default, :finance, :native, :traditional]
+[: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"
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
@@ -302,21 +302,21 @@ asynchronously.
-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",
@@ -325,12 +325,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",
@@ -339,20 +339,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",
@@ -361,13 +361,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -376,10 +376,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index bb101c980..333fa204f 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1114,23 +1114,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 fed16b520..6a633c764 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1114,23 +1114,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 34a67b155..741f8334f 100644
--- a/Plausible.Stats.FilterParser.html
+++ b/Plausible.Stats.FilterParser.html
@@ -178,14 +178,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.epub b/Plausible.epub
index cea3aacf9b21a9f79c67fea1fa69e82d342504b4..0b3e57820e41203695355ec6702d02014439996e 100644
GIT binary patch
delta 120193
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