From 517db089535750ebe2a735a2e72a2dc8989f6cef Mon Sep 17 00:00:00 2001
From: vinibrsl
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Cldr.LanguageTag
.
The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -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 f70f3e092..926bd95af 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 ab23c9246..5ea066703 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 7af0dfdf2..6b6e7ac20 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 f4f57dbeb..43ab8f22e 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 65be910aa..ad3a84507 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 c789b6600..00396fe78 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 b7eb64e6152a349c5cd5964eb54f729f40cba152..dd1077eace8fbee51ac003594acb8a32d866741e 100644
GIT binary patch
delta 115221
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