From da3cd697e8663e59831465ded20f3003d1530e2a Mon Sep 17 00:00:00 2001
From: zoldar
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 8f113052c6..949cae12ba 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 6f39cfd506..33f6f5ce9e 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 3831f410a3..5e063f3a3d 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 7903b7eb87..a12ab60b80 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 ccae2c294c..449a983f53 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 5854ec883a..aa144c71c0 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 560248bfdb..9dd749bf7e 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 bfa52d9d4c..e1b02d1426 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 7607cfbdca..1b76b84d72 100644
--- a/Plausible.ClickhouseEventV2.html
+++ b/Plausible.ClickhouseEventV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index 827a3789a7..9317a340ae 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 6a4e17b3a7..ef8b7fcedc 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 87ccd09b3d..4464557010 100644
--- a/Plausible.ClickhouseSessionV2.html
+++ b/Plausible.ClickhouseSessionV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html
index adecda39a3..125f2d7656 100644
--- a/Plausible.ConfigHelpers.html
+++ b/Plausible.ConfigHelpers.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html
index 9eaa54c152..34bb49c745 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 9573c59eb4..140a364ca5 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 ee3852011e..4808c4c822 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 63d2522eb0..6423c9abbd 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 62455b9b21..7642c6f0a9 100644
--- a/Plausible.DataMigration.html
+++ b/Plausible.DataMigration.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DebugReplayInfo.html b/Plausible.DebugReplayInfo.html
index ca7a76f456..8009bfdcb0 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 b60e1b32c1..001607bc14 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 3eeb1d75a7..c3c8a70f0a 100644
--- a/Plausible.Factory.html
+++ b/Plausible.Factory.html
@@ -14,7 +14,7 @@
-
+
@@ -485,6 +485,14 @@ Pages
+
+
+ site_import_factory()
+
+
+
+
+
site_membership_factory()
@@ -563,7 +571,7 @@ Pages
api_key_factory()
-
+
View Source
@@ -657,7 +665,7 @@ Pages
business_subscription_factory()
-
+
View Source
@@ -679,7 +687,7 @@ Pages
ch_session_factory()
-
+
View Source
@@ -701,7 +709,7 @@ Pages
country_rule_factory()
-
+
View Source
@@ -835,7 +843,7 @@ Pages
enterprise_plan_factory()
-
+
View Source
@@ -857,7 +865,7 @@ Pages
event_factory()
-
+
View Source
@@ -907,7 +915,7 @@ Pages
goal_factory()
-
+
View Source
@@ -929,7 +937,7 @@ Pages
google_auth_factory()
-
+
View Source
@@ -951,7 +959,7 @@ Pages
growth_subscription_factory()
-
+
View Source
@@ -973,7 +981,7 @@ Pages
imported_browsers_factory()
-
+
View Source
@@ -995,7 +1003,7 @@ Pages
imported_devices_factory()
-
+
View Source
@@ -1017,7 +1025,7 @@ Pages
imported_entry_pages_factory()
-
+
View Source
@@ -1039,7 +1047,7 @@ Pages
imported_exit_pages_factory()
-
+
View Source
@@ -1061,7 +1069,7 @@ Pages
imported_locations_factory()
-
+
View Source
@@ -1083,7 +1091,7 @@ Pages
imported_operating_systems_factory()
-
+
View Source
@@ -1105,7 +1113,7 @@ Pages
imported_pages_factory()
-
+
View Source
@@ -1127,7 +1135,7 @@ Pages
imported_sources_factory()
-
+
View Source
@@ -1149,7 +1157,7 @@ Pages
imported_visitors_factory()
-
+
View Source
@@ -1329,7 +1337,7 @@ Pages
invitation_factory()
-
+
View Source
@@ -1351,7 +1359,7 @@ Pages
ip_rule_factory()
-
+
View Source
@@ -1373,7 +1381,7 @@ Pages
monthly_report_factory()
-
+
View Source
@@ -1395,7 +1403,7 @@ Pages
pageview_factory()
-
+
View Source
@@ -1465,7 +1473,7 @@ Pages
shared_link_factory()
-
+
View Source
@@ -1498,6 +1506,28 @@ Pages
+
+
+
+
+
+
+
+
+
@@ -1601,7 +1631,7 @@ Pages
subscription_factory()
-
+
View Source
@@ -1645,7 +1675,7 @@ Pages
weekly_report_factory()
-
+
View Source
diff --git a/Plausible.Funnel.Const.html b/Plausible.Funnel.Const.html
index 58a22a80de..c0acb01a49 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 18ba713868..a8fc0a27ae 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 970fe97f71..9b9e55459f 100644
--- a/Plausible.Funnel.html
+++ b/Plausible.Funnel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html
index 0430320000..f85d809d0f 100644
--- a/Plausible.Funnels.html
+++ b/Plausible.Funnels.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index 8d0d12c784..d3ad5d6462 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 139bdaf626..5a1b8ebba9 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 99e4dfdc93..81d3f9bd09 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index fbba0be857..76773ee643 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 6d099fe3a2..05e99ff65f 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 eb7159ac82..ff2b8748d8 100644
--- a/Plausible.Google.Api.html
+++ b/Plausible.Google.Api.html
@@ -14,7 +14,7 @@
-
+
@@ -223,7 +223,7 @@ Pages
- import_authorize_url(site_id, redirect_to)
+ import_authorize_url(site_id, redirect_to, legacy \\ true)
@@ -472,14 +472,16 @@ importing has finished or {:error, term()}
when a re
many times.Useful links:
-
+
+
+
-
+
Link to this function
- import_authorize_url(site_id, redirect_to)
+ import_authorize_url(site_id, redirect_to, legacy \\ true)
diff --git a/Plausible.Google.HTTP.html b/Plausible.Google.HTTP.html
index 01d0e2b18a..f0021027bf 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 5db5738b32..d32f03054d 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 dcd944f521..8c786ad513 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 529f9d1cb9..f580c21301 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 0f6dd18b8e..88280bad90 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 93ac0ae4c4..9e4b1abaf7 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 8255b40b9c..883312a0f6 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 b275ac8fcd..82f6f24390 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 d727b03e7f..05c3a2fb2f 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 223d4aaeb4..1193cb5c9b 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 47199b8921..f20ca535f2 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
.
@@ -282,6 +282,22 @@ like LiveView, where notifications can be listened for via
+
+
+
+ Functions
+
+
+
+
+ listen()
+
+
+
+ Allows to explicitly start listening for importer job notifications.
+
+
+
@@ -519,6 +535,46 @@ like LiveView, where notifications can be listened for via
+
+
+
+
+
+
+
+
+
+
+
+ Functions
+
+
+
+
+
+
+
+
+
+
+ @spec listen() :: :ok
+
+
+
+Allows to explicitly start listening for importer job notifications.
Listener must explicitly filter out a subset of imports that apply to the given context.
diff --git a/Plausible.Imported.NoopImporter.html b/Plausible.Imported.NoopImporter.html
index b5d435b6cf..ca082577a0 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 d8e7877456..8763fea1da 100644
--- a/Plausible.Imported.SiteImport.html
+++ b/Plausible.Imported.SiteImport.html
@@ -14,7 +14,7 @@
-
+
@@ -213,6 +213,14 @@ Pages
+
+
+ from_legacy(data)
+
+
+
+
+
importing()
@@ -286,6 +294,7 @@ Pages
imported_by: term(),
imported_by_id: term(),
inserted_at: term(),
+ legacy: term(),
site: term(),
site_id: term(),
source: term(),
@@ -322,7 +331,7 @@ Pages
complete_changeset(site_import, params \\ %{})
-
+
View Source
@@ -350,7 +359,7 @@ Pages
completed()
-
+
View Source
@@ -374,7 +383,7 @@ Pages
create_changeset(site, user, params)
-
+
View Source
@@ -403,7 +412,7 @@ Pages
fail_changeset(site_import)
-
+
View Source
@@ -431,7 +440,7 @@ Pages
failed()
-
+
View Source
@@ -444,6 +453,34 @@ Pages
+
+
+
+
+
+
+
+
+
+
+ @spec from_legacy(Plausible.Site.ImportedData.t()) :: t()
+
+
+
+
@@ -455,7 +492,7 @@ Pages
importing()
-
+
View Source
@@ -479,7 +516,7 @@ Pages
label(arg1)
-
+
View Source
@@ -507,7 +544,7 @@ Pages
pending()
-
+
View Source
@@ -531,7 +568,7 @@ Pages
start_changeset(site_import)
-
+
View Source
diff --git a/Plausible.Imported.UniversalAnalytics.html b/Plausible.Imported.UniversalAnalytics.html
index f9c92dfeb7..0bc410ab2c 100644
--- a/Plausible.Imported.UniversalAnalytics.html
+++ b/Plausible.Imported.UniversalAnalytics.html
@@ -14,7 +14,7 @@
-
+
@@ -207,7 +207,7 @@ Pages
from_report(data, site_id, import_id, table)
-
+
View Source
@@ -229,7 +229,7 @@ Pages
import_data(site_import, opts)
-
+
View Source
diff --git a/Plausible.Imported.html b/Plausible.Imported.html
index 74ca342c72..e38b1ae12d 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -14,7 +14,7 @@
-
+
@@ -176,6 +176,14 @@ analytics formerly known as "Google Analytics"
+
+ get_import(import_id)
+
+
+
+
+
list_all_imports(site)
@@ -192,6 +200,16 @@ analytics formerly known as "Google Analytics"
+
+ listen()
+
+
+
+
+
+
+
load_import_data(site)
@@ -200,6 +218,14 @@ analytics formerly known as "Google Analytics"
+
+ max_complete_imports()
+
+
+
+
+
tables()
@@ -230,7 +256,7 @@ analytics formerly known as "Google Analytics"delete_imports_for_site(site)
-
+
View Source
@@ -258,7 +284,7 @@ analytics formerly known as "Google Analytics" get_earliest_import(site)
-
+
View Source
@@ -276,6 +302,34 @@ analytics formerly known as "Google Analytics"
+
+
+
+
+
+
+
+ @spec get_import(non_neg_integer()) :: Plausible.Imported.SiteImport.t() | nil
+
+
+
+
@@ -287,7 +341,7 @@ analytics formerly known as "Google Analytics" list_all_imports(site)
-
+
View Source
@@ -315,7 +369,7 @@ analytics formerly known as "Google Analytics" list_complete_import_ids(site)
-
+
View Source
@@ -334,6 +388,28 @@ analytics formerly known as "Google Analytics"
+
+
+
+
+
+
+
+
@@ -343,6 +419,34 @@ analytics formerly known as "Google Analytics"load_import_data(site)
+
+
+ View Source
+
+
+
+
+
+
+
+
+
+ @spec load_import_data(Plausible.Site.t()) :: Plausible.Site.t()
+
+
+
+
+
+
+
+
+
+
+
+ Link to this function
+
+ max_complete_imports()
+
View Source
@@ -355,7 +459,7 @@ analytics formerly known as "Google Analytics"
- @spec load_import_data(Plausible.Site.t()) :: Plausible.Site.t()
+ @spec max_complete_imports() :: non_neg_integer()
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 4ec40aa2ce..f0e75a6477 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 cc3f061790..7300f10691 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 09435acc1c..3bd3370bbe 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 f96dc7a339..3cf04f835b 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 83c8d76ce7..abdd192cf7 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 6f0c234e03..ab82092dd4 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 8c4abe3834..905f95fe88 100644
--- a/Plausible.Ingestion.Event.html
+++ b/Plausible.Ingestion.Event.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Request.Revenue.html b/Plausible.Ingestion.Request.Revenue.html
index 0d3074f306..69c772752e 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 a0e3b2cd2f..6d46ce9436 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 2abe256c70..7b4e386504 100644
--- a/Plausible.License.html
+++ b/Plausible.License.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html
index c0773c12ee..396094215a 100644
--- a/Plausible.Mailer.html
+++ b/Plausible.Mailer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.MigrationUtils.html b/Plausible.MigrationUtils.html
index 58b1a9d32d..141edbf91f 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 49a7952db6..2ac619c13f 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 7599002424..d4cfd7e704 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 eb042e14d5..fa60916a5f 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 022d4ae041..36d622be32 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 9023b57036..cccc84e1e5 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 fcf0bfe86b..73f9a8bf11 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 2d0fd048b1..d03c145d29 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 5d8ec6fd13..88725b837d 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 11982788bb..deb3760a3b 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 3ee39d6882..5b02a4c420 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 dd38086abd..d1f63110e4 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index 798940ade2..15e91133b0 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index fc200a514d..510c39b612 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -14,7 +14,7 @@
-
+
@@ -187,6 +187,14 @@ asynchronously.
+
delete_native_stats!(site)
@@ -247,6 +255,28 @@ asynchronously.The stats_start_date
is expected to get repopulated the next time
Plausible.Sites.stats_start_date/1
is called.
If the input argument is a site, all imported stats are deleted. If it's a site import,
only imported stats for that import are deleted.
+
+
+
+
+
+
+
+
+
@@ -258,7 +288,7 @@ only imported stats for that import are deleted.
delete_native_stats!(site)
-
+
View Source
@@ -286,7 +316,7 @@ only imported stats for that import are deleted.
reset!(site)
-
+
View Source
diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html
index 477d9e2b2e..280ec13883 100644
--- a/Plausible.RateLimit.html
+++ b/Plausible.RateLimit.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index ea1113519c..a3ded88f27 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index e8d5807009..5ae53c78b9 100644
--- a/Plausible.Repo.html
+++ b/Plausible.Repo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.S3.html b/Plausible.S3.html
index 3068a2dc31..61f68c3f0d 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Sentry.Client.html b/Plausible.Sentry.Client.html
index 1b2c3b8b2a..4d5b92ae5e 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 d528fd4f61..5e02b41612 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 3d057860cc..893ff06478 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 91b1b5b823..6579c4bd57 100644
--- a/Plausible.Session.Salts.html
+++ b/Plausible.Session.Salts.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.CountryRule.html b/Plausible.Shield.CountryRule.html
index 803794bc3b..9faadb3c07 100644
--- a/Plausible.Shield.CountryRule.html
+++ b/Plausible.Shield.CountryRule.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.CountryRuleCache.html b/Plausible.Shield.CountryRuleCache.html
index 703005b6d2..e33a9a6c67 100644
--- a/Plausible.Shield.CountryRuleCache.html
+++ b/Plausible.Shield.CountryRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.IPRule.html b/Plausible.Shield.IPRule.html
index 75b0a55094..5bf120db8d 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 7fbc94faf8..abd68ca806 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 90bbbbb5d6..9e3909007c 100644
--- a/Plausible.Shields.html
+++ b/Plausible.Shields.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Cache.html b/Plausible.Site.Cache.html
index 6321f53d9e..82b1f179e8 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 2b6bf58930..eebf982528 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 b71afacd08..bd31dd8964 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 7f6f3ce3ec..17554241e6 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 a6d3f037f3..27bca21482 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 ae94b42367..c00d4d2e50 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 2d54298755..430eb931da 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 9d4cd6f5fb..41b7f83271 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 f25f4758f2..45252874a3 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 26d4edecf2..7333b49564 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 326c9e59d6..3308f31a72 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 96b5319603..c7f5ca5aa7 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 e5f7453790..e8308c13b4 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 ba31483df3..afa87c47b1 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 019f363bd9..4c31bfef94 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 7a91297029..65dd8dc36b 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 5da0f7fe73..fb843b4722 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 a53e663a8a..0c881a96d2 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index a26498afff..bc2403c843 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index 522b916802..08149fcf19 100644
--- a/Plausible.Sites.html
+++ b/Plausible.Sites.html
@@ -14,7 +14,7 @@
-
+
@@ -297,6 +297,14 @@ This function does 2 transformations:
+
+
+
+
+
owned_site_ids(user)
@@ -478,7 +486,7 @@ does not have stats yet.
create_shared_link(site, name, password \\ nil)
-
+
View Source
@@ -546,7 +554,7 @@ does not have stats yet.
get_for_user(user_id, domain, roles \\ [:owner, :admin, :viewer])
-
+
View Source
@@ -570,7 +578,7 @@ does not have stats yet.
get_for_user!(user_id, domain, roles \\ [:owner, :admin, :viewer])
-
+
View Source
@@ -592,7 +600,7 @@ does not have stats yet.
has_admin_access?(user_id, site)
-
+
View Source
@@ -614,7 +622,7 @@ does not have stats yet.
has_goals?(site)
-
+
View Source
@@ -636,7 +644,7 @@ does not have stats yet.
has_stats?(site)
-
+
View Source
@@ -658,7 +666,7 @@ does not have stats yet.
is_member?(user_id, site)
-
+
View Source
@@ -786,7 +794,7 @@ This function does 2 transformations:
locked?(site)
-
+
View Source
@@ -797,6 +805,34 @@ This function does 2 transformations:
+
+
+
+
+
+
+
+
+
+
+ @spec native_stats_start_date(Plausible.Site.t()) :: Date.t() | nil
+
+
+
+
@@ -808,7 +844,7 @@ This function does 2 transformations:
owned_site_ids(user)
-
+
View Source
@@ -830,7 +866,7 @@ This function does 2 transformations:
owned_sites_count(user)
-
+
View Source
@@ -852,7 +888,7 @@ This function does 2 transformations:
owned_sites_domains(user)
-
+
View Source
@@ -874,7 +910,7 @@ This function does 2 transformations:
role(user_id, site)
-
+
View Source
@@ -925,7 +961,7 @@ This function does 2 transformations:
shared_link_url(site, link)
-
+
View Source
diff --git a/Plausible.Stats.Aggregate.html b/Plausible.Stats.Aggregate.html
index 1d73599aa2..5a5f3170db 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 0f91c8fa8a..aac0f478c6 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 00b72e2a48..62db2186b6 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 e5fa7445ac..f39de2e49e 100644
--- a/Plausible.Stats.Clickhouse.html
+++ b/Plausible.Stats.Clickhouse.html
@@ -14,7 +14,7 @@
-
+
@@ -187,6 +187,14 @@ Pages
+
+
+
+
+
last_24h_visitors_hourly_intervals(sites, now \\ NaiveDateTime.utc_now())
@@ -241,7 +249,7 @@ Pages
current_visitors(site, query)
-
+
View Source
@@ -265,7 +273,7 @@ Pages
empty_24h_visitors_hourly_intervals(sites, now \\ NaiveDateTime.utc_now())
-
+
View Source
@@ -294,7 +302,7 @@ Pages
has_pageviews?(site)
-
+
View Source
@@ -327,6 +335,36 @@ Pages
+
+
+
+
+
+
+
+
+
+
+ @spec imported_pageview_counts(Plausible.Site.t()) :: %{
+ required(non_neg_integer()) => non_neg_integer()
+}
+
+
+
+
@@ -340,7 +378,7 @@ Pages
last_24h_visitors_hourly_intervals(sites, now \\ NaiveDateTime.utc_now())
-
+
View Source
@@ -397,7 +435,7 @@ Pages
top_sources_for_spike(site, query, limit, page)
-
+
View Source
@@ -419,7 +457,7 @@ Pages
usage_breakdown(domains, date_range)
-
+
View Source
diff --git a/Plausible.Stats.Compare.html b/Plausible.Stats.Compare.html
index a3ea0f253f..87a9d0058a 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 a4d579873a..5919ab27b4 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 ddd6ac2c58..a8cf1013df 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 1f77b348ce..f4a258ab44 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 2ba9edaaad..3591f95c8e 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 469aa5aaea..7c66418397 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 28b62d6fd5..6055c8caad 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 88eacbf2f3..62e63adae8 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 4a6dca0a3f..703953f3b3 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 6bc4bbc57a..841bdb918a 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 c5e6d0b888..b19523ebb3 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 ce1a63680c..7548c1a291 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 89052eab5a..5170652d4e 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 e62c61282a..c7f1ed6990 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 a1a89c778d..1d69a3b74a 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 208e125693..fd66082957 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 701b692106..11bb3c2b2e 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 2c6e0fe8ec..88f602590b 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 1ae6ffd81d..88defe6928 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 d15f462566..135746c7fa 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 baac0ee77c..ff3b69712d 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 344f1b52d6..792d58c6a1 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index aca76e1702..32d20d7de3 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index 3d1ea618a5..6ef47a8ef3 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index c43e6f77e2..e07de385bb 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 f29c10ab7b..4ebcfdf8da 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 8906cbe663..14ea061d65 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 351e048f9d..4ceb9ec95d 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 7273c4047f..af84d98729 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 058355811f..dfdf806a19 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 39a09b2aad..92d1ed212c 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 f7c028b56e..4d83021184 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 fd18d0ba4b..744b6fa8f4 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 efe6d061b3..7c851b4dcc 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 d7b1b19010..2d8f751db4 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 c2c34ba5b9..bb630d7860 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 45d3ed33fd..beebcb28f7 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 f6df230e7e..97687f463b 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 3289a65526..0cad9350f3 100644
--- a/Plausible.Workers.SpikeNotifier.html
+++ b/Plausible.Workers.SpikeNotifier.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index d1c9821920387b3d593de5385fb84d30fd69e204..a43a04aa9efbda73829f84d4df9756d06b69cd80 100644
GIT binary patch
delta 169285
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"hNk<|Y;M@)g#iUW9oSVxmR6
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