From cb1758fea792ea54f7f1e10c23f441fb104f15c0 Mon Sep 17 00:00:00 2001
From: aerosol
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Give
Queries the ClickHouse database for the monthly pageview usage. If the given user's
subscription is active
, past_due
, or a deleted
(but not yet expired), a map
-with the following structure is returned:
%{
- current_cycle: usage_cycle(),
- last_cycle: usage_cycle(),
- penultimate_cycle: usage_cycle()
-}
In all other cases of the subscription status (or a free_10k
subscription which
-does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the +with the following structure is returned:
%{
+ current_cycle: usage_cycle(),
+ last_cycle: usage_cycle(),
+ penultimate_cycle: usage_cycle()
+}
In all other cases of the subscription status (or a free_10k
subscription which
+does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the
user owns. Alternatively, given an optional argument of site_ids
, the usage from
across all those sites is queried instead.
Cldr.LanguageTag
.The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -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 @@ wuth 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 @@ wuth 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 a7ad39dab..1e158ab5e 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 e33e18c24..deb167c49 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 5bb0efafd..725763867 100644
--- a/Plausible.Cldr.Number.Cardinal.html
+++ b/Plausible.Cldr.Number.Cardinal.html
@@ -14,7 +14,7 @@
-
+
@@ -455,31 +455,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 b1dd0620c..242126a15 100644
--- a/Plausible.Cldr.Number.Format.html
+++ b/Plausible.Cldr.Number.Format.html
@@ -14,7 +14,7 @@
-
+
@@ -468,7 +468,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¤)",
@@ -478,7 +478,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",
@@ -535,7 +535,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 e51d94fb3..a67345ddb 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 3cf8cdf48..ac088e362 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 3b8a5f44f..acb9317f7 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"}}
@@ -613,20 +613,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.
@@ -673,16 +673,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 0943120d9..753a61097 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,14 +1294,14 @@ 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")
-{:error,
- {Cldr.UnknownLocaleError,
- "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
+iex> Plausible.Cldr.put_gettext_locale(~l"de")
+{:error,
+ {Cldr.UnknownLocaleError,
+ "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
@@ -1345,29 +1345,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"}}
@@ -1416,10 +1416,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」"
@@ -1550,47 +1550,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"}}
@@ -1660,23 +1660,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 864b1859a..4bf7cee6c 100644
--- a/Plausible.ClickhouseEventV2.html
+++ b/Plausible.ClickhouseEventV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index 9c928eada..7e52c5b2e 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -845,23 +845,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.ClickhouseSessionV2.BoolUInt8.html b/Plausible.ClickhouseSessionV2.BoolUInt8.html
index 6c827fb99..9c93718f8 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 b5ee368af..7d057a476 100644
--- a/Plausible.ClickhouseSessionV2.html
+++ b/Plausible.ClickhouseSessionV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html
index e0f55c42a..25ae6eab9 100644
--- a/Plausible.ConfigHelpers.html
+++ b/Plausible.ConfigHelpers.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html
index b5d112129..eac3725d9 100644
--- a/Plausible.DataCase.html
+++ b/Plausible.DataCase.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.NumericIDs.html b/Plausible.DataMigration.NumericIDs.html
index 773b03f80..99d7f3974 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 79db04e38..ba2eb53ab 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 0fc7bbb81..5b4249d78 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -14,7 +14,7 @@
-
+
@@ -1152,23 +1152,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.VersionedSessions.html b/Plausible.DataMigration.VersionedSessions.html
index 3549579c6..e099ba07c 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 b6087f66f..bcda87a84 100644
--- a/Plausible.DataMigration.html
+++ b/Plausible.DataMigration.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DebugReplayInfo.html b/Plausible.DebugReplayInfo.html
index 342eb98ca..257de3fe6 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 8c2d6ff3a..b109e0ac7 100644
--- a/Plausible.Ecto.EventName.html
+++ b/Plausible.Ecto.EventName.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Exports.html b/Plausible.Exports.html
index 1f25324d1..e95a8a769 100644
--- a/Plausible.Exports.html
+++ b/Plausible.Exports.html
@@ -14,7 +14,7 @@
-
+
@@ -294,10 +294,10 @@ tables into the format of imported_*
tables for a w
-Renders filename for the Zip archive containing the exported CSV files.
Examples:
iex> archive_filename("plausible.io", ~D[2021-01-01], ~D[2024-12-31])
+Renders filename for the Zip archive containing the exported CSV files.
Examples:
iex> archive_filename("plausible.io", ~D[2021-01-01], ~D[2024-12-31])
"plausible.io_20210101_20241231.zip"
-iex> archive_filename("Bücher.example", ~D[2021-01-01], ~D[2024-12-31])
+iex> archive_filename("Bücher.example", ~D[2021-01-01], ~D[2024-12-31])
"Bücher.example_20210101_20241231.zip"
@@ -617,14 +617,14 @@ tables into the format of imported_*
tables for a w
-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 e6486f042..4a4a01ab0 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 10ec11557..e0be8b4b0 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 0883aa108..b9c385512 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 e3c0f371d..c43b36255 100644
--- a/Plausible.Funnel.html
+++ b/Plausible.Funnel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html
index 0299c6c81..078aa7257 100644
--- a/Plausible.Funnels.html
+++ b/Plausible.Funnels.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index 608a21dc0..66059304c 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 e2e55ff49..b986c5987 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 cb342084e..f19d9e349 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index 173725949..40882961f 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 0bf9128d4..6f7f9cca1 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 b15478b19..66ac60908 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 b043c33d0..4ec27ca6f 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 d579e455e..5ccf48af4 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 387f50075..1a80a2533 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 62e52964a..7bfd6f982 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 bc4be7968..d86f3e6ad 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 b7876a464..18928524b 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 52ff861f5..221b518cb 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 63d09d431..95b3d94e4 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 b4b56d90e..cc2482d10 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 161aa563a..1706bc04b 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 f981e5195..7baca4d3d 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 296e423b1..6e2821027 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -1143,23 +1143,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 bbf715892..1238ed665 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 51e04c021..1f0cc38d4 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -14,7 +14,7 @@
-
+
@@ -226,13 +226,13 @@ Pages
-Extracts min/max date range from a list of uploads.
Examples:
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"},
...> "imported_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([])
** (ArgumentError) empty uploads
@@ -291,11 +291,11 @@ Pages
-Extracts table name and min/max dates from the filename.
Examples:
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]}
diff --git a/Plausible.Imported.GoogleAnalytics4.html b/Plausible.Imported.GoogleAnalytics4.html
index 791d360d0..ffb18cdbe 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 c58f6a649..d87bb9df5 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 eb0511290..695b6df87 100644
--- a/Plausible.Imported.Importer.html
+++ b/Plausible.Imported.Importer.html
@@ -14,7 +14,7 @@
-
+
@@ -178,30 +178,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, %{"complete" => ^import_id}} ->
- IO.puts("Job completed")
+receive do
+ {:notification, :analytics_imports_jobs, %{"complete" => ^import_id}} ->
+ IO.puts("Job completed")
- {:notification, :analytics_imports_jobs, %{"transient_fail" => ^import_id}} ->
- IO.puts("Job failed transiently")
+ {:notification, :analytics_imports_jobs, %{"transient_fail" => ^import_id}} ->
+ IO.puts("Job failed transiently")
- {:notification, :analytics_imports_jobs, %{"fail" => ^import_id}} ->
- IO.puts("Job failed permanently")
-after
+ {:notification, :analytics_imports_jobs, %{"fail" => ^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 953b4c7f0..18d3e2184 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 7ea0b87b1..939e60fc9 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 5793f1aad..96e76a38e 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 a498e24f5..538e94070 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 8cc96a59b..baca1d628 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -1143,23 +1143,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 eacbab4a5..28f6a5ef0 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 0eb02cdcb..c80685551 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 e01fc9ef1..846ac0c22 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 fbbf968a4..5cecd48ba 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 19370ccfa..f4d18226b 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 cd7d7fdaa..5e5162ba6 100644
--- a/Plausible.Ingestion.Event.html
+++ b/Plausible.Ingestion.Event.html
@@ -14,7 +14,7 @@
-
+
@@ -224,6 +224,14 @@ are uniformly either buffered in batches (to Clickhouse) or dropped
+
+
+
+
+
@@ -451,7 +459,7 @@ are uniformly either buffered in batches (to Clickhouse) or dropped
emit_telemetry_buffered(event)
-
+
View Source
@@ -479,7 +487,7 @@ are uniformly either buffered in batches (to Clickhouse) or dropped
emit_telemetry_dropped(event, reason)
-
+
View Source
@@ -552,6 +560,28 @@ are uniformly either buffered in batches (to Clickhouse) or dropped
+
+
+
+
+
+
+
+
+
diff --git a/Plausible.Ingestion.Request.Revenue.html b/Plausible.Ingestion.Request.Revenue.html
index e970726e1..1d68283cd 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 0c2b23cc7..e443e023f 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 c3f9ca15c..71402cb0c 100644
--- a/Plausible.License.html
+++ b/Plausible.License.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html
index 072ca74e9..36eed1809 100644
--- a/Plausible.Mailer.html
+++ b/Plausible.Mailer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.MigrationUtils.html b/Plausible.MigrationUtils.html
index c1b2a93f2..b85e72a39 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 9e4bad23d..ab63248e8 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 ebc92938f..78b73b31e 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 ecd6ae6a3..71aac5584 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 fb1db83c4..1e511ad71 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 65ec0f12b..4c867e537 100644
--- a/Plausible.Plugins.API.CustomProps.html
+++ b/Plausible.Plugins.API.CustomProps.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.Goals.html b/Plausible.Plugins.API.Goals.html
index a3fe0cd14..436f19fda 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 4aa17493a..7361e114b 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 dff977ffe..761097b3f 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 285835200..b51e13556 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 3faf83659..93688b56d 100644
--- a/Plausible.PromEx.Plugins.PlausibleMetrics.html
+++ b/Plausible.PromEx.Plugins.PlausibleMetrics.html
@@ -14,7 +14,7 @@
-
+
@@ -179,6 +179,14 @@ Pages
+
+
+
+
+
@@ -201,7 +209,7 @@ Pages
execute_cache_metrics()
-
+
View Source
@@ -223,7 +231,7 @@ Pages
execute_write_buffer_metrics()
-
+
View Source
@@ -234,6 +242,30 @@ Pages
Add telemetry events for Session and Event write buffers
+
+
+
+
+
+
+
+
+
+ Link to this function
+
+ measure_duration(event, fun, meta \\ %{})
+
+
+
+ View Source
+
+
+
+
+
+
+
+
diff --git a/Plausible.PromEx.html b/Plausible.PromEx.html
index 7459fe827..9c0a4c112 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index 78ed4f412..838fb5942 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index b5aff9def..fe13c060d 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html
index 27651428e..48f100162 100644
--- a/Plausible.RateLimit.html
+++ b/Plausible.RateLimit.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index 942667d7e..ad90ee972 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index c43bafc83..c14aa9062 100644
--- a/Plausible.Repo.html
+++ b/Plausible.Repo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.S3.html b/Plausible.S3.html
index f952632bf..4a25c14a5 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -14,7 +14,7 @@
-
+
@@ -286,7 +286,7 @@ The URL expires in 24 hours.In the current implementation the bucket alwa
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"
@@ -318,8 +318,8 @@ The URL expires in 24 hours.In the current implementation the bucket alwa
-
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"}
@@ -341,10 +341,10 @@ The URL expires in 24 hours.In the current implementation the bucket alwa
-Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> %{
+Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> %{
...> s3_url: "http://localhost:10000/test-imports/123/imported_browsers.csv",
...> presigned_url: "http://localhost:10000/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin" <> _
-...> } = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
+...> } = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
@@ -373,7 +373,7 @@ The URL expires in 24 hours.In the current implementation the bucket alwa
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 e32dda00f..39f835d68 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 ddd3ba90c..5a26d293c 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 24f7cf1dc..5d7804942 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 1ab3363b3..618a4b057 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 7dd306985..070e2b564 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 0e3e1d205..50a8bf933 100644
--- a/Plausible.Shield.CountryRuleCache.html
+++ b/Plausible.Shield.CountryRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.IPRule.html b/Plausible.Shield.IPRule.html
index 15e86ff75..d527303e3 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 435f8f251..924759273 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 d976251f5..ac2e77970 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 9baad4f6f..57e064630 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 a9c8a862c..03a8881c4 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 b595cc29e..2ed5cc4f7 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 5e53e4ae1..eb58563e6 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 736c4d282..1701b49a3 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 489a47cc5..8fa5c1359 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 48ecdaef5..58ee1e408 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 1838ca6d2..87681414e 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 25bef7832..9792da01a 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 a9b2a071b..4ae7ddb98 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 7737b0917..9e1304043 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 6b16c348f..36895bde0 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 6ea32cb1b..ebba0aadf 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 64b30f66c..cbaedb256 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 69c0ffcc6..558cc918c 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 dc4a9eea4..0e2f5e583 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 9ec358782..1fb2ad284 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 b64addd9a..91904ef46 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 d3977d9d1..a4509be62 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 8ee18ee20..fc7e3f628 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index 51a79504d..7a8dee885 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index d9240b0d2..80ccad220 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 5c58fbed2..3ea780f82 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 6992b3c16..98e0ff962 100644
--- a/Plausible.Stats.Base.html
+++ b/Plausible.Stats.Base.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Breakdown.html b/Plausible.Stats.Breakdown.html
index 65afac8b3..25f94505f 100644
--- a/Plausible.Stats.Breakdown.html
+++ b/Plausible.Stats.Breakdown.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Clickhouse.html b/Plausible.Stats.Clickhouse.html
index 14c499708..a2240f5eb 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 13eb3c7c2..89bc7c0a6 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 2a61bc47a..245bc2cc3 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 43614b884..727650d87 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 c42fe21cf..9c961a73b 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 831182155..45f5cd796 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 2c48be0ec..70286f24d 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 5dac53279..233f51f0b 100644
--- a/Plausible.Stats.Filters.Utils.html
+++ b/Plausible.Stats.Filters.Utils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index 82d9027f5..79a0732dd 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -14,7 +14,7 @@
-
+
@@ -253,14 +253,14 @@ Pages
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-%{"event:page" => {:matches, "/blog/**"}}
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+%{"event:page" => {:matches, "/blog/**"}}
-iex> Filters.parse("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> Filters.parse("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
-iex> Filters.parse(nil)
-%{}
+iex> Filters.parse(nil)
+%{}
diff --git a/Plausible.Stats.Fragments.html b/Plausible.Stats.Fragments.html
index adae2eb8f..ff123a1ec 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 f34366848..7ad2f10df 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 4efe1f4ee..84646edbb 100644
--- a/Plausible.Stats.Goal.Revenue.html
+++ b/Plausible.Stats.Goal.Revenue.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Imported.html b/Plausible.Stats.Imported.html
index 85513f208..b13e48dc1 100644
--- a/Plausible.Stats.Imported.html
+++ b/Plausible.Stats.Imported.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Interval.html b/Plausible.Stats.Interval.html
index 33fdd929c..3eaf4e6a0 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 2af383386..e9704a029 100644
--- a/Plausible.Stats.Metrics.html
+++ b/Plausible.Stats.Metrics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Props.html b/Plausible.Stats.Props.html
index ec7a3ed02..0acfe503e 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 aea20df61..7323b5047 100644
--- a/Plausible.Stats.Query.html
+++ b/Plausible.Stats.Query.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Sampling.html b/Plausible.Stats.Sampling.html
index dac64c0ce..d1b030923 100644
--- a/Plausible.Stats.Sampling.html
+++ b/Plausible.Stats.Sampling.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Timeseries.html b/Plausible.Stats.Timeseries.html
index 135ca9a42..f0d61898a 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 88c4cd53f..93c505013 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 d0d0dfa67..4e2f5f58d 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 2595ca8f7..3c1ed90fa 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 d692dd26f..5168c188c 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 b909b056e..006a7dade 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index 9769ccad2..82ae08bbc 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index 762b297fb..c5a6507cd 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index 19af9f71a..948090c01 100644
--- a/Plausible.Users.html
+++ b/Plausible.Users.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.AcceptTrafficUntil.html b/Plausible.Workers.AcceptTrafficUntil.html
index 21185e431..a4cc2bbb1 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 77979c784..9cc1677c5 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 606f76d52..08a422be2 100644
--- a/Plausible.Workers.CleanInvitations.html
+++ b/Plausible.Workers.CleanInvitations.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ExpireDomainChangeTransitions.html b/Plausible.Workers.ExpireDomainChangeTransitions.html
index 3fa32997d..f1f27b56f 100644
--- a/Plausible.Workers.ExpireDomainChangeTransitions.html
+++ b/Plausible.Workers.ExpireDomainChangeTransitions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ExportCSV.html b/Plausible.Workers.ExportCSV.html
index cecf3a363..97c5d5be7 100644
--- a/Plausible.Workers.ExportCSV.html
+++ b/Plausible.Workers.ExportCSV.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ImportAnalytics.html b/Plausible.Workers.ImportAnalytics.html
index ed37f8637..e9a29ddc0 100644
--- a/Plausible.Workers.ImportAnalytics.html
+++ b/Plausible.Workers.ImportAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.LockSites.html b/Plausible.Workers.LockSites.html
index 1048c7932..87826935f 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 ca826f815..60037eac3 100644
--- a/Plausible.Workers.NotifyAnnualRenewal.html
+++ b/Plausible.Workers.NotifyAnnualRenewal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.RotateSalts.html b/Plausible.Workers.RotateSalts.html
index e04c2c944..4eb6031be 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 b879b4003..e43ab37a2 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 afc605866..6f71520e9 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 4fe41bd5b..6f43cf646 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 676fb8baf..c309a8c29 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 6d5c41e6a..a3c6845e9 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 18718db28..39532f092 100644
--- a/Plausible.Workers.SpikeNotifier.html
+++ b/Plausible.Workers.SpikeNotifier.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index 1900a309318367bc185db90d6e76c8e4ffd49d10..f74714405c639648a2287a1b44caf8e6971cd8b5 100644
GIT binary patch
delta 141561
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%0AO%AVy~2f
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