From 8ef9f4ac5794f54b267540d9f4c0d6b502bf155f 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 2b577889e..459931eb8 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 76f4b4506..e338be6c2 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 074bff4aa..34a62ad90 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 aef74bda6..66e491da0 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 b3e9cc90a..97396b607 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 3a48d66bc..0c110c845 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 1e0c5d7fb7d59b0ea03bc92c1a2282d9fadec1b7..982777ce9db606e9622b4d7a204ff8484a08e0d9 100644
GIT binary patch
delta 110434
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