From 81f0312a9c4e617e9734663221038387f8f8578e Mon Sep 17 00:00:00 2001
From: "github-merge-queue[bot]"
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Cldr.LanguageTag
.
The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -261,54 +261,54 @@ a configuredExamples
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ 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"}}
@@ -369,95 +369,95 @@ with an error tuple for each invalid tag added at the end of the list.
Example
-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"}}
+ ]}
@@ -502,92 +502,92 @@ with an error tuple for each invalid tag added at the end of the list.
Example
-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"}}
+]
diff --git a/Plausible.Cldr.Currency.html b/Plausible.Cldr.Currency.html
index 45d88cd4f..38bef7afb 100644
--- a/Plausible.Cldr.Currency.html
+++ b/Plausible.Cldr.Currency.html
@@ -14,7 +14,7 @@
-
+
@@ -419,11 +419,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,
@@ -433,12 +433,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,
@@ -448,7 +448,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -499,11 +499,11 @@ The default is :all
. See Example
MyApp.Cldr.Currency.currencies_for_locale!("en")
- => %{
FJD: %Cldr.Currency{
+ => %{FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -513,12 +513,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,
@@ -528,7 +528,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -586,13 +586,13 @@ or a
Examples
-iex> Plausible.Cldr.Currency.currency_for_code("AUD")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("AUD")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -600,15 +600,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",
@@ -616,7 +616,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -675,12 +675,12 @@ or a
Examples
-iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -688,14 +688,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",
@@ -703,7 +703,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -744,15 +744,15 @@ or a
Examples
-iex> {:ok, locale} = Plausible.Cldr.validate_locale("en")
+iex> {:ok, locale} = Plausible.Cldr.validate_locale("en")
iex> Plausible.Cldr.Currency.currency_from_locale locale
:USD
-iex> {:ok, locale} = Plausible.Cldr.validate_locale("en-AU")
+iex> {:ok, locale} = Plausible.Cldr.validate_locale("en-AU")
iex> Plausible.Cldr.Currency.currency_from_locale locale
:AUD
-iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
+iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
:GBP
@@ -796,14 +796,14 @@ or a
Example
-iex> MyApp.Cldr.Currency.currency_history_for_locale("en")
-{:ok,
- %{
- USD: %{from: ~D[1792-01-01], to: nil},
- USN: %{tender: false},
- USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
- }
-}
+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]}
+ }
+}
@@ -862,9 +862,9 @@ The default is :all
. See Example
-MyApp.Cldr.Currency.currency_strings("en")
-=> {:ok,
- %{
+MyApp.Cldr.Currency.currency_strings("en")
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -874,7 +874,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
@@ -933,8 +933,8 @@ The default is :all
. See Example
-MyApp.Cldr.Currency.currency_strings!("en")
-=> %{
+MyApp.Cldr.Currency.currency_strings!("en")
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -944,7 +944,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ }
@@ -982,10 +982,10 @@ or a
Example
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
:USD
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
:AUD
@@ -1033,7 +1033,7 @@ mapping is returned for that territory.Example
-iex> Plausible.Cldr.Currency.current_territory_currencies()
+iex> Plausible.Cldr.Currency.current_territory_currencies()
@@ -1125,11 +1125,11 @@ currency codeExamples
-iex> Plausible.Cldr.Currency.known_currency_code("AUD")
-{:ok, :AUD}
+iex> Plausible.Cldr.Currency.known_currency_code("AUD")
+{:ok, :AUD}
-iex> Plausible.Cldr.Currency.known_currency_code("GGG")
-{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
+iex> Plausible.Cldr.Currency.known_currency_code("GGG")
+{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
@@ -1176,13 +1176,13 @@ currency codeExamples
-iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
+iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
true
-iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
+iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
false
-iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
+iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
false
@@ -1217,7 +1217,7 @@ currency codeExample
-iex> Plausible.Cldr.Currency.known_currency_codes()
+iex> Plausible.Cldr.Currency.known_currency_codes()
@@ -1276,14 +1276,14 @@ such as 0.05
. Optional.Example
-iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
+{:ok,
+ %Cldr.Currency{
alt_code: :XAE,
cash_digits: 0,
cash_rounding: nil,
code: :XAE,
- count: %{other: "Custom Name"},
+ count: %{other: "Custom Name"},
digits: 0,
from: nil,
iso_digits: 0,
@@ -1293,11 +1293,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."}}
@@ -1355,20 +1355,20 @@ default is Plaus
Examples
-iex> Plausible.Cldr.Currency.pluralize(1, :USD)
-{:ok, "US dollar"}
+iex> Plausible.Cldr.Currency.pluralize(1, :USD)
+{:ok, "US dollar"}
-iex> Plausible.Cldr.Currency.pluralize(3, :USD)
-{:ok, "US dollars"}
+iex> Plausible.Cldr.Currency.pluralize(3, :USD)
+{:ok, "US dollars"}
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
-{:ok, "美元"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
+{:ok, "美元"}
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
-{:ok, "dollars des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
+{:ok, "dollars des États-Unis"}
-iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
-{:ok, "dollar des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
+{:ok, "dollar des États-Unis"}
@@ -1410,8 +1410,8 @@ or a
Example
-iex> MyApp.Cldr.Currency.strings_for_currency :AUD,("en")
-["a$", "australian dollars", "aud", "australian dollar"]
+iex> MyApp.Cldr.Currency.strings_for_currency :AUD,("en")
+["a$", "australian dollars", "aud", "australian dollar"]
diff --git a/Plausible.Cldr.Locale.html b/Plausible.Cldr.Locale.html
index eeb4b4a09..2ca8007e3 100644
--- a/Plausible.Cldr.Locale.html
+++ b/Plausible.Cldr.Locale.html
@@ -14,7 +14,7 @@
-
+
@@ -326,16 +326,16 @@ this specific locale..Examples
-iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
-{:ok, [:"fr-CA", :fr, :und]}
+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]}
@@ -389,20 +389,20 @@ this specific locale.Examples
-Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
-=> {:ok,
- [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+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]>]}
@@ -533,15 +533,15 @@ generic top-level domain names.Examples
iex> Plausible.Cldr.Locale.locale_from_host "a.b.com.au"
-Elixir.Plausible.Cldr.validate_locale(:"en-AU")
+Elixir.Plausible.Cldr.validate_locale(:"en-AU")
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
@@ -683,12 +683,12 @@ be a territory.Examples
-iex> Cldr.Locale.territory_from_host("a.b.com.au")
-{:ok, :AU}
+iex> Cldr.Locale.territory_from_host("a.b.com.au")
+{:ok, :AU}
-iex> Cldr.Locale.territory_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Cldr.Locale.territory_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
diff --git a/Plausible.Cldr.Number.Cardinal.html b/Plausible.Cldr.Number.Cardinal.html
index c3c0b569a..7691c39ca 100644
--- a/Plausible.Cldr.Number.Cardinal.html
+++ b/Plausible.Cldr.Number.Cardinal.html
@@ -14,7 +14,7 @@
-
+
@@ -461,31 +461,31 @@ The valid substitution keys are :zero
, Examples
-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"
diff --git a/Plausible.Cldr.Number.Format.html b/Plausible.Cldr.Number.Format.html
index 454e4983f..6e5d4fc66 100644
--- a/Plausible.Cldr.Number.Format.html
+++ b/Plausible.Cldr.Number.Format.html
@@ -14,7 +14,7 @@
-
+
@@ -465,7 +465,7 @@ to precompile all the known formats at compile time.Example
#=> Plausible.Cldr.Number.Format.Format.decimal_format_list
-["#", "#,##,##0%",
+["#", "#,##,##0%",
"#,##,##0.###", "#,##,##0.00¤", "#,##,##0.00¤;(#,##,##0.00¤)",
"#,##,##0 %", "#,##0%", "#,##0.###", "#,##0.00 ¤",
"#,##0.00 ¤;(#,##0.00 ¤)", "#,##0.00¤", "#,##0.00¤;(#,##0.00¤)",
@@ -475,7 +475,7 @@ to precompile all the known formats at compile time."000 B ¤"
, "000 E ¤", "000 K ¤", "000 MRD ¤", "000 Md ¤", "000 Mio'.' ¤",
"000 Mio ¤", "000 Mld ¤", "000 Mln ¤", "000 Mn ¤", "000 Mrd'.' ¤",
"000 Mrd ¤", "000 Mr ¤", "000 M ¤", "000 NT ¤", "000 N ¤", "000 Tn ¤",
-"000 Tr ¤", ...]
+"000 Tr ¤", ...]
iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
-{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
+iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
+{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
"0 billion", "0 million", "0 thousand",
"0 trillion", "00 billion", "00 million", "00 thousand", "00 trillion",
"000 billion", "000 million", "000 thousand", "000 trillion", "000B", "000K",
@@ -532,7 +532,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
, Examples
-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 98496fa44..61a16c771 100644
--- a/Plausible.Cldr.Number.PluralRule.Range.html
+++ b/Plausible.Cldr.Number.PluralRule.Range.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Cldr.Number.Symbol.html b/Plausible.Cldr.Number.Symbol.html
index c6a95cc21..4fb056968 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -14,7 +14,7 @@
-
+
@@ -378,9 +378,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: ",",
@@ -393,8 +393,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- },
- thai: %Cldr.Number.Symbol{
+ },
+ thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -407,8 +407,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 2b5ffd203..33a9d7c7d 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -14,7 +14,7 @@
-
+
@@ -317,23 +317,23 @@ it is returned as is.Examples
iex> Plausible.Cldr.Number.System.number_system_for "th", :latn
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :default
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "he", :traditional
-{:ok, %{rules: "hebrew", type: :algorithmic}}
+{:ok, %{rules: "hebrew", type: :algorithmic}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :native
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :finance
-{
+{
:error,
- {Cldr.UnknownNumberSystemError,
- "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
-}
+ {Cldr.UnknownNumberSystemError,
+ "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
+}
@@ -424,10 +424,10 @@ or a Examples
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"}}
@@ -509,13 +509,13 @@ or a Examples
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"}}
@@ -614,20 +614,20 @@ actual system name.Examples
-ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
-{:ok, :latn}
+ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
-{
+iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
+{
:error,
- {Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
-}
Note that return value is not guaranteed to be a valid
+
{Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
+}
Note that return value is not guaranteed to be a valid
number system for the given locale as demonstrated in the third example.
@@ -674,16 +674,16 @@ is recommended.Examples
iex> Plausible.Cldr.Number.System.to_system 123456, :hebr
-{:ok, "קכ״ג׳תנ״ו"}
+{:ok, "קכ״ג׳תנ״ו"}
iex> Plausible.Cldr.Number.System.to_system 123, :hans
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hant
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hansfin
-{:ok, "壹佰贰拾叁"}
+{:ok, "壹佰贰拾叁"}
To configure these transliteration pairs, add the to the use Cldr
configuration
-in a backend module:
defmodule MyApp.Cldr do
+in a backend module:defmodule MyApp.Cldr do
use Cldr,
- locale: ["en", "fr", "th"],
+ locale: ["en", "fr", "th"],
default_locale: "en",
- precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
-end
Where each tuple in the list configures one transliteration map. In this example, two maps are
+
precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
+end
Where each tuple in the list configures one transliteration map. In this example, two maps are
configured: from :latn
to :thai
and from :arab
to :thai
.
A list of configurable number systems is returned by Cldr.Number.System.numeric_systems/0
.
If a transliteration is requested between two number pairs that have not been configured for precompilation, a warning is logged.
Examples
-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 713c1fb73..1e3933a49 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -14,7 +14,7 @@
-
+
@@ -441,19 +441,19 @@ using the Elixir standard library functions.
Examples
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
-{:ok, 1000.34}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
+{:ok, 1000.34}
-iex> Plausible.Cldr.Number.parse("-1_000_000.34")
-{:ok, -1000000.34}
+iex> Plausible.Cldr.Number.parse("-1_000_000.34")
+{:ok, -1000000.34}
-iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
-{:ok, 1000}
+iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
+{:ok, 1000}
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
-{:error,
- {Cldr.Number.ParseError,
- "The string \"+1.000,34\" could not be parsed as a number"}}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
+{:error,
+ {Cldr.Number.ParseError,
+ "The string \"+1.000,34\" could not be parsed as a number"}}
@@ -525,17 +525,17 @@ financial instruments.
Examples
-iex> Plausible.Cldr.Number.scan("100 US dollars")
+iex> Plausible.Cldr.Number.scan("100 US dollars")
...> |> Plausible.Cldr.Number.resolve_currencies
-[100, :USD]
+[100, :USD]
-iex> Plausible.Cldr.Number.scan("100 eurosports")
-...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
-[100, :EUR]
+iex> Plausible.Cldr.Number.scan("100 eurosports")
+...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
+[100, :EUR]
-iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
-...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
-[100, :USD]
+iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
+...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
+[100, :USD]
@@ -612,19 +612,19 @@ financial instruments.Examples
-iex> Plausible.Cldr.Number.resolve_currency("US dollars")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("US dollars")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
-[:EUR]
+iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
+[:EUR]
-iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
-{:error,
- {Cldr.UnknownCurrencyError,
- "The currency \"not a known currency\" is unknown or not supported"}}
+iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
+{:error,
+ {Cldr.UnknownCurrencyError,
+ "The currency \"not a known currency\" is unknown or not supported"}}
@@ -688,13 +688,13 @@ The default is options[:backend].get_locale()
Examples
iex> Plausible.Cldr.Number.resolve_per "11%"
-["11", :percent]
+["11", :percent]
iex> Plausible.Cldr.Number.resolve_per "% of linguists"
-[:percent, " of linguists"]
+[:percent, " of linguists"]
iex> Plausible.Cldr.Number.resolve_per "% of linguists %"
-[:percent, " of linguists ", :percent]
+[:percent, " of linguists ", :percent]
@@ -751,9 +751,9 @@ The default is 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("£1_000_000.34")
+["£", 1000000.34]
-iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
-["I want £", 1000000, " dollars"]
+iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
+["I want £", 1000000, " dollars"]
-iex> Plausible.Cldr.Number.scan("The prize is 23")
-["The prize is ", 23]
+iex> Plausible.Cldr.Number.scan("The prize is 23")
+["The prize is ", 23]
-iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
-["The lottery number is ", 23, " for the next draw"]
+iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
+["The lottery number is ", 23, " for the next draw"]
-iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
-["The loss is ", -1000, " euros"]
+iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
+["The loss is ", -1000, " euros"]
iex> Plausible.Cldr.Number.to_approx_string 1234
-{:ok, "~1,234"}
+{:ok, "~1,234"}
iex> Plausible.Cldr.Number.to_at_least_string 1234
-{:ok, "1,234+"}
+{:ok, "1,234+"}
iex> Plausible.Cldr.Number.to_at_most_string 1234
-{:ok, "≤1,234"}
+{:ok, "≤1,234"}
iex> Plausible.Cldr.Number.to_range_string 1234..5678
-{:ok, "1,234–5,678"}
+{:ok, "1,234–5,678"}
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. @@ -1168,80 +1168,80 @@ inserted in the final formatted number.
iex> Plausible.Cldr.Number.to_string 12345
-{:ok, "12,345"}
+{:ok, "12,345"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr"
-{:ok, "12 345"}
+{:ok, "12 345"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es", minimum_grouping_digits: 1
-{:ok, "1.345,32 €"}
+{:ok, "1.345,32 €"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es"
-{:ok, "1345,32 €"}
+{:ok, "1345,32 €"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr", currency: "USD"
-{:ok, "12 345,00 $US"}
+{:ok, "12 345,00 $US"}
iex> Plausible.Cldr.Number.to_string 12345, format: "#E0"
-{:ok, "1.2345E4"}
+{:ok, "1.2345E4"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB"
-{:ok, "THB 12,345.00"}
+{:ok, "THB 12,345.00"}
iex> Plausible.Cldr.Number.to_string -12345, format: :accounting, currency: "THB"
-{:ok, "(THB 12,345.00)"}
+{:ok, "(THB 12,345.00)"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th"
-{:ok, "฿12,345.00"}
+{:ok, "฿12,345.00"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th", number_system: :native
-{:ok, "฿๑๒,๓๔๕.๐๐"}
+{:ok, "฿๑๒,๓๔๕.๐๐"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long
-{:ok, "1 thousand"}
+{:ok, "1 thousand"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long, currency: "USD"
-{:ok, "1,244 US dollars"}
+{:ok, "1,244 US dollars"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short
-{:ok, "1K"}
+{:ok, "1K"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short, currency: "EUR"
-{:ok, "€1K"}
+{:ok, "€1K"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout
-{:ok, "one thousand two hundred thirty-four"}
+{:ok, "one thousand two hundred thirty-four"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout_verbose
-{:ok, "one thousand two hundred and thirty-four"}
+{:ok, "one thousand two hundred and thirty-four"}
iex> Plausible.Cldr.Number.to_string 1989, format: :spellout_year
-{:ok, "nineteen eighty-nine"}
+{:ok, "nineteen eighty-nine"}
iex> Plausible.Cldr.Number.to_string 123, format: :ordinal
-{:ok, "123rd"}
+{:ok, "123rd"}
iex> Plausible.Cldr.Number.to_string 123, format: :roman
-{:ok, "CXXIII"}
+{:ok, "CXXIII"}
iex> Plausible.Cldr.Number.to_string 123, locale: "th-u-nu-thai"
-{:ok, "๑๒๓"}
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", format: :percent)
- {:error, {Cldr.UnknownFormatError,
- "The locale :he with number system :hebr does not define a format :percent"}}
+return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr", format: :percent)
+ {:error, {Cldr.UnknownFormatError,
+ "The locale :he with number system :hebr does not define a format :percent"}}
iex> Plausible.Cldr.Number.validate_number_system "en", :latn
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :default
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :unknown
-{:error,
- {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
+{:error,
+ {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
iex> Plausible.Cldr.Number.validate_number_system "zz", :default
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
Functions to implement the number system rule-based-number-format rules of CLDR.
These rules are defined only on the "und" locale and represent specialised number formatting.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
-...> |> 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,
@@ -161,9 +161,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,
@@ -155,9 +155,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()
+iex> Plausible.Cldr.default_territory()
:"001"
iex> Plausible.Cldr.ellipsis("And furthermore")
+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)
+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"
@@ -715,23 +715,23 @@ take an optional locale parameter for which a locale is not supplied.
Example
-iex> Plausible.Cldr.put_locale("pl")
-iex> Plausible.Cldr.get_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.put_locale("pl")
+iex> Plausible.Cldr.get_locale()
+%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: []
+ }
@@ -818,10 +818,10 @@ take an optional locale parameter for which a locale is not supplied.
Examples
-iex> Plausible.Cldr.known_gettext_locale_name("en")
+iex> Plausible.Cldr.known_gettext_locale_name("en")
"en"
-iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
+iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
false
@@ -864,10 +864,10 @@ name is configured and available in Gettext.Examples
-iex> Plausible.Cldr.known_gettext_locale_name?("en")
+iex> Plausible.Cldr.known_gettext_locale_name?("en")
true
-iex> Plausible.Cldr.known_gettext_locale_name?("!!")
+iex> Plausible.Cldr.known_gettext_locale_name?("!!")
false
@@ -941,10 +941,10 @@ to return the first known locale name from a list.Examples
-iex> Plausible.Cldr.known_locale_name(:"en-AU")
+iex> Plausible.Cldr.known_locale_name(:"en-AU")
:"en-AU"
-iex> Plausible.Cldr.known_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_locale_name(:"en-SA")
false
@@ -986,10 +986,10 @@ name is configured and available in Cldr.Examples
-iex> Plausible.Cldr.known_locale_name?(:en)
+iex> Plausible.Cldr.known_locale_name?(:en)
true
-iex> Plausible.Cldr.known_locale_name?(:"!!")
+iex> Plausible.Cldr.known_locale_name?(:"!!")
false
@@ -1043,8 +1043,8 @@ in this module or in
Example
-iex> Plausible.Cldr.known_number_system_types()
-[:default, :finance, :native, :traditional]
+iex> Plausible.Cldr.known_number_system_types()
+[:default, :finance, :native, :traditional]
@@ -1109,10 +1109,10 @@ and has RBNF rules defined.
Examples
-iex> Plausible.Cldr.known_rbnf_locale_name(:en)
+iex> Plausible.Cldr.known_rbnf_locale_name(:en)
:en
-iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
false
@@ -1155,10 +1155,10 @@ rules based number formats (RBNF).Examples
-iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
+iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
true
-iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
+iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
false
@@ -1294,18 +1294,18 @@ CLDR backend defined by the t:Cldr.LanguageTag
is se
Examples
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"en")
-{:ok, "en"}
+iex> Plausible.Cldr.put_gettext_locale(~l"en")
+{:ok, "en"}
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"de")
-{
+iex> Plausible.Cldr.put_gettext_locale(~l"de")
+{
:error,
- {
+ {
Cldr.UnknownLocaleError,
"Locale TestBackend.Cldr.Locale.new!(\"de-DE\") does not map to a known gettext locale name"
- }
-}
+ }
+}
@@ -1349,29 +1349,29 @@ of a language tag.
Examples
-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"}}
@@ -1420,10 +1420,10 @@ The default is Examples
-iex> Plausible.Cldr.quote("Quoted String")
+iex> Plausible.Cldr.quote("Quoted String")
"“Quoted String”"
-iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
+iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
"「Quoted String」"
@@ -1554,47 +1554,47 @@ of a language tag.Examples
-iex> Plausible.Cldr.validate_locale(:en)
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale(:en)
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale("zzz")
-{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
+iex> Plausible.Cldr.validate_locale("zzz")
+{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
@@ -1664,23 +1664,23 @@ of a language tag.Examples
-iex> Plausible.Cldr.validate_number_system_type(:default)
-{:ok, :default}
+iex> Plausible.Cldr.validate_number_system_type(:default)
+{:ok, :default}
-iex> Plausible.Cldr.validate_number_system_type(:traditional)
-{:ok, :traditional}
+iex> Plausible.Cldr.validate_number_system_type(:traditional)
+{:ok, :traditional}
-iex> Plausible.Cldr.validate_number_system_type(:latn)
-{
+iex> Plausible.Cldr.validate_number_system_type(:latn)
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
+}
-iex> Plausible.Cldr.validate_number_system_type("bork")
-{
+iex> Plausible.Cldr.validate_number_system_type("bork")
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
+}
diff --git a/Plausible.ClickhouseEventV2.html b/Plausible.ClickhouseEventV2.html
index c860e40b6..db4603ffb 100644
--- a/Plausible.ClickhouseEventV2.html
+++ b/Plausible.ClickhouseEventV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseLocationData.html b/Plausible.ClickhouseLocationData.html
index 7f8ccc5d3..de09a9043 100644
--- a/Plausible.ClickhouseLocationData.html
+++ b/Plausible.ClickhouseLocationData.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index 6eb3c6118..4aecd01ee 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -879,23 +879,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.ClickhouseSessionV2.BoolUInt8.html b/Plausible.ClickhouseSessionV2.BoolUInt8.html
index 1a9248407..23470f3d2 100644
--- a/Plausible.ClickhouseSessionV2.BoolUInt8.html
+++ b/Plausible.ClickhouseSessionV2.BoolUInt8.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseSessionV2.html b/Plausible.ClickhouseSessionV2.html
index c63bb62a4..6d1d92643 100644
--- a/Plausible.ClickhouseSessionV2.html
+++ b/Plausible.ClickhouseSessionV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html
index e4abe4650..28ab38a2b 100644
--- a/Plausible.ConfigHelpers.html
+++ b/Plausible.ConfigHelpers.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.CrmExtensions.html b/Plausible.CrmExtensions.html
index 928b13c22..c0a6099e8 100644
--- a/Plausible.CrmExtensions.html
+++ b/Plausible.CrmExtensions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html
index b30e6afd7..9beff782b 100644
--- a/Plausible.DataCase.html
+++ b/Plausible.DataCase.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html b/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html
index 173e1f122..4aa83969b 100644
--- a/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html
+++ b/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.LocationsSync.html b/Plausible.DataMigration.LocationsSync.html
index 55e1b5ff8..7e51dc1db 100644
--- a/Plausible.DataMigration.LocationsSync.html
+++ b/Plausible.DataMigration.LocationsSync.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.NumericIDs.html b/Plausible.DataMigration.NumericIDs.html
index 3dfa7191d..f1acfdc6d 100644
--- a/Plausible.DataMigration.NumericIDs.html
+++ b/Plausible.DataMigration.NumericIDs.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.PopulateEventSessionColumns.html b/Plausible.DataMigration.PopulateEventSessionColumns.html
index b51053d4e..2830cda75 100644
--- a/Plausible.DataMigration.PopulateEventSessionColumns.html
+++ b/Plausible.DataMigration.PopulateEventSessionColumns.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index b0b68157e..7754742e3 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -14,7 +14,7 @@
-
+
@@ -1196,23 +1196,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.DataMigration.SiteImports.html b/Plausible.DataMigration.SiteImports.html
index 63ab04c4f..9b990fc12 100644
--- a/Plausible.DataMigration.SiteImports.html
+++ b/Plausible.DataMigration.SiteImports.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.VersionedSessions.html b/Plausible.DataMigration.VersionedSessions.html
index 58eeeed2e..1f3e3b028 100644
--- a/Plausible.DataMigration.VersionedSessions.html
+++ b/Plausible.DataMigration.VersionedSessions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.html b/Plausible.DataMigration.html
index 2b948a2d7..1544ce160 100644
--- a/Plausible.DataMigration.html
+++ b/Plausible.DataMigration.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DebugReplayInfo.html b/Plausible.DebugReplayInfo.html
index ae8590801..7d7c195dd 100644
--- a/Plausible.DebugReplayInfo.html
+++ b/Plausible.DebugReplayInfo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ecto.EventName.html b/Plausible.Ecto.EventName.html
index 76cd589b2..8d248799b 100644
--- a/Plausible.Ecto.EventName.html
+++ b/Plausible.Ecto.EventName.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ecto.Types.CompiledRegex.html b/Plausible.Ecto.Types.CompiledRegex.html
index 778ae0746..caf341f3f 100644
--- a/Plausible.Ecto.Types.CompiledRegex.html
+++ b/Plausible.Ecto.Types.CompiledRegex.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Exports.html b/Plausible.Exports.html
index efdb5a600..00b5436f3 100644
--- a/Plausible.Exports.html
+++ b/Plausible.Exports.html
@@ -14,7 +14,7 @@
-
+
@@ -381,7 +381,7 @@ tables into the format of imported_*
tables for a we
-Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
+Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
"plausible_io_20241231.zip"
@@ -404,10 +404,10 @@ tables into the format of imported_*
tables for a we
-Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
+Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
"attachment; filename=\"plausible_io_20241231.zip\""
-iex> content_disposition("📊.zip")
+iex> content_disposition("📊.zip")
"attachment; filename=\"plausible-export.zip\"; filename*=utf-8''%F0%9F%93%8A.zip"
@@ -726,14 +726,14 @@ tables into the format of imported_*
tables for a we
-Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
+Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
-DBConnection.run(pool, fn conn ->
+DBConnection.run(pool, fn conn ->
conn
- |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
- |> Stream.into(File.stream!("export.zip"))
- |> Stream.run()
-end)
+ |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
+ |> Stream.into(File.stream!("export.zip"))
+ |> Stream.run()
+end)
diff --git a/Plausible.Factory.html b/Plausible.Factory.html
index cb5450917..cbaf4eeff 100644
--- a/Plausible.Factory.html
+++ b/Plausible.Factory.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.File.html b/Plausible.File.html
index ec6c1285d..753b7b12c 100644
--- a/Plausible.File.html
+++ b/Plausible.File.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnel.Const.html b/Plausible.Funnel.Const.html
index 0abdfe2ad..fc515a233 100644
--- a/Plausible.Funnel.Const.html
+++ b/Plausible.Funnel.Const.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnel.Step.html b/Plausible.Funnel.Step.html
index ecec422a9..0a652bc52 100644
--- a/Plausible.Funnel.Step.html
+++ b/Plausible.Funnel.Step.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnel.html b/Plausible.Funnel.html
index 8fb76f1b0..0fbb0ea6a 100644
--- a/Plausible.Funnel.html
+++ b/Plausible.Funnel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html
index 702ea7555..ee1e483b4 100644
--- a/Plausible.Funnels.html
+++ b/Plausible.Funnels.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index cae7a5ef8..ba30659a2 100644
--- a/Plausible.Geo.html
+++ b/Plausible.Geo.html
@@ -14,7 +14,7 @@
-
+
@@ -260,8 +260,8 @@ and MaxMind license key.
Examples
- 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"
@@ -302,8 +302,8 @@ asynchronously.
Examples
- 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
@@ -332,21 +332,21 @@ asynchronously.
Examples
-iex> lookup("8.7.6.5")
-%{
- "city" => %{
+iex> lookup("8.7.6.5")
+%{
+ "city" => %{
"geoname_id" => 5349755,
- "names" => %{
+ "names" => %{
"de" => "Fontana",
"en" => "Fontana",
"ja" => "フォンタナ",
"ru" => "Фонтана"
- }
- },
- "continent" => %{
+ }
+ },
+ "continent" => %{
"code" => "NA",
"geoname_id" => 6255149,
- "names" => %{
+ "names" => %{
"de" => "Nordamerika",
"en" => "North America",
"es" => "Norteamérica",
@@ -355,12 +355,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",
@@ -369,20 +369,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",
@@ -391,13 +391,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -406,10 +406,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.Goal.Revenue.html b/Plausible.Goal.Revenue.html
index c2e496661..775fba719 100644
--- a/Plausible.Goal.Revenue.html
+++ b/Plausible.Goal.Revenue.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Goal.html b/Plausible.Goal.html
index f5b692a9b..06dc1e61f 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index a68a18295..1e1c3d270 100644
--- a/Plausible.Goals.html
+++ b/Plausible.Goals.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.API.Mock.html b/Plausible.Google.API.Mock.html
index 8de03ad21..63ea5ed3c 100644
--- a/Plausible.Google.API.Mock.html
+++ b/Plausible.Google.API.Mock.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.API.html b/Plausible.Google.API.html
index 0d8f73e06..66456847f 100644
--- a/Plausible.Google.API.html
+++ b/Plausible.Google.API.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.GA4.API.html b/Plausible.Google.GA4.API.html
index 4286d4543..5c3062a82 100644
--- a/Plausible.Google.GA4.API.html
+++ b/Plausible.Google.GA4.API.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.GA4.HTTP.html b/Plausible.Google.GA4.HTTP.html
index 1a947da72..b465728f2 100644
--- a/Plausible.Google.GA4.HTTP.html
+++ b/Plausible.Google.GA4.HTTP.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.GA4.ReportRequest.html b/Plausible.Google.GA4.ReportRequest.html
index 43fe582d4..6ed7c87ff 100644
--- a/Plausible.Google.GA4.ReportRequest.html
+++ b/Plausible.Google.GA4.ReportRequest.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.HTTP.html b/Plausible.Google.HTTP.html
index fb8b99d66..f2d2cebe1 100644
--- a/Plausible.Google.HTTP.html
+++ b/Plausible.Google.HTTP.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HTTPClient.Interface.html b/Plausible.HTTPClient.Interface.html
index 71e9af3ff..589ee9ab4 100644
--- a/Plausible.HTTPClient.Interface.html
+++ b/Plausible.HTTPClient.Interface.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HTTPClient.Non200Error.html b/Plausible.HTTPClient.Non200Error.html
index 33407252a..8077a3bf4 100644
--- a/Plausible.HTTPClient.Non200Error.html
+++ b/Plausible.HTTPClient.Non200Error.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HTTPClient.html b/Plausible.HTTPClient.html
index 9ff2f7adb..65728e15f 100644
--- a/Plausible.HTTPClient.html
+++ b/Plausible.HTTPClient.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HelpScout.Vault.html b/Plausible.HelpScout.Vault.html
index f92574c66..a8e03d0bf 100644
--- a/Plausible.HelpScout.Vault.html
+++ b/Plausible.HelpScout.Vault.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HelpScout.html b/Plausible.HelpScout.html
index ffd7a3f69..99936c076 100644
--- a/Plausible.HelpScout.html
+++ b/Plausible.HelpScout.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Helpers.JSON.html b/Plausible.Helpers.JSON.html
index 3a16e528f..1141915a4 100644
--- a/Plausible.Helpers.JSON.html
+++ b/Plausible.Helpers.JSON.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index 2454003f7..675bcc67b 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -1187,23 +1187,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.Buffer.html b/Plausible.Imported.Buffer.html
index 7277ea4c9..0143d1f73 100644
--- a/Plausible.Imported.Buffer.html
+++ b/Plausible.Imported.Buffer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.CSVImporter.html b/Plausible.Imported.CSVImporter.html
index 12ebe0a14..874e1a06b 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -14,7 +14,7 @@
-
+
@@ -257,13 +257,13 @@ or from local storage for which it uses iex> date_range([
-...> %{"filename" => "imported_devices_20190101_20210101.csv"},
+Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
+...> %{"filename" => "imported_devices_20190101_20210101.csv"},
...> "pages_20200101_20220101.csv"
-...> ])
-Date.range(~D[2019-01-01], ~D[2022-01-01])
+...> ])
+Date.range(~D[2019-01-01], ~D[2022-01-01])
-iex> date_range([])
+iex> date_range([])
nil
@@ -292,13 +292,13 @@ or from local storage for which it uses iex> extract_table("my_data.csv")
+Extracts the table name from the provided filename.
Raises if the filename doesn't conform to the expected format.
Examples:
iex> extract_table("my_data.csv")
** (ArgumentError) invalid filename
-iex> extract_table("imported_devices_00010101_20250101.csv")
+iex> extract_table("imported_devices_00010101_20250101.csv")
"imported_devices"
-iex> extract_table("devices_00010101_20250101.csv")
+iex> extract_table("devices_00010101_20250101.csv")
"imported_devices"
@@ -321,8 +321,8 @@ or from local storage for which it uses
-Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
, $PERSISTENT_CACHE_DIR
or $DEFAULT_DATA_DIR
(if set) and falls back to /tmp.
$DEFAULT_DATA_DIR
is set to /var/lib/plausible
in container images.
Examples:
iex> local_dir = local_dir(_site_id = 37)
-iex> String.ends_with?(local_dir, "/plausible-imports/37")
+Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
, $PERSISTENT_CACHE_DIR
or $DEFAULT_DATA_DIR
(if set) and falls back to /tmp.
$DEFAULT_DATA_DIR
is set to /var/lib/plausible
in container images.
Examples:
iex> local_dir = local_dir(_site_id = 37)
+iex> String.ends_with?(local_dir, "/plausible-imports/37")
true
@@ -382,14 +382,14 @@ or from local storage for which it uses iex> parse_filename!("my_data.csv")
+Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
** (ArgumentError) invalid filename
-iex> parse_filename!("imported_devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("imported_devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
-iex> parse_filename!("devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
@@ -417,13 +417,13 @@ or from local storage for which it uses iex> valid_filename?("my_data.csv")
+Checks if the provided filename conforms to the expected format.
Examples:
iex> valid_filename?("my_data.csv")
false
-iex> valid_filename?("imported_devices_00010101_20250101.csv")
+iex> valid_filename?("imported_devices_00010101_20250101.csv")
true
-iex> valid_filename?("devices_00010101_20250101.csv")
+iex> valid_filename?("devices_00010101_20250101.csv")
true
diff --git a/Plausible.Imported.GoogleAnalytics4.html b/Plausible.Imported.GoogleAnalytics4.html
index 1035e2777..023042b32 100644
--- a/Plausible.Imported.GoogleAnalytics4.html
+++ b/Plausible.Imported.GoogleAnalytics4.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.ImportSources.html b/Plausible.Imported.ImportSources.html
index b6d0a83a9..ef55ac3a4 100644
--- a/Plausible.Imported.ImportSources.html
+++ b/Plausible.Imported.ImportSources.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.Importer.html b/Plausible.Imported.Importer.html
index ca7da0341..e41535e89 100644
--- a/Plausible.Imported.Importer.html
+++ b/Plausible.Imported.Importer.html
@@ -14,7 +14,7 @@
-
+
@@ -183,30 +183,30 @@ scope of importer logic and is expected to be implemented separately.
In case it's necessary to run the whole import job fully synchronously, the
Plausible.Workers.ImportAnalytics
worker sends an Oban.Notifier
message
-on completion, failure or transient failure of the import.
A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
+on completion, failure or transient failure of the import.A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
site,
user,
start_date: ~D[2005-01-01],
- end_date: Date.utc_today(),
+ end_date: Date.utc_today(),
# this option is necessary to setup the calling process as listener
listen?: true
-)
+)
-import_id = job.args[:import_id]
+import_id = job.args[:import_id]
-receive do
- {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
- IO.puts("Job completed")
+receive do
+ {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
+ IO.puts("Job completed")
- {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed transiently")
+ {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed transiently")
- {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed permanently")
-after
+ {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed permanently")
+after
15_000 ->
- IO.puts("Job didn't finish in 15 seconds")
-end
In a more realistic scenario, job scheduling will be done inside a GenServer process
+
IO.puts("Job didn't finish in 15 seconds")
+end
In a more realistic scenario, job scheduling will be done inside a GenServer process
like LiveView, where notifications can be listened for via handle_info/2
.
diff --git a/Plausible.Imported.NoopImporter.html b/Plausible.Imported.NoopImporter.html
index 5a8d3bd96..002f3aa74 100644
--- a/Plausible.Imported.NoopImporter.html
+++ b/Plausible.Imported.NoopImporter.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.SiteImport.html b/Plausible.Imported.SiteImport.html
index b506e6ecd..7ab950ddd 100644
--- a/Plausible.Imported.SiteImport.html
+++ b/Plausible.Imported.SiteImport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.UniversalAnalytics.html b/Plausible.Imported.UniversalAnalytics.html
index e0f8aecf1..f84baa7ee 100644
--- a/Plausible.Imported.UniversalAnalytics.html
+++ b/Plausible.Imported.UniversalAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.html b/Plausible.Imported.html
index 89873f3a8..a57dae4d5 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index fe30e5146..6bdff90a0 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -1217,23 +1217,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 89cc61897..1188d76df 100644
--- a/Plausible.Ingestion.Counters.Buffer.html
+++ b/Plausible.Ingestion.Counters.Buffer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Counters.Record.html b/Plausible.Ingestion.Counters.Record.html
index e00adb559..154e9ceaa 100644
--- a/Plausible.Ingestion.Counters.Record.html
+++ b/Plausible.Ingestion.Counters.Record.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Counters.TelemetryHandler.html b/Plausible.Ingestion.Counters.TelemetryHandler.html
index e567e9b8e..c5c38b647 100644
--- a/Plausible.Ingestion.Counters.TelemetryHandler.html
+++ b/Plausible.Ingestion.Counters.TelemetryHandler.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Counters.html b/Plausible.Ingestion.Counters.html
index 3adb1165f..e7fc623ce 100644
--- a/Plausible.Ingestion.Counters.html
+++ b/Plausible.Ingestion.Counters.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Event.Revenue.html b/Plausible.Ingestion.Event.Revenue.html
index ac01f489e..9bc80818c 100644
--- a/Plausible.Ingestion.Event.Revenue.html
+++ b/Plausible.Ingestion.Event.Revenue.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Event.html b/Plausible.Ingestion.Event.html
index b4bec1e40..abd8d4b7a 100644
--- a/Plausible.Ingestion.Event.html
+++ b/Plausible.Ingestion.Event.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Request.Revenue.html b/Plausible.Ingestion.Request.Revenue.html
index 49e694e40..b3211136d 100644
--- a/Plausible.Ingestion.Request.Revenue.html
+++ b/Plausible.Ingestion.Request.Revenue.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Request.html b/Plausible.Ingestion.Request.html
index 19045a786..264f8056e 100644
--- a/Plausible.Ingestion.Request.html
+++ b/Plausible.Ingestion.Request.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.License.html b/Plausible.License.html
index 947bab5f4..69f84f2fc 100644
--- a/Plausible.License.html
+++ b/Plausible.License.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.LiveViewTest.html b/Plausible.LiveViewTest.html
index ced2731f1..69314ef56 100644
--- a/Plausible.LiveViewTest.html
+++ b/Plausible.LiveViewTest.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html
index 9e01b5b4f..99c8bb59d 100644
--- a/Plausible.Mailer.html
+++ b/Plausible.Mailer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.MigrationUtils.html b/Plausible.MigrationUtils.html
index 241090630..ce846df8b 100644
--- a/Plausible.MigrationUtils.html
+++ b/Plausible.MigrationUtils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.OpenTelemetry.Sampler.html b/Plausible.OpenTelemetry.Sampler.html
index e77a2bb0a..407f88819 100644
--- a/Plausible.OpenTelemetry.Sampler.html
+++ b/Plausible.OpenTelemetry.Sampler.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.PaddleApi.Mock.html b/Plausible.PaddleApi.Mock.html
index 41cd0d885..6d4a673af 100644
--- a/Plausible.PaddleApi.Mock.html
+++ b/Plausible.PaddleApi.Mock.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Pagination.html b/Plausible.Pagination.html
index e9999c86b..812f0380b 100644
--- a/Plausible.Pagination.html
+++ b/Plausible.Pagination.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.Capabilities.html b/Plausible.Plugins.API.Capabilities.html
index 5332a658a..97bb4204d 100644
--- a/Plausible.Plugins.API.Capabilities.html
+++ b/Plausible.Plugins.API.Capabilities.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.CustomProps.html b/Plausible.Plugins.API.CustomProps.html
index 1fea15343..767552089 100644
--- a/Plausible.Plugins.API.CustomProps.html
+++ b/Plausible.Plugins.API.CustomProps.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.Funnels.html b/Plausible.Plugins.API.Funnels.html
index 47cdf2db1..2b05f5c6b 100644
--- a/Plausible.Plugins.API.Funnels.html
+++ b/Plausible.Plugins.API.Funnels.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.Goals.html b/Plausible.Plugins.API.Goals.html
index 76a6cece4..dec56cd55 100644
--- a/Plausible.Plugins.API.Goals.html
+++ b/Plausible.Plugins.API.Goals.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.SharedLinks.html b/Plausible.Plugins.API.SharedLinks.html
index 59cf8cb26..f9a1b202f 100644
--- a/Plausible.Plugins.API.SharedLinks.html
+++ b/Plausible.Plugins.API.SharedLinks.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.Token.html b/Plausible.Plugins.API.Token.html
index 36b1dd899..d2b20f63b 100644
--- a/Plausible.Plugins.API.Token.html
+++ b/Plausible.Plugins.API.Token.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.Tokens.html b/Plausible.Plugins.API.Tokens.html
index 343867fd8..83ae7500c 100644
--- a/Plausible.Plugins.API.Tokens.html
+++ b/Plausible.Plugins.API.Tokens.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.PromEx.Plugins.PlausibleMetrics.html b/Plausible.PromEx.Plugins.PlausibleMetrics.html
index 969729d53..867d1e3b9 100644
--- a/Plausible.PromEx.Plugins.PlausibleMetrics.html
+++ b/Plausible.PromEx.Plugins.PlausibleMetrics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.PromEx.html b/Plausible.PromEx.html
index d5822b3ca..91c9438d1 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index 2a7925d7b..dbeb719a0 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index 4088eda3f..0e44ee41a 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html
index 774129539..6f6b9c2cb 100644
--- a/Plausible.RateLimit.html
+++ b/Plausible.RateLimit.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index 33520cf17..975a4175e 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index 76101e105..bfd08e6ad 100644
--- a/Plausible.Repo.html
+++ b/Plausible.Repo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RequestLogger.html b/Plausible.RequestLogger.html
index 6947d9fdb..ae50e7008 100644
--- a/Plausible.RequestLogger.html
+++ b/Plausible.RequestLogger.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.S3.html b/Plausible.S3.html
index bc043169c..f2bbe72d3 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -14,7 +14,7 @@
-
+
@@ -316,7 +316,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.
In
Returns the pre-configured S3 bucket for CSV exports.
config :plausible, Plausible.S3,
- exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
+ exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
"test-exports"
@@ -348,8 +348,8 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-
Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
-%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
+Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
+%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
@@ -371,9 +371,9 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
-iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
-iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
+Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
+iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
+iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
@@ -402,7 +402,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
Returns the pre-configured S3 bucket for CSV imports.
config :plausible, Plausible.S3,
- imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
+ imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
"test-imports"
diff --git a/Plausible.Sentry.Client.html b/Plausible.Sentry.Client.html
index 0c1856ae1..88f971d34 100644
--- a/Plausible.Sentry.Client.html
+++ b/Plausible.Sentry.Client.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.SentryFilter.html b/Plausible.SentryFilter.html
index c7bc217cd..f7a80bcbc 100644
--- a/Plausible.SentryFilter.html
+++ b/Plausible.SentryFilter.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Session.CacheStore.html b/Plausible.Session.CacheStore.html
index 8e7e58533..aaef132d3 100644
--- a/Plausible.Session.CacheStore.html
+++ b/Plausible.Session.CacheStore.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Session.Salts.html b/Plausible.Session.Salts.html
index 2aaac8547..cda68f217 100644
--- a/Plausible.Session.Salts.html
+++ b/Plausible.Session.Salts.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.CountryRule.html b/Plausible.Shield.CountryRule.html
index e1b57731b..7dfa6bcad 100644
--- a/Plausible.Shield.CountryRule.html
+++ b/Plausible.Shield.CountryRule.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.CountryRuleCache.html b/Plausible.Shield.CountryRuleCache.html
index edea35810..2c798dd98 100644
--- a/Plausible.Shield.CountryRuleCache.html
+++ b/Plausible.Shield.CountryRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.HostnameRule.html b/Plausible.Shield.HostnameRule.html
index 4628bcc9f..1afe8c04b 100644
--- a/Plausible.Shield.HostnameRule.html
+++ b/Plausible.Shield.HostnameRule.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.HostnameRuleCache.html b/Plausible.Shield.HostnameRuleCache.html
index b726aaf46..1b8be8c3a 100644
--- a/Plausible.Shield.HostnameRuleCache.html
+++ b/Plausible.Shield.HostnameRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.IPRule.html b/Plausible.Shield.IPRule.html
index de6ed4221..916688225 100644
--- a/Plausible.Shield.IPRule.html
+++ b/Plausible.Shield.IPRule.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.IPRuleCache.html b/Plausible.Shield.IPRuleCache.html
index f4ce2494d..086bbae88 100644
--- a/Plausible.Shield.IPRuleCache.html
+++ b/Plausible.Shield.IPRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.PageRule.html b/Plausible.Shield.PageRule.html
index 7586a31b2..2ee6165d2 100644
--- a/Plausible.Shield.PageRule.html
+++ b/Plausible.Shield.PageRule.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.PageRuleCache.html b/Plausible.Shield.PageRuleCache.html
index c176cb50c..681d2c748 100644
--- a/Plausible.Shield.PageRuleCache.html
+++ b/Plausible.Shield.PageRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shields.html b/Plausible.Shields.html
index 1fd4f1a22..afd26b31f 100644
--- a/Plausible.Shields.html
+++ b/Plausible.Shields.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Cache.html b/Plausible.Site.Cache.html
index 525d4d810..3700b818a 100644
--- a/Plausible.Site.Cache.html
+++ b/Plausible.Site.Cache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Domain.html b/Plausible.Site.Domain.html
index b5abdeade..ceba79a8e 100644
--- a/Plausible.Site.Domain.html
+++ b/Plausible.Site.Domain.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.GateKeeper.html b/Plausible.Site.GateKeeper.html
index f53e432e1..9306ca067 100644
--- a/Plausible.Site.GateKeeper.html
+++ b/Plausible.Site.GateKeeper.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.GoogleAuth.html b/Plausible.Site.GoogleAuth.html
index 8fecf0c44..7e7c9290b 100644
--- a/Plausible.Site.GoogleAuth.html
+++ b/Plausible.Site.GoogleAuth.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.ImportedData.html b/Plausible.Site.ImportedData.html
index ea62677f4..3f8df97de 100644
--- a/Plausible.Site.ImportedData.html
+++ b/Plausible.Site.ImportedData.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.InstallationMeta.html b/Plausible.Site.InstallationMeta.html
index e77eb502d..47d494896 100644
--- a/Plausible.Site.InstallationMeta.html
+++ b/Plausible.Site.InstallationMeta.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Membership.html b/Plausible.Site.Membership.html
index c4e2a333a..e0068a08e 100644
--- a/Plausible.Site.Membership.html
+++ b/Plausible.Site.Membership.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Memberships.AcceptInvitation.html b/Plausible.Site.Memberships.AcceptInvitation.html
index 91fbd0133..5fca33c1e 100644
--- a/Plausible.Site.Memberships.AcceptInvitation.html
+++ b/Plausible.Site.Memberships.AcceptInvitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Memberships.CreateInvitation.html b/Plausible.Site.Memberships.CreateInvitation.html
index ccf7abc7c..1008b0f62 100644
--- a/Plausible.Site.Memberships.CreateInvitation.html
+++ b/Plausible.Site.Memberships.CreateInvitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Memberships.RejectInvitation.html b/Plausible.Site.Memberships.RejectInvitation.html
index d7fabec0a..547344c7f 100644
--- a/Plausible.Site.Memberships.RejectInvitation.html
+++ b/Plausible.Site.Memberships.RejectInvitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Memberships.RemoveInvitation.html b/Plausible.Site.Memberships.RemoveInvitation.html
index e78ffa240..1ae0b319b 100644
--- a/Plausible.Site.Memberships.RemoveInvitation.html
+++ b/Plausible.Site.Memberships.RemoveInvitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Memberships.html b/Plausible.Site.Memberships.html
index 46d903ea2..18fa5a89a 100644
--- a/Plausible.Site.Memberships.html
+++ b/Plausible.Site.Memberships.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.MonthlyReport.html b/Plausible.Site.MonthlyReport.html
index d35ea1306..7273c93ea 100644
--- a/Plausible.Site.MonthlyReport.html
+++ b/Plausible.Site.MonthlyReport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Removal.html b/Plausible.Site.Removal.html
index 4cba9f17b..0295c3624 100644
--- a/Plausible.Site.Removal.html
+++ b/Plausible.Site.Removal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.SharedLink.html b/Plausible.Site.SharedLink.html
index 18cbe778d..cb70b11de 100644
--- a/Plausible.Site.SharedLink.html
+++ b/Plausible.Site.SharedLink.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.TrafficChangeNotification.html b/Plausible.Site.TrafficChangeNotification.html
index 93b126f37..a2e6fac40 100644
--- a/Plausible.Site.TrafficChangeNotification.html
+++ b/Plausible.Site.TrafficChangeNotification.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.UserPreference.html b/Plausible.Site.UserPreference.html
index 31592319f..062d7e73d 100644
--- a/Plausible.Site.UserPreference.html
+++ b/Plausible.Site.UserPreference.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.WeeklyReport.html b/Plausible.Site.WeeklyReport.html
index b2627f8a3..1ca9b80a4 100644
--- a/Plausible.Site.WeeklyReport.html
+++ b/Plausible.Site.WeeklyReport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.html b/Plausible.Site.html
index 6888f8256..0f44ff7a9 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index 6a0380865..7d67002dd 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index 342a5ae34..11ab0a0d5 100644
--- a/Plausible.Sites.html
+++ b/Plausible.Sites.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Aggregate.html b/Plausible.Stats.Aggregate.html
index a7aefc6e1..3fb3242c2 100644
--- a/Plausible.Stats.Aggregate.html
+++ b/Plausible.Stats.Aggregate.html
@@ -14,7 +14,7 @@
-
+
@@ -169,7 +169,7 @@ Pages
@@ -177,7 +177,7 @@ Pages
@@ -205,7 +205,7 @@ Pages
aggregate(site, query, metrics)
-
+
View Source
@@ -218,16 +218,16 @@ Pages
-
+
-
+
Link to this function
- get_value(metric_list, index, metric, currency)
+ get_value(metric_list, index, metric)
-
+
View Source
@@ -240,16 +240,16 @@ Pages
-
+
-
+
Link to this function
- metric_map(map, index, metric, currency)
+ metric_map(map, index, metric)
-
+
View Source
diff --git a/Plausible.Stats.Base.html b/Plausible.Stats.Base.html
index 7e488cca0..58be15e45 100644
--- a/Plausible.Stats.Base.html
+++ b/Plausible.Stats.Base.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Breakdown.html b/Plausible.Stats.Breakdown.html
index 072bb8248..a6c580e86 100644
--- a/Plausible.Stats.Breakdown.html
+++ b/Plausible.Stats.Breakdown.html
@@ -14,7 +14,7 @@
-
+
@@ -199,7 +199,7 @@ Pages
breakdown(site, query, metrics, arg, opts \\ [])
-
+
View Source
@@ -221,7 +221,7 @@ Pages
transform_dimensions(dimension)
-
+
View Source
diff --git a/Plausible.Stats.Clickhouse.html b/Plausible.Stats.Clickhouse.html
index b25b24973..167c568f7 100644
--- a/Plausible.Stats.Clickhouse.html
+++ b/Plausible.Stats.Clickhouse.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Compare.html b/Plausible.Stats.Compare.html
index 9c38ebfca..e6518c8de 100644
--- a/Plausible.Stats.Compare.html
+++ b/Plausible.Stats.Compare.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Comparisons.html b/Plausible.Stats.Comparisons.html
index 2373b39b4..8746f8c52 100644
--- a/Plausible.Stats.Comparisons.html
+++ b/Plausible.Stats.Comparisons.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.CurrentVisitors.html b/Plausible.Stats.CurrentVisitors.html
index 584b70ebb..9e1c5c646 100644
--- a/Plausible.Stats.CurrentVisitors.html
+++ b/Plausible.Stats.CurrentVisitors.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.CustomProps.html b/Plausible.Stats.CustomProps.html
index 0cd905b92..1042af34e 100644
--- a/Plausible.Stats.CustomProps.html
+++ b/Plausible.Stats.CustomProps.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.DateTimeRange.html b/Plausible.Stats.DateTimeRange.html
index 07835794c..e98b83fea 100644
--- a/Plausible.Stats.DateTimeRange.html
+++ b/Plausible.Stats.DateTimeRange.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.EmailReport.html b/Plausible.Stats.EmailReport.html
index 0d5a9b592..13c8653ad 100644
--- a/Plausible.Stats.EmailReport.html
+++ b/Plausible.Stats.EmailReport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.FilterSuggestions.html b/Plausible.Stats.FilterSuggestions.html
index b53d06f33..449c41e70 100644
--- a/Plausible.Stats.FilterSuggestions.html
+++ b/Plausible.Stats.FilterSuggestions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Filters.Utils.html b/Plausible.Stats.Filters.Utils.html
index 88530f463..580f2d4ed 100644
--- a/Plausible.Stats.Filters.Utils.html
+++ b/Plausible.Stats.Filters.Utils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index 2991c9b3e..f4289d1fc 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -14,7 +14,7 @@
-
+
@@ -396,14 +396,14 @@ does not handle AND/OR/NOT!
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-[[:matches_wildcard, "event:page", ["/blog/**"]]]
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+[[:matches_wildcard, "event:page", ["/blog/**"]]]
-iex> Filters.parse("visit:browser!=Chrome")
-[[:is_not, "visit:browser", ["Chrome"]]]
+iex> Filters.parse("visit:browser!=Chrome")
+[[:is_not, "visit:browser", ["Chrome"]]]
-iex> Filters.parse(nil)
-[]
+iex> Filters.parse(nil)
+[]
diff --git a/Plausible.Stats.Funnel.html b/Plausible.Stats.Funnel.html
index 3a2425b97..640b8064c 100644
--- a/Plausible.Stats.Funnel.html
+++ b/Plausible.Stats.Funnel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Goal.Revenue.html b/Plausible.Stats.Goal.Revenue.html
index 8a18328fa..f6df19a2c 100644
--- a/Plausible.Stats.Goal.Revenue.html
+++ b/Plausible.Stats.Goal.Revenue.html
@@ -14,7 +14,7 @@
-
+
@@ -161,7 +161,7 @@ Pages
@@ -169,19 +169,25 @@ Pages
- get_revenue_tracking_currency(site, query, metrics)
+ format_revenue_metric(value, query, dimension_values)
- Returns the common currency for the goal filters in a query. If there are no
-goal filters, multiple currencies or the site owner does not have access to
-revenue goals, nil
is returned and revenue metrics are dropped.
-
- maybe_cast_metric_to_money(value, metric, currency)
+ preload_revenue_currencies(site, goals, metrics, dimensions)
+
+
+
+ Preloads revenue currencies for a query.
+
+
+
+
+
@@ -208,16 +214,16 @@ revenue goals, nil
is returned and revenue metrics a
Functions
-
+
-
+
Link to this function
- cast_revenue_metrics_to_money(results, revenue_goals)
+ available?(site)
-
+
View Source
@@ -230,16 +236,16 @@ revenue goals, nil
is returned and revenue metrics a
-
+
-
+
Link to this function
- get_revenue_tracking_currency(site, query, metrics)
+ format_revenue_metric(value, query, dimension_values)
-
+
View Source
@@ -249,32 +255,41 @@ revenue goals, nil
is returned and revenue metrics a
-
- @spec get_revenue_tracking_currency(Plausible.Site.t(), Plausible.Stats.Query.t(), [
- atom()
-]) ::
- {atom() | nil, [atom()]}
-
-
-
-Returns the common currency for the goal filters in a query. If there are no
-goal filters, multiple currencies or the site owner does not have access to
-revenue goals, nil
is returned and revenue metrics are dropped.
Aggregating revenue data works only for same currency goals. If the query is
-filtered by goals with different currencies, for example, one USD and other
-EUR, revenue metrics are dropped.
-
+
-
+
Link to this function
- maybe_cast_metric_to_money(value, metric, currency)
+ preload_revenue_currencies(site, goals, metrics, dimensions)
-
+
+
+ View Source
+
+
+
+
+
+
+
+Preloads revenue currencies for a query.
Assumptions and business logic:
- Goals are already filtered according to query filters and dimensions
- If there's a single currency involved, return map containing the default
- If there's a breakdown by event:goal we return all the relevant currencies as a map
- If filtering by multiple different currencies without event:goal breakdown empty map is returned
- If user has no access or preloading is not needed, empty map is returned
The resulting data structure is attached to a Query
and used below in format_revenue_metric/3
.
+
+
+
+
+
+
+
+ Link to this function
+
+ requested?(metrics)
+
+
View Source
@@ -296,7 +311,7 @@ EUR, revenue metrics are dropped.
revenue_metrics()
-
+
View Source
diff --git a/Plausible.Stats.Imported.Base.html b/Plausible.Stats.Imported.Base.html
index e154671f6..306f9d568 100644
--- a/Plausible.Stats.Imported.Base.html
+++ b/Plausible.Stats.Imported.Base.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Imported.SQL.Expression.html b/Plausible.Stats.Imported.SQL.Expression.html
index 0cde0207f..03b8975ad 100644
--- a/Plausible.Stats.Imported.SQL.Expression.html
+++ b/Plausible.Stats.Imported.SQL.Expression.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Imported.SQL.WhereBuilder.html b/Plausible.Stats.Imported.SQL.WhereBuilder.html
index 209f9b9eb..37434516a 100644
--- a/Plausible.Stats.Imported.SQL.WhereBuilder.html
+++ b/Plausible.Stats.Imported.SQL.WhereBuilder.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Imported.html b/Plausible.Stats.Imported.html
index de85c968e..c4f1a07cf 100644
--- a/Plausible.Stats.Imported.html
+++ b/Plausible.Stats.Imported.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Interval.html b/Plausible.Stats.Interval.html
index 39fca63cb..c3139cd02 100644
--- a/Plausible.Stats.Interval.html
+++ b/Plausible.Stats.Interval.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.JSONSchema.Utils.html b/Plausible.Stats.JSONSchema.Utils.html
index a0638e4e2..acedd1b5b 100644
--- a/Plausible.Stats.JSONSchema.Utils.html
+++ b/Plausible.Stats.JSONSchema.Utils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.JSONSchema.html b/Plausible.Stats.JSONSchema.html
index 6c24904e5..5d350565d 100644
--- a/Plausible.Stats.JSONSchema.html
+++ b/Plausible.Stats.JSONSchema.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Legacy.Dimensions.html b/Plausible.Stats.Legacy.Dimensions.html
index 2404dc564..958c35d29 100644
--- a/Plausible.Stats.Legacy.Dimensions.html
+++ b/Plausible.Stats.Legacy.Dimensions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Legacy.QueryBuilder.html b/Plausible.Stats.Legacy.QueryBuilder.html
index e237d3dee..c72e78028 100644
--- a/Plausible.Stats.Legacy.QueryBuilder.html
+++ b/Plausible.Stats.Legacy.QueryBuilder.html
@@ -14,7 +14,7 @@
-
+
@@ -225,7 +225,7 @@ Pages
parse_order_by(order_by)
-
+
View Source
diff --git a/Plausible.Stats.Legacy.TimeOnPage.html b/Plausible.Stats.Legacy.TimeOnPage.html
index 86b10a4be..34f3bc187 100644
--- a/Plausible.Stats.Legacy.TimeOnPage.html
+++ b/Plausible.Stats.Legacy.TimeOnPage.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Metrics.html b/Plausible.Stats.Metrics.html
index 388e886eb..4030620c8 100644
--- a/Plausible.Stats.Metrics.html
+++ b/Plausible.Stats.Metrics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Query.html b/Plausible.Stats.Query.html
index 595ea3cf6..714fe3b61 100644
--- a/Plausible.Stats.Query.html
+++ b/Plausible.Stats.Query.html
@@ -14,7 +14,7 @@
-
+
@@ -283,7 +283,7 @@ Pages
t()
-
+
View Source
@@ -311,6 +311,8 @@ Pages
pagination: term(),
period: term(),
preloaded_goals: term(),
+ remove_unavailable_revenue_metrics: term(),
+ revenue_currencies: term(),
sample_threshold: term(),
skip_imported_reason: term(),
timezone: term(),
@@ -344,7 +346,7 @@ Pages
add_filter(query, filter)
-
+
View Source
@@ -366,7 +368,7 @@ Pages
build(site, schema_type, params, debug_metadata)
-
+
View Source
@@ -388,7 +390,7 @@ Pages
date_range(query)
-
+
View Source
@@ -410,7 +412,7 @@ Pages
ensure_include_imported(query, requested?)
-
+
View Source
@@ -445,7 +447,7 @@ Pages
from(site, params, debug_metadata \\ %{}, now \\ nil)
-
+
View Source
@@ -467,7 +469,7 @@ Pages
put_experimental_reduced_joins(query, site, params)
-
+
View Source
@@ -489,7 +491,7 @@ Pages
put_imported_opts(query, site, params)
-
+
View Source
@@ -511,7 +513,7 @@ Pages
remove_top_level_filters(query, prefixes)
-
+
View Source
@@ -534,7 +536,7 @@ from use.
set(query, keywords)
-
+
View Source
@@ -556,7 +558,7 @@ from use.
set_include(query, key, value)
-
+
View Source
@@ -578,7 +580,7 @@ from use.
trace(query, metrics)
-
+
View Source
@@ -607,6 +609,8 @@ from use.
pagination: term(),
period: term(),
preloaded_goals: term(),
+ remove_unavailable_revenue_metrics: term(),
+ revenue_currencies: term(),
sample_threshold: term(),
skip_imported_reason: term(),
timezone: term(),
@@ -630,6 +634,8 @@ from use.
pagination: term(),
period: term(),
preloaded_goals: term(),
+ remove_unavailable_revenue_metrics: term(),
+ revenue_currencies: term(),
sample_threshold: term(),
skip_imported_reason: term(),
timezone: term(),
diff --git a/Plausible.Stats.QueryOptimizer.html b/Plausible.Stats.QueryOptimizer.html
index 50c7218e5..d89f1d5ba 100644
--- a/Plausible.Stats.QueryOptimizer.html
+++ b/Plausible.Stats.QueryOptimizer.html
@@ -14,7 +14,7 @@
-
+
@@ -202,7 +202,7 @@ queried from a single table.
optimize(query)
-
+
View Source
@@ -212,7 +212,7 @@ queried from a single table.
- This module manipulates an existing query, updating it according to business logic.
For example, it:
- Figures out what the right granularity to group by time is
- Adds a missing order_by clause to a query
- Updating "time" dimension in order_by to the right granularity
+ This module manipulates an existing query, updating it according to business logic.
For example, it:
- Figures out what the right granularity to group by time is
- Adds a missing order_by clause to a query
- Updating "time" dimension in order_by to the right granularity
- Updates event:hostname filters to also apply on visit level for sane results.
- Removes revenue metrics from dashboard queries if not requested, present or unavailable for the site.
@@ -224,7 +224,7 @@ queried from a single table.
split(query)
-
+
View Source
diff --git a/Plausible.Stats.QueryResult.html b/Plausible.Stats.QueryResult.html
index 8eb8aa216..7b6207d11 100644
--- a/Plausible.Stats.QueryResult.html
+++ b/Plausible.Stats.QueryResult.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.QueryRunner.html b/Plausible.Stats.QueryRunner.html
index dee6a7836..fc874f6dc 100644
--- a/Plausible.Stats.QueryRunner.html
+++ b/Plausible.Stats.QueryRunner.html
@@ -14,7 +14,7 @@
-
+
@@ -190,7 +190,7 @@ and gathering results.Some secondary responsibilities are:
- Dea
run(site, query)
-
+
View Source
diff --git a/Plausible.Stats.SQL.Expression.html b/Plausible.Stats.SQL.Expression.html
index cce2b41c0..ff0329ea5 100644
--- a/Plausible.Stats.SQL.Expression.html
+++ b/Plausible.Stats.SQL.Expression.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.SQL.Fragments.html b/Plausible.Stats.SQL.Fragments.html
index a51a07f3b..b4795c783 100644
--- a/Plausible.Stats.SQL.Fragments.html
+++ b/Plausible.Stats.SQL.Fragments.html
@@ -14,7 +14,7 @@
-
+
@@ -668,12 +668,12 @@ boundary, not_before
is returned.not_before boundary is set to the past Saturday, which is before the
weekstart, therefore the cap does not apply. > this_wednesday = ~D[2022-11-09]
> past_saturday = ~D[2022-11-05]
- > weekstart_not_before(this_wednesday, past_saturday)
+ > weekstart_not_before(this_wednesday, past_saturday)
~D[2022-11-07]
In this other example, the fragment returns Tuesday and not the weekstart.
The not_before
boundary is set to Tuesday, which is past the weekstart,
therefore the cap applies.
> this_wednesday = ~D[2022-11-09]
> this_tuesday = ~D[2022-11-08]
- > weekstart_not_before(this_wednesday, this_tuesday)
+ > weekstart_not_before(this_wednesday, this_tuesday)
~D[2022-11-08]
diff --git a/Plausible.Stats.SQL.SpecialMetrics.html b/Plausible.Stats.SQL.SpecialMetrics.html
index 498bb83e3..79084dbb9 100644
--- a/Plausible.Stats.SQL.SpecialMetrics.html
+++ b/Plausible.Stats.SQL.SpecialMetrics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.SQL.WhereBuilder.html b/Plausible.Stats.SQL.WhereBuilder.html
index b71aac257..2a7132d49 100644
--- a/Plausible.Stats.SQL.WhereBuilder.html
+++ b/Plausible.Stats.SQL.WhereBuilder.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Sampling.html b/Plausible.Stats.Sampling.html
index 27f603558..79d2a1554 100644
--- a/Plausible.Stats.Sampling.html
+++ b/Plausible.Stats.Sampling.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.TableDecider.html b/Plausible.Stats.TableDecider.html
index 9f0609bb8..14c302d3c 100644
--- a/Plausible.Stats.TableDecider.html
+++ b/Plausible.Stats.TableDecider.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Time.html b/Plausible.Stats.Time.html
index 324451788..32664d85c 100644
--- a/Plausible.Stats.Time.html
+++ b/Plausible.Stats.Time.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Timeseries.html b/Plausible.Stats.Timeseries.html
index 446e5d117..4810d556f 100644
--- a/Plausible.Stats.Timeseries.html
+++ b/Plausible.Stats.Timeseries.html
@@ -14,7 +14,7 @@
-
+
@@ -189,7 +189,7 @@ Pages
timeseries(site, query, metrics)
-
+
View Source
diff --git a/Plausible.Stats.Util.html b/Plausible.Stats.Util.html
index 23eb7ee67..b7d336663 100644
--- a/Plausible.Stats.Util.html
+++ b/Plausible.Stats.Util.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.html b/Plausible.Stats.html
index d98e06778..2d357a8b6 100644
--- a/Plausible.Stats.html
+++ b/Plausible.Stats.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Test.Support.HTML.html b/Plausible.Test.Support.HTML.html
index 877cab8b8..bca584bf0 100644
--- a/Plausible.Test.Support.HTML.html
+++ b/Plausible.Test.Support.HTML.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Test.Support.HTTPMocker.html b/Plausible.Test.Support.HTTPMocker.html
index a5da7982f..7093f33ef 100644
--- a/Plausible.Test.Support.HTTPMocker.html
+++ b/Plausible.Test.Support.HTTPMocker.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.TestUtils.html b/Plausible.TestUtils.html
index ae12ead8b..19e0b31ea 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index c2f477805..62707590f 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index a30ccadc3..87a7ebfcb 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index ea37228e3..c150f71f2 100644
--- a/Plausible.Users.html
+++ b/Plausible.Users.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Check.html b/Plausible.Verification.Check.html
index f612f7c31..8c7b8614d 100644
--- a/Plausible.Verification.Check.html
+++ b/Plausible.Verification.Check.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Checks.CSP.html b/Plausible.Verification.Checks.CSP.html
index fe788ade1..a356b97be 100644
--- a/Plausible.Verification.Checks.CSP.html
+++ b/Plausible.Verification.Checks.CSP.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Checks.FetchBody.html b/Plausible.Verification.Checks.FetchBody.html
index e5f3ce0ed..a892601aa 100644
--- a/Plausible.Verification.Checks.FetchBody.html
+++ b/Plausible.Verification.Checks.FetchBody.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Checks.Installation.html b/Plausible.Verification.Checks.Installation.html
index d6211f12a..77819affd 100644
--- a/Plausible.Verification.Checks.Installation.html
+++ b/Plausible.Verification.Checks.Installation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Checks.ScanBody.html b/Plausible.Verification.Checks.ScanBody.html
index 531e3cd24..62720838b 100644
--- a/Plausible.Verification.Checks.ScanBody.html
+++ b/Plausible.Verification.Checks.ScanBody.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Checks.Snippet.html b/Plausible.Verification.Checks.Snippet.html
index 7bdda641c..cc7933cf1 100644
--- a/Plausible.Verification.Checks.Snippet.html
+++ b/Plausible.Verification.Checks.Snippet.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Checks.SnippetCacheBust.html b/Plausible.Verification.Checks.SnippetCacheBust.html
index 8131dd942..5967bb4e6 100644
--- a/Plausible.Verification.Checks.SnippetCacheBust.html
+++ b/Plausible.Verification.Checks.SnippetCacheBust.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Checks.html b/Plausible.Verification.Checks.html
index 3c5588cc5..727bc18d9 100644
--- a/Plausible.Verification.Checks.html
+++ b/Plausible.Verification.Checks.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Diagnostics.Result.html b/Plausible.Verification.Diagnostics.Result.html
index b100e64b7..453ece536 100644
--- a/Plausible.Verification.Diagnostics.Result.html
+++ b/Plausible.Verification.Diagnostics.Result.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Diagnostics.html b/Plausible.Verification.Diagnostics.html
index 2af22cbb4..3a156e185 100644
--- a/Plausible.Verification.Diagnostics.html
+++ b/Plausible.Verification.Diagnostics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.Errors.html b/Plausible.Verification.Errors.html
index 380a646a2..370e475dc 100644
--- a/Plausible.Verification.Errors.html
+++ b/Plausible.Verification.Errors.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.State.html b/Plausible.Verification.State.html
index 60a300ee2..3993fa555 100644
--- a/Plausible.Verification.State.html
+++ b/Plausible.Verification.State.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.URL.html b/Plausible.Verification.URL.html
index e807f11b9..2be8641ae 100644
--- a/Plausible.Verification.URL.html
+++ b/Plausible.Verification.URL.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Verification.html b/Plausible.Verification.html
index 3c2c083e0..11ec6c416 100644
--- a/Plausible.Verification.html
+++ b/Plausible.Verification.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.AcceptTrafficUntil.html b/Plausible.Workers.AcceptTrafficUntil.html
index 1a45f9fc9..df1849422 100644
--- a/Plausible.Workers.AcceptTrafficUntil.html
+++ b/Plausible.Workers.AcceptTrafficUntil.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.CheckUsage.html b/Plausible.Workers.CheckUsage.html
index 20509e0d5..daf327cfa 100644
--- a/Plausible.Workers.CheckUsage.html
+++ b/Plausible.Workers.CheckUsage.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.CleanInvitations.html b/Plausible.Workers.CleanInvitations.html
index aa6ed168f..28214700c 100644
--- a/Plausible.Workers.CleanInvitations.html
+++ b/Plausible.Workers.CleanInvitations.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.CleanUserSessions.html b/Plausible.Workers.CleanUserSessions.html
index 861e2181c..b4dae1152 100644
--- a/Plausible.Workers.CleanUserSessions.html
+++ b/Plausible.Workers.CleanUserSessions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ClickhouseCleanSites.html b/Plausible.Workers.ClickhouseCleanSites.html
index e0f08d7b2..163cd9a1e 100644
--- a/Plausible.Workers.ClickhouseCleanSites.html
+++ b/Plausible.Workers.ClickhouseCleanSites.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ExpireDomainChangeTransitions.html b/Plausible.Workers.ExpireDomainChangeTransitions.html
index cd624ba53..f95e991b1 100644
--- a/Plausible.Workers.ExpireDomainChangeTransitions.html
+++ b/Plausible.Workers.ExpireDomainChangeTransitions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ExportAnalytics.html b/Plausible.Workers.ExportAnalytics.html
index 5c1992a39..a9f6b04d3 100644
--- a/Plausible.Workers.ExportAnalytics.html
+++ b/Plausible.Workers.ExportAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ImportAnalytics.html b/Plausible.Workers.ImportAnalytics.html
index f8fcd86e4..42de4d9ea 100644
--- a/Plausible.Workers.ImportAnalytics.html
+++ b/Plausible.Workers.ImportAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.LocalImportAnalyticsCleaner.html b/Plausible.Workers.LocalImportAnalyticsCleaner.html
index add774aa9..051490a93 100644
--- a/Plausible.Workers.LocalImportAnalyticsCleaner.html
+++ b/Plausible.Workers.LocalImportAnalyticsCleaner.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.LockSites.html b/Plausible.Workers.LockSites.html
index d9639c1d2..5b6a6aba1 100644
--- a/Plausible.Workers.LockSites.html
+++ b/Plausible.Workers.LockSites.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.NotifyAnnualRenewal.html b/Plausible.Workers.NotifyAnnualRenewal.html
index 8989d1809..f3a071365 100644
--- a/Plausible.Workers.NotifyAnnualRenewal.html
+++ b/Plausible.Workers.NotifyAnnualRenewal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.NotifyExportedAnalytics.html b/Plausible.Workers.NotifyExportedAnalytics.html
index fb892309c..58fe8ed4e 100644
--- a/Plausible.Workers.NotifyExportedAnalytics.html
+++ b/Plausible.Workers.NotifyExportedAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.RotateSalts.html b/Plausible.Workers.RotateSalts.html
index 994fe555a..54ba62066 100644
--- a/Plausible.Workers.RotateSalts.html
+++ b/Plausible.Workers.RotateSalts.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ScheduleEmailReports.html b/Plausible.Workers.ScheduleEmailReports.html
index 4d2b21145..9c547e9cc 100644
--- a/Plausible.Workers.ScheduleEmailReports.html
+++ b/Plausible.Workers.ScheduleEmailReports.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.SendCheckStatsEmails.html b/Plausible.Workers.SendCheckStatsEmails.html
index c5a1b25b3..fd46f923b 100644
--- a/Plausible.Workers.SendCheckStatsEmails.html
+++ b/Plausible.Workers.SendCheckStatsEmails.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.SendEmailReport.html b/Plausible.Workers.SendEmailReport.html
index fbb1536ee..75146b64a 100644
--- a/Plausible.Workers.SendEmailReport.html
+++ b/Plausible.Workers.SendEmailReport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.SendSiteSetupEmails.html b/Plausible.Workers.SendSiteSetupEmails.html
index ad0d07a20..3e6c500b5 100644
--- a/Plausible.Workers.SendSiteSetupEmails.html
+++ b/Plausible.Workers.SendSiteSetupEmails.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.SendTrialNotifications.html b/Plausible.Workers.SendTrialNotifications.html
index f3343855b..0288e6ccc 100644
--- a/Plausible.Workers.SendTrialNotifications.html
+++ b/Plausible.Workers.SendTrialNotifications.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.TrafficChangeNotifier.html b/Plausible.Workers.TrafficChangeNotifier.html
index ee4cc4c25..3c36b54fe 100644
--- a/Plausible.Workers.TrafficChangeNotifier.html
+++ b/Plausible.Workers.TrafficChangeNotifier.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index c4a496195634480a0c9101d3270b414461d3dcb3..45828e80f359780a559cfb048d9292f690fc2ad9 100644
GIT binary patch
delta 153960
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%0DhZ*;_Sl
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