From 0bf92f0ab530230cb7d8ac6371fd67c536f8c73e 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])
Give
Queries the ClickHouse database for the monthly pageview usage. If the given user's
subscription is active
, past_due
, or a deleted
(but not yet expired), a map
-with the following structure is returned:
%{
- current_cycle: usage_cycle(),
- last_cycle: usage_cycle(),
- penultimate_cycle: usage_cycle()
-}
In all other cases of the subscription status (or a free_10k
subscription which
-does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the +with the following structure is returned:
%{
+ current_cycle: usage_cycle(),
+ last_cycle: usage_cycle(),
+ penultimate_cycle: usage_cycle()
+}
In all other cases of the subscription status (or a free_10k
subscription which
+does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the
user owns. Alternatively, given an optional argument of site_ids
, the usage from
across all those sites is queried instead.
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 5af035663..1c3ff570c 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 4ae0bdf4b..b3f6e39ee 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 45da7de55..7069274d8 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 ac06fde8b..0fc43e265 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.Revenue.html b/Plausible.Goal.Revenue.html
index 38aa988b4..3891fc5a3 100644
--- a/Plausible.Goal.Revenue.html
+++ b/Plausible.Goal.Revenue.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Goal.html b/Plausible.Goal.html
index af194308a..4e461989f 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index fbef54e3e..677aa190a 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 65750a456..e24666f39 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 760fa977c..f533bd2ab 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 00699f1f5..047b6305d 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 8a0528c86..a4eb1c262 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 b0283c5f8..bfaf597f0 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 ed5170ee5..bdcf1ca8a 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 9db977fcc..c30da0168 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 69a21ae71..dfbf6092f 100644
--- a/Plausible.HTTPClient.html
+++ b/Plausible.HTTPClient.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Helpers.JSON.html b/Plausible.Helpers.JSON.html
index f07c660fe..602ce7b94 100644
--- a/Plausible.Helpers.JSON.html
+++ b/Plausible.Helpers.JSON.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index 428388b00..1b254c465 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 accc4c508..b7f205f38 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 5a2bd3d69..f93b8e403 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 1c2860c9a..0f2d898c1 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 777cf0570..6a21fe646 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 c8c59b183..72bc3fc03 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 6cecb1584..786b78148 100644
--- a/Plausible.Ingestion.Counters.html
+++ b/Plausible.Ingestion.Counters.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Ingestion.Event.Revenue.html b/Plausible.Ingestion.Event.Revenue.html
index da48bb451..3d48bdc35 100644
--- a/Plausible.Ingestion.Event.Revenue.html
+++ b/Plausible.Ingestion.Event.Revenue.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Ingestion.Event.html b/Plausible.Ingestion.Event.html
index 82deeefa7..3e62ba3f1 100644
--- a/Plausible.Ingestion.Event.html
+++ b/Plausible.Ingestion.Event.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Ingestion.Request.Revenue.html b/Plausible.Ingestion.Request.Revenue.html
index 0715d7510..73836ea0a 100644
--- a/Plausible.Ingestion.Request.Revenue.html
+++ b/Plausible.Ingestion.Request.Revenue.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Ingestion.Request.html b/Plausible.Ingestion.Request.html
index 89653395c..94b6508a0 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 7b00caa4b..4cea73fe4 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 3934220b9..bf76e7bd5 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 41d84c215..4c5c61dde 100644
--- a/Plausible.PaddleApi.Mock.html
+++ b/Plausible.PaddleApi.Mock.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Pagination.html b/Plausible.Pagination.html
index 1f3a5d8b6..b6a53b136 100644
--- a/Plausible.Pagination.html
+++ b/Plausible.Pagination.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Plugins.API.CustomProps.html b/Plausible.Plugins.API.CustomProps.html
index d7661cd30..25db7cf02 100644
--- a/Plausible.Plugins.API.CustomProps.html
+++ b/Plausible.Plugins.API.CustomProps.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Plugins.API.Goals.html b/Plausible.Plugins.API.Goals.html
index 2896ba3a9..8dcf22fc1 100644
--- a/Plausible.Plugins.API.Goals.html
+++ b/Plausible.Plugins.API.Goals.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Plugins.API.SharedLinks.html b/Plausible.Plugins.API.SharedLinks.html
index d067537ab..07dd8f3a6 100644
--- a/Plausible.Plugins.API.SharedLinks.html
+++ b/Plausible.Plugins.API.SharedLinks.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Plugins.API.Token.html b/Plausible.Plugins.API.Token.html
index fb6d7e81a..4d624fcb9 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 ff40a7875..d1099ac28 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 6417ff3f0..5535722ed 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 0770470f1..17794a81b 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index 11bda5f74..74b89679b 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index 5521f8400..3f61c7699 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html
index 3d92961c9..9e8929208 100644
--- a/Plausible.RateLimit.html
+++ b/Plausible.RateLimit.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index d3b98700a..25ea8b0dc 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index 2b5788c8a..e75d4bffb 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 43014811b..b5d36ac05 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 023867a20..5d464a3e1 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 91701c85a..7458ed9ee 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 419b0f102..c9fa49343 100644
--- a/Plausible.Session.Salts.html
+++ b/Plausible.Session.Salts.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Cache.Warmer.All.html b/Plausible.Site.Cache.Warmer.All.html
index e2263ab61..fa3608545 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 c22168908..402850248 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 e67a7fa54..4c62eef05 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 5bd305a68..1ff9a0564 100644
--- a/Plausible.Site.Cache.html
+++ b/Plausible.Site.Cache.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Domain.html b/Plausible.Site.Domain.html
index 223152f38..7a51688c3 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 6fe669792..535de9aa3 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 391f2f50e..0dee11dee 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 2c5357c2d..7a0ca5846 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 ee11fb90f..3182da349 100644
--- a/Plausible.Site.Membership.html
+++ b/Plausible.Site.Membership.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Memberships.AcceptInvitation.html b/Plausible.Site.Memberships.AcceptInvitation.html
index e933cc1b5..2277dab67 100644
--- a/Plausible.Site.Memberships.AcceptInvitation.html
+++ b/Plausible.Site.Memberships.AcceptInvitation.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Memberships.CreateInvitation.html b/Plausible.Site.Memberships.CreateInvitation.html
index d039e7c9d..3c4eb9bc2 100644
--- a/Plausible.Site.Memberships.CreateInvitation.html
+++ b/Plausible.Site.Memberships.CreateInvitation.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Memberships.RejectInvitation.html b/Plausible.Site.Memberships.RejectInvitation.html
index cb7f37c20..fab44e28d 100644
--- a/Plausible.Site.Memberships.RejectInvitation.html
+++ b/Plausible.Site.Memberships.RejectInvitation.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Memberships.RemoveInvitation.html b/Plausible.Site.Memberships.RemoveInvitation.html
index 05f9c4dbe..fb892803d 100644
--- a/Plausible.Site.Memberships.RemoveInvitation.html
+++ b/Plausible.Site.Memberships.RemoveInvitation.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Memberships.html b/Plausible.Site.Memberships.html
index 031ead9e3..c02ca28a3 100644
--- a/Plausible.Site.Memberships.html
+++ b/Plausible.Site.Memberships.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.MonthlyReport.html b/Plausible.Site.MonthlyReport.html
index 17ba818d6..e1d6a70b2 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 4d851adb8..2e8c01bdd 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 699b2649a..542213440 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 c0dd5065b..774e4b7e9 100644
--- a/Plausible.Site.SpikeNotification.html
+++ b/Plausible.Site.SpikeNotification.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.UserPreference.html b/Plausible.Site.UserPreference.html
index f8dd1e249..302d5e922 100644
--- a/Plausible.Site.UserPreference.html
+++ b/Plausible.Site.UserPreference.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.WeeklyReport.html b/Plausible.Site.WeeklyReport.html
index b3b316566..6fa074124 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 4aa67b659..bac987219 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index 25f06d023..22eda83b5 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index 21a158408..d002aaa03 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 f5cefe8a3..7b6ee446b 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 65d61438d..1f862d875 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 8197ad8d2..673b034ae 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 fa5978e0f..e7c3c076c 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 6f18b699a..4630ebf6b 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 6caa69394..9a6f599e7 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 2ffad73ff..175cc0a6f 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 b375c1dfd..a268e6ab6 100644
--- a/Plausible.Stats.CustomProps.html
+++ b/Plausible.Stats.CustomProps.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.EmailReport.html b/Plausible.Stats.EmailReport.html
index 36699c7ae..716cf0145 100644
--- a/Plausible.Stats.EmailReport.html
+++ b/Plausible.Stats.EmailReport.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.FilterParser.html b/Plausible.Stats.FilterParser.html
index 1e0ed9793..0ac818f96 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 d5d4c6934..c314df5a8 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 7cea3b683..bf23b9cf0 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 3896fac9c..933629484 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 a36e8519f..401583057 100644
--- a/Plausible.Stats.Funnel.html
+++ b/Plausible.Stats.Funnel.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Goal.Revenue.html b/Plausible.Stats.Goal.Revenue.html
index 107db6d11..f24a3444e 100644
--- a/Plausible.Stats.Goal.Revenue.html
+++ b/Plausible.Stats.Goal.Revenue.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Imported.html b/Plausible.Stats.Imported.html
index f9460d7a5..e989f000f 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 cbf2adc63..963a04fbe 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 c3c5d25a9..0c00091b3 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 e87b053aa..dbadeff70 100644
--- a/Plausible.Stats.Query.html
+++ b/Plausible.Stats.Query.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Sampling.html b/Plausible.Stats.Sampling.html
index 85c1f8521..ce28449da 100644
--- a/Plausible.Stats.Sampling.html
+++ b/Plausible.Stats.Sampling.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Stats.Timeseries.html b/Plausible.Stats.Timeseries.html
index 2ebee4abf..1d35e8973 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 eb08adc22..a6f9f3f5a 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 91c442490..d70e38b3c 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 91efc51d4..d15bc6fc1 100644
--- a/Plausible.Test.Support.HTML.html
+++ b/Plausible.Test.Support.HTML.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Test.Support.HTTPMocker.html b/Plausible.Test.Support.HTTPMocker.html
index cd667f124..94df97fa4 100644
--- a/Plausible.Test.Support.HTTPMocker.html
+++ b/Plausible.Test.Support.HTTPMocker.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.TestUtils.html b/Plausible.TestUtils.html
index 099d7afb4..dd24ac03c 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index fe6d18792..1991fba2e 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index ab8209d16..179c4dfa1 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index 09f5425a1..947486b5c 100644
--- a/Plausible.Users.html
+++ b/Plausible.Users.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.AcceptTrafficUntil.html b/Plausible.Workers.AcceptTrafficUntil.html
index 752e0513b..79221029e 100644
--- a/Plausible.Workers.AcceptTrafficUntil.html
+++ b/Plausible.Workers.AcceptTrafficUntil.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.CheckUsage.html b/Plausible.Workers.CheckUsage.html
index 342bbf467..ba7a69ca6 100644
--- a/Plausible.Workers.CheckUsage.html
+++ b/Plausible.Workers.CheckUsage.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Workers.CleanInvitations.html b/Plausible.Workers.CleanInvitations.html
index 15891846b..4284c011c 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 951ffedc4..5b9f76f95 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 e2058f5f8..240ff7292 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 a29aa1d07..29ebf1135 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 bbdef5e5a..5017434b5 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 72e674b75..99f1379ab 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 8c9b68fdd..8f161b637 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 82007a8af..a8134ad90 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 9eb92f076..6ad1969f4 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 44a9c146e..10afa715c 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 8f8422778..81a1124be 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 a92c98cb1..981e881f7 100644
--- a/Plausible.Workers.SpikeNotifier.html
+++ b/Plausible.Workers.SpikeNotifier.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index c19cabd2e96158b128f2d93eee9ad5c7e9ce799f..6f7ae94e6e8025580f7014831624187544e4f838 100644
GIT binary patch
delta 142282
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⪼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