From 000460e3cd158f7eac35b907f900ff1684b2c30d 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 5ed7f74ca..637b111f9 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 3a498617c..56112350c 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 04df6b92f..1a75cc5d9 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 6a44523d5..151b6ab7a 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 a64cf405a..6ee7ecb40 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 f566556bf..f0e62a8d6 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 d7dd3508d..bb3137d03 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 b60394b0d..52c59af90 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 655101b91..18491355c 100644
--- a/Plausible.ClickhouseEventV2.html
+++ b/Plausible.ClickhouseEventV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseLocationData.html b/Plausible.ClickhouseLocationData.html
index 0756c3456..8ec2f2f01 100644
--- a/Plausible.ClickhouseLocationData.html
+++ b/Plausible.ClickhouseLocationData.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index 9d846c4ea..72d634ad1 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 56122e0bf..87bd83f1f 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 2f548bf26..d30d5e3d0 100644
--- a/Plausible.ClickhouseSessionV2.html
+++ b/Plausible.ClickhouseSessionV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html
index 1e0c67354..050415274 100644
--- a/Plausible.ConfigHelpers.html
+++ b/Plausible.ConfigHelpers.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.CrmExtensions.html b/Plausible.CrmExtensions.html
index 063640c96..f8130f137 100644
--- a/Plausible.CrmExtensions.html
+++ b/Plausible.CrmExtensions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html
index 2deebb275..b8b211e21 100644
--- a/Plausible.DataCase.html
+++ b/Plausible.DataCase.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.AcquisitionChannel.html b/Plausible.DataMigration.AcquisitionChannel.html
index 614fdf3ef..86dd81681 100644
--- a/Plausible.DataMigration.AcquisitionChannel.html
+++ b/Plausible.DataMigration.AcquisitionChannel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.BackfillTeams.html b/Plausible.DataMigration.BackfillTeams.html
index 4fd251d52..4380105d4 100644
--- a/Plausible.DataMigration.BackfillTeams.html
+++ b/Plausible.DataMigration.BackfillTeams.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html b/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html
index 67b859f35..60da7543d 100644
--- a/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html
+++ b/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.ClickhouseRepo.html b/Plausible.DataMigration.ClickhouseRepo.html
index 09075c788..5f2322a82 100644
--- a/Plausible.DataMigration.ClickhouseRepo.html
+++ b/Plausible.DataMigration.ClickhouseRepo.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.LocationsSync.html b/Plausible.DataMigration.LocationsSync.html
index ef89f291d..06af26a4c 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 4fd57f52a..3b3d288e2 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 06ed9dfaf..5d1e5a23f 100644
--- a/Plausible.DataMigration.PopulateEventSessionColumns.html
+++ b/Plausible.DataMigration.PopulateEventSessionColumns.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.PostgresRepo.html b/Plausible.DataMigration.PostgresRepo.html
index 754cec9d7..1975fa2a5 100644
--- a/Plausible.DataMigration.PostgresRepo.html
+++ b/Plausible.DataMigration.PostgresRepo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.SiteImports.html b/Plausible.DataMigration.SiteImports.html
index 6a0ebd3de..75cdc8673 100644
--- a/Plausible.DataMigration.SiteImports.html
+++ b/Plausible.DataMigration.SiteImports.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.TeamsConsitencyCheck.html b/Plausible.DataMigration.TeamsConsitencyCheck.html
index a1c36d2c5..c7faec316 100644
--- a/Plausible.DataMigration.TeamsConsitencyCheck.html
+++ b/Plausible.DataMigration.TeamsConsitencyCheck.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.VersionedSessions.html b/Plausible.DataMigration.VersionedSessions.html
index 02b990bf2..5479b9c03 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 0d1c91151..6b81c9f72 100644
--- a/Plausible.DataMigration.html
+++ b/Plausible.DataMigration.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ecto.EventName.html b/Plausible.Ecto.EventName.html
index 188b92a94..22ad96710 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 ffe52d1a3..bffa579f7 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 e0e6966c8..7a8d39c84 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 d92959574..4d7f545d6 100644
--- a/Plausible.Factory.html
+++ b/Plausible.Factory.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.File.html b/Plausible.File.html
index 483cca74c..43e7a8573 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 3523baabb..6829e6ac7 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 21f5e1f92..7b08486ab 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 692edd151..140865b33 100644
--- a/Plausible.Funnel.html
+++ b/Plausible.Funnel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html
index 9cb86d7c9..67e09f9ae 100644
--- a/Plausible.Funnels.html
+++ b/Plausible.Funnels.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index 6541b7394..ff2da548e 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 a0de089fd..a3ea7100f 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 8351294de..6e6a17fdd 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index c26cf6a36..89e3a3294 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 524d79720..9b1cea54d 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 4949c9b09..9aa757b2a 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 28a2b6b99..95d2df84b 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 c5876dfca..bc3761ac0 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 54d0c20f0..229bb319a 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 2edada73d..d5e28ac91 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 78b924e74..c6b1154ac 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 1d7d92b57..98b4500c5 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 c77cdfde0..4edd1ea33 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 3babb5619..e362d33c3 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 412510bbe..5a31157d2 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 14c3b0646..affe942d1 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 9af15b00b..59828f68e 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 2839ffa2b..59740d996 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 6cc6aa7cb..2ebf309f1 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 4fd4022d0..dda8abcb8 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 b183cb88b..77e3094d1 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 8a01c80e4..744ecf368 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 2869cd51f..183322fb4 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 53626d8fb..3147bacfb 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 02ba53cd9..1609d415e 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 ff6c382c3..a2873e4ad 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 95579a3bf..e7cb638c0 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -1225,23 +1225,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.Acquisition.html b/Plausible.Ingestion.Acquisition.html
index ea2122ff8..d5dd0e5eb 100644
--- a/Plausible.Ingestion.Acquisition.html
+++ b/Plausible.Ingestion.Acquisition.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Counters.Buffer.html b/Plausible.Ingestion.Counters.Buffer.html
index 8bb07b472..52d0c190f 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 8e3f0cd92..59cc93cdb 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 46889566e..33d371bdf 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 fd8032877..8d4975b88 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 e7572d2ae..4aa4161ab 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 084cedbc7..298fd00e9 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 5c0f12152..357f0c097 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 aa0016037..6b37eaf03 100644
--- a/Plausible.Ingestion.Request.html
+++ b/Plausible.Ingestion.Request.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Source.html b/Plausible.Ingestion.Source.html
index 228cacbc2..9ca675b3d 100644
--- a/Plausible.Ingestion.Source.html
+++ b/Plausible.Ingestion.Source.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.License.html b/Plausible.License.html
index 6dff5df37..6fba9da54 100644
--- a/Plausible.License.html
+++ b/Plausible.License.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.LiveViewTest.html b/Plausible.LiveViewTest.html
index e47724ae8..a87dc42bf 100644
--- a/Plausible.LiveViewTest.html
+++ b/Plausible.LiveViewTest.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html
index 919ce3d58..662f6d6c3 100644
--- a/Plausible.Mailer.html
+++ b/Plausible.Mailer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.MigrationUtils.html b/Plausible.MigrationUtils.html
index 68e7b9cce..b6a06157c 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 3cfbdab04..37a3a3c09 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 b3e4426f1..fa0dc23e0 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 be5d5a07c..a844abd17 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 7fa0abcf5..51f6e8d80 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 25da54cf8..f2761e753 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 3d6433964..ba9ecb1c7 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 e0c6bdd48..4ccbdd654 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 c7a4cd382..033d98a44 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 18cb41dac..bffbd4354 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 1f307194d..b5e4f3be0 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 2f6328870..261e9dcae 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 2de1d7d4a..d6224e209 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index fc2594dd4..04fc85cf3 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index 0312d3bae..257b75ae1 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html
index f27c6ace4..9cfaef52d 100644
--- a/Plausible.RateLimit.html
+++ b/Plausible.RateLimit.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index 2ce3af631..74bb93b8e 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index 6de467582..094b18f3c 100644
--- a/Plausible.Repo.html
+++ b/Plausible.Repo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RequestLogger.html b/Plausible.RequestLogger.html
index 235341c32..571dc7d15 100644
--- a/Plausible.RequestLogger.html
+++ b/Plausible.RequestLogger.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.S3.html b/Plausible.S3.html
index 61a801348..195ade34d 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 4ebc17c9e..d4fb79e65 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 9aa0788c0..2ae9172d4 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 f855764da..da406f223 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 cdc20ad49..c662792c4 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 78bd21d86..39c2cba41 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 163fad59d..71d49289b 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 9e402764b..ee7ba9bf5 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 859e922bc..d00b76cbe 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 a255a5ecb..5e3bda415 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 97c63c2d2..ec56d8e65 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 1f54ee442..ee8f97504 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 821535ebb..fd268a2d0 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 245530eb5..731c5d7bd 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 ee50d2918..d2ca9c479 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 7740dba12..45177f3cb 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 99b126feb..85e43fd23 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 140bae085..d39cbac26 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 2f20d0132..de529d164 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 e0f4b426b..c5d94d301 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 07dd2aeed..c842007da 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 6bf546094..56d16dfc1 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 9c866afce..b94aae205 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 82a721b80..ff8377aeb 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 d738ff457..50ffd7186 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 4c8a30dd7..41b4733ca 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 8c1d36f07..557f7d52f 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 1c8a9eb27..875e87e79 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 550377e5c..c8051d8e8 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 2c453cc56..3533278fa 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 7d95953a0..29d847f8a 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 2bb35ec2e..e544c269b 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 a4f8328db..78235f0be 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index 8a084c0ba..949052547 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index b2033546a..48626b6e0 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 fe05636bf..5ec7338f8 100644
--- a/Plausible.Stats.Aggregate.html
+++ b/Plausible.Stats.Aggregate.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Base.html b/Plausible.Stats.Base.html
index 204a4a89b..c898ce945 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 c028e590a..10d30f9a4 100644
--- a/Plausible.Stats.Breakdown.html
+++ b/Plausible.Stats.Breakdown.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Clickhouse.html b/Plausible.Stats.Clickhouse.html
index 817ddf9c0..b440fc7a1 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 3a540d63f..e992fd89c 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 260878bd3..69d32f033 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 f369dd41b..14313be55 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 df2d90fa1..22fe0881d 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 fcffa6904..d9fcd6916 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 5326bcf52..7f2e9ef20 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 d2676a95b..ef44c74ba 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 ceec66368..400dd92d8 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 59c660cf5..76a4d62a6 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 b7a152630..ef6a257dc 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 2289d1553..749c2473a 100644
--- a/Plausible.Stats.Goal.Revenue.html
+++ b/Plausible.Stats.Goal.Revenue.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Imported.Base.html b/Plausible.Stats.Imported.Base.html
index 802984428..cf8e8d69d 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 9e2733a13..9d243d048 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 866d299e8..b93d2c710 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 401683d63..bb9a2f1b9 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 8808164a3..dbf4f6c81 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 fdc746247..98dbca43a 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 bda081943..11ae22ad4 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 a1801f25f..bd5f4cb7b 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 16b49f6a9..da2008696 100644
--- a/Plausible.Stats.Legacy.QueryBuilder.html
+++ b/Plausible.Stats.Legacy.QueryBuilder.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Legacy.TimeOnPage.html b/Plausible.Stats.Legacy.TimeOnPage.html
index 5c68e5f33..86258eceb 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 7d0a6c527..3e4c2428c 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 938cfe9ef..b3c9a796e 100644
--- a/Plausible.Stats.Query.html
+++ b/Plausible.Stats.Query.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.QueryOptimizer.html b/Plausible.Stats.QueryOptimizer.html
index fd16e9943..3a2204fe2 100644
--- a/Plausible.Stats.QueryOptimizer.html
+++ b/Plausible.Stats.QueryOptimizer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.QueryResult.html b/Plausible.Stats.QueryResult.html
index 92c63b30c..b057fc0c5 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 1887cbcc6..99e0e9208 100644
--- a/Plausible.Stats.QueryRunner.html
+++ b/Plausible.Stats.QueryRunner.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.SQL.Expression.html b/Plausible.Stats.SQL.Expression.html
index 50923d1fe..82e80bfd1 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 73bc0b91b..10db87ec8 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 3fb730446..43625d2eb 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 8d43f35de..c92b4a2e0 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 8730a4677..9d3e7a0b4 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 92de843c7..34361b45b 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 1ca71141b..ae367a883 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 4ec6f61e9..6877e73b7 100644
--- a/Plausible.Stats.Timeseries.html
+++ b/Plausible.Stats.Timeseries.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Util.html b/Plausible.Stats.Util.html
index 05646e300..0e32ccf66 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 2033364cb..06eddd9f0 100644
--- a/Plausible.Stats.html
+++ b/Plausible.Stats.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Adapter.Read.Billing.html b/Plausible.Teams.Adapter.Read.Billing.html
index 1bb17894b..7f680bc51 100644
--- a/Plausible.Teams.Adapter.Read.Billing.html
+++ b/Plausible.Teams.Adapter.Read.Billing.html
@@ -14,7 +14,7 @@
-
+
@@ -159,6 +159,22 @@ Pages
Functions
+
+
+
+
+
+
+
+
+
+
check_feature_availability(feature, user)
@@ -215,6 +231,14 @@ Pages
+
+
monthly_pageview_limit(user)
@@ -284,6 +308,50 @@ Pages
Functions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -293,7 +361,7 @@ Pages
check_feature_availability(feature, user)
-
+
View Source
@@ -315,7 +383,7 @@ Pages
check_feature_availability_for_stats_api(user)
-
+
View Source
@@ -337,7 +405,7 @@ Pages
check_needs_to_upgrade(user)
-
+
View Source
@@ -359,7 +427,7 @@ Pages
ensure_can_add_new_site(user)
-
+
View Source
@@ -381,7 +449,7 @@ Pages
enterprise_configured?(user)
-
+
View Source
@@ -403,7 +471,7 @@ Pages
get_subscription(user)
-
+
View Source
@@ -425,7 +493,29 @@ Pages
has_active_subscription?(user)
-
+
+
+ View Source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link to this function
+
+ latest_enterprise_plan_with_prices(user, customer_ip)
+
+
View Source
@@ -447,7 +537,7 @@ Pages
monthly_pageview_limit(user)
-
+
View Source
@@ -471,7 +561,7 @@ Pages
monthly_pageview_usage(user, site_ids \\ nil)
-
+
View Source
@@ -493,7 +583,7 @@ Pages
site_limit(user)
-
+
View Source
@@ -515,7 +605,7 @@ Pages
site_usage(user)
-
+
View Source
@@ -537,7 +627,7 @@ Pages
suggest_by_usage(user, usage_during_cycle)
-
+
View Source
@@ -559,7 +649,7 @@ Pages
team_member_limit(user)
-
+
View Source
@@ -583,7 +673,7 @@ Pages
team_member_usage(user, opts \\ [])
-
+
View Source
diff --git a/Plausible.Teams.Adapter.Read.Ownership.html b/Plausible.Teams.Adapter.Read.Ownership.html
index cae81cc18..384870276 100644
--- a/Plausible.Teams.Adapter.Read.Ownership.html
+++ b/Plausible.Teams.Adapter.Read.Ownership.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Adapter.Read.Sites.html b/Plausible.Teams.Adapter.Read.Sites.html
index 595a354dd..de015019e 100644
--- a/Plausible.Teams.Adapter.Read.Sites.html
+++ b/Plausible.Teams.Adapter.Read.Sites.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Adapter.html b/Plausible.Teams.Adapter.html
index 9b7fd7ea5..a9b8f1327 100644
--- a/Plausible.Teams.Adapter.html
+++ b/Plausible.Teams.Adapter.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.GuestInvitation.html b/Plausible.Teams.GuestInvitation.html
index 356a7525c..daf2ef5c6 100644
--- a/Plausible.Teams.GuestInvitation.html
+++ b/Plausible.Teams.GuestInvitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.GuestMembership.html b/Plausible.Teams.GuestMembership.html
index 5941b6ca7..28963f959 100644
--- a/Plausible.Teams.GuestMembership.html
+++ b/Plausible.Teams.GuestMembership.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Invitation.html b/Plausible.Teams.Invitation.html
index 54e806704..3f601a886 100644
--- a/Plausible.Teams.Invitation.html
+++ b/Plausible.Teams.Invitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Membership.html b/Plausible.Teams.Membership.html
index 8633bf0fd..793803ec3 100644
--- a/Plausible.Teams.Membership.html
+++ b/Plausible.Teams.Membership.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.SiteTransfer.html b/Plausible.Teams.SiteTransfer.html
index 08a7fdf95..3ba7ab423 100644
--- a/Plausible.Teams.SiteTransfer.html
+++ b/Plausible.Teams.SiteTransfer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Team.html b/Plausible.Teams.Team.html
index fecc3150a..5a5b4d824 100644
--- a/Plausible.Teams.Team.html
+++ b/Plausible.Teams.Team.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Test.html b/Plausible.Teams.Test.html
index 45689c21a..3ecccd9af 100644
--- a/Plausible.Teams.Test.html
+++ b/Plausible.Teams.Test.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.Users.html b/Plausible.Teams.Users.html
index 98179cd24..e51ab3518 100644
--- a/Plausible.Teams.Users.html
+++ b/Plausible.Teams.Users.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Teams.html b/Plausible.Teams.html
index fbdcf1b24..369679a7e 100644
--- a/Plausible.Teams.html
+++ b/Plausible.Teams.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Test.Support.HTML.html b/Plausible.Test.Support.HTML.html
index 2d96c943c..c37f880e8 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 26fb70063..fae85ed1c 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 41590279b..a4a9fd4fc 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index 14adf17c9..f3e5b7dd9 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index 7bd37d626..efed27e4a 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index d26985d48..7b62abb69 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 7401b7580..3d8f6f593 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 c9b1d16f7..6560f10f6 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 d85112a32..a62936457 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 601054786..6c66d9d29 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 fb8146dbd..863090efd 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 e67944298..174f51fd0 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 f25a82aa6..f202877ac 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 cd0a4ead5..43cdb162b 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 34123e59d..455ca5d05 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 fe84c2a60..876aa903a 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 e57159b9a..bc527b2a9 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 ef730e834..ddf9b0802 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 a2e33e4ab..42b7593c1 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 c851693a8..817f20eff 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 237aa88db..ef61b0646 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 8ce950163..91c15cd7e 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 caa032ce5..0c79a3d17 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 50cdf5ffb..6612e4a08 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 5efb50cf0..b7b62acea 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 9fdf98e1d..9d930c4c5 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 c23250049..06d99e841 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 00cb45d68..cae045246 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 3f268a0c7..00b5062ff 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 52d97725a..0828877e0 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 f229bf4a2..b2dbe3910 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 7a42c7038..57ca04ef7 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 51e5e2e75..d7fbe5cfd 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 0f4bd5594..02f39c503 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 5786fa3c0..a42e10acd 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 0337feca5..638a4e665 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 9a30161fc..7ac1825c5 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 d9105a7d0..7943be39a 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 4fbb1080c..4e9f60da8 100644
--- a/Plausible.Workers.TrafficChangeNotifier.html
+++ b/Plausible.Workers.TrafficChangeNotifier.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index dae2a2a9fd449b8ca9cfeb833779179adafa5b64..35e5f2d7617365dcd8b09963b8c05c3cd1d2d5c6 100644
GIT binary patch
delta 149330
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%0A4ru<
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