From ff8f612ee0f43d18f48d69c43a4e9047262e3663 Mon Sep 17 00:00:00 2001
From: macobo
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 86bed0ab2..c2233c721 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 ff811fe4a..06d928d19 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 270578b53..4fbb2784b 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 9a961a7db..94ada27ce 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 9da7b8a31..c8b1b67a0 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 e69784f9e..f30abfc70 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 5f3ba800d..fc74025c0 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 1c6687fab..21188cd45 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 44dbf003f..a66e26b93 100644
--- a/Plausible.ClickhouseEventV2.html
+++ b/Plausible.ClickhouseEventV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index b9c1fe29a..e9466cb25 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -855,23 +855,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.ClickhouseSessionV2.BoolUInt8.html b/Plausible.ClickhouseSessionV2.BoolUInt8.html
index 3a3380655..a1f824a97 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 7fbe94625..60b281ae8 100644
--- a/Plausible.ClickhouseSessionV2.html
+++ b/Plausible.ClickhouseSessionV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html
index baf858eb1..1fc8011d7 100644
--- a/Plausible.ConfigHelpers.html
+++ b/Plausible.ConfigHelpers.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.CrmExtensions.html b/Plausible.CrmExtensions.html
index 000be387b..2d328b63a 100644
--- a/Plausible.CrmExtensions.html
+++ b/Plausible.CrmExtensions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html
index 9d8d7dfb1..d72e16cb2 100644
--- a/Plausible.DataCase.html
+++ b/Plausible.DataCase.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html b/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html
index 199709617..63083beaa 100644
--- a/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html
+++ b/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.NumericIDs.html b/Plausible.DataMigration.NumericIDs.html
index 37ce1ccda..8e2a17356 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 843ddc011..4a7fcd0da 100644
--- a/Plausible.DataMigration.PopulateEventSessionColumns.html
+++ b/Plausible.DataMigration.PopulateEventSessionColumns.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index 1a14ff38b..9d020cd9e 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -14,7 +14,7 @@
-
+
@@ -1162,23 +1162,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.DataMigration.SiteImports.html b/Plausible.DataMigration.SiteImports.html
index e113357c8..5bc2f0801 100644
--- a/Plausible.DataMigration.SiteImports.html
+++ b/Plausible.DataMigration.SiteImports.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.VersionedSessions.html b/Plausible.DataMigration.VersionedSessions.html
index 38126287f..51042cebb 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 2d3ebd2d7..febb4791f 100644
--- a/Plausible.DataMigration.html
+++ b/Plausible.DataMigration.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DebugReplayInfo.html b/Plausible.DebugReplayInfo.html
index 95e586f60..a660d6812 100644
--- a/Plausible.DebugReplayInfo.html
+++ b/Plausible.DebugReplayInfo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ecto.EventName.html b/Plausible.Ecto.EventName.html
index e99ed920a..9ee31b0e9 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 2cb7f2ad1..bff10aae0 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 23edbc5cf..ed6f784e1 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 210448061..6e6818d81 100644
--- a/Plausible.Factory.html
+++ b/Plausible.Factory.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnel.Const.html b/Plausible.Funnel.Const.html
index 3801794f3..6de9b3c0d 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 4ea648750..a77482841 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 e40ba2961..159467e72 100644
--- a/Plausible.Funnel.html
+++ b/Plausible.Funnel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html
index 0fa5e869d..dc8775d70 100644
--- a/Plausible.Funnels.html
+++ b/Plausible.Funnels.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index 55fbb8383..061255abe 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 edf254c7e..6c8f4717a 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 2b2a0766b..e261613ca 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index 192a7c40c..e78042d15 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 3d4b688a7..f7b2d2ef7 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 8e07d7c31..2fe19b8b8 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 4c899c0b7..5c17e572a 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 c2f916753..4a7915bd1 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 631dfbaed..71b72128d 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 34b4607e7..b257493bb 100644
--- a/Plausible.Google.HTTP.html
+++ b/Plausible.Google.HTTP.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.UA.API.html b/Plausible.Google.UA.API.html
index 7c035216b..bed9f6486 100644
--- a/Plausible.Google.UA.API.html
+++ b/Plausible.Google.UA.API.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.UA.HTTP.html b/Plausible.Google.UA.HTTP.html
index 08490b433..da03c1750 100644
--- a/Plausible.Google.UA.HTTP.html
+++ b/Plausible.Google.UA.HTTP.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.UA.ReportRequest.html b/Plausible.Google.UA.ReportRequest.html
index ae6bf0077..c0701bc48 100644
--- a/Plausible.Google.UA.ReportRequest.html
+++ b/Plausible.Google.UA.ReportRequest.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HTTPClient.Interface.html b/Plausible.HTTPClient.Interface.html
index 1410bec9f..db734de4c 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 7905d5158..8ca52f548 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 5ae820b9d..14a130df9 100644
--- a/Plausible.HTTPClient.html
+++ b/Plausible.HTTPClient.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Helpers.JSON.html b/Plausible.Helpers.JSON.html
index f35a68805..f3d5c3d4a 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 7410b9bbe..83b005f6a 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -1153,23 +1153,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 e106662e1..c2cf641c9 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 a39abb256..15022ac49 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
or $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
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
or $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
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 62b917922..0631e8647 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 4604cb994..52e38dd95 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 77584d6aa..f9e54c1f1 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 36f3fb5c5..b65d9f0bb 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 8ac929ddf..9bbbe977d 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 a5e3576fc..e85fdb9c0 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 d3aed1389..be1722fe4 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 05a193e11..2b05a39a1 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -1153,23 +1153,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Ingestion.Counters.Buffer.html b/Plausible.Ingestion.Counters.Buffer.html
index c43303523..57e56dd7b 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 3320d00d5..faf8c13eb 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 3ca8016d2..0e891c8b5 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 61613cfe2..e7ddb3867 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 806bfe1f9..99e6219c7 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 44d81e773..351a5e821 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 184e1a75b..eaf657723 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 508189529..e8068b671 100644
--- a/Plausible.Ingestion.Request.html
+++ b/Plausible.Ingestion.Request.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.License.html b/Plausible.License.html
index d623dedb8..93f835910 100644
--- a/Plausible.License.html
+++ b/Plausible.License.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.LiveViewTest.html b/Plausible.LiveViewTest.html
index 34e066db1..fa5a9ddcd 100644
--- a/Plausible.LiveViewTest.html
+++ b/Plausible.LiveViewTest.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html
index b8a8576f5..fea5d88af 100644
--- a/Plausible.Mailer.html
+++ b/Plausible.Mailer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.MigrationUtils.html b/Plausible.MigrationUtils.html
index 4f904ccb0..1bbc45691 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 9c6fdcd7d..b2e61218a 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 ce07da4e2..2dc2833ed 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 571fdc2ec..53919d1f6 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 b8a398eb4..4317313ef 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 fa9461b01..b401ebfd5 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 b2e2e48cc..f46701eb3 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 023c3eeb3..dd6bce292 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 4e6a59e48..2be077954 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 ecd87229e..7f8486426 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 3f3d4a24e..01216d06d 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 c4a2fc16e..23b40cad7 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 e5b35c517..8ecad5b6e 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index cf2fd6388..9c5a049ee 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index b7161101d..95c8b88dc 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html
index d82691873..a4810ae5d 100644
--- a/Plausible.RateLimit.html
+++ b/Plausible.RateLimit.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index 885bb17aa..f84cc01c0 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index cc3f7703b..db593e1cc 100644
--- a/Plausible.Repo.html
+++ b/Plausible.Repo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RequestLogger.html b/Plausible.RequestLogger.html
index d1e0689c4..41d14e333 100644
--- a/Plausible.RequestLogger.html
+++ b/Plausible.RequestLogger.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.S3.html b/Plausible.S3.html
index 62ce822e5..7200e2ded 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 f2cd7f4be..553d97070 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 bac6bd0bf..80f2419d7 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 f75add38d..bab0a7c9c 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 f222bf8a5..57227584c 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 9e45100b9..740a02412 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 691164024..1908359f5 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 05bf55580..d23864ecc 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 818b0ce70..e2ce56666 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 b08a9d7fc..457827f13 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 b2f207112..c1d5a8e1c 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 4812adf55..e0b79cd84 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 b0b09596e..8d2d65575 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 17cc4d702..b7f27517b 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 10fcc8e2d..a32e2278b 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 69d342bb0..3659d7e61 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 29b60127c..74031ee1e 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 e78efe219..a65a8fed6 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 0a42b3123..9589ab6c7 100644
--- a/Plausible.Site.ImportedData.html
+++ b/Plausible.Site.ImportedData.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Membership.html b/Plausible.Site.Membership.html
index 137aa4548..ac8682030 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 285cf1b83..1b23de78b 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 9db75c059..19ed3e75b 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 5b9bdc097..b7bf502fd 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 61a88f08e..02172d7ca 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 1dd969b55..8b7ea92e8 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 6e4224d78..0c074f805 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 5b66eddcc..0a8c1b6c3 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 f1b5391e1..c6e8e37ac 100644
--- a/Plausible.Site.SharedLink.html
+++ b/Plausible.Site.SharedLink.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.SpikeNotification.html b/Plausible.Site.SpikeNotification.html
index 3a9e05602..19d3503bb 100644
--- a/Plausible.Site.SpikeNotification.html
+++ b/Plausible.Site.SpikeNotification.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.UserPreference.html b/Plausible.Site.UserPreference.html
index 4922bfdfb..f9c29290d 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 10c6f9123..300476fa1 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 c3c27e05f..5a3d952ad 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index 5c3026bb2..834510131 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index 9fd7a68b2..9dcb2147e 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 8245c0f97..83976d920 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 36d4c1d19..ce39f7f01 100644
--- a/Plausible.Stats.Base.html
+++ b/Plausible.Stats.Base.html
@@ -14,7 +14,7 @@
-
+
@@ -265,7 +265,7 @@ Pages
add_percentage_metric(q, site, query, metrics)
-
+
View Source
@@ -309,7 +309,7 @@ Pages
filter_converted_sessions(db_query, site, query)
-
+
View Source
@@ -331,7 +331,7 @@ Pages
maybe_add_conversion_rate(q, site, query, metrics)
-
+
View Source
@@ -353,7 +353,7 @@ Pages
page_regex(expr)
-
+
View Source
@@ -463,7 +463,7 @@ Pages
total_visitors_subquery(site, query, include_imported)
-
+
View Source
@@ -485,7 +485,7 @@ Pages
utc_boundaries(query, site)
-
+
View Source
diff --git a/Plausible.Stats.Breakdown.html b/Plausible.Stats.Breakdown.html
index 91af15253..4ec76a09d 100644
--- a/Plausible.Stats.Breakdown.html
+++ b/Plausible.Stats.Breakdown.html
@@ -14,7 +14,7 @@
-
+
@@ -163,14 +163,6 @@ Pages
-
-
-
-
-
@@ -195,29 +187,7 @@ Pages
breakdown(site, query, metrics, pagination, opts \\ [])
-
-
- View Source
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Link to this function
-
- transform_dimensions(dimension)
-
-
+
View Source
diff --git a/Plausible.Stats.Clickhouse.html b/Plausible.Stats.Clickhouse.html
index 0271b6b3e..3aad7c496 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 e2a563dd9..1f658b572 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 ea702bf71..51a09ce1f 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 02f982c86..ae619a5c2 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 022242df3..b562842bc 100644
--- a/Plausible.Stats.CustomProps.html
+++ b/Plausible.Stats.CustomProps.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.EmailReport.html b/Plausible.Stats.EmailReport.html
index e889e39bf..817132682 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 1b797d7f8..d13a06be8 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 056ad7b25..482e4be9b 100644
--- a/Plausible.Stats.Filters.Utils.html
+++ b/Plausible.Stats.Filters.Utils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Filters.WhereBuilder.html b/Plausible.Stats.Filters.WhereBuilder.html
index 475feff05..54aba3ef4 100644
--- a/Plausible.Stats.Filters.WhereBuilder.html
+++ b/Plausible.Stats.Filters.WhereBuilder.html
@@ -14,7 +14,7 @@
-
+
@@ -202,7 +202,7 @@ Used for special business logic cases
build(table, site, query)
-
+
View Source
@@ -224,7 +224,7 @@ Used for special business logic cases
build_condition(db_field, filter)
-
+
View Source
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index 6e8f0ca2e..5e07e0794 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -14,7 +14,7 @@
-
+
@@ -283,14 +283,14 @@ Pages
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-[[:matches, "event:page", ["/blog/**"]]]
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+[[:matches, "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.Fragments.html b/Plausible.Stats.Fragments.html
index c69eeffb8..fe6fd27a8 100644
--- a/Plausible.Stats.Fragments.html
+++ b/Plausible.Stats.Fragments.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Funnel.html b/Plausible.Stats.Funnel.html
index 33a6af16c..d1725aaec 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 0d0984c6d..1fcb23ccb 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 76692fb7c..825609cdc 100644
--- a/Plausible.Stats.Imported.Base.html
+++ b/Plausible.Stats.Imported.Base.html
@@ -14,7 +14,7 @@
-
+
@@ -161,7 +161,7 @@ Pages
@@ -212,16 +212,16 @@ Pages
Functions
-
+
-
+
Link to this function
- decide_tables(query)
+ decide_table(query)
-
+
View Source
@@ -287,7 +287,7 @@ Pages
query_imported(table, site, query)
-
+
View Source
@@ -309,7 +309,7 @@ Pages
special_goals_for(binary)
-
+
View Source
diff --git a/Plausible.Stats.Imported.html b/Plausible.Stats.Imported.html
index 2c2436a50..beae0d87d 100644
--- a/Plausible.Stats.Imported.html
+++ b/Plausible.Stats.Imported.html
@@ -14,7 +14,7 @@
-
+
@@ -203,6 +203,14 @@ Pages
+
+
merge_imported_region_suggestions(native_q, site, query)
@@ -260,7 +268,7 @@ breakdown property is possible to query from the imported tables.
goals_with_path()
-
+
View Source
@@ -282,7 +290,7 @@ breakdown property is possible to query from the imported tables.
goals_with_url()
-
+
View Source
@@ -304,7 +312,7 @@ breakdown property is possible to query from the imported tables.
merge_imported(q, site, query, metrics)
-
+
View Source
@@ -326,7 +334,7 @@ breakdown property is possible to query from the imported tables.
merge_imported_city_suggestions(native_q, site, query)
-
+
View Source
@@ -348,7 +356,7 @@ breakdown property is possible to query from the imported tables.
merge_imported_country_suggestions(native_q, site, query)
-
+
View Source
@@ -370,7 +378,29 @@ breakdown property is possible to query from the imported tables.
merge_imported_filter_suggestions(native_q, site, query, filter_name, filter_query)
-
+
+
+ View Source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link to this function
+
+ merge_imported_pageview_goals(q, site, query, page_exprs, metrics)
+
+
View Source
@@ -392,7 +422,7 @@ breakdown property is possible to query from the imported tables.
merge_imported_region_suggestions(native_q, site, query)
-
+
View Source
@@ -414,7 +444,7 @@ breakdown property is possible to query from the imported tables.
merge_imported_timeseries(native_q, site, query, metrics)
-
+
View Source
@@ -436,7 +466,7 @@ breakdown property is possible to query from the imported tables.
schema_supports_query?(query)
-
+
View Source
@@ -461,7 +491,7 @@ We are currently importing only two custom properties - url
total_imported_visitors(site, query)
-
+
View Source
diff --git a/Plausible.Stats.Interval.html b/Plausible.Stats.Interval.html
index cafa12e82..5151113a4 100644
--- a/Plausible.Stats.Interval.html
+++ b/Plausible.Stats.Interval.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Metrics.html b/Plausible.Stats.Metrics.html
index 55517e4a0..30abecea6 100644
--- a/Plausible.Stats.Metrics.html
+++ b/Plausible.Stats.Metrics.html
@@ -14,7 +14,7 @@
-
+
@@ -159,14 +159,6 @@ Pages
Functions
-
-
- from_string(str)
-
-
-
-
-
from_string!(str)
@@ -196,28 +188,6 @@ Pages
Functions
-
-
-
-
-
-
-
-
-
@@ -227,7 +197,7 @@ Pages
from_string!(str)
-
+
View Source
@@ -249,7 +219,7 @@ Pages
metric?(value)
-
+
View Source
diff --git a/Plausible.Stats.Props.html b/Plausible.Stats.Props.html
index d1c5db5d4..986c2378e 100644
--- a/Plausible.Stats.Props.html
+++ b/Plausible.Stats.Props.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Query.html b/Plausible.Stats.Query.html
index df569c3af..39b3c9536 100644
--- a/Plausible.Stats.Query.html
+++ b/Plausible.Stats.Query.html
@@ -14,7 +14,7 @@
-
+
@@ -241,14 +241,6 @@ Pages
-
-
- set(query, keywords)
-
-
-
-
-
set_dimensions(query, dimensions)
@@ -384,7 +376,7 @@ Pages
ensure_include_imported(query, requested?)
-
+
View Source
@@ -415,7 +407,7 @@ Pages
exclude_imported(query)
-
+
View Source
@@ -465,7 +457,7 @@ Pages
get_filter(query, name)
-
+
View Source
@@ -487,7 +479,7 @@ Pages
get_filter_by_prefix(query, prefix)
-
+
View Source
@@ -509,7 +501,7 @@ Pages
has_event_filters?(query)
-
+
View Source
@@ -531,7 +523,7 @@ Pages
put_filter(query, filter)
-
+
View Source
@@ -553,29 +545,7 @@ Pages
remove_filters(query, prefixes)
-
-
- View Source
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Link to this function
-
- set(query, keywords)
-
-
+
View Source
@@ -597,7 +567,7 @@ Pages
set_dimensions(query, dimensions)
-
+
View Source
@@ -625,7 +595,7 @@ Pages
set_metrics(query, metrics)
-
+
View Source
@@ -647,7 +617,7 @@ Pages
set_order_by(query, order_by)
-
+
View Source
@@ -669,7 +639,7 @@ Pages
trace(query, metrics)
-
+
View Source
diff --git a/Plausible.Stats.QueryOptimizer.html b/Plausible.Stats.QueryOptimizer.html
index e04e60066..952558012 100644
--- a/Plausible.Stats.QueryOptimizer.html
+++ b/Plausible.Stats.QueryOptimizer.html
@@ -14,7 +14,7 @@
-
+
@@ -202,7 +202,7 @@ queried from a single table.
optimize(query)
-
+
View Source
@@ -224,7 +224,7 @@ queried from a single table.
split(query)
-
+
View Source
diff --git a/Plausible.Stats.SQL.Expression.html b/Plausible.Stats.SQL.Expression.html
index bb7761a69..b9e8ccbda 100644
--- a/Plausible.Stats.SQL.Expression.html
+++ b/Plausible.Stats.SQL.Expression.html
@@ -14,7 +14,7 @@
-
+
@@ -162,7 +162,7 @@ for dimensions used in query select, group_by and order_by.
@@ -189,16 +189,16 @@ for dimensions used in query select, group_by and order_by.
Functions
-
+
-
+
Link to this function
- dimension(arg1, query, select_alias)
+ dimension(arg1, query)
-
+
View Source
@@ -220,7 +220,7 @@ for dimensions used in query select, group_by and order_by.
event_goal_join(events, page_regexes)
-
+
View Source
diff --git a/Plausible.Stats.Sampling.html b/Plausible.Stats.Sampling.html
index 8a74cb362..bf3c9ee05 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 1e57e39d7..369fb7320 100644
--- a/Plausible.Stats.TableDecider.html
+++ b/Plausible.Stats.TableDecider.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Timeseries.html b/Plausible.Stats.Timeseries.html
index 7cc56545f..2674ecf97 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 1a4a562dc..625bfc588 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 6b4a32f34..50a2bbf28 100644
--- a/Plausible.Stats.html
+++ b/Plausible.Stats.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Test.Support.HTML.html b/Plausible.Test.Support.HTML.html
index 1498c4a35..0734bafca 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 17d79efac..1d4b11d41 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 2b1f0933c..25901ee41 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index de7f04a66..761d41235 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index be64f3b0d..de82ba180 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index 86c335392..c524e12b4 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 62078df96..f42bf9613 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 3f6759230..5fca96580 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 4438c74ce..8cfad3aa4 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 04af00514..de62f6f1c 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 58f7c2c0c..3c968150f 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 f614613d5..8159026f9 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 ed3fe8c74..8a1dd2626 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 eb340b138..9c016e607 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 6176754e8..a94b17973 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 d7a80ea46..765ebc767 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 c2cb7c4b6..da02603dd 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 3944f5e79..38ce45b21 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 1252694eb..e74306b24 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 8b8523ca2..c3069a432 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 a89bebd82..27a89c564 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 b3e742c3f..96032eb06 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 661db62ac..95d4018b5 100644
--- a/Plausible.Workers.CleanInvitations.html
+++ b/Plausible.Workers.CleanInvitations.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ClickhouseCleanSites.html b/Plausible.Workers.ClickhouseCleanSites.html
index 17511141e..bf2391b45 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 198bd9edb..4d08804e5 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 18352c9f5..a47d9ed4f 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 1b41c9488..d23bed59a 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 e9a84660d..1d23779ae 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 17dce296d..10fc5d82f 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 99f815155..f4a7a5579 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 ff1574c71..d1778fc61 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 c4c0d9077..106010652 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 fd7f1f80e..1ed73aaf8 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 e4a9ffafd..15fbd58d4 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 67a33c3a1..5ec31ad52 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 658c31f87..596d8ce79 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 2c24b71e6..0a9c1ee85 100644
--- a/Plausible.Workers.SendTrialNotifications.html
+++ b/Plausible.Workers.SendTrialNotifications.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.SpikeNotifier.html b/Plausible.Workers.SpikeNotifier.html
index c8d2651c4..d7d3e25f0 100644
--- a/Plausible.Workers.SpikeNotifier.html
+++ b/Plausible.Workers.SpikeNotifier.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index c0fa1a8a34fd4cefa1d2da41588e03f19c4bd920..04e7aad052f57b9262fe399e8a3b9a56d0a7d9ba 100644
GIT binary patch
delta 153507
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