From 2e5c85a2e382855a7b0de1f993813f590dacb999 Mon Sep 17 00:00:00 2001
From: aerosol
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Cldr.LanguageTag
.
The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -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 1839821cb..c2a2db46a 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 df5ee6f75..7222225ae 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 242964d53..408f425d9 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 544a529b8..618808c23 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 b91900be8..b13fb7c00 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 046fc2c14..23eeef857 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 1b55a7f185ee3faad094249389ca8bf711a3a0e1..5672ddd8efb2e3373bd648dd58116f0d0e2dfcd3 100644
GIT binary patch
delta 116341
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