From 5e9a1bc9bb35aba37baf6c303113489ba238bf57 Mon Sep 17 00:00:00 2001
From: RobertJoonas run(list)
-
+
View Source
diff --git a/Mix.Tasks.CleanClickhouse.html b/Mix.Tasks.CleanClickhouse.html
index ee7b93481..322eab084 100644
--- a/Mix.Tasks.CleanClickhouse.html
+++ b/Mix.Tasks.CleanClickhouse.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Mix.Tasks.CreateFreeSubscription.html b/Mix.Tasks.CreateFreeSubscription.html
index 23cdbab46..abaaadd96 100644
--- a/Mix.Tasks.CreateFreeSubscription.html
+++ b/Mix.Tasks.CreateFreeSubscription.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Mix.Tasks.DownloadCountryDatabase.html b/Mix.Tasks.DownloadCountryDatabase.html
index cdee15aea..183cf96dc 100644
--- a/Mix.Tasks.DownloadCountryDatabase.html
+++ b/Mix.Tasks.DownloadCountryDatabase.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Mix.Tasks.GenerateReferrerFavicons.html b/Mix.Tasks.GenerateReferrerFavicons.html
index 8b79e1247..c6b3e5258 100644
--- a/Mix.Tasks.GenerateReferrerFavicons.html
+++ b/Mix.Tasks.GenerateReferrerFavicons.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Mix.Tasks.PullSandboxSubscription.html b/Mix.Tasks.PullSandboxSubscription.html
index a20f9affa..8b6bbccb8 100644
--- a/Mix.Tasks.PullSandboxSubscription.html
+++ b/Mix.Tasks.PullSandboxSubscription.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Mix.Tasks.SendPageview.html b/Mix.Tasks.SendPageview.html
index 897dc62e3..20addcb96 100644
--- a/Mix.Tasks.SendPageview.html
+++ b/Mix.Tasks.SendPageview.html
@@ -13,7 +13,7 @@
-
+
diff --git a/ObanErrorReporter.html b/ObanErrorReporter.html
index 1e1677387..978353edc 100644
--- a/ObanErrorReporter.html
+++ b/ObanErrorReporter.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.AsyncInsertRepo.html b/Plausible.AsyncInsertRepo.html
index f13af5d8a..9624b1c24 100644
--- a/Plausible.AsyncInsertRepo.html
+++ b/Plausible.AsyncInsertRepo.html
@@ -13,7 +13,7 @@
-
+
@@ -1114,23 +1114,23 @@ pool to disconnect within the given interval.
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])
@spec get_invoices(Plausible.Billing.Subscription.t()) :: +@spec get_invoices(Plausible.Billing.Subscription.t()) :: {:ok, list()} | {:error, :request_failed} | {:error, :no_invoices}
Returns a list of growth plans available for the user to choose.
As new versions of plans are introduced, users who were on old plans can still choose from old plans.
+ + +@spec monthly_pageview_limit(Plausible.Billing.Subscription.t()) :: +@spec monthly_pageview_limit(Plausible.Billing.Subscription.t()) :: non_neg_integer() | :unlimited
@type t() :: %Plausible.Billing.Subscription{ - __meta__: term(), - cancel_url: term(), - currency_code: term(), - id: term(), - inserted_at: term(), - last_bill_date: term(), - next_bill_amount: term(), - next_bill_date: term(), - paddle_plan_id: term(), - paddle_subscription_id: term(), - status: term(), - update_url: term(), - updated_at: term(), - user: term(), - user_id: term() -}+
@type status() :: :deleted | :paused | :past_due | :active
@spec active_subscription_for(integer()) :: Plausible.Billing.Subscription.t() | nil+
@spec active_subscription_for(integer()) :: Plausible.Billing.Subscription.t() | nil
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 53aa57b27..53396ae18 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 29d899812..f6ed51e5f 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 3e251112a..0aa71c70f 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 540073ceb..003815ec5 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 115df5ac8..012cb6eff 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index b858036af..d405c6467 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 3f5b74773..bfd236945 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 54ae5c98e..d516679c1 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 a796b3251..bc9366fde 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 c57f0f7aa..796cff9ad 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 f11211851..5429ce8c1 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 527bd722b..b7864fc6a 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 33dc6493a..78fb1c782 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 55a307b2b..6b0b98910 100644
--- a/Plausible.HTTPClient.html
+++ b/Plausible.HTTPClient.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index e7222e18e..79c934d4a 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 6be0a4085..64bf0b7b6 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index f53b10e44..29dc76336 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 59cb247fd..c1a8dd481 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 e7ee4c512..14169bdcc 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 8a0e73632..cd5905db7 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 4bbbb2546..069c6a038 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 c5594d0eb..3c214b465 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 74aa531a1..cc86929da 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 7ec4489ad..af1b7d937 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 7abde949e..3528d5f60 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 47f48f3c7..5995090c0 100644
--- a/Plausible.PaddleApi.Mock.html
+++ b/Plausible.PaddleApi.Mock.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Plugins.API.Goals.html b/Plausible.Plugins.API.Goals.html
index 4d615f653..7f5d10ef6 100644
--- a/Plausible.Plugins.API.Goals.html
+++ b/Plausible.Plugins.API.Goals.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Plugins.API.Pagination.html b/Plausible.Plugins.API.Pagination.html
index b5265d38f..b85f9c774 100644
--- a/Plausible.Plugins.API.Pagination.html
+++ b/Plausible.Plugins.API.Pagination.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Plugins.API.SharedLinks.html b/Plausible.Plugins.API.SharedLinks.html
index 0077dbc31..842745372 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 dd25ed6c4..353db06c7 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 46ee61076..e9b661a60 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 97643f880..4cc4bb9c2 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 ffe9dc727..52b5b88c5 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index a0c012a7d..425044da9 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index 3b0c8a772..2f5db20ad 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index 880f52edb..33ee55f80 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index 57f94397b..8b2a863bd 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 7ba233a80..9569a30af 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 cad8bdff0..bcc112c4e 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 a1b956839..c03d0e148 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 d57c6c79d..0fe3fd198 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 300facc69..a89dfbdf8 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 271a52620..ac8abba2e 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 d7e044c5a..d3cc99e20 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 277f7365f..9fef4b906 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 bf85681d9..103979ac1 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 4612b0de8..8fb1c27db 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 21cea74fa..92d309157 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 3e8183700..c73450eb4 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 3aa189099..706484349 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 164da15a4..dc67dff72 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 ff536b3c0..16d3c3265 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 f98d2eeeb..2e909356d 100644
--- a/Plausible.Site.Memberships.AcceptInvitation.html
+++ b/Plausible.Site.Memberships.AcceptInvitation.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Site.Memberships.RejectInvitation.html b/Plausible.Site.Memberships.RejectInvitation.html
index 7607043ce..0e5d37c68 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 221c4176b..e3eb2ea43 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 86b8ef538..0fbe5bbbb 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 5d5d2bde6..090aa023b 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 61e4975b4..3cb0f6767 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 e6c24046a..36d37e864 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 93a7b49c0..648af6bb1 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 4396f6efa..31964f224 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 6c17d6208..df4d5932a 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index 0dfccdcb8..8d9f15b44 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index 5115caa05..3612dcf57 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 aae2cb6ec..019b71e65 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 9c958faea..3208e2761 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 b60fadfbe..31126abbd 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 6d3927733..68d147f9f 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 2218cd867..9bbc959b0 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 79b4c374b..9ce892e34 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 55034dff0..aafff095e 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 84854cffb..dd08cff6a 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 5da378d69..addfa9ba7 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 1f409805e..57a2cea22 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 2efd97eb5..33987fbad 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 b88b8e38d..32902887b 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 bf607940e..7e6dba90b 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 92f7adf14..2c5dc1b9a 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 676918caf..06076a620 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 094535802..1a67bc31e 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 ab0fdc508..44dbbf05f 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 f5df33834..0ada4a8a0 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 9bb5afffc..78811e57d 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 f70cd78f0..5a9680341 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 feb197266..6440ac95a 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 3790993ef..5156e05f0 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index d020befd5..959ede469 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index 7f5437abe..f2fe7f01d 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index 8ffbad157..9432187e7 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 b530c1ee2..f3b99a76c 100644
--- a/Plausible.Workers.CheckUsage.html
+++ b/Plausible.Workers.CheckUsage.html
@@ -13,7 +13,7 @@
-
+
@@ -188,7 +188,7 @@ Functions
check_enterprise_subscriber(subscriber, billing_mod)
-
+
View Source
@@ -210,7 +210,7 @@ Functions
day_of_month(date)
-
+
View Source
@@ -234,7 +234,7 @@ Functions
last_day_of_month(day)
-
+
View Source
@@ -258,7 +258,7 @@ Functions
least(left, right)
-
+
View Source
@@ -282,7 +282,7 @@ Functions
yesterday()
-
+
View Source
diff --git a/Plausible.Workers.CleanEmailVerificationCodes.html b/Plausible.Workers.CleanEmailVerificationCodes.html
index 49994cf99..bab2c5e21 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 1e6d8de18..ae27407df 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 16d8c5b42..de08730e2 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 44f27cd4e..4bfc291ef 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 bb33cbf62..f03aa25aa 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 20236f28e..f401b9049 100644
--- a/Plausible.Workers.NotifyAnnualRenewal.html
+++ b/Plausible.Workers.NotifyAnnualRenewal.html
@@ -13,7 +13,7 @@
-
+
@@ -158,7 +158,7 @@ Functions
perform(job)
-
+
View Source
diff --git a/Plausible.Workers.RotateSalts.html b/Plausible.Workers.RotateSalts.html
index 69a472768..924a134c4 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 bad87a659..1c8d8e64a 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 852669067..791d41c43 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 2d42e4278..9a9091ea6 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 ca5311a20..37d0b1a5a 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 c2bf2fdbe..f1cba6f67 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 6918c27c5..079a5ee39 100644
--- a/Plausible.Workers.SpikeNotifier.html
+++ b/Plausible.Workers.SpikeNotifier.html
@@ -13,7 +13,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index d7d8acc9a801a37ae9d5487ff5e2d2a664c1596f..acb03daf34c77d0c7e410078903530a22946facc 100644
GIT binary patch
delta 148662
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
qI
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