+ + + + View Source + + + Plausible.Shield.CountryRule + (Plausible v0.0.1) + +
+ + +Schema for Country Block List
+From 5600dc6ba95020dbd3bc809b6c9f1b8512109ba7 Mon Sep 17 00:00:00 2001
From: aerosol
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Give
Queries the ClickHouse database for the monthly pageview usage. If the given user's
subscription is active
, past_due
, or a deleted
(but not yet expired), a map
-with the following structure is returned:
%{
- current_cycle: usage_cycle(),
- last_cycle: usage_cycle(),
- penultimate_cycle: usage_cycle()
-}
In all other cases of the subscription status (or a free_10k
subscription which
-does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the +with the following structure is returned:
%{
+ current_cycle: usage_cycle(),
+ last_cycle: usage_cycle(),
+ penultimate_cycle: usage_cycle()
+}
In all other cases of the subscription status (or a free_10k
subscription which
+does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the
user owns. Alternatively, given an optional argument of site_ids
, the usage from
across all those sites is queried instead.
Cldr.LanguageTag
.The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -261,54 +261,54 @@ a configuredExamples
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
-{:error,
- {Cldr.NoMatchingLocale,
- "No configured locale could be matched to \"xx,yy;q=0.3\""}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
+{:error,
+ {Cldr.NoMatchingLocale,
+ "No configured locale could be matched to \"xx,yy;q=0.3\""}}
-iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
@@ -369,95 +369,95 @@ wuth an error tuple for each invalid tag added at the end of the list.
Example
-iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
- ]}
+ transform: %{},
+ language_variants: []
+ }}
+ ]}
-iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
-{:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
+{:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
- ]}
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+ ]}
@@ -502,92 +502,92 @@ wuth an error tuple for each invalid tag added at the end of the list.
Example
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
-]
+ transform: %{},
+ language_variants: []
+ }}
+]
Plausible.Cldr.AcceptLanguage.parse! "invalid_tag"
** (Cldr.AcceptLanguageError) "Expected a BCP47 language tag. Could not parse the remaining "g" starting at position 11
(ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-]
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+]
diff --git a/Plausible.Cldr.Currency.html b/Plausible.Cldr.Currency.html
index 00b18ba6a..795f9b58d 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 a6ef21e88..04a7af2d8 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 b6383d7e2..3324d42ba 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 e7e31f381..b7dc3f947 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 6b4fe04ac..dce4205c5 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 6857a6324..21d2d1a75 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 279547497..dbff4d208 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 491650eac..a42f1b84c 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 1211a9109..d814f5080 100644
--- a/Plausible.ClickhouseEventV2.html
+++ b/Plausible.ClickhouseEventV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index 65c3d09b8..6e14b95da 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 9daad3b30..0c6b1a1a0 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 99d83f352..c41904cd9 100644
--- a/Plausible.ClickhouseSessionV2.html
+++ b/Plausible.ClickhouseSessionV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html
index 14d121bc2..3baf03679 100644
--- a/Plausible.ConfigHelpers.html
+++ b/Plausible.ConfigHelpers.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html
index 55a615447..77665dd9d 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 49f4d7ca3..d122ac0ce 100644
--- a/Plausible.DataMigration.NumericIDs.html
+++ b/Plausible.DataMigration.NumericIDs.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index fbef17701..ee70e10f1 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 96f0b80de..2f4751c27 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 0293a5271..a878f84bb 100644
--- a/Plausible.DataMigration.html
+++ b/Plausible.DataMigration.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DebugReplayInfo.html b/Plausible.DebugReplayInfo.html
index c953891c2..36ec55317 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 65c1706ac..2ab55a10d 100644
--- a/Plausible.Ecto.EventName.html
+++ b/Plausible.Ecto.EventName.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Factory.html b/Plausible.Factory.html
index 35ad1423b..0dd2785f0 100644
--- a/Plausible.Factory.html
+++ b/Plausible.Factory.html
@@ -14,7 +14,7 @@
-
+
@@ -203,6 +203,14 @@ Pages
+
+
+ country_rule_factory()
+
+
+
+
+
create(_)
@@ -682,6 +690,28 @@ Pages
+
+
+
+
+
+
+
+
+
diff --git a/Plausible.Funnel.Const.html b/Plausible.Funnel.Const.html
index c61f32db3..b16f03a8a 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 295cc06cf..6e1b53e3b 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 cea64ca83..9296109cf 100644
--- a/Plausible.Funnel.html
+++ b/Plausible.Funnel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html
index ffb0bd164..82582ee44 100644
--- a/Plausible.Funnels.html
+++ b/Plausible.Funnels.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index 2318dbd00..170a52d0d 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"
@@ -301,8 +301,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
@@ -331,21 +331,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",
@@ -354,12 +354,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",
@@ -368,20 +368,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",
@@ -390,13 +390,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -405,10 +405,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.Goal.Revenue.html b/Plausible.Goal.Revenue.html
index a229e76f0..5f2ad05f4 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 81a052fcb..3a12611dd 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index 37068b3e8..3921eef07 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 3c438188f..250047442 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 8f438302a..fe46d3e7c 100644
--- a/Plausible.Google.Api.html
+++ b/Plausible.Google.Api.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.HTTP.html b/Plausible.Google.HTTP.html
index 6f4dad241..96f1b6ffc 100644
--- a/Plausible.Google.HTTP.html
+++ b/Plausible.Google.HTTP.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.ReportRequest.html b/Plausible.Google.ReportRequest.html
index 4a54b0ea8..868bf97b7 100644
--- a/Plausible.Google.ReportRequest.html
+++ b/Plausible.Google.ReportRequest.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HTTPClient.Interface.html b/Plausible.HTTPClient.Interface.html
index 797582095..c0304c717 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 cad5423ef..ca1f2f63c 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 0d18f3757..59d9ec22e 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 f00edc01b..16c73dd60 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 07b37bb80..0610c28c0 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 26020b792..019b57947 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 c43b27d78..4b18fd14a 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.ImportSources.html b/Plausible.Imported.ImportSources.html
index 13991a1b3..b8ac46069 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 1613d77c3..77ed0e3d5 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 3496e121b..bfb152a72 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 fbecbcb69..c60a8d1ca 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 607f749c4..ff673338c 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 a68a2e673..2437ed639 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 251c88e4e..e19954bd3 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 3a5328c8a..2793e9975 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 e8fe5458a..29a558a5b 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 2786cebee..f47a0a977 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 f4be31fae..f39226b3e 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 4377eb91b..605bf630f 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 6e9752954..c635548b5 100644
--- a/Plausible.Ingestion.Event.html
+++ b/Plausible.Ingestion.Event.html
@@ -14,7 +14,7 @@
-
+
@@ -264,7 +264,8 @@ are uniformly either buffered in batches (to Clickhouse) or dropped
| Plausible.Site.GateKeeper.policy()
| :invalid
| :dc_ip
- | :site_ip_blocklist
+ | :site_ip_blocklist
+ | :site_country_blocklist
@@ -280,7 +281,7 @@ are uniformly either buffered in batches (to Clickhouse) or dropped
t()
-
+
View Source
@@ -420,7 +421,7 @@ are uniformly either buffered in batches (to Clickhouse) or dropped
build_and_buffer(request)
-
+
View Source
@@ -449,7 +450,7 @@ are uniformly either buffered in batches (to Clickhouse) or dropped
emit_telemetry_buffered(event)
-
+
View Source
@@ -477,7 +478,7 @@ are uniformly either buffered in batches (to Clickhouse) or dropped
emit_telemetry_dropped(event, reason)
-
+
View Source
@@ -505,7 +506,7 @@ are uniformly either buffered in batches (to Clickhouse) or dropped
telemetry_event_buffered()
-
+
View Source
@@ -533,7 +534,7 @@ are uniformly either buffered in batches (to Clickhouse) or dropped
telemetry_event_dropped()
-
+
View Source
diff --git a/Plausible.Ingestion.Request.Revenue.html b/Plausible.Ingestion.Request.Revenue.html
index 045547a69..e4f9d688d 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 d63e2785c..76abbcc43 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 ad32c3745..16ad11cff 100644
--- a/Plausible.License.html
+++ b/Plausible.License.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html
index 7824f8e55..b029b8add 100644
--- a/Plausible.Mailer.html
+++ b/Plausible.Mailer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.MigrationUtils.html b/Plausible.MigrationUtils.html
index 58c405440..934645cba 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 5262544df..078950876 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 51cc18d4d..7d0377ba1 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 8ef8e902d..1f164bdc2 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 62963e40a..6873d6b44 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 bf990098b..0f9b25147 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 8e162103b..afc42ca70 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 bb6d1ee3e..0048dbab7 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 158b19556..5f1dfab80 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 ea9021122..938871088 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 bde1b1eb8..c76cfc8ba 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 34eb3cac5..c52fd3529 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index 34e3af791..b300a3a2d 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index a5772f391..3d4004380 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html
index 30a1defc8..82cc6caae 100644
--- a/Plausible.RateLimit.html
+++ b/Plausible.RateLimit.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index e78b2c88f..95097aa0a 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index c9cd108a6..8066e9fac 100644
--- a/Plausible.Repo.html
+++ b/Plausible.Repo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Sentry.Client.html b/Plausible.Sentry.Client.html
index a14d541fe..ebeef2381 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 c0e998869..69a0751ea 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 8c5d727f7..991bed468 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 655e0b5bb..4eae86f51 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
new file mode 100644
index 000000000..490fccf4a
--- /dev/null
+++ b/Plausible.Shield.CountryRule.html
@@ -0,0 +1,306 @@
+
+
+
+
+
+
+
+
+
+
+ Plausible.Shield.CountryRule — Plausible v0.0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ View Source
+
+
+ Plausible.Shield.CountryRule
+ (Plausible v0.0.1)
+
+
+
+
+
+Schema for Country Block List
+
+
+
+
+
+
+
+
+ Summary
+
+
+
+
+ Functions
+
+
+
+
+ changeset(rule, attrs)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Types
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Functions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plausible.Shield.CountryRuleCache.html b/Plausible.Shield.CountryRuleCache.html
new file mode 100644
index 000000000..d71900c9c
--- /dev/null
+++ b/Plausible.Shield.CountryRuleCache.html
@@ -0,0 +1,545 @@
+
+
+
+
+
+
+
+
+
+
+ Plausible.Shield.CountryRuleCache — Plausible v0.0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ View Source
+
+
+ Plausible.Shield.CountryRuleCache
+ (Plausible v0.0.1)
+
+
+
+
+
+Allows retrieving Country Rules by domain and country code
+
+
+
+
+
+
+
+
+ Summary
+
+
+
+ Functions
+
+
+
+
+ child_spec(opts)
+
+
+
+
+
+
+
+ get(key, opts \\ [])
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Ensures the cache has non-zero size unless no items exist.
+Useful for orchestrating app startup to prevent the service
+going up asynchronously with an empty cache.
+
+
+
+
+
+ refresh_all(opts \\ [])
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Functions
+
+
+
+
+
+
+
+
+
+
+ @spec child_spec(Keyword.t()) :: Supervisor.child_spec()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Ensures the cache has non-zero size unless no items exist.
+Useful for orchestrating app startup to prevent the service
+going up asynchronously with an empty cache.
+
+
+
+
+
+
+
+
+
+
+
+
+ @spec refresh_all(Keyword.t()) :: :ok
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @spec refresh_updated_recently(Keyword.t()) :: :ok
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link to this function
+
+ telemetry_event_refresh(cache_name \\ name(), mode)
+
+
+
+ View Source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plausible.Shield.IPRule.html b/Plausible.Shield.IPRule.html
index 936339b4d..881712dc4 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 b0770431a..e5ee52d78 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 f636223bd..894df9b61 100644
--- a/Plausible.Shields.html
+++ b/Plausible.Shields.html
@@ -14,7 +14,7 @@
-
+
@@ -161,7 +161,7 @@ Pages
@@ -169,7 +169,7 @@ Pages
@@ -177,7 +177,39 @@ Pages
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -193,7 +225,15 @@ Pages
+
+
+
@@ -212,16 +252,18 @@ Pages
Functions
-
+
+
+
-
+
Link to this function
- add_ip_rule(site_id, params)
+ add_country_rule(site_or_id, params, opts \\ [])
-
+
View Source
@@ -233,12 +275,71 @@ Pages
- @spec add_ip_rule(Plausible.Site.t() | non_neg_integer(), map()) ::
+ @spec add_country_rule(Plausible.Site.t() | non_neg_integer(), map(), Keyword.t()) ::
+ {:ok, Plausible.Shield.CountryRule.t()} | {:error, Ecto.Changeset.t()}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link to this function
+
+ add_ip_rule(site_or_id, params, opts \\ [])
+
+
+
+ View Source
+
+
+
+
+
+
+
+
+
+ @spec add_ip_rule(Plausible.Site.t() | non_neg_integer(), map(), Keyword.t()) ::
{:ok, Plausible.Shield.IPRule.t()} | {:error, Ecto.Changeset.t()}
+
+
+
+
+
+
+
+
+
+
+ @spec count_country_rules(Plausible.Site.t() | non_neg_integer()) :: non_neg_integer()
+
+
+
+
@@ -248,9 +349,9 @@ Pages
Link to this function
- count_ip_rules(site_id)
+ count_ip_rules(site_or_id)
-
+
View Source
@@ -267,6 +368,36 @@ Pages
+
+
+
+
+
+
+
+
+
+
+ @spec list_country_rules(Plausible.Site.t() | non_neg_integer()) :: [
+ Plausible.Shield.CountryRule.t()
+]
+
+
+
+
@@ -276,9 +407,9 @@ Pages
Link to this function
- list_ip_rules(site_id)
+ list_ip_rules(site_or_id)
-
+
View Source
@@ -299,16 +430,16 @@ Pages
-
+
-
+
Link to this function
- maximum_ip_rules()
+ maximum_country_rules()
-
+
View Source
@@ -319,6 +450,56 @@ Pages
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link to this function
+
+ remove_country_rule(site_or_id, rule_id)
+
+
+
+ View Source
+
+
+
+
+
+
+
+
+
+ @spec remove_country_rule(Plausible.Site.t() | non_neg_integer(), String.t()) :: :ok
+
+
+
+
@@ -328,9 +509,9 @@ Pages
Link to this function
- remove_ip_rule(site_id, rule_id)
+ remove_ip_rule(site_or_id, rule_id)
-
+
View Source
diff --git a/Plausible.Site.Cache.html b/Plausible.Site.Cache.html
index 9387c5dd6..578ab0dd6 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 05b94d350..d65fc4001 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 cd0d55d09..86cc7cc28 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 0f337cbcf..fc456b4f9 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 3f61b4531..0873d8cee 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 20c1383ea..6ea454ab8 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 d07e21032..f4a39b886 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 97572a0a6..05ebd00a9 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 6757f00aa..f2b6960b7 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 7c1e14dc3..b64964c81 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 c2389922f..11ccbd5de 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 a53027597..ae4a8eb7f 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 49d37e9ac..93de16f79 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 87b7c3867..a124515ce 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 cd9ded8fc..8ee4de096 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 22205bbe4..93c200546 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 1fa324c90..32b55c7e1 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 df2e82328..8bfb5c959 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index 66a1b6e83..ef61b703e 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index 23fdeb476..3c4dad079 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 f93133fe1..2fc25d8dc 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 547e9eaef..fccdce63b 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 624655909..43f651be6 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 d53abd36c..4d86ecadf 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 f7c4f04d2..e1713591a 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 efd686b2f..2819f1f26 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 a74b67cb1..a89d9ad24 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 9d4fdd67a..83910820a 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 0c82a206b..dc01bcbe2 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 7a9387572..b92a94a11 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 dc8b65feb..45bc64e13 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 b329ab283..e49e0ef5c 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 49838ea74..73d2d128d 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 027c9bae1..cddff81ef 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 519b0d8a0..97b0c74f3 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 a1c45a0fa..1f4365e34 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 1aff4680a..c9bbadec1 100644
--- a/Plausible.Stats.Interval.html
+++ b/Plausible.Stats.Interval.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Props.html b/Plausible.Stats.Props.html
index fec04e1d3..d590c8284 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 9ce1d7155..36314ba81 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 86ffce7f1..d305fd3d3 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 1de199952..de1cb6ad1 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 196468c2c..893d44629 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 9d82c4eea..a17ee9802 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 d3aa2e9d1..0c60e7f8e 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 a4b24f074..8f30ba478 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 9bf9874f3..b11e836b6 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index 366dd19aa..e58ccfef0 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index 4363177b6..dd0254d9f 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -14,7 +14,7 @@
-
+
@@ -171,6 +171,14 @@ Pages
+
+
+
+
+
to_utc_datetime(naive_date_time, timezone)
@@ -249,6 +257,35 @@ Pages
+
+
+
+
+
+
+
+
+
+
+ @spec to_datetime_in_timezone(Date.t() | NaiveDateTime.t() | DateTime.t(), String.t()) ::
+ DateTime.t()
+
+
+
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index 74c39a9d9..56040f087 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 e08a9862a..07628a306 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 35050d5b5..7c3db3967 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 236a125b1..d7f01201c 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 c2012e2e7..f59d08abd 100644
--- a/Plausible.Workers.ExpireDomainChangeTransitions.html
+++ b/Plausible.Workers.ExpireDomainChangeTransitions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ImportAnalytics.html b/Plausible.Workers.ImportAnalytics.html
index f21a91e84..f09eb45ad 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 fa69a8d1c..ebdf7bb60 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 8898d6e32..27481953d 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 773f01157..cc09ce2ed 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 2b9bb06f5..9a742dc20 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 9e0168573..c3f0340e1 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 ed2d3464b..ad05efe28 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 d5b4e9a14..e92b1575e 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 160dedadd..7bd8b3a62 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 e2b4142cd..27d20f7fd 100644
--- a/Plausible.Workers.SpikeNotifier.html
+++ b/Plausible.Workers.SpikeNotifier.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index 7c62c0b9f8717ce003bc477defab7ff77a7083ea..ff65c940437fd3c6437d7960651ff4540effe548 100644
GIT binary patch
delta 166744
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