From 1fc8faa9a81ced203e2147fc9190f42c4555b402 Mon Sep 17 00:00:00 2001
From: aerosol
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Cldr.LanguageTag
.
The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -232,54 +232,54 @@ a configurediex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
-{:error,
- {Cldr.NoMatchingLocale,
- "No configured locale could be matched to \"xx,yy;q=0.3\""}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
+{:error,
+ {Cldr.NoMatchingLocale,
+ "No configured locale could be matched to \"xx,yy;q=0.3\""}}
-iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
- ]}
+ transform: %{},
+ language_variants: []
+ }}
+ ]}
-iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
-{:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
+{:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
- ]}
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+ ]}
iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
-]
+ transform: %{},
+ language_variants: []
+ }}
+]
Plausible.Cldr.AcceptLanguage.parse! "invalid_tag"
** (Cldr.AcceptLanguageError) "Expected a BCP47 language tag. Could not parse the remaining "g" starting at position 11
(ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-]
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+]
:all
. See FJD: %Cldr.Currency{
+ %{ FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -404,12 +404,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
- },
- SUR: %Cldr.Currency{
+ },
+ SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -419,7 +419,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -470,11 +470,11 @@ The default is :all
. See FJD: %Cldr.Currency{
+ => %{FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -484,12 +484,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
-},
-SUR: %Cldr.Currency{
+},
+SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -499,7 +499,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -557,13 +557,13 @@ or a
-iex> Plausible.Cldr.Currency.currency_for_code("AUD")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("AUD")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -571,15 +571,15 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}}
+}}
-iex> Plausible.Cldr.Currency.currency_for_code("THB")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("THB")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -587,7 +587,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -646,12 +646,12 @@ or a
-iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -659,14 +659,14 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}
+}
-iex> Plausible.Cldr.Currency.currency_for_code!("THB")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("THB")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -674,7 +674,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -715,11 +715,11 @@ or a
-iex> {:ok, locale} = Plausible.Cldr.validate_locale "en"
+iex> {:ok, locale} = Plausible.Cldr.validate_locale "en"
iex> Plausible.Cldr.Currency.currency_from_locale locale
:USD
-iex> {:ok, locale} = Plausible.Cldr.validate_locale "en-AU"
+iex> {:ok, locale} = Plausible.Cldr.validate_locale "en-AU"
iex> Plausible.Cldr.Currency.currency_from_locale locale
:AUD
@@ -768,13 +768,13 @@ or a
iex> MyApp.Cldr.Currency.currency_history_for_locale "en"
-{:ok,
- %{
- USD: %{from: ~D[1792-01-01], to: nil},
- USN: %{tender: false},
- USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
- }
-}
+
{:ok,
+ %{
+ USD: %{from: ~D[1792-01-01], to: nil},
+ USN: %{tender: false},
+ USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
+ }
+}
@@ -834,8 +834,8 @@ The default is :all
. See MyApp.Cldr.Currency.currency_strings "en"
-=> {:ok,
- %{
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -845,7 +845,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
:all
. See MyApp.Cldr.Currency.currency_strings! "en"
-=> %{
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -915,7 +915,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ iex> Plausible.Cldr.Currency.current_territory_currencies()
0.05
. Optional.iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
+{:ok,
+ %Cldr.Currency{
alt_code: :XAE,
cash_digits: 0,
cash_rounding: nil,
code: :XAE,
- count: %{other: "Custom Name"},
+ count: %{other: "Custom Name"},
digits: 0,
from: nil,
iso_digits: 0,
@@ -1264,11 +1264,11 @@ such as 0.05
. Optional.symbol
: "XAE",
tender: false,
to: nil
- }}
-iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
-{:error, "Required options are missing. Required options are [:name, :digits]"}
-iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
-{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
+ }}
+iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
+{:error, "Required options are missing. Required options are [:name, :digits]"}
+iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
+{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
Plaus
iex> Plausible.Cldr.Currency.pluralize 1, :USD
-{:ok, "US dollar"}
+{:ok, "US dollar"}
iex> Plausible.Cldr.Currency.pluralize 3, :USD
-{:ok, "US dollars"}
+{:ok, "US dollars"}
iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "zh"
-{:ok, "美元"}
+{:ok, "美元"}
iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "fr"
-{:ok, "dollars des États-Unis"}
+{:ok, "dollars des États-Unis"}
iex> Plausible.Cldr.Currency.pluralize 1, :USD, locale: "fr"
-{:ok, "dollar des États-Unis"}
+{:ok, "dollar des États-Unis"}
iex> MyApp.Cldr.Currency.strings_for_currency :AUD, "en"
-["a$", "australian dollars", "aud", "australian dollar"]
+["a$", "australian dollars", "aud", "australian dollar"]
iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
+{:ok, [:"fr-CA", :fr, :und]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
-{:ok, [:nb, :no, :und]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
+{:ok, [:nb, :no, :und]}
Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
+=> {:ok,
+ [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-Plausible.Cldr.Locale.fallback_locales(:nb))
-=> {:ok,
- [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:nb))
+=> {:ok,
+ [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
iex> Cldr.Locale.territory_from_host("a.b.com.au")
+{:ok, :AU}
-iex> Cldr.Locale.territory_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Cldr.Locale.territory_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
:zero
, iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"few"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
-{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
+iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
+{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
"0 billion", "0 million", "0 thousand",
"0 trillion", "00 billion", "00 million", "00 thousand", "00 trillion",
"000 billion", "000 million", "000 thousand", "000 trillion", "000B", "000K",
@@ -506,7 +506,7 @@ the known formats at compile time. Its use is not otherwise recommended."¤#,##0.00", "¤#,##0.00;(¤#,##0.00)", "¤000B", "¤000K", "¤000M",
"¤000T", "¤00B", "¤00K", "¤00M", "¤00T", "¤0B", "¤0K", "¤0M", "¤0T",
"¤ #,##0.00", "¤ #,##0.00;(¤ #,##0.00)", "¤ 000B", "¤ 000K", "¤ 000M",
- "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
+ "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
Plausible.Cld
Examples
iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
-{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
+{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
Plausible.Cld
Examples
iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
-%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
+%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
percent: "#,##0 %",
scientific: "#E0",
standard: "#,##0.###"
- currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
- {"10000", [one: "00 k ¤", other: "00 k ¤"]},
- {"100000", [one: "000 k ¤", other: "000 k ¤"]},
- {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
- {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
- {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
- {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
- {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
- {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
- {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
- {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
- {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
+ currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
+ {"10000", [one: "00 k ¤", other: "00 k ¤"]},
+ {"100000", [one: "000 k ¤", other: "000 k ¤"]},
+ {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
+ {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
+ {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
+ {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
+ {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
+ {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
+ {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
+ {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
+ {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
...
}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
-{:ok, 1}
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
+{:ok, 1}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
1
:zero
, iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.Symbol.html b/Plausible.Cldr.Number.Symbol.html
index 2b43d3983..0cdeb1bc9 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 bfa73dc87..4ccbe7501 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 b0bc14bb6..b8577202a 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 2ae2de632..d046823b1 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 ee569bbe5..5dd9603fa 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 d99d7c1a0..5dc211e4d 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 0f4efcfdae27c3f21b4a4bfd283971ef5f97d969..c4a907df2ba5ac0eaa226708a025ec01088c8b50 100644
GIT binary patch
delta 113561
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