From c68466038dc0f59faf33e6dd5bf8d2360aaf4a53 Mon Sep 17 00:00:00 2001
From: zoldar
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 29cdddf2e..49c2d64f8 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 e56c5e379..962eab06b 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 9d6767509..ab08b7f06 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 ebb64e077..0b8d80b6e 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 1a99b9389..4cf98a976 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 ab302edd3..c5fa2b5c1 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 080424820db962630ccad6bb4c0dd681d63a6e44..baa26033e199b6ec331f01494d69ec5d45403a4b 100644
GIT binary patch
delta 114016
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