From 62e62abe546d36b8f456b742e970737c907b11e9 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 915754e51..779c1f0fd 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 65f46816a..483b4753d 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 dc8480b33..156b2b883 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 e14008563..1b7eb3f1d 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 ad3567a23..2a15b9726 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 9b4b64045..e1c80d200 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 91a94878b..693bb024c 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 1860acd43..e64350bf1 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 d75cdff1f..673dc5ec8 100644
--- a/Plausible.ClickhouseEventV2.html
+++ b/Plausible.ClickhouseEventV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index 0f0f25f02..b8acdf871 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 66c76138a..42e3f286c 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 9c14c43ed..79b6faa5a 100644
--- a/Plausible.ClickhouseSessionV2.html
+++ b/Plausible.ClickhouseSessionV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html
index fa8d426e6..54ba9a0c6 100644
--- a/Plausible.ConfigHelpers.html
+++ b/Plausible.ConfigHelpers.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html
index 9d77c51e9..36eb7ee12 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 956d80b09..2916de4ea 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 1162791c1..c6677e923 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 4b33c68e4..a0342d623 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.SiteImports.html b/Plausible.DataMigration.SiteImports.html
index 6cfd72bc2..bf2e424b5 100644
--- a/Plausible.DataMigration.SiteImports.html
+++ b/Plausible.DataMigration.SiteImports.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.VersionedSessions.html b/Plausible.DataMigration.VersionedSessions.html
index 7fbae66b2..43d3ce2c7 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 65d60b0fc..38650fdcf 100644
--- a/Plausible.DataMigration.html
+++ b/Plausible.DataMigration.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DebugReplayInfo.html b/Plausible.DebugReplayInfo.html
index 86ea4b5d2..28f7c8b2a 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 edc87f092..db3a9da96 100644
--- a/Plausible.Ecto.EventName.html
+++ b/Plausible.Ecto.EventName.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ecto.Types.CompiledRegex.html b/Plausible.Ecto.Types.CompiledRegex.html
index 64269606e..b5fc505d6 100644
--- a/Plausible.Ecto.Types.CompiledRegex.html
+++ b/Plausible.Ecto.Types.CompiledRegex.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Exports.html b/Plausible.Exports.html
index 2d1cbadc5..24ad98f33 100644
--- a/Plausible.Exports.html
+++ b/Plausible.Exports.html
@@ -14,7 +14,7 @@
-
+
@@ -382,7 +382,7 @@ tables into the format of imported_*
tables for a we
-Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
+Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
"plausible_io_20241231.zip"
@@ -405,10 +405,10 @@ tables into the format of imported_*
tables for a we
-Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
+Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
"attachment; filename=\"plausible_io_20241231.zip\""
-iex> content_disposition("📊.zip")
+iex> content_disposition("📊.zip")
"attachment; filename=\"plausible-export.zip\"; filename*=utf-8''%F0%9F%93%8A.zip"
@@ -725,14 +725,14 @@ tables into the format of imported_*
tables for a we
-Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
+Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
-DBConnection.run(pool, fn conn ->
+DBConnection.run(pool, fn conn ->
conn
- |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
- |> Stream.into(File.stream!("export.zip"))
- |> Stream.run()
-end)
+ |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
+ |> Stream.into(File.stream!("export.zip"))
+ |> Stream.run()
+end)
diff --git a/Plausible.Factory.html b/Plausible.Factory.html
index bf0b5bcc1..c2bb624bb 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 98d928446..dcfaacaf6 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 6e9cb4513..c10217910 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 dcdffb4e9..1c4ad61e4 100644
--- a/Plausible.Funnel.html
+++ b/Plausible.Funnel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html
index 8fd9ea85e..6890fb0a6 100644
--- a/Plausible.Funnels.html
+++ b/Plausible.Funnels.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index 5c1e19239..447538442 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 f512a48b7..0cdbaf710 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 8fd2d7ee5..cb0ab219c 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index 2d2ff8e65..1221771e4 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 460ff7c8b..33ec0bfbc 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 62cc39342..ac6091eeb 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 eb6f34b4c..a4826d9f5 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 947498a62..6096ad02c 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 a0d597e4f..410ddb49a 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 08dad52e6..eecb4f614 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 6fa2603d7..84a603300 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 a6afec2c5..2e7fb8fae 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 92c89487f..8238bfbcc 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 a2387e3a0..854dddb01 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 d79c13d97..c17e1d2b9 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 65703b011..f95f1ee3b 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 bb382410f..3004c8926 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 034580bb2..84e95aff8 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 7e3563b9c..5cf994627 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 0e7ce1cc8..691e00154 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -14,7 +14,7 @@
-
+
@@ -257,13 +257,13 @@ or from local storage for which it uses iex> date_range([
-...> %{"filename" => "imported_devices_20190101_20210101.csv"},
+Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
+...> %{"filename" => "imported_devices_20190101_20210101.csv"},
...> "pages_20200101_20220101.csv"
-...> ])
-Date.range(~D[2019-01-01], ~D[2022-01-01])
+...> ])
+Date.range(~D[2019-01-01], ~D[2022-01-01])
-iex> date_range([])
+iex> date_range([])
nil
@@ -292,13 +292,13 @@ or from local storage for which it uses iex> extract_table("my_data.csv")
+Extracts the table name from the provided filename.
Raises if the filename doesn't conform to the expected format.
Examples:
iex> extract_table("my_data.csv")
** (ArgumentError) invalid filename
-iex> extract_table("imported_devices_00010101_20250101.csv")
+iex> extract_table("imported_devices_00010101_20250101.csv")
"imported_devices"
-iex> extract_table("devices_00010101_20250101.csv")
+iex> extract_table("devices_00010101_20250101.csv")
"imported_devices"
@@ -321,8 +321,8 @@ or from local storage for which it uses
-Returns local directory for CSV imports storage.
Builds upon $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
Examples:
iex> local_dir = local_dir(_site_id = 37)
-iex> String.ends_with?(local_dir, "/plausible-imports/37")
+Returns local directory for CSV imports storage.
Builds upon $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
Examples:
iex> local_dir = local_dir(_site_id = 37)
+iex> String.ends_with?(local_dir, "/plausible-imports/37")
true
@@ -381,14 +381,14 @@ or from local storage for which it uses iex> parse_filename!("my_data.csv")
+Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
** (ArgumentError) invalid filename
-iex> parse_filename!("imported_devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("imported_devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
-iex> parse_filename!("devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
@@ -416,13 +416,13 @@ or from local storage for which it uses iex> valid_filename?("my_data.csv")
+Checks if the provided filename conforms to the expected format.
Examples:
iex> valid_filename?("my_data.csv")
false
-iex> valid_filename?("imported_devices_00010101_20250101.csv")
+iex> valid_filename?("imported_devices_00010101_20250101.csv")
true
-iex> valid_filename?("devices_00010101_20250101.csv")
+iex> valid_filename?("devices_00010101_20250101.csv")
true
diff --git a/Plausible.Imported.GoogleAnalytics4.html b/Plausible.Imported.GoogleAnalytics4.html
index dc6d6a9d4..88ab017b1 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 7066e257e..4b36d0366 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 bf35bf536..4cba6320c 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, %{"event" => "complete", "import_id" => ^import_id}} ->
- IO.puts("Job completed")
+receive do
+ {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
+ IO.puts("Job completed")
- {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed transiently")
+ {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed transiently")
- {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed permanently")
-after
+ {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed permanently")
+after
15_000 ->
- IO.puts("Job didn't finish in 15 seconds")
-end
In a more realistic scenario, job scheduling will be done inside a GenServer process
+
IO.puts("Job didn't finish in 15 seconds")
+end
In a more realistic scenario, job scheduling will be done inside a GenServer process
like LiveView, where notifications can be listened for via handle_info/2
.
diff --git a/Plausible.Imported.NoopImporter.html b/Plausible.Imported.NoopImporter.html
index 0a7c393b1..04aafb85c 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 c66dd1b60..cdeb5c7fb 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 8d0b62915..90cff9dd4 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 3dbd63601..a3a89ac73 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 00eab4e1a..a67c6e5a1 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 ee278e132..98013dcc4 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 9fab82198..dae9e6cd8 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 a0ae61039..7ccaa9a6c 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 40fc940c1..092f6ca59 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 cb92b0ac9..7f34ffb08 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 429f97e32..ee56d504b 100644
--- a/Plausible.Ingestion.Event.html
+++ b/Plausible.Ingestion.Event.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Request.Revenue.html b/Plausible.Ingestion.Request.Revenue.html
index 5ca57b1db..410a1b706 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 0d4a3b682..cc5127335 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 733f20b80..c833e5bb7 100644
--- a/Plausible.License.html
+++ b/Plausible.License.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html
index cabc33490..a7586c452 100644
--- a/Plausible.Mailer.html
+++ b/Plausible.Mailer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.MigrationUtils.html b/Plausible.MigrationUtils.html
index 37f584cf2..78b6b185a 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 f3f4ea866..7f8ba6a63 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 6fd6fdd34..16630df37 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 1a9588514..9beab9a12 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 a3b5b68eb..ed3d9cd73 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 26d21cfcd..17a38a721 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 4e7b1b142..0b45a3040 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 07521a5fa..3ebee80a0 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 3f9a09358..4bf6422f3 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 ea80d4a62..48a521fcd 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 76f41817a..0865e9c67 100644
--- a/Plausible.PromEx.Plugins.PlausibleMetrics.html
+++ b/Plausible.PromEx.Plugins.PlausibleMetrics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.PromEx.html b/Plausible.PromEx.html
index 7a0546cae..06b12df4d 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index 2e4b3cdcf..4ee35a006 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index fc6a73806..c3bcfc5e9 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html
index 289a8e8aa..d6b495526 100644
--- a/Plausible.RateLimit.html
+++ b/Plausible.RateLimit.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index 299088f72..8d94fdf25 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index 712b8179c..deec6948d 100644
--- a/Plausible.Repo.html
+++ b/Plausible.Repo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RequestLogger.html b/Plausible.RequestLogger.html
index 42dc93ffb..ea221ec70 100644
--- a/Plausible.RequestLogger.html
+++ b/Plausible.RequestLogger.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.S3.html b/Plausible.S3.html
index 0154b5fe9..28f28e9d2 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -14,7 +14,7 @@
-
+
@@ -316,7 +316,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"
@@ -348,8 +348,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"}
@@ -371,9 +371,9 @@ 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> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
-iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
-iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
+Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
+iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
+iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
@@ -402,7 +402,7 @@ The URL expires in 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 71c7b9251..ea489ee14 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 2d1342f07..368fa60ac 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 1c622d5db..e3cf0bf5d 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 9a2cfab4b..bfcda5d07 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 83a262c6c..70ea0b404 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 9f223c886..05b3d8ef3 100644
--- a/Plausible.Shield.CountryRuleCache.html
+++ b/Plausible.Shield.CountryRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.HostnameRule.html b/Plausible.Shield.HostnameRule.html
index df950b339..1c5bea74d 100644
--- a/Plausible.Shield.HostnameRule.html
+++ b/Plausible.Shield.HostnameRule.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.HostnameRuleCache.html b/Plausible.Shield.HostnameRuleCache.html
index 576efbee5..3de15ebc0 100644
--- a/Plausible.Shield.HostnameRuleCache.html
+++ b/Plausible.Shield.HostnameRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.IPRule.html b/Plausible.Shield.IPRule.html
index 1a45ef562..8a1e42111 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 cb9f96b8e..a073a2936 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 e18e7fa76..643cc81d9 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 00844d7db..72bc42ef2 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 0dc4e6606..370263070 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 c4d174bf2..c6e67951d 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 faaa7a2b4..cd1387abc 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 c12f339de..524cefad3 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 8463742d4..5f9170edd 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 a4b379478..e9a9e92ea 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 270d39014..36711d253 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 2ea107df5..c79ab5dbb 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 e3c746925..df859657b 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 82f86692b..9396e5257 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 5a0944ca1..b2f6879c6 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 d7c007364..75f8e17e2 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 310de0ee6..13b072e1c 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 79d68e8c9..184dd577e 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 20afdcbb4..e339893bc 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 f4a8c47b9..f0b86c394 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 85c93e287..5b01056ca 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 8b4dd7036..9e6d26f67 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 63e816416..f5f7c5224 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index 414709016..62ae212f8 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index 7c4323e6c..0c3601269 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 36a7de4fe..c8794cc75 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 4cb27d2e2..a401fcae4 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 0c8aab6b3..65ef5301c 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 73a45e31d..60d296f35 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 78704abc8..265bccba4 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 e09ca5941..ed377b571 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 0a3a9f880..adfdab4bc 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 17ae7b97f..1bc131843 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 f0a5823a3..0fc247e71 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 92cebe6ca..36a0eb170 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 9bf82ebed..b8c859e29 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 212c35c44..fde7f4295 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -14,7 +14,7 @@
-
+
@@ -283,14 +283,14 @@ Pages
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-%{"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 f6380f1f8..20b868648 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 eddc82455..08c628956 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 870b4f334..c1d7e71be 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 04c368510..b46235c24 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 f2e573734..b66f794c3 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 0b7bf9384..d4889b18e 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 f09dc2c84..0521646af 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 4c924ea53..3a4718d85 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 38e063000..aa12bceb9 100644
--- a/Plausible.Stats.Sampling.html
+++ b/Plausible.Stats.Sampling.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.TableDecider.html b/Plausible.Stats.TableDecider.html
index eed3f8d3e..8dd78c349 100644
--- a/Plausible.Stats.TableDecider.html
+++ b/Plausible.Stats.TableDecider.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Timeseries.html b/Plausible.Stats.Timeseries.html
index 202b63061..46288fdde 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 76a4cf560..88d695059 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 f71f8a244..17359d480 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 aa18313b6..ffe6479c6 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 b03855d6e..646535480 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 2d51c9dec..9d9056981 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index 4fb41232d..9e7a58015 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index a47b1779c..f3774acd3 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index f59aed157..d72f5ccee 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 aea4d9f04..7a26ac67c 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 bb4ddd40e..fc0da539e 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 33c10678c..3909a1608 100644
--- a/Plausible.Workers.CleanInvitations.html
+++ b/Plausible.Workers.CleanInvitations.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ClickhouseCleanSites.html b/Plausible.Workers.ClickhouseCleanSites.html
index b37d4af7e..340cd7518 100644
--- a/Plausible.Workers.ClickhouseCleanSites.html
+++ b/Plausible.Workers.ClickhouseCleanSites.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ExpireDomainChangeTransitions.html b/Plausible.Workers.ExpireDomainChangeTransitions.html
index fb9deb790..99fa57956 100644
--- a/Plausible.Workers.ExpireDomainChangeTransitions.html
+++ b/Plausible.Workers.ExpireDomainChangeTransitions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ExportAnalytics.html b/Plausible.Workers.ExportAnalytics.html
index 01b369b21..f2d808dda 100644
--- a/Plausible.Workers.ExportAnalytics.html
+++ b/Plausible.Workers.ExportAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ImportAnalytics.html b/Plausible.Workers.ImportAnalytics.html
index 059681a9c..20b0b1ffe 100644
--- a/Plausible.Workers.ImportAnalytics.html
+++ b/Plausible.Workers.ImportAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.LocalImportAnalyticsCleaner.html b/Plausible.Workers.LocalImportAnalyticsCleaner.html
index b18003eda..d2caf3650 100644
--- a/Plausible.Workers.LocalImportAnalyticsCleaner.html
+++ b/Plausible.Workers.LocalImportAnalyticsCleaner.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.LockSites.html b/Plausible.Workers.LockSites.html
index d62e73b66..b3fe59944 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 2b74022e2..b433c98b2 100644
--- a/Plausible.Workers.NotifyAnnualRenewal.html
+++ b/Plausible.Workers.NotifyAnnualRenewal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.NotifyExportedAnalytics.html b/Plausible.Workers.NotifyExportedAnalytics.html
index 729a07853..24c5bf3a6 100644
--- a/Plausible.Workers.NotifyExportedAnalytics.html
+++ b/Plausible.Workers.NotifyExportedAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.RotateSalts.html b/Plausible.Workers.RotateSalts.html
index 92a403075..bad29bf8a 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 e583f6905..686b51f4b 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 e7c525a23..a10cf6705 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 6c44b85a9..902253655 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 218014037..eb52fa856 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 95d62655e..94d40d296 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 00b525d54..249869690 100644
--- a/Plausible.Workers.SpikeNotifier.html
+++ b/Plausible.Workers.SpikeNotifier.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index d84d48c7b7de9f172b21599c0b90ff66b0fa5034..e89a7f7bb0f5c0186988a2e5c72786cc352e8520 100644
GIT binary patch
delta 138772
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