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