From e2139162f9356bd2e5d3d5268ea55eaa9af762cf Mon Sep 17 00:00:00 2001
From: vinibrsl
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Cldr.LanguageTag
.
The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -232,54 +232,54 @@ a configurediex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
-{:error,
- {Cldr.NoMatchingLocale,
- "No configured locale could be matched to \"xx,yy;q=0.3\""}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
+{:error,
+ {Cldr.NoMatchingLocale,
+ "No configured locale could be matched to \"xx,yy;q=0.3\""}}
-iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
- ]}
+ transform: %{},
+ language_variants: []
+ }}
+ ]}
-iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
-{:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
+{:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
- ]}
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+ ]}
iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
-]
+ transform: %{},
+ language_variants: []
+ }}
+]
Plausible.Cldr.AcceptLanguage.parse! "invalid_tag"
** (Cldr.AcceptLanguageError) "Expected a BCP47 language tag. Could not parse the remaining "g" starting at position 11
(ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-]
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+]
:all
. See FJD: %Cldr.Currency{
+ %{ FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -404,12 +404,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
- },
- SUR: %Cldr.Currency{
+ },
+ SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -419,7 +419,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -470,11 +470,11 @@ The default is :all
. See FJD: %Cldr.Currency{
+ => %{FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -484,12 +484,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
-},
-SUR: %Cldr.Currency{
+},
+SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -499,7 +499,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -557,13 +557,13 @@ or a
-iex> Plausible.Cldr.Currency.currency_for_code("AUD")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("AUD")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -571,15 +571,15 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}}
+}}
-iex> Plausible.Cldr.Currency.currency_for_code("THB")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("THB")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -587,7 +587,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -646,12 +646,12 @@ or a
-iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -659,14 +659,14 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}
+}
-iex> Plausible.Cldr.Currency.currency_for_code!("THB")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("THB")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -674,7 +674,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -715,11 +715,11 @@ or a
-iex> {:ok, locale} = Plausible.Cldr.validate_locale "en"
+iex> {:ok, locale} = Plausible.Cldr.validate_locale "en"
iex> Plausible.Cldr.Currency.currency_from_locale locale
:USD
-iex> {:ok, locale} = Plausible.Cldr.validate_locale "en-AU"
+iex> {:ok, locale} = Plausible.Cldr.validate_locale "en-AU"
iex> Plausible.Cldr.Currency.currency_from_locale locale
:AUD
@@ -768,13 +768,13 @@ or a
iex> MyApp.Cldr.Currency.currency_history_for_locale "en"
-{:ok,
- %{
- USD: %{from: ~D[1792-01-01], to: nil},
- USN: %{tender: false},
- USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
- }
-}
+
{:ok,
+ %{
+ USD: %{from: ~D[1792-01-01], to: nil},
+ USN: %{tender: false},
+ USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
+ }
+}
@@ -834,8 +834,8 @@ The default is :all
. See MyApp.Cldr.Currency.currency_strings "en"
-=> {:ok,
- %{
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -845,7 +845,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
:all
. See MyApp.Cldr.Currency.currency_strings! "en"
-=> %{
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -915,7 +915,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ iex> Plausible.Cldr.Currency.current_territory_currencies()
0.05
. Optional.iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
+{:ok,
+ %Cldr.Currency{
alt_code: :XAE,
cash_digits: 0,
cash_rounding: nil,
code: :XAE,
- count: %{other: "Custom Name"},
+ count: %{other: "Custom Name"},
digits: 0,
from: nil,
iso_digits: 0,
@@ -1264,11 +1264,11 @@ such as 0.05
. Optional.symbol
: "XAE",
tender: false,
to: nil
- }}
-iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
-{:error, "Required options are missing. Required options are [:name, :digits]"}
-iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
-{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
+ }}
+iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
+{:error, "Required options are missing. Required options are [:name, :digits]"}
+iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
+{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
Plaus
iex> Plausible.Cldr.Currency.pluralize 1, :USD
-{:ok, "US dollar"}
+{:ok, "US dollar"}
iex> Plausible.Cldr.Currency.pluralize 3, :USD
-{:ok, "US dollars"}
+{:ok, "US dollars"}
iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "zh"
-{:ok, "美元"}
+{:ok, "美元"}
iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "fr"
-{:ok, "dollars des États-Unis"}
+{:ok, "dollars des États-Unis"}
iex> Plausible.Cldr.Currency.pluralize 1, :USD, locale: "fr"
-{:ok, "dollar des États-Unis"}
+{:ok, "dollar des États-Unis"}
iex> MyApp.Cldr.Currency.strings_for_currency :AUD, "en"
-["a$", "australian dollars", "aud", "australian dollar"]
+["a$", "australian dollars", "aud", "australian dollar"]
iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
+{:ok, [:"fr-CA", :fr, :und]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
-{:ok, [:nb, :no, :und]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
+{:ok, [:nb, :no, :und]}
Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
+=> {:ok,
+ [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-Plausible.Cldr.Locale.fallback_locales(:nb))
-=> {:ok,
- [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:nb))
+=> {:ok,
+ [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
iex> Cldr.Locale.territory_from_host("a.b.com.au")
+{:ok, :AU}
-iex> Cldr.Locale.territory_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Cldr.Locale.territory_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
:zero
, iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"few"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
-{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
+iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
+{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
"0 billion", "0 million", "0 thousand",
"0 trillion", "00 billion", "00 million", "00 thousand", "00 trillion",
"000 billion", "000 million", "000 thousand", "000 trillion", "000B", "000K",
@@ -506,7 +506,7 @@ the known formats at compile time. Its use is not otherwise recommended."¤#,##0.00", "¤#,##0.00;(¤#,##0.00)", "¤000B", "¤000K", "¤000M",
"¤000T", "¤00B", "¤00K", "¤00M", "¤00T", "¤0B", "¤0K", "¤0M", "¤0T",
"¤ #,##0.00", "¤ #,##0.00;(¤ #,##0.00)", "¤ 000B", "¤ 000K", "¤ 000M",
- "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
+ "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
Plausible.Cld
Examples
iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
-{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
+{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
Plausible.Cld
Examples
iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
-%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
+%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
percent: "#,##0 %",
scientific: "#E0",
standard: "#,##0.###"
- currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
- {"10000", [one: "00 k ¤", other: "00 k ¤"]},
- {"100000", [one: "000 k ¤", other: "000 k ¤"]},
- {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
- {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
- {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
- {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
- {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
- {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
- {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
- {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
- {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
+ currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
+ {"10000", [one: "00 k ¤", other: "00 k ¤"]},
+ {"100000", [one: "000 k ¤", other: "000 k ¤"]},
+ {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
+ {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
+ {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
+ {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
+ {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
+ {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
+ {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
+ {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
+ {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
...
}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
-{:ok, 1}
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
+{:ok, 1}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
1
:zero
, iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.PluralRule.Range.html b/Plausible.Cldr.Number.PluralRule.Range.html
index 6db733dd9..ada18fa7c 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 12afc883e..b65958f13 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 434d7984e..1fe37196b 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 c0826c6a6..232277f89 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 613f6614d..d92d1b7a6 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index 06f38a270..b0588fecb 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 230c59721..101d084d0 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 bc6a67abc..244a6108c 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 1d82fffc5..9de311131 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 54f9d7141..f165c6e03 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 8aef0372f..cbb76cd46 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 a322e344c..c5047b26c 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 e8b3cae2c..30cc87d5c 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 1df439e70..ae15e4c14 100644
--- a/Plausible.HTTPClient.html
+++ b/Plausible.HTTPClient.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index bb9ff15a2..fc41406b7 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 3b3d6d957..a29cfe1b4 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 42a1e2944..cb6d072bc 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 9a463a6f5..f65d0611e 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 5aca6602c..677bc9775 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 13eee39c5..bc53868f2 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 e22c07698..662359268 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 921b266cb..2f61d5247 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 008c50fcc..df0550425 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 12c37cbe1..fce506fdf 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 a1191f9ca..4e956b81b 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 f89153778..75749dc24 100644
--- a/Plausible.PaddleApi.Mock.html
+++ b/Plausible.PaddleApi.Mock.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.PromEx.Plugins.PlausibleMetrics.html b/Plausible.PromEx.Plugins.PlausibleMetrics.html
index 171fc350b..857c1f46e 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 f36c237bf..af13b0e66 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index 56377eb19..7bda7f9e5 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index da9aed4d3..df9b5547f 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index c4bb19ee0..ff52a384a 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index 0612c69d8..bd5eba29f 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 cf713467a..340f3fa5e 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 cb6b28d2d..b747cc380 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 442a6e755..1fe8a464a 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 40aab524b..62f8ae6ef 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 207f91aba..b95b80848 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 4e0bc1270..b4c42785b 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 9404a1396..cbefadb9b 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 1c147ff78..27205d63f 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 a50ad3b76..a95273a5b 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 b26af9008..38ebf21b2 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 ea9c4fe00..c8f32a069 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 5e3a7b73e..fd589698d 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 56f1adda2..046d05ffc 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 3cd02227a..20f359c2d 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 dc30ee26e..d4c6fd772 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 9a43226da..19274ff89 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 42853f606..568010403 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 31e4766f9..ba57e0313 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 c72d54952..f7aeb055e 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 fbd87ef56..51a8471b6 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 81d1fa0d8..72095425b 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index a35813613..0ef2e23c2 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index c06d8fbc7..24f84fb3f 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 4186166e1..e0430412e 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 528c73141..a115c9eff 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 3884639a9..3ea361220 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 9603a290e..ed59a46f7 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 23a226279..db9783026 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 48e88539b..6940e5598 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 50c10fa05..f64956d03 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 f65c200b4..9a743685a 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 bf1b9b6dc..f98cedb31 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 bdb938ad1..b61d290dc 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 1285fe10a..27fbcd9a4 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 2486e268a..2c35cb566 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 708e824d6..312bb7fc5 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 80d83a73b..4a7d64815 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 aab6eb955..beb01c57e 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 d0da40d90..3b9a56fa2 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 470a62822..b99bbb0ce 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 21694358d..c935c6f98 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 6cfbd0390..e80e3239a 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 a6db1c914..d96d836d0 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 36dddd3a0..69937ade5 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 cdb3a5b19..af3bf5996 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index 66ecd6e28..cf231a2cd 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index 6fa363e18..ccf2513d3 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index c3ce2466b..c6b2b99ca 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 334125393..a7b7d4203 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 3f617c921..4a54351e9 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 1e34c966c..08ab14f8d 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 830f8f2a4..18061f409 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 eddadebc1..336333bda 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 91eaea98c..159782e67 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 afdb717cd..e76ef769f 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 93edd5949..b68c210f7 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 c98ce3453..603645f95 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 c02da0df0..b2e7dae32 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 f7d499524..d6359e428 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 715806b08..0d109e78d 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 0a572ec0e..b2776b39a 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 f8a200af9..d7304f012 100644
--- a/Plausible.Workers.SpikeNotifier.html
+++ b/Plausible.Workers.SpikeNotifier.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index b8761b45133e5089acbd704ce9b8f04ac65194ba..f659dcbe0d6ff8066e28c55dcbb2eb7c405b4e88 100644
GIT binary patch
delta 120797
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