From 0d4f02b18e4c55defdf7ebea5f91900aa6125731 Mon Sep 17 00:00:00 2001
From: ukutaht
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 47f288bf9..bf2d38863 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 9be1e254b..d25dd40d5 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 7a0886337..70f03b5e8 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 46db1ae62..7a132cf5b 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 8414b70e6..a866c64aa 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 cefaac184..c0d588f70 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 a17c3dd5e..419ca4ad6 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 84b10784b..0e65ce0ef 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 c17cac8ce..721871084 100644
--- a/Plausible.ClickhouseEventV2.html
+++ b/Plausible.ClickhouseEventV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index 8a4565140..7d626e17c 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 c512721b2..e318fb8f1 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 15188e45c..16871de04 100644
--- a/Plausible.ClickhouseSessionV2.html
+++ b/Plausible.ClickhouseSessionV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html
index a051a245b..b643b688e 100644
--- a/Plausible.ConfigHelpers.html
+++ b/Plausible.ConfigHelpers.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html
index 346504899..32be9717c 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 20639cca0..b37313fe7 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 5b298b134..a6a9a31ab 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 e70fe29f7..009dc9851 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -14,7 +14,7 @@
-
+
@@ -1152,23 +1152,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.DataMigration.VersionedSessions.html b/Plausible.DataMigration.VersionedSessions.html
index ceaa5607e..04e636250 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 0f49db358..4ac99e431 100644
--- a/Plausible.DataMigration.html
+++ b/Plausible.DataMigration.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DebugReplayInfo.html b/Plausible.DebugReplayInfo.html
index f9cc7fe00..aec716aea 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 9a79ca55e..8ab7ac5e1 100644
--- a/Plausible.Ecto.EventName.html
+++ b/Plausible.Ecto.EventName.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Exports.html b/Plausible.Exports.html
index 6974bf12e..1f5824bed 100644
--- a/Plausible.Exports.html
+++ b/Plausible.Exports.html
@@ -14,7 +14,7 @@
-
+
@@ -294,10 +294,10 @@ tables into the format of imported_*
tables for a w
-Renders filename for the Zip archive containing the exported CSV files.
Examples:
iex> archive_filename("plausible.io", ~D[2021-01-01], ~D[2024-12-31])
+Renders filename for the Zip archive containing the exported CSV files.
Examples:
iex> archive_filename("plausible.io", ~D[2021-01-01], ~D[2024-12-31])
"plausible.io_20210101_20241231.zip"
-iex> archive_filename("Bücher.example", ~D[2021-01-01], ~D[2024-12-31])
+iex> archive_filename("Bücher.example", ~D[2021-01-01], ~D[2024-12-31])
"Bücher.example_20210101_20241231.zip"
@@ -617,14 +617,14 @@ tables into the format of imported_*
tables for a w
-Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
+Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
-DBConnection.run(pool, fn conn ->
+DBConnection.run(pool, fn conn ->
conn
- |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
- |> Stream.into(File.stream!("export.zip"))
- |> Stream.run()
-end)
+ |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
+ |> Stream.into(File.stream!("export.zip"))
+ |> Stream.run()
+end)
diff --git a/Plausible.Factory.html b/Plausible.Factory.html
index a3100e45b..a44b9f531 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 5e8959bbb..2446afa05 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 563372aa9..900036631 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 fe954a01e..6917cef63 100644
--- a/Plausible.Funnel.html
+++ b/Plausible.Funnel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html
index 43415c8c4..ba03fc0d3 100644
--- a/Plausible.Funnels.html
+++ b/Plausible.Funnels.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index e19a91e09..6dfcebcf8 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 2284cb26f..4b80a7629 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 688e801ae..97504c3f0 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index ca2f4de80..c89603905 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 b944f2cf6..2a436a51f 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 0400a3f43..6281471d3 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 9ca40b160..8949da055 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 aff739b35..cd1197ceb 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 d60423014..984c40a05 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 3973fdba4..24904ffeb 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 dc67bb19b..3c65c9446 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 3f06e7eaf..e1004ee3a 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 121340847..38f470d3c 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 c79928024..ceda1014b 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 c3670dc31..4746bb546 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 60fc163ae..60f3306f6 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 9d53fc783..43d4593c9 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 c85e36d96..9006d098b 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 d0a161f29..e48046b8a 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 b6ef95339..6ef8ed9d2 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -14,7 +14,7 @@
-
+
@@ -226,13 +226,13 @@ Pages
-Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
-...> %{"filename" => "imported_devices_20190101_20210101.csv"},
+Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
+...> %{"filename" => "imported_devices_20190101_20210101.csv"},
...> "imported_pages_20200101_20220101.csv"
-...> ])
-Date.range(~D[2019-01-01], ~D[2022-01-01])
+...> ])
+Date.range(~D[2019-01-01], ~D[2022-01-01])
-iex> date_range([])
+iex> date_range([])
** (ArgumentError) empty uploads
@@ -291,11 +291,11 @@ Pages
-Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
+Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
** (ArgumentError) invalid filename
-iex> parse_filename!("imported_devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("imported_devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
diff --git a/Plausible.Imported.GoogleAnalytics4.html b/Plausible.Imported.GoogleAnalytics4.html
index 32b8348a6..7d524a078 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 6fc92940c..5060d6840 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 03ae1a2d1..86e99cb3d 100644
--- a/Plausible.Imported.Importer.html
+++ b/Plausible.Imported.Importer.html
@@ -14,7 +14,7 @@
-
+
@@ -178,30 +178,30 @@ scope of importer logic and is expected to be implemented separately.
In case it's necessary to run the whole import job fully synchronously, the
Plausible.Workers.ImportAnalytics
worker sends an Oban.Notifier
message
-on completion, failure or transient failure of the import.
A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
+on completion, failure or transient failure of the import.A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
site,
user,
start_date: ~D[2005-01-01],
- end_date: Date.utc_today(),
+ end_date: Date.utc_today(),
# this option is necessary to setup the calling process as listener
listen?: true
-)
+)
-import_id = job.args[:import_id]
+import_id = job.args[:import_id]
-receive do
- {:notification, :analytics_imports_jobs, %{"complete" => ^import_id}} ->
- IO.puts("Job completed")
+receive do
+ {:notification, :analytics_imports_jobs, %{"complete" => ^import_id}} ->
+ IO.puts("Job completed")
- {:notification, :analytics_imports_jobs, %{"transient_fail" => ^import_id}} ->
- IO.puts("Job failed transiently")
+ {:notification, :analytics_imports_jobs, %{"transient_fail" => ^import_id}} ->
+ IO.puts("Job failed transiently")
- {:notification, :analytics_imports_jobs, %{"fail" => ^import_id}} ->
- IO.puts("Job failed permanently")
-after
+ {:notification, :analytics_imports_jobs, %{"fail" => ^import_id}} ->
+ IO.puts("Job failed permanently")
+after
15_000 ->
- IO.puts("Job didn't finish in 15 seconds")
-end
In a more realistic scenario, job scheduling will be done inside a GenServer process
+
IO.puts("Job didn't finish in 15 seconds")
+end
In a more realistic scenario, job scheduling will be done inside a GenServer process
like LiveView, where notifications can be listened for via handle_info/2
.
diff --git a/Plausible.Imported.NoopImporter.html b/Plausible.Imported.NoopImporter.html
index 81136f708..925ceea3d 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 9731f6c2d..68301688b 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 589ae0b24..a6e5cff0c 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 9704f84f9..34ce9ef9b 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index ba3f3e4ba..d549dc836 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 04e0e5bc7..e88247cae 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 59c07de60..f679febbe 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 fce31ca85..a2a3d2dac 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 ddf9b8632..ebf9dbd1d 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 96894e689..7b90cb464 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 4abd25c96..327de06aa 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 1ba6823d6..a64d06c03 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 2c9a681ee..889f7de8f 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 c2915fafc..c9d10b716 100644
--- a/Plausible.License.html
+++ b/Plausible.License.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html
index 71264d5f4..7c5cbc8ca 100644
--- a/Plausible.Mailer.html
+++ b/Plausible.Mailer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.MigrationUtils.html b/Plausible.MigrationUtils.html
index ee4cf6aa5..2b5ac3f87 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 88ac050a5..e61c26d88 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 1ed833b0f..e47b9467f 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 ec9a51dbd..256f0e904 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 4c2ac92c2..41b8cbff7 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 542b6065f..abac127e9 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 e8eb197e9..cf1ae65d7 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 b80b455c9..3c0085a1f 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 610207dce..d23d7af85 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 c613dc758..998c2c801 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 262d5450b..fb59441c5 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 fe6120455..7f6607e2d 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index 046f2b0d0..fa51ffb94 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index 77b479580..41123feec 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html
index fafbc8d7f..124e1e3cc 100644
--- a/Plausible.RateLimit.html
+++ b/Plausible.RateLimit.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index 97a1e8ffc..2bb864025 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index c2aeabbb5..65692c0ed 100644
--- a/Plausible.Repo.html
+++ b/Plausible.Repo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.S3.html b/Plausible.S3.html
index f5a8637dd..7976b7173 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -14,7 +14,7 @@
-
+
@@ -286,7 +286,7 @@ The URL expires in 24 hours.
In the current implementation the bucket alwa
Returns the pre-configured S3 bucket for CSV exports.
config :plausible, Plausible.S3,
- exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
+ exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
"test-exports"
@@ -318,8 +318,8 @@ The URL expires in 24 hours.In the current implementation the bucket alwa
-
Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
-%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
+Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
+%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
@@ -341,10 +341,10 @@ The URL expires in 24 hours.In the current implementation the bucket alwa
-Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> %{
+Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> %{
...> s3_url: "http://localhost:10000/test-imports/123/imported_browsers.csv",
...> presigned_url: "http://localhost:10000/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=minioadmin" <> _
-...> } = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
+...> } = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
@@ -373,7 +373,7 @@ The URL expires in 24 hours.In the current implementation the bucket alwa
Returns the pre-configured S3 bucket for CSV imports.
config :plausible, Plausible.S3,
- imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
+ imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
"test-imports"
diff --git a/Plausible.Sentry.Client.html b/Plausible.Sentry.Client.html
index 50fd219fc..40be38084 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 7094c16e3..da4c17994 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 5f34cd815..d82b910bd 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 e3bb7d89e..32fec0a34 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 d4b4dd639..1c91c58bc 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 2d452f7a4..abc6c9c5c 100644
--- a/Plausible.Shield.CountryRuleCache.html
+++ b/Plausible.Shield.CountryRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.IPRule.html b/Plausible.Shield.IPRule.html
index 41ba92f4f..65e57e55c 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 2912d379c..98a3889b8 100644
--- a/Plausible.Shield.IPRuleCache.html
+++ b/Plausible.Shield.IPRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shields.html b/Plausible.Shields.html
index b02f22c3d..665982578 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 f39eef001..3b0fb6330 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 0f546a482..2d564941d 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 d9934cc7f..46d922918 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 290c028f6..dc884e4f3 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 5e59f86c7..687100cf4 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 6e8c0127d..218697779 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 f85b963a9..94cd523e2 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 1e16ef3c7..885c4fa50 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 2bd55f329..671355cfb 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 698c9a351..bc07e6cfe 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 55f149ba7..40f289c05 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 cc627f95a..62069be88 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 0b1356457..d4d03c252 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 f2088207a..4eab75b8a 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 fdcd2d2da..428883521 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 a094ea6f4..70354e3ea 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 a04aa2def..11930b1c2 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 afa69c2bd..76875c523 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index 148004a5a..ed7363e7b 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index 4afa9c546..f78157a94 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 4b4fa23b6..e697eb413 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 43d7be002..a30ffc67a 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 6e7994cac..c81009949 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 470af6f06..571a0dd1f 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 b4cd9bdc8..2075ab355 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 6db30b26f..09b9a2f2b 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 22a62b91d..92eaddcb1 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 8cea0efad..1128b3816 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 36cf08722..5109ece09 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 6e00d7174..b4192962e 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 2d03aaf1f..7eea4328f 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 a163a1842..d5a0c5311 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -14,7 +14,7 @@
-
+
@@ -253,14 +253,14 @@ Pages
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-%{"event:page" => {:matches, "/blog/**"}}
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+%{"event:page" => {:matches, "/blog/**"}}
-iex> Filters.parse("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> Filters.parse("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
-iex> Filters.parse(nil)
-%{}
+iex> Filters.parse(nil)
+%{}
diff --git a/Plausible.Stats.Fragments.html b/Plausible.Stats.Fragments.html
index 94fa57bda..2af01976b 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 05ea34538..c5ed406c4 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 dedcae8b7..2666b3861 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 896384121..d94f12e06 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 4ca709e65..721d4176b 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 69152d61e..0b173c6db 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 7b72d04b6..5695640f4 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 1c0279f34..008a028f4 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 8e5b97089..d15dccc93 100644
--- a/Plausible.Stats.Sampling.html
+++ b/Plausible.Stats.Sampling.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Timeseries.html b/Plausible.Stats.Timeseries.html
index 05f44534e..6ccc7421c 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 7c9080ff3..fa566f08e 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 d2beceac1..3d18bf428 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 069239c74..f3a33a25c 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 096475112..e468d7fea 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 366c8d5b0..13423fa90 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index 909b5f21d..46377292d 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index 432d11345..43f581f9c 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index dcd6f92fe..d34df2d14 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 928ca89db..05f5f1d3e 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 53ea3e267..0c2ff62f4 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 765fe799e..2c3823a1c 100644
--- a/Plausible.Workers.CleanInvitations.html
+++ b/Plausible.Workers.CleanInvitations.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ExpireDomainChangeTransitions.html b/Plausible.Workers.ExpireDomainChangeTransitions.html
index 394b046f8..62b1e8855 100644
--- a/Plausible.Workers.ExpireDomainChangeTransitions.html
+++ b/Plausible.Workers.ExpireDomainChangeTransitions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ExportCSV.html b/Plausible.Workers.ExportCSV.html
index eabfaf16a..c8686a645 100644
--- a/Plausible.Workers.ExportCSV.html
+++ b/Plausible.Workers.ExportCSV.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ImportAnalytics.html b/Plausible.Workers.ImportAnalytics.html
index bc2215868..099176ce5 100644
--- a/Plausible.Workers.ImportAnalytics.html
+++ b/Plausible.Workers.ImportAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.LockSites.html b/Plausible.Workers.LockSites.html
index e3419b9ca..6b680801c 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 d98c5f1d6..25f1ccea3 100644
--- a/Plausible.Workers.NotifyAnnualRenewal.html
+++ b/Plausible.Workers.NotifyAnnualRenewal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.RotateSalts.html b/Plausible.Workers.RotateSalts.html
index 4ebf773be..9db2f8580 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 6bd79ada5..8eb7a4f01 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 08f5c1396..6c6b66f07 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 baddeb44f..e8b9cfd2e 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 5d76ea247..552fdb488 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 500cfdfe2..0432a312b 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 17a176f14..f60ea82a7 100644
--- a/Plausible.Workers.SpikeNotifier.html
+++ b/Plausible.Workers.SpikeNotifier.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index 3d62a1de8df7d1191f130189f5d6fcc195baebe4..f6fe4769703986064d4c160e936ca1976e29835a 100644
GIT binary patch
delta 138229
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