From cc6850b001a1bdc04f4fb7223505f90c520f6ec1 Mon Sep 17 00:00:00 2001
From: aerosol Similar to Example: Similar to Example:insert_stream(source_or_schema, rows, opts
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])
the set of natural languages that are preferred as a response to the request.
Language tags function are provided in
Cldr.LanguageTag
.
The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -234,54 +234,54 @@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("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: []
- }}
-
-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"}}
+ 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("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: []
- }}
- ]}
-
-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{
+ 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("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"}}
+]
MyApp.Cldr.Currency.currencies_for_locale "en" => {:ok, - %{
FJD: %Cldr.Currency{
+ %{ FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -406,12 +406,12 @@ currencies_for_locale(locale, only \\ :all,
symbol: "FJD",
tender: true,
to: nil
- },
- SUR: %Cldr.Currency{
+ },
+ SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -421,7 +421,7 @@ currencies_for_locale(locale, only \\ :all,
symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -472,11 +472,11 @@ currencies_for_locale!(locale, only \\ :all
Example
MyApp.Cldr.Currency.currencies_for_locale! "en"
- => %{
FJD: %Cldr.Currency{
+ => %{FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -486,12 +486,12 @@ currencies_for_locale!(locale, only \\ :all
symbol: "FJD",
tender: true,
to: nil
-},
-SUR: %Cldr.Currency{
+},
+SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -501,7 +501,7 @@ currencies_for_locale!(locale, only \\ :all
symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -559,13 +559,13 @@ currency_for_code(currency_or_currency_code
Examples
-iex> Plausible.Cldr.Currency.currency_for_code("AUD")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("AUD")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -573,15 +573,15 @@ currency_for_code(currency_or_currency_code
rounding: 0,
symbol: "A$",
tender: true
-}}
+}}
-iex> Plausible.Cldr.Currency.currency_for_code("THB")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("THB")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -589,7 +589,7 @@ currency_for_code(currency_or_currency_code
rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -648,12 +648,12 @@ currency_for_code!(currency_or_currency_cod
Examples
-iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -661,14 +661,14 @@ currency_for_code!(currency_or_currency_cod
rounding: 0,
symbol: "A$",
tender: true
-}
+}
-iex> Plausible.Cldr.Currency.currency_for_code!("THB")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("THB")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -676,7 +676,7 @@ currency_for_code!(currency_or_currency_cod
rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -717,11 +717,11 @@ currency_from_locale(locale)
Examples
-iex> {:ok, locale} = Plausible.Cldr.validate_locale "en"
+iex> {:ok, locale} = Plausible.Cldr.validate_locale "en"
iex> Plausible.Cldr.Currency.currency_from_locale locale
:USD
-iex> {:ok, locale} = Plausible.Cldr.validate_locale "en-AU"
+iex> {:ok, locale} = Plausible.Cldr.validate_locale "en-AU"
iex> Plausible.Cldr.Currency.currency_from_locale locale
:AUD
@@ -770,13 +770,13 @@ currency_history_for_locale(language_tag)
Example
iex> MyApp.Cldr.Currency.currency_history_for_locale "en"
-{:ok,
- %{
- USD: %{from: ~D[1792-01-01], to: nil},
- USN: %{tender: false},
- USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
- }
-}
+
{:ok,
+ %{
+ USD: %{from: ~D[1792-01-01], to: nil},
+ USN: %{tender: false},
+ USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
+ }
+}
@@ -836,8 +836,8 @@ currency_strings(locale, only \\ :all, exce
Example
MyApp.Cldr.Currency.currency_strings "en"
-=> {:ok,
- %{
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -847,7 +847,7 @@ currency_strings(locale, only \\ :all, exce
"guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+
}}
@@ -907,7 +907,7 @@ currency_strings!(locale_name, only \\ :all
Example
MyApp.Cldr.Currency.currency_strings! "en"
-=> %{
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -917,7 +917,7 @@ currency_strings!(locale_name, only \\ :all
"guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+
}
iex> Plausible.Cldr.Currency.current_territory_currencies()
+iex> Plausible.Cldr.Currency.current_territory_currencies()
iex> Plausible.Cldr.Currency.known_currency_code "AUD"
-{:ok, :AUD}
+{:ok, :AUD}
iex> Plausible.Cldr.Currency.known_currency_code "GGG"
-{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
+{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
+{:ok,
+ %Cldr.Currency{
alt_code: :XAE,
cash_digits: 0,
cash_rounding: nil,
code: :XAE,
- count: %{other: "Custom Name"},
+ count: %{other: "Custom Name"},
digits: 0,
from: nil,
iso_digits: 0,
@@ -1266,11 +1266,11 @@ new(currency, options \\ [])
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."}}
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"]
In these examples the default locale is :"en-001"
.
iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
-{:ok, [:"fr-CA", :fr, :"en-001", :en]}
+In these examples the default locale is :"en-001"
.
iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
+{:ok, [:"fr-CA", :fr, :"en-001", :en]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
-{:ok, [:nb, :no, :"en-001", :en]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
+{:ok, [:nb, :no, :"en-001", :en]}
In these examples the default locale is :"en-001"
.
Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
-=> {:ok,
- [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
- #Cldr.LanguageTag<en [validated]>]}
+In these examples the default locale is :"en-001"
.
Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
+=> {:ok,
+ [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
+ #Cldr.LanguageTag<en [validated]>]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-Plausible.Cldr.Locale.fallback_locales(:nb))
-=> {:ok,
- [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
- #Cldr.LanguageTag<en [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:nb))
+=> {:ok,
+ [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
+ #Cldr.LanguageTag<en [validated]>]}
iex> Plausible.Cldr.Locale.locale_from_host "a.b.com.au"
-Elixir.Plausible.Cldr.validate_locale(:"en-AU")
+Elixir.Plausible.Cldr.validate_locale(:"en-AU")
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
iex> Cldr.Locale.territory_from_host("a.b.com.au")
-{:ok, :AU}
+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\""}}
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"
#=> Plausible.Cldr.Number.Format.Format.decimal_format_list
-["#", "#,##,##0%",
+["#", "#,##,##0%",
"#,##,##0.###", "#,##,##0.00¤", "#,##,##0.00¤;(#,##,##0.00¤)",
"#,##,##0 %", "#,##0%", "#,##0.###", "#,##0.00 ¤",
"#,##0.00 ¤;(#,##0.00 ¤)", "#,##0.00¤", "#,##0.00¤;(#,##0.00¤)",
@@ -451,7 +451,7 @@ decimal_format_list()
"000 B ¤", "000 E ¤", "000 K ¤", "000 MRD ¤", "000 Md ¤", "000 Mio'.' ¤",
"000 Mio ¤", "000 Mld ¤", "000 Mln ¤", "000 Mn ¤", "000 Mrd'.' ¤",
"000 Mrd ¤", "000 Mr ¤", "000 M ¤", "000 NT ¤", "000 N ¤", "000 Tn ¤",
-"000 Tr ¤", ...]
+"000 Tr ¤", ...]
iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
-{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
+iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
+{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
"0 billion", "0 million", "0 thousand",
"0 trillion", "00 billion", "00 million", "00 thousand", "00 trillion",
"000 billion", "000 million", "000 thousand", "000 trillion", "000B", "000K",
@@ -508,7 +508,7 @@ decimal_format_list_for(locale \\ Plausible
"¤#,##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"]}
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}}}
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}}
iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
-{:ok, 1}
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
+{:ok, 1}
iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
1
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 32fdad0daca97..d8f525ffeb7d5 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -351,9 +351,9 @@ number_symbols_for(locale \\ Plausible.Cldr
Example:
-iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
-{:ok, %{
- latn: %Cldr.Number.Symbol{
+iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
+{:ok, %{
+ latn: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -366,8 +366,8 @@ number_symbols_for(locale \\ Plausible.Cldr
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- },
- thai: %Cldr.Number.Symbol{
+ },
+ thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -380,8 +380,8 @@ number_symbols_for(locale \\ Plausible.Cldr
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- }
- }}
+ }
+ }}
diff --git a/Plausible.Cldr.Number.System.html b/Plausible.Cldr.Number.System.html
index 6aad322b8e80a..f40544a09b400 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -290,23 +290,23 @@ number_system_for(locale, system_name)
Examples
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}
+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.
iex> Plausible.Cldr.Number.System.to_system 123456, :hebr
-{:ok, "קכ״ג׳תנ״ו"}
+{:ok, "קכ״ג׳תנ״ו"}
iex> Plausible.Cldr.Number.System.to_system 123, :hans
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hant
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hansfin
-{:ok, "壹佰贰拾叁"}
+{:ok, "壹佰贰拾叁"}
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 6d2e6ae7000ce..5f671ce24eefa 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -414,19 +414,19 @@ parse(string, options \\ [])
Examples
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
-{:ok, 1000.34}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
+{:ok, 1000.34}
-iex> Plausible.Cldr.Number.parse("-1_000_000.34")
-{:ok, -1000000.34}
+iex> Plausible.Cldr.Number.parse("-1_000_000.34")
+{:ok, -1000000.34}
-iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
-{:ok, 1000}
+iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
+{:ok, 1000}
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
-{:error,
- {Cldr.Number.ParseError,
- "The string \"+1.000,34\" could not be parsed as a number"}}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
+{:error,
+ {Cldr.Number.ParseError,
+ "The string \"+1.000,34\" could not be parsed as a number"}}
@@ -498,17 +498,17 @@ resolve_currencies(list, options \\ [])
Examples
-iex> Plausible.Cldr.Number.scan("100 US dollars")
+iex> Plausible.Cldr.Number.scan("100 US dollars")
...> |> Plausible.Cldr.Number.resolve_currencies
-[100, :USD]
+[100, :USD]
-iex> Plausible.Cldr.Number.scan("100 eurosports")
-...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
-[100, :EUR]
+iex> Plausible.Cldr.Number.scan("100 eurosports")
+...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
+[100, :EUR]
-iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
-...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
-[100, :USD]
+iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
+...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
+[100, :USD]
@@ -585,19 +585,19 @@ resolve_currency(string, options \\ [])
Examples
-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"}}
@@ -661,13 +661,13 @@ resolve_per(string, options \\ [])
Examples
iex> Plausible.Cldr.Number.resolve_per "11%"
-["11", :percent]
+["11", :percent]
iex> Plausible.Cldr.Number.resolve_per "% of linguists"
-[:percent, " of linguists"]
+[:percent, " of linguists"]
iex> Plausible.Cldr.Number.resolve_per "% of linguists %"
-[:percent, " of linguists ", :percent]
+ [:percent, " of linguists ", :percent]
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("£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_approx_string 1234
-{:ok, "~1,234"}
+{:ok, "~1,234"}
iex> Plausible.Cldr.Number.to_at_least_string 1234
-{:ok, "1,234+"}
+{:ok, "1,234+"}
iex> Plausible.Cldr.Number.to_at_most_string 1234
-{:ok, "≤1,234"}
+{:ok, "≤1,234"}
iex> Plausible.Cldr.Number.to_range_string 1234..5678
-{:ok, "1,234–5,678"}
+{:ok, "1,234–5,678"}
Wrapping elements is particularly useful when formatting a number with a currency symbol and the requirement is to have different HTML formatting -applied to the symbol than the number. For example:
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
+applied to the symbol than the number. For example: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
+
...> 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
function if wrapping HTML tags since these will ensure HTML entities are
-correctly encoded. For example:
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
-...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
-...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
-...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
+correctly encoded. For example:iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
+...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
+...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
+...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include
+
...> end)
+{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include a currency symbol, a literal string, inserted text between a currency symbol and the currency amount, a percent sign, the number itself and several other elements. In some cases it is helpful to be apply specific formatting to each element. @@ -1141,80 +1141,80 @@
iex> Plausible.Cldr.Number.to_string 12345
-{:ok, "12,345"}
+{:ok, "12,345"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr"
-{:ok, "12 345"}
+{:ok, "12 345"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es", minimum_grouping_digits: 1
-{:ok, "1.345,32 €"}
+{:ok, "1.345,32 €"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es"
-{:ok, "1345,32 €"}
+{:ok, "1345,32 €"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr", currency: "USD"
-{:ok, "12 345,00 $US"}
+{:ok, "12 345,00 $US"}
iex> Plausible.Cldr.Number.to_string 12345, format: "#E0"
-{:ok, "1.2345E4"}
+{:ok, "1.2345E4"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB"
-{:ok, "THB 12,345.00"}
+{:ok, "THB 12,345.00"}
iex> Plausible.Cldr.Number.to_string -12345, format: :accounting, currency: "THB"
-{:ok, "(THB 12,345.00)"}
+{:ok, "(THB 12,345.00)"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th"
-{:ok, "฿12,345.00"}
+{:ok, "฿12,345.00"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th", number_system: :native
-{:ok, "฿๑๒,๓๔๕.๐๐"}
+{:ok, "฿๑๒,๓๔๕.๐๐"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long
-{:ok, "1 thousand"}
+{:ok, "1 thousand"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long, currency: "USD"
-{:ok, "1,244 US dollars"}
+{:ok, "1,244 US dollars"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short
-{:ok, "1K"}
+{:ok, "1K"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short, currency: "EUR"
-{:ok, "€1K"}
+{:ok, "€1K"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout
-{:ok, "one thousand two hundred thirty-four"}
+{:ok, "one thousand two hundred thirty-four"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout_verbose
-{:ok, "one thousand two hundred and thirty-four"}
+{:ok, "one thousand two hundred and thirty-four"}
iex> Plausible.Cldr.Number.to_string 1989, format: :spellout_year
-{:ok, "nineteen eighty-nine"}
+{:ok, "nineteen eighty-nine"}
iex> Plausible.Cldr.Number.to_string 123, format: :ordinal
-{:ok, "123rd"}
+{:ok, "123rd"}
iex> Plausible.Cldr.Number.to_string 123, format: :roman
-{:ok, "CXXIII"}
+{:ok, "CXXIII"}
iex> Plausible.Cldr.Number.to_string 123, locale: "th-u-nu-thai"
-{:ok, "๑๒๓"}
errors
ErrorsAn error tuple {:error, reason}
will be returned if an error is detected.
-The two most likely causes of an error return are:
iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
- {:error, {Cldr.FormatCompileError,
- "Decimal format compiler: syntax error before: \"#\""}}
locale
and
+The two most likely causes of an error return are: iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
+ {:error, {Cldr.FormatCompileError,
+ "Decimal format compiler: syntax error before: \"#\""}}
locale
and
number_system
. This happens typically when the number system is
:algorithmic
rather than the more common :numeric
. In this case the error
-return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr")
- {:error, {Cldr.UnknownFormatError,
- "The locale :he with number system :hebr does not define a format :standard"}}
+return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr")
+ {:error, {Cldr.UnknownFormatError,
+ "The locale :he with number system :hebr does not define a format :standard"}}
iex> Plausible.Cldr.Number.validate_number_system "en", :latn
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :default
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :unknown
-{:error,
- {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
+{:error,
+ {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
iex> Plausible.Cldr.Number.validate_number_system "zz", :default
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
Functions to implement the number system rule-based-number-format rules of CLDR.
These rules are defined only on the "und" locale and represent specialised number formatting.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
-[:zz_default, :tamil, :roman_upper, :roman_lower, :hebrew_item,
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
+[:zz_default, :tamil, :roman_upper, :roman_lower, :hebrew_item,
:hebrew, :greek_upper, :greek_lower, :georgian,
- :ethiopic, :cyrillic_lower, :armenian_upper, :armenian_lower]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
-"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :roman)
-{:ok, "CXXIII"}
+ :ethiopic, :cyrillic_lower, :armenian_upper, :armenian_lower]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
+"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :roman)
+{:ok, "CXXIII"}
Functions to implement the ordinal rule-based-number-format rules of CLDR.
As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
-[:digits_ordinal]
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
+[:digits_ordinal]
-iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
-[
+iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
+[
:digits_ordinal_masculine_plural,
:digits_ordinal_masculine,
:digits_ordinal_feminine_plural,
:digits_ordinal_feminine,
:digits_ordinal
-]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
-"123rd"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
-{:ok, "123rd"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
+"123rd"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
+{:ok, "123rd"}
Functions to implement the spellout rule-based-number-format rules of CLDR.
As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
-[:spellout_ordinal_verbose, :spellout_ordinal, :spellout_numbering_year,
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
+[:spellout_ordinal_verbose, :spellout_ordinal, :spellout_numbering_year,
:spellout_numbering_verbose, :spellout_numbering, :spellout_cardinal_verbose,
- :spellout_cardinal]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
-"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
-{:ok, "one hundred twenty-three"}
+ :spellout_cardinal]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
+"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
+{:ok, "one hundred twenty-three"}
iex> Plausible.Cldr.default_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.default_locale()
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}
+ transform: %{},
+ language_variants: []
+}
iex> Plausible.Cldr.default_territory()
+iex> Plausible.Cldr.default_territory()
:"001"
iex> Plausible.Cldr.ellipsis "And furthermore"
"And furthermore…"
-iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja
+iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja
"And furthermore…there is much to be done"
iex> Plausible.Cldr.ellipsis "And furthermore", format: :word
"And furthermore …"
-iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja, format: :word
+iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja, format: :word
"And furthermore … there is much to be done"
@@ -677,23 +677,23 @@ 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")
+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)
+iex> Plausible.Cldr.known_locale_name?(:en)
true
-iex> Plausible.Cldr.known_locale_name?(:"!!")
+iex> Plausible.Cldr.known_locale_name?(:"!!")
false
@@ -1006,7 +1006,7 @@ known_number_system_types()
Example
iex> Plausible.Cldr.known_number_system_types
-[:default, :finance, :native, :traditional]
+[:default, :finance, :native, :traditional]
iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
+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{
+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"}}
iex> Plausible.Cldr.validate_number_system_type :default
-{:ok, :default}
+{:ok, :default}
iex> Plausible.Cldr.validate_number_system_type :traditional
-{:ok, :traditional}
+{:ok, :traditional}
iex> Plausible.Cldr.validate_number_system_type :latn
-{
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
+}
iex> Plausible.Cldr.validate_number_system_type "bork"
-{
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
+}
Similar to insert_all/2
but with the following differences:
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])
Similar to insert_all/2
but with the following differences:
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])
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
@@ -304,21 +304,21 @@ lookup(ip_address)
Examples
-iex> lookup("8.7.6.5")
-%{
- "city" => %{
+iex> lookup("8.7.6.5")
+%{
+ "city" => %{
"geoname_id" => 5349755,
- "names" => %{
+ "names" => %{
"de" => "Fontana",
"en" => "Fontana",
"ja" => "フォンタナ",
"ru" => "Фонтана"
- }
- },
- "continent" => %{
+ }
+ },
+ "continent" => %{
"code" => "NA",
"geoname_id" => 6255149,
- "names" => %{
+ "names" => %{
"de" => "Nordamerika",
"en" => "North America",
"es" => "Norteamérica",
@@ -327,12 +327,12 @@ lookup(ip_address)
"pt-BR" => "América do Norte",
"ru" => "Северная Америка",
"zh-CN" => "北美洲"
- }
- },
- "country" => %{
+ }
+ },
+ "country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -341,20 +341,20 @@ lookup(ip_address)
"pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "location" => %{
+ }
+ },
+ "location" => %{
"accuracy_radius" => 50,
"latitude" => 34.1211,
"longitude" => -117.4362,
"metro_code" => 803,
"time_zone" => "America/Los_Angeles"
- },
- "postal" => %{"code" => "92336"},
- "registered_country" => %{
+ },
+ "postal" => %{"code" => "92336"},
+ "registered_country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -363,13 +363,13 @@ lookup(ip_address)
"pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -378,10 +378,10 @@ lookup(ip_address)
"pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index 1df477c715752..ffd2af4a5924b 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1116,23 +1116,23 @@ insert_stream(source_or_schema, rows, opts
-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 a8f1b283f2f18..9b2e3ab8a2904 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1116,23 +1116,23 @@ insert_stream(source_or_schema, rows, opts
-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 8486ee7a24ea8..820dcf094a9fd 100644
--- a/Plausible.Stats.FilterParser.html
+++ b/Plausible.Stats.FilterParser.html
@@ -180,14 +180,14 @@ parse_filters(filters)
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 ba80be75b14f665cb940f4465a6a07e3462d9bac..cc3d2fc0bcbfd48763ab8edfb35469ef4dd3aa78 100644
GIT binary patch
delta 116022
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