From 0c9b71f547b3e686c740b258532208fa842800dc Mon Sep 17 00:00:00 2001
From: vinibrsl
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Cldr.LanguageTag
.
The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -234,54 +234,54 @@ a configurediex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
-{:error,
- {Cldr.NoMatchingLocale,
- "No configured locale could be matched to \"xx,yy;q=0.3\""}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
+{:error,
+ {Cldr.NoMatchingLocale,
+ "No configured locale could be matched to \"xx,yy;q=0.3\""}}
-iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
- ]}
+ transform: %{},
+ language_variants: []
+ }}
+ ]}
-iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
-{:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
+{:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
- ]}
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+ ]}
iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
-]
+ transform: %{},
+ language_variants: []
+ }}
+]
Plausible.Cldr.AcceptLanguage.parse! "invalid_tag"
** (Cldr.AcceptLanguageError) "Expected a BCP47 language tag. Could not parse the remaining "g" starting at position 11
(ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-]
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+]
:all
. See FJD: %Cldr.Currency{
+ %{ FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -406,12 +406,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
- },
- SUR: %Cldr.Currency{
+ },
+ SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -421,7 +421,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -472,11 +472,11 @@ The default is :all
. See FJD: %Cldr.Currency{
+ => %{FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -486,12 +486,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
-},
-SUR: %Cldr.Currency{
+},
+SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -501,7 +501,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -559,13 +559,13 @@ or a
Examples
-iex> Plausible.Cldr.Currency.currency_for_code("AUD")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("AUD")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -573,15 +573,15 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}}
+}}
-iex> Plausible.Cldr.Currency.currency_for_code("THB")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("THB")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -589,7 +589,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -648,12 +648,12 @@ or a
Examples
-iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -661,14 +661,14 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}
+}
-iex> Plausible.Cldr.Currency.currency_for_code!("THB")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("THB")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -676,7 +676,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -717,11 +717,11 @@ or a
Examples
-iex> {:ok, locale} = Plausible.Cldr.validate_locale "en"
+iex> {:ok, locale} = Plausible.Cldr.validate_locale "en"
iex> Plausible.Cldr.Currency.currency_from_locale locale
:USD
-iex> {:ok, locale} = Plausible.Cldr.validate_locale "en-AU"
+iex> {:ok, locale} = Plausible.Cldr.validate_locale "en-AU"
iex> Plausible.Cldr.Currency.currency_from_locale locale
:AUD
@@ -770,13 +770,13 @@ or a
iex> MyApp.Cldr.Currency.currency_history_for_locale "en"
-{:ok,
- %{
- USD: %{from: ~D[1792-01-01], to: nil},
- USN: %{tender: false},
- USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
- }
-}
+
{:ok,
+ %{
+ USD: %{from: ~D[1792-01-01], to: nil},
+ USN: %{tender: false},
+ USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
+ }
+}
@@ -836,8 +836,8 @@ The default is :all
. See MyApp.Cldr.Currency.currency_strings "en"
-=> {:ok,
- %{
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -847,7 +847,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
:all
. See MyApp.Cldr.Currency.currency_strings! "en"
-=> %{
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -917,7 +917,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ iex> Plausible.Cldr.Currency.current_territory_currencies()
0.05
. Optional.iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
+{:ok,
+ %Cldr.Currency{
alt_code: :XAE,
cash_digits: 0,
cash_rounding: nil,
code: :XAE,
- count: %{other: "Custom Name"},
+ count: %{other: "Custom Name"},
digits: 0,
from: nil,
iso_digits: 0,
@@ -1266,11 +1266,11 @@ such as 0.05
. Optional.symbol
: "XAE",
tender: false,
to: nil
- }}
-iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
-{:error, "Required options are missing. Required options are [:name, :digits]"}
-iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
-{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
+ }}
+iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
+{:error, "Required options are missing. Required options are [:name, :digits]"}
+iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
+{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
Plaus
Examples
iex> Plausible.Cldr.Currency.pluralize 1, :USD
-{:ok, "US dollar"}
+{:ok, "US dollar"}
iex> Plausible.Cldr.Currency.pluralize 3, :USD
-{:ok, "US dollars"}
+{:ok, "US dollars"}
iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "zh"
-{:ok, "美元"}
+{:ok, "美元"}
iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "fr"
-{:ok, "dollars des États-Unis"}
+{:ok, "dollars des États-Unis"}
iex> Plausible.Cldr.Currency.pluralize 1, :USD, locale: "fr"
-{:ok, "dollar des États-Unis"}
+{:ok, "dollar des États-Unis"}
iex> MyApp.Cldr.Currency.strings_for_currency :AUD, "en"
-["a$", "australian dollars", "aud", "australian dollar"]
+["a$", "australian dollars", "aud", "australian dollar"]
iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
-{:ok, [:"fr-CA", :fr, :"en-001", :en]}
+In these examples the default locale is :"en-001"
.
iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
+{:ok, [:"fr-CA", :fr, :"en-001", :en]}
# 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, :"en-001", :en]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
+{:ok, [:nb, :no, :"en-001", :en]}
Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
-=> {:ok,
- [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
- #Cldr.LanguageTag<en [validated]>]}
+In these examples the default locale is :"en-001"
.
Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
+=> {:ok,
+ [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
+ #Cldr.LanguageTag<en [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<en [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:nb))
+=> {:ok,
+ [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
+ #Cldr.LanguageTag<en [validated]>]}
iex> Cldr.Locale.territory_from_host("a.b.com.au")
+{:ok, :AU}
-iex> Cldr.Locale.territory_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Cldr.Locale.territory_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
:zero
, iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"few"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
-{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
+iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
+{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
"0 billion", "0 million", "0 thousand",
"0 trillion", "00 billion", "00 million", "00 thousand", "00 trillion",
"000 billion", "000 million", "000 thousand", "000 trillion", "000B", "000K",
@@ -508,7 +508,7 @@ the known formats at compile time. Its use is not otherwise recommended."¤#,##0.00", "¤#,##0.00;(¤#,##0.00)", "¤000B", "¤000K", "¤000M",
"¤000T", "¤00B", "¤00K", "¤00M", "¤00T", "¤0B", "¤0K", "¤0M", "¤0T",
"¤ #,##0.00", "¤ #,##0.00;(¤ #,##0.00)", "¤ 000B", "¤ 000K", "¤ 000M",
- "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
+ "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
Plausible.Cld
Examples
iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
-{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
+{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
Plausible.Cld
Examples
iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
-%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
+%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
percent: "#,##0 %",
scientific: "#E0",
standard: "#,##0.###"
- currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
- {"10000", [one: "00 k ¤", other: "00 k ¤"]},
- {"100000", [one: "000 k ¤", other: "000 k ¤"]},
- {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
- {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
- {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
- {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
- {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
- {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
- {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
- {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
- {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
+ currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
+ {"10000", [one: "00 k ¤", other: "00 k ¤"]},
+ {"100000", [one: "000 k ¤", other: "000 k ¤"]},
+ {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
+ {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
+ {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
+ {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
+ {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
+ {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
+ {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
+ {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
+ {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
...
}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
-{:ok, 1}
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
+{:ok, 1}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
1
:zero
, iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.Symbol.html b/Plausible.Cldr.Number.Symbol.html
index f84f7259e..314e0b37e 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -351,9 +351,9 @@ is Plausible.Cld
Example:
-iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
-{:ok, %{
- latn: %Cldr.Number.Symbol{
+iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
+{:ok, %{
+ latn: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -366,8 +366,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- },
- thai: %Cldr.Number.Symbol{
+ },
+ thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -380,8 +380,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- }
- }}
+ }
+ }}
diff --git a/Plausible.Cldr.Number.System.html b/Plausible.Cldr.Number.System.html
index 771b67376..2f2573592 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -290,23 +290,23 @@ it is returned as is.iex> Plausible.Cldr.Number.System.number_system_for "th", :latn
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :default
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "he", :traditional
-{:ok, %{rules: "hebrew", type: :algorithmic}}
+{:ok, %{rules: "hebrew", type: :algorithmic}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :native
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :finance
-{
+{
:error,
- {Cldr.UnknownNumberSystemError,
- "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
-}
+ {Cldr.UnknownNumberSystemError,
+ "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
+}
iex> Plausible.Cldr.Number.System.number_system_names_for "en"
-{:ok, [:latn]}
+{:ok, [:latn]}
iex> Plausible.Cldr.Number.System.number_system_names_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
iex> Plausible.Cldr.Number.System.number_systems_for "en"
-{:ok, %{default: :latn, native: :latn}}
+{:ok, %{default: :latn, native: :latn}}
iex> Plausible.Cldr.Number.System.number_systems_for "th"
-{:ok, %{default: :latn, native: :thai}}
+{:ok, %{default: :latn, native: :thai}}
iex> Plausible.Cldr.Number.System.number_systems_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
-{
+iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
+{
:error,
- {Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
-}
Note that return value is not guaranteed to be a valid +
{Cldr.UnknownNumberSystemError, "The number system :nope is unknown"} +}Note that return value is not guaranteed to be a valid number system for the given locale as demonstrated in the third example.
To configure these transliteration pairs, add the to the use Cldr
configuration
-in a backend module:
defmodule MyApp.Cldr do
+in a backend module:defmodule MyApp.Cldr do
use Cldr,
- locale: ["en", "fr", "th"],
+ locale: ["en", "fr", "th"],
default_locale: "en",
- precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
-end
Where each tuple in the list configures one transliteration map. In this example, two maps are
+
precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
+end
Where each tuple in the list configures one transliteration map. In this example, two maps are
configured: from :latn
to :thai
and from :arab
to :thai
.
A list of configurable number systems is returned by Cldr.Number.System.systems_with_digits/0
.
If a transliteration is requested between two number pairs that have not been configured for precompilation, a warning is logged.
Examples
iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
"123556"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
"123 556,000"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
"123556"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
"๑๒๓๕๕๖"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
"๑๒๓๕๕๖"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
"Some number is: ๑๒๓๕๕๖"
diff --git a/Plausible.Cldr.Number.html b/Plausible.Cldr.Number.html
index a35c9e581..7ea78e4c9 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -414,19 +414,19 @@ using the Elixir standard library functions.
Examples
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
-{:ok, 1000.34}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
+{:ok, 1000.34}
-iex> Plausible.Cldr.Number.parse("-1_000_000.34")
-{:ok, -1000000.34}
+iex> Plausible.Cldr.Number.parse("-1_000_000.34")
+{:ok, -1000000.34}
-iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
-{:ok, 1000}
+iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
+{:ok, 1000}
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
-{:error,
- {Cldr.Number.ParseError,
- "The string \"+1.000,34\" could not be parsed as a number"}}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
+{:error,
+ {Cldr.Number.ParseError,
+ "The string \"+1.000,34\" could not be parsed as a number"}}
@@ -498,17 +498,17 @@ financial instruments.
Examples
-iex> Plausible.Cldr.Number.scan("100 US dollars")
+iex> Plausible.Cldr.Number.scan("100 US dollars")
...> |> Plausible.Cldr.Number.resolve_currencies
-[100, :USD]
+[100, :USD]
-iex> Plausible.Cldr.Number.scan("100 eurosports")
-...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
-[100, :EUR]
+iex> Plausible.Cldr.Number.scan("100 eurosports")
+...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
+[100, :EUR]
-iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
-...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
-[100, :USD]
+iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
+...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
+[100, :USD]
@@ -585,19 +585,19 @@ financial instruments.iex> Plausible.Cldr.Number.resolve_currency("US dollars")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("US dollars")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
-[:EUR]
+iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
+[:EUR]
-iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
-{:error,
- {Cldr.UnknownCurrencyError,
- "The currency \"not a known currency\" is unknown or not supported"}}
+iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
+{:error,
+ {Cldr.UnknownCurrencyError,
+ "The currency \"not a known currency\" is unknown or not supported"}}
options[:backend].get_locale()
Examples
iex> Plausible.Cldr.Number.resolve_per "11%"
-["11", :percent]
+["11", :percent]
iex> Plausible.Cldr.Number.resolve_per "% of linguists"
-[:percent, " of linguists"]
+[:percent, " of linguists"]
iex> Plausible.Cldr.Number.resolve_per "% of linguists %"
-[:percent, " of linguists ", :percent]
+[:percent, " of linguists ", :percent]
options[:backend].get_locale()
Examples
-iex> Plausible.Cldr.Number.scan("100%")
-...> |> Plausible.Cldr.Number.resolve_pers()
-[100, :percent]
+iex> Plausible.Cldr.Number.scan("100%")
+...> |> Plausible.Cldr.Number.resolve_pers()
+[100, :percent]
iex> Plausible.Cldr.Number.scan("£1_000_000.34")
+["£", 1000000.34]
-iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
-["I want £", 1000000, " dollars"]
+iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
+["I want £", 1000000, " dollars"]
-iex> Plausible.Cldr.Number.scan("The prize is 23")
-["The prize is ", 23]
+iex> Plausible.Cldr.Number.scan("The prize is 23")
+["The prize is ", 23]
-iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
-["The lottery number is ", 23, " for the next draw"]
+iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
+["The lottery number is ", 23, " for the next draw"]
-iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
-["The loss is ", -1000, " euros"]
+iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
+["The loss is ", -1000, " euros"]
iex> Plausible.Cldr.Number.to_range_string 1234..5678
-{:ok, "1,234–5,678"}
+{:ok, "1,234–5,678"}
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
...> string, :currency_symbol -> "<span class=\"symbol\">" <> string <> "</span>"
...> string, :number -> "<span class=\"number\">" <> string <> "</span>"
...> string, :currency_space -> "<span>" <> string <> "</span>"
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3
+
It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3
function if wrapping HTML tags since these will ensure HTML entities are
-correctly encoded. For example:
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
-...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
-...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
-...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
+correctly encoded. For example:iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
+...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
+...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
+...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include
+
...> end)
+{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include a currency symbol, a literal string, inserted text between a currency symbol and the currency amount, a percent sign, the number itself and several other elements. In some cases it is helpful to be apply specific formatting to each element. @@ -1141,80 +1141,80 @@ inserted in the final formatted number.
errors
ErrorsAn error tuple {:error, reason}
will be returned if an error is detected.
-The two most likely causes of an error return are:
iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
- {:error, {Cldr.FormatCompileError,
- "Decimal format compiler: syntax error before: \"#\""}}
locale
and
+The two most likely causes of an error return are: iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
+ {:error, {Cldr.FormatCompileError,
+ "Decimal format compiler: syntax error before: \"#\""}}
locale
and
number_system
. This happens typically when the number system is
:algorithmic
rather than the more common :numeric
. In this case the error
-return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr")
- {:error, {Cldr.UnknownFormatError,
- "The locale :he with number system :hebr does not define a format :standard"}}
+return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr")
+ {:error, {Cldr.UnknownFormatError,
+ "The locale :he with number system :hebr does not define a format :standard"}}
Functions to implement the number system rule-based-number-format rules of CLDR.
These rules are defined only on the "und" locale and represent specialised number formatting.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
-[:zz_default, :tamil, :roman_upper, :roman_lower, :hebrew_item,
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
+[:zz_default, :tamil, :roman_upper, :roman_lower, :hebrew_item,
:hebrew, :greek_upper, :greek_lower, :georgian,
- :ethiopic, :cyrillic_lower, :armenian_upper, :armenian_lower]
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"}
+ :ethiopic, :cyrillic_lower, :armenian_upper, :armenian_lower]
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")
-[
+iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
+[
:digits_ordinal_masculine_plural,
:digits_ordinal_masculine,
:digits_ordinal_feminine_plural,
:digits_ordinal_feminine,
:digits_ordinal
-]
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")
-[:spellout_ordinal_verbose, :spellout_ordinal, :spellout_numbering_year,
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
+[:spellout_ordinal_verbose, :spellout_ordinal, :spellout_numbering_year,
:spellout_numbering_verbose, :spellout_numbering, :spellout_cardinal_verbose,
- :spellout_cardinal]
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"}
+ :spellout_cardinal]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
+"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
+{:ok, "one hundred twenty-three"}
iex> Plausible.Cldr.default_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.default_locale()
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}
+ transform: %{},
+ language_variants: []
+}
iex> Plausible.Cldr.default_territory()
:"001"
iex> Plausible.Cldr.ellipsis "And furthermore"
"And furthermore…"
-iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja
+iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja
"And furthermore…there is much to be done"
iex> Plausible.Cldr.ellipsis "And furthermore", format: :word
"And furthermore …"
-iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja, format: :word
+iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja, format: :word
"And furthermore … there is much to be done"
@@ -677,23 +677,23 @@ take an optional locale parameter for which a locale is not supplied.iex> Plausible.Cldr.put_locale("pl")
+iex> Plausible.Cldr.put_locale("pl")
iex> Plausible.Cldr.get_locale
-%Cldr.LanguageTag{
+%Cldr.LanguageTag{
backend: Elixir.Plausible.Cldr,
canonical_locale_name: "pl",
cldr_locale_name: :pl,
- extensions: %{},
+ extensions: %{},
language: "pl",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :pl,
territory: :PL,
requested_locale_name: "pl",
script: :Latn,
- transform: %{},
- language_variants: []
- }
+ transform: %{},
+ language_variants: []
+ }
iex> Plausible.Cldr.known_gettext_locale_name?("en")
true
-iex> Plausible.Cldr.known_gettext_locale_name?("!!")
+iex> Plausible.Cldr.known_gettext_locale_name?("!!")
false
iex> Plausible.Cldr.known_locale_name?(:en)
true
-iex> Plausible.Cldr.known_locale_name?(:"!!")
+iex> Plausible.Cldr.known_locale_name?(:"!!")
false
@@ -1006,7 +1006,7 @@ in this module or in iex> Plausible.Cldr.known_number_system_types
-[:default, :finance, :native, :traditional]
+iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
true
-iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
+iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
false
iex> Plausible.Cldr.put_locale("en")
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.put_locale("en")
+{:ok,
+ %Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.put_locale("invalid-locale!")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
+iex> Plausible.Cldr.put_locale("invalid-locale!")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
iex> Plausible.Cldr.validate_locale(:en)
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale("zzz")
-{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
+iex> Plausible.Cldr.validate_locale("zzz")
+{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
In the case of a DB-IP database:
iex> database_type()
-"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
+ In the case of a DB-IP database:
iex> database_type()
+"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
"GeoLite2-City"
@@ -274,8 +274,8 @@ asynchronously.
Examples
- Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
-:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
+ Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
+:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
:ok
@@ -304,21 +304,21 @@ asynchronously.
Examples
-iex> lookup("8.7.6.5")
-%{
- "city" => %{
+iex> lookup("8.7.6.5")
+%{
+ "city" => %{
"geoname_id" => 5349755,
- "names" => %{
+ "names" => %{
"de" => "Fontana",
"en" => "Fontana",
"ja" => "フォンタナ",
"ru" => "Фонтана"
- }
- },
- "continent" => %{
+ }
+ },
+ "continent" => %{
"code" => "NA",
"geoname_id" => 6255149,
- "names" => %{
+ "names" => %{
"de" => "Nordamerika",
"en" => "North America",
"es" => "Norteamérica",
@@ -327,12 +327,12 @@ asynchronously."pt-BR" => "América do Norte",
"ru" => "Северная Америка",
"zh-CN" => "北美洲"
- }
- },
- "country" => %{
+ }
+ },
+ "country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -341,20 +341,20 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "location" => %{
+ }
+ },
+ "location" => %{
"accuracy_radius" => 50,
"latitude" => 34.1211,
"longitude" => -117.4362,
"metro_code" => 803,
"time_zone" => "America/Los_Angeles"
- },
- "postal" => %{"code" => "92336"},
- "registered_country" => %{
+ },
+ "postal" => %{"code" => "92336"},
+ "registered_country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -363,13 +363,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -378,10 +378,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index 473906033..d149007f7 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1116,23 +1116,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 2ee4e7a77..d81cabd15 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1116,23 +1116,23 @@ pool to disconnect within the given interval.
See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Stats.FilterParser.html b/Plausible.Stats.FilterParser.html
index 2889197b7..817a18214 100644
--- a/Plausible.Stats.FilterParser.html
+++ b/Plausible.Stats.FilterParser.html
@@ -180,14 +180,14 @@ Functions
Examples:
-
iex> FilterParser.parse_filters("{\"page\":\"/blog/**\"}")
-%{"page" => "/blog/**"}
+iex> FilterParser.parse_filters("{\"page\":\"/blog/**\"}")
+%{"page" => "/blog/**"}
-iex> FilterParser.parse_filters("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> FilterParser.parse_filters("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
-iex> FilterParser.parse_filters(nil)
-%{}
+iex> FilterParser.parse_filters(nil)
+%{}
diff --git a/Plausible.epub b/Plausible.epub
index d1e4fb80d55c4be0cd8b87072386d933091e5103..ccda9b0f0053b6d36a7d011f2a944603e9542a36 100644
GIT binary patch
delta 114393
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