From a876f6cf2ef34a1f0a5d2094b5a7fd8c2303ac46 Mon Sep 17 00:00:00 2001
From: RobertJoonas
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 b1a71bbc2..624234c72 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 c832aed78..9048329e1 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 8356b511c..c140b7d5a 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 6d892f751..e2fab02c7 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 2b6f73a4d..1aed84656 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 3601368fa..1fd0ccc07 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 a805300fcf6ee859d3d0e8de42cac4de616097d8..b6afcf511cf9c954b53abca57e5988474da8f695 100644
GIT binary patch
delta 107059
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