From ce297484d7c77ca8341d6fa75b4756cca1c9cc34 Mon Sep 17 00:00:00 2001
From: aerosol
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Cldr.LanguageTag
.
The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -232,54 +232,54 @@ a configurediex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
-{:error,
- {Cldr.NoMatchingLocale,
- "No configured locale could be matched to \"xx,yy;q=0.3\""}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
+{:error,
+ {Cldr.NoMatchingLocale,
+ "No configured locale could be matched to \"xx,yy;q=0.3\""}}
-iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
- ]}
+ transform: %{},
+ language_variants: []
+ }}
+ ]}
-iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
-{:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
+{:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
- ]}
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+ ]}
iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
-]
+ transform: %{},
+ language_variants: []
+ }}
+]
Plausible.Cldr.AcceptLanguage.parse! "invalid_tag"
** (Cldr.AcceptLanguageError) "Expected a BCP47 language tag. Could not parse the remaining "g" starting at position 11
(ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-]
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+]
:all
. See FJD: %Cldr.Currency{
+ %{ FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -404,12 +404,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
- },
- SUR: %Cldr.Currency{
+ },
+ SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -419,7 +419,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -470,11 +470,11 @@ The default is :all
. See FJD: %Cldr.Currency{
+ => %{FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -484,12 +484,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
-},
-SUR: %Cldr.Currency{
+},
+SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -499,7 +499,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -557,13 +557,13 @@ or a
-iex> Plausible.Cldr.Currency.currency_for_code("AUD")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("AUD")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -571,15 +571,15 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}}
+}}
-iex> Plausible.Cldr.Currency.currency_for_code("THB")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("THB")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -587,7 +587,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -646,12 +646,12 @@ or a
-iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -659,14 +659,14 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}
+}
-iex> Plausible.Cldr.Currency.currency_for_code!("THB")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("THB")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -674,7 +674,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -715,11 +715,11 @@ or a
-iex> {:ok, locale} = Plausible.Cldr.validate_locale "en"
+iex> {:ok, locale} = Plausible.Cldr.validate_locale "en"
iex> Plausible.Cldr.Currency.currency_from_locale locale
:USD
-iex> {:ok, locale} = Plausible.Cldr.validate_locale "en-AU"
+iex> {:ok, locale} = Plausible.Cldr.validate_locale "en-AU"
iex> Plausible.Cldr.Currency.currency_from_locale locale
:AUD
@@ -768,13 +768,13 @@ or a
iex> MyApp.Cldr.Currency.currency_history_for_locale "en"
-{:ok,
- %{
- USD: %{from: ~D[1792-01-01], to: nil},
- USN: %{tender: false},
- USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
- }
-}
+
{:ok,
+ %{
+ USD: %{from: ~D[1792-01-01], to: nil},
+ USN: %{tender: false},
+ USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
+ }
+}
@@ -834,8 +834,8 @@ The default is :all
. See MyApp.Cldr.Currency.currency_strings "en"
-=> {:ok,
- %{
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -845,7 +845,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
:all
. See MyApp.Cldr.Currency.currency_strings! "en"
-=> %{
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -915,7 +915,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ iex> Plausible.Cldr.Currency.current_territory_currencies()
0.05
. Optional.iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
+{:ok,
+ %Cldr.Currency{
alt_code: :XAE,
cash_digits: 0,
cash_rounding: nil,
code: :XAE,
- count: %{other: "Custom Name"},
+ count: %{other: "Custom Name"},
digits: 0,
from: nil,
iso_digits: 0,
@@ -1264,11 +1264,11 @@ such as 0.05
. Optional.symbol
: "XAE",
tender: false,
to: nil
- }}
-iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
-{:error, "Required options are missing. Required options are [:name, :digits]"}
-iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
-{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
+ }}
+iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
+{:error, "Required options are missing. Required options are [:name, :digits]"}
+iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
+{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
Plaus
iex> Plausible.Cldr.Currency.pluralize 1, :USD
-{:ok, "US dollar"}
+{:ok, "US dollar"}
iex> Plausible.Cldr.Currency.pluralize 3, :USD
-{:ok, "US dollars"}
+{:ok, "US dollars"}
iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "zh"
-{:ok, "美元"}
+{:ok, "美元"}
iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "fr"
-{:ok, "dollars des États-Unis"}
+{:ok, "dollars des États-Unis"}
iex> Plausible.Cldr.Currency.pluralize 1, :USD, locale: "fr"
-{:ok, "dollar des États-Unis"}
+{:ok, "dollar des États-Unis"}
iex> MyApp.Cldr.Currency.strings_for_currency :AUD, "en"
-["a$", "australian dollars", "aud", "australian dollar"]
+["a$", "australian dollars", "aud", "australian dollar"]
iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
+{:ok, [:"fr-CA", :fr, :und]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
-{:ok, [:nb, :no, :und]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
+{:ok, [:nb, :no, :und]}
Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
+=> {:ok,
+ [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-Plausible.Cldr.Locale.fallback_locales(:nb))
-=> {:ok,
- [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:nb))
+=> {:ok,
+ [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
iex> Cldr.Locale.territory_from_host("a.b.com.au")
+{:ok, :AU}
-iex> Cldr.Locale.territory_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Cldr.Locale.territory_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
:zero
, iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"few"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
-{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
+iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
+{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
"0 billion", "0 million", "0 thousand",
"0 trillion", "00 billion", "00 million", "00 thousand", "00 trillion",
"000 billion", "000 million", "000 thousand", "000 trillion", "000B", "000K",
@@ -506,7 +506,7 @@ the known formats at compile time. Its use is not otherwise recommended."¤#,##0.00", "¤#,##0.00;(¤#,##0.00)", "¤000B", "¤000K", "¤000M",
"¤000T", "¤00B", "¤00K", "¤00M", "¤00T", "¤0B", "¤0K", "¤0M", "¤0T",
"¤ #,##0.00", "¤ #,##0.00;(¤ #,##0.00)", "¤ 000B", "¤ 000K", "¤ 000M",
- "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
+ "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
Plausible.Cld
Examples
iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
-{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
+{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
Plausible.Cld
Examples
iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
-%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
+%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
percent: "#,##0 %",
scientific: "#E0",
standard: "#,##0.###"
- currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
- {"10000", [one: "00 k ¤", other: "00 k ¤"]},
- {"100000", [one: "000 k ¤", other: "000 k ¤"]},
- {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
- {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
- {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
- {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
- {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
- {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
- {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
- {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
- {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
+ currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
+ {"10000", [one: "00 k ¤", other: "00 k ¤"]},
+ {"100000", [one: "000 k ¤", other: "000 k ¤"]},
+ {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
+ {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
+ {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
+ {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
+ {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
+ {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
+ {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
+ {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
+ {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
...
}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
-{:ok, 1}
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
+{:ok, 1}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
1
:zero
, iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.PluralRule.Range.html b/Plausible.Cldr.Number.PluralRule.Range.html
index 10da01c94..121f9c778 100644
--- a/Plausible.Cldr.Number.PluralRule.Range.html
+++ b/Plausible.Cldr.Number.PluralRule.Range.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Cldr.Number.Symbol.html b/Plausible.Cldr.Number.Symbol.html
index 59c440f0b..e6b343847 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -13,7 +13,7 @@
-
+
@@ -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 fa4232ea0..3136ecfb6 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -13,7 +13,7 @@
-
+
@@ -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 9d70812d0..142834c54 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -13,7 +13,7 @@
-
+
@@ -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.Goal.html b/Plausible.Goal.html
index cb3306c45..af43372e1 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index 9e2c7d9ac..0ad6fffc5 100644
--- a/Plausible.Goals.html
+++ b/Plausible.Goals.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Google.Api.Mock.html b/Plausible.Google.Api.Mock.html
index b6e89524e..33de6c960 100644
--- a/Plausible.Google.Api.Mock.html
+++ b/Plausible.Google.Api.Mock.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Google.Api.html b/Plausible.Google.Api.html
index ad99fa5da..f205e7708 100644
--- a/Plausible.Google.Api.html
+++ b/Plausible.Google.Api.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Google.Buffer.html b/Plausible.Google.Buffer.html
index ba108f357..414b5040e 100644
--- a/Plausible.Google.Buffer.html
+++ b/Plausible.Google.Buffer.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Google.HTTP.html b/Plausible.Google.HTTP.html
index 2061673b9..d654a69ac 100644
--- a/Plausible.Google.HTTP.html
+++ b/Plausible.Google.HTTP.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Google.ReportRequest.html b/Plausible.Google.ReportRequest.html
index bee8ee499..df75c7807 100644
--- a/Plausible.Google.ReportRequest.html
+++ b/Plausible.Google.ReportRequest.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.HTTPClient.Interface.html b/Plausible.HTTPClient.Interface.html
index 80f925ae9..f108f5b09 100644
--- a/Plausible.HTTPClient.Interface.html
+++ b/Plausible.HTTPClient.Interface.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.HTTPClient.Non200Error.html b/Plausible.HTTPClient.Non200Error.html
index 62b5dd59a..8341e6dcc 100644
--- a/Plausible.HTTPClient.Non200Error.html
+++ b/Plausible.HTTPClient.Non200Error.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.HTTPClient.html b/Plausible.HTTPClient.html
index 34af73a0b..717bd1860 100644
--- a/Plausible.HTTPClient.html
+++ b/Plausible.HTTPClient.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index 925e9af98..4f3614104 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -13,7 +13,7 @@
-
+
@@ -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.Imported.html b/Plausible.Imported.html
index 6cf406afc..6277eb72d 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 87761bc9e..0ff2811d8 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -13,7 +13,7 @@
-
+
@@ -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.Ingestion.Counters.Buffer.html b/Plausible.Ingestion.Counters.Buffer.html
index f0025dda2..a4fab67a8 100644
--- a/Plausible.Ingestion.Counters.Buffer.html
+++ b/Plausible.Ingestion.Counters.Buffer.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Ingestion.Counters.Record.html b/Plausible.Ingestion.Counters.Record.html
index c71fe35af..315fbfc3d 100644
--- a/Plausible.Ingestion.Counters.Record.html
+++ b/Plausible.Ingestion.Counters.Record.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Ingestion.Counters.TelemetryHandler.html b/Plausible.Ingestion.Counters.TelemetryHandler.html
index 66297dc9c..23d4de120 100644
--- a/Plausible.Ingestion.Counters.TelemetryHandler.html
+++ b/Plausible.Ingestion.Counters.TelemetryHandler.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Ingestion.Counters.html b/Plausible.Ingestion.Counters.html
index 75ce806f1..4d761d177 100644
--- a/Plausible.Ingestion.Counters.html
+++ b/Plausible.Ingestion.Counters.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Ingestion.Event.html b/Plausible.Ingestion.Event.html
index 569ebf6c0..cde682ed3 100644
--- a/Plausible.Ingestion.Event.html
+++ b/Plausible.Ingestion.Event.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Ingestion.Request.html b/Plausible.Ingestion.Request.html
index 1e02c5373..4c108434e 100644
--- a/Plausible.Ingestion.Request.html
+++ b/Plausible.Ingestion.Request.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html
index 02e068002..3b44f093f 100644
--- a/Plausible.Mailer.html
+++ b/Plausible.Mailer.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.OpenTelemetry.Sampler.html b/Plausible.OpenTelemetry.Sampler.html
index bdf66b968..349c86bb6 100644
--- a/Plausible.OpenTelemetry.Sampler.html
+++ b/Plausible.OpenTelemetry.Sampler.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.PaddleApi.Mock.html b/Plausible.PaddleApi.Mock.html
index ff143a4e5..badd3d5cd 100644
--- a/Plausible.PaddleApi.Mock.html
+++ b/Plausible.PaddleApi.Mock.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Plugins.API.Token.html b/Plausible.Plugins.API.Token.html
index 67ecbc5b7..2f9f2ad0b 100644
--- a/Plausible.Plugins.API.Token.html
+++ b/Plausible.Plugins.API.Token.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Plugins.API.Tokens.html b/Plausible.Plugins.API.Tokens.html
index 889b3b6f3..2577fee5f 100644
--- a/Plausible.Plugins.API.Tokens.html
+++ b/Plausible.Plugins.API.Tokens.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.PromEx.Plugins.PlausibleMetrics.html b/Plausible.PromEx.Plugins.PlausibleMetrics.html
index edb357823..fc6e3471f 100644
--- a/Plausible.PromEx.Plugins.PlausibleMetrics.html
+++ b/Plausible.PromEx.Plugins.PlausibleMetrics.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.PromEx.html b/Plausible.PromEx.html
index 16f0ad361..d22d83f4e 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index d98a3a010..b10b2243b 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index f13daca21..9e5577e1a 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index 1d16d6670..f337aae1f 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index 50cd5cd3f..a8be751d8 100644
--- a/Plausible.Repo.html
+++ b/Plausible.Repo.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Sentry.Client.html b/Plausible.Sentry.Client.html
index d3fcd8447..0d9aabb3b 100644
--- a/Plausible.Sentry.Client.html
+++ b/Plausible.Sentry.Client.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.SentryFilter.html b/Plausible.SentryFilter.html
index c54090d22..722ff5b04 100644
--- a/Plausible.SentryFilter.html
+++ b/Plausible.SentryFilter.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Session.CacheStore.html b/Plausible.Session.CacheStore.html
index ebd5ecf06..e43b970fc 100644
--- a/Plausible.Session.CacheStore.html
+++ b/Plausible.Session.CacheStore.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Session.Salts.html b/Plausible.Session.Salts.html
index 62f10b1ef..3386fa81b 100644
--- a/Plausible.Session.Salts.html
+++ b/Plausible.Session.Salts.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Session.WriteBuffer.html b/Plausible.Session.WriteBuffer.html
index 18eea8acf..bee4f714e 100644
--- a/Plausible.Session.WriteBuffer.html
+++ b/Plausible.Session.WriteBuffer.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Cache.Warmer.All.html b/Plausible.Site.Cache.Warmer.All.html
index 6e46e8776..43bd6fe8c 100644
--- a/Plausible.Site.Cache.Warmer.All.html
+++ b/Plausible.Site.Cache.Warmer.All.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Cache.Warmer.RecentlyUpdated.html b/Plausible.Site.Cache.Warmer.RecentlyUpdated.html
index b77f73999..6bb686a01 100644
--- a/Plausible.Site.Cache.Warmer.RecentlyUpdated.html
+++ b/Plausible.Site.Cache.Warmer.RecentlyUpdated.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Cache.Warmer.html b/Plausible.Site.Cache.Warmer.html
index 91b95a667..1f65fbef3 100644
--- a/Plausible.Site.Cache.Warmer.html
+++ b/Plausible.Site.Cache.Warmer.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Cache.html b/Plausible.Site.Cache.html
index 933bc3162..c55fe8cc1 100644
--- a/Plausible.Site.Cache.html
+++ b/Plausible.Site.Cache.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.CustomDomain.html b/Plausible.Site.CustomDomain.html
index 2c92e6173..4c5156875 100644
--- a/Plausible.Site.CustomDomain.html
+++ b/Plausible.Site.CustomDomain.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Domain.html b/Plausible.Site.Domain.html
index eabc98179..487d9926b 100644
--- a/Plausible.Site.Domain.html
+++ b/Plausible.Site.Domain.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.GateKeeper.html b/Plausible.Site.GateKeeper.html
index b1c29bd3d..6feacc85f 100644
--- a/Plausible.Site.GateKeeper.html
+++ b/Plausible.Site.GateKeeper.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.GoogleAuth.html b/Plausible.Site.GoogleAuth.html
index 77cd6fd5d..dd868ff10 100644
--- a/Plausible.Site.GoogleAuth.html
+++ b/Plausible.Site.GoogleAuth.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.ImportedData.html b/Plausible.Site.ImportedData.html
index b9e5bb91b..8738dc7c8 100644
--- a/Plausible.Site.ImportedData.html
+++ b/Plausible.Site.ImportedData.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Membership.html b/Plausible.Site.Membership.html
index 1a2bcf43b..544473ccc 100644
--- a/Plausible.Site.Membership.html
+++ b/Plausible.Site.Membership.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.MonthlyReport.html b/Plausible.Site.MonthlyReport.html
index 31c2025c2..ec9ac4761 100644
--- a/Plausible.Site.MonthlyReport.html
+++ b/Plausible.Site.MonthlyReport.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Removal.html b/Plausible.Site.Removal.html
index 3d88c4a90..e3a997706 100644
--- a/Plausible.Site.Removal.html
+++ b/Plausible.Site.Removal.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.SharedLink.html b/Plausible.Site.SharedLink.html
index c60e781c9..9bc896454 100644
--- a/Plausible.Site.SharedLink.html
+++ b/Plausible.Site.SharedLink.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.SpikeNotification.html b/Plausible.Site.SpikeNotification.html
index 8f5f0b780..cc97d92f5 100644
--- a/Plausible.Site.SpikeNotification.html
+++ b/Plausible.Site.SpikeNotification.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.WeeklyReport.html b/Plausible.Site.WeeklyReport.html
index 59c755163..0420f94ee 100644
--- a/Plausible.Site.WeeklyReport.html
+++ b/Plausible.Site.WeeklyReport.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.html b/Plausible.Site.html
index 6a743616e..b6de7cc77 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index 34cd42aa4..abe5b4eda 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index 75da02f6f..99ebb89f4 100644
--- a/Plausible.Sites.html
+++ b/Plausible.Sites.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Aggregate.html b/Plausible.Stats.Aggregate.html
index 048d096bc..60c212dc1 100644
--- a/Plausible.Stats.Aggregate.html
+++ b/Plausible.Stats.Aggregate.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Base.html b/Plausible.Stats.Base.html
index fa7f74b7b..bd65f3928 100644
--- a/Plausible.Stats.Base.html
+++ b/Plausible.Stats.Base.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Breakdown.html b/Plausible.Stats.Breakdown.html
index c654d9d19..d6621d071 100644
--- a/Plausible.Stats.Breakdown.html
+++ b/Plausible.Stats.Breakdown.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Clickhouse.html b/Plausible.Stats.Clickhouse.html
index cd45ddb06..8b4c3484b 100644
--- a/Plausible.Stats.Clickhouse.html
+++ b/Plausible.Stats.Clickhouse.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Compare.html b/Plausible.Stats.Compare.html
index 03f1461e5..41bb9795c 100644
--- a/Plausible.Stats.Compare.html
+++ b/Plausible.Stats.Compare.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Comparisons.html b/Plausible.Stats.Comparisons.html
index 08b62f44a..53dffd0be 100644
--- a/Plausible.Stats.Comparisons.html
+++ b/Plausible.Stats.Comparisons.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.CurrentVisitors.html b/Plausible.Stats.CurrentVisitors.html
index 9be5a96a9..95fce0d38 100644
--- a/Plausible.Stats.CurrentVisitors.html
+++ b/Plausible.Stats.CurrentVisitors.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.CustomProps.html b/Plausible.Stats.CustomProps.html
index d608cbc38..717a1ec76 100644
--- a/Plausible.Stats.CustomProps.html
+++ b/Plausible.Stats.CustomProps.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.FilterParser.html b/Plausible.Stats.FilterParser.html
index 53694c151..682c256dd 100644
--- a/Plausible.Stats.FilterParser.html
+++ b/Plausible.Stats.FilterParser.html
@@ -13,7 +13,7 @@
-
+
@@ -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.Stats.FilterSuggestions.html b/Plausible.Stats.FilterSuggestions.html
index 1898a50ca..1a8d40e3b 100644
--- a/Plausible.Stats.FilterSuggestions.html
+++ b/Plausible.Stats.FilterSuggestions.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index e35756873..6dc4c519a 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Fragments.html b/Plausible.Stats.Fragments.html
index 05bb4fd4c..bd5948ae7 100644
--- a/Plausible.Stats.Fragments.html
+++ b/Plausible.Stats.Fragments.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Funnel.html b/Plausible.Stats.Funnel.html
index c7f5302ed..98fab4b0e 100644
--- a/Plausible.Stats.Funnel.html
+++ b/Plausible.Stats.Funnel.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Imported.html b/Plausible.Stats.Imported.html
index 048c60f3a..b0a5206b3 100644
--- a/Plausible.Stats.Imported.html
+++ b/Plausible.Stats.Imported.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Interval.html b/Plausible.Stats.Interval.html
index d5729afec..193f0479d 100644
--- a/Plausible.Stats.Interval.html
+++ b/Plausible.Stats.Interval.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Props.html b/Plausible.Stats.Props.html
index 2b1583d8e..6066d00ce 100644
--- a/Plausible.Stats.Props.html
+++ b/Plausible.Stats.Props.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Query.html b/Plausible.Stats.Query.html
index 3ceec3a83..06683b286 100644
--- a/Plausible.Stats.Query.html
+++ b/Plausible.Stats.Query.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Timeseries.html b/Plausible.Stats.Timeseries.html
index e5f086648..798ea330e 100644
--- a/Plausible.Stats.Timeseries.html
+++ b/Plausible.Stats.Timeseries.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Util.html b/Plausible.Stats.Util.html
index 23b2b7d9e..cd59b30ac 100644
--- a/Plausible.Stats.Util.html
+++ b/Plausible.Stats.Util.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.html b/Plausible.Stats.html
index 46530759b..4c15495a7 100644
--- a/Plausible.Stats.html
+++ b/Plausible.Stats.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Test.Support.HTML.html b/Plausible.Test.Support.HTML.html
index acf13d4c0..856f73ed2 100644
--- a/Plausible.Test.Support.HTML.html
+++ b/Plausible.Test.Support.HTML.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.TestUtils.html b/Plausible.TestUtils.html
index af55a0bfa..a7489d444 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index 0445435a4..41c8bec96 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index 4ef2ce9cd..9706eca2c 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index fc63b622e..3b4b78ff1 100644
--- a/Plausible.Users.html
+++ b/Plausible.Users.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.CheckUsage.html b/Plausible.Workers.CheckUsage.html
index b7303e6e7..09fd4e103 100644
--- a/Plausible.Workers.CheckUsage.html
+++ b/Plausible.Workers.CheckUsage.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.CleanEmailVerificationCodes.html b/Plausible.Workers.CleanEmailVerificationCodes.html
index e652079e5..1a7e053a7 100644
--- a/Plausible.Workers.CleanEmailVerificationCodes.html
+++ b/Plausible.Workers.CleanEmailVerificationCodes.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.CleanInvitations.html b/Plausible.Workers.CleanInvitations.html
index 36ebb5d5a..b62365398 100644
--- a/Plausible.Workers.CleanInvitations.html
+++ b/Plausible.Workers.CleanInvitations.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.ExpireDomainChangeTransitions.html b/Plausible.Workers.ExpireDomainChangeTransitions.html
index 103ce7b81..a2374aebc 100644
--- a/Plausible.Workers.ExpireDomainChangeTransitions.html
+++ b/Plausible.Workers.ExpireDomainChangeTransitions.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.ImportGoogleAnalytics.html b/Plausible.Workers.ImportGoogleAnalytics.html
index 66f6131d2..6314baea7 100644
--- a/Plausible.Workers.ImportGoogleAnalytics.html
+++ b/Plausible.Workers.ImportGoogleAnalytics.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.LockSites.html b/Plausible.Workers.LockSites.html
index 6f577ec90..ac288178d 100644
--- a/Plausible.Workers.LockSites.html
+++ b/Plausible.Workers.LockSites.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.NotifyAnnualRenewal.html b/Plausible.Workers.NotifyAnnualRenewal.html
index 63886466b..4933ce508 100644
--- a/Plausible.Workers.NotifyAnnualRenewal.html
+++ b/Plausible.Workers.NotifyAnnualRenewal.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.RotateSalts.html b/Plausible.Workers.RotateSalts.html
index 35b5d4125..3ac9f2606 100644
--- a/Plausible.Workers.RotateSalts.html
+++ b/Plausible.Workers.RotateSalts.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.ScheduleEmailReports.html b/Plausible.Workers.ScheduleEmailReports.html
index b8f8402c1..522d5905e 100644
--- a/Plausible.Workers.ScheduleEmailReports.html
+++ b/Plausible.Workers.ScheduleEmailReports.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.SendCheckStatsEmails.html b/Plausible.Workers.SendCheckStatsEmails.html
index ebb59361f..20900b8b8 100644
--- a/Plausible.Workers.SendCheckStatsEmails.html
+++ b/Plausible.Workers.SendCheckStatsEmails.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.SendEmailReport.html b/Plausible.Workers.SendEmailReport.html
index d64981761..90dcdbc99 100644
--- a/Plausible.Workers.SendEmailReport.html
+++ b/Plausible.Workers.SendEmailReport.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.SendSiteSetupEmails.html b/Plausible.Workers.SendSiteSetupEmails.html
index ac47b17ff..711555621 100644
--- a/Plausible.Workers.SendSiteSetupEmails.html
+++ b/Plausible.Workers.SendSiteSetupEmails.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.SendTrialNotifications.html b/Plausible.Workers.SendTrialNotifications.html
index 782717d33..cd9eece6a 100644
--- a/Plausible.Workers.SendTrialNotifications.html
+++ b/Plausible.Workers.SendTrialNotifications.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.SpikeNotifier.html b/Plausible.Workers.SpikeNotifier.html
index 075b0ddd0..fe70c59db 100644
--- a/Plausible.Workers.SpikeNotifier.html
+++ b/Plausible.Workers.SpikeNotifier.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index 057d7d4b0c89fcca43a28856bb634eaa363fea89..7358fd82c91b82bf968d8cf2ed3dde3d3197f928 100644
GIT binary patch
delta 118609
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