From 141cac52e4c73ad523da8e81c7024d96dcab5507 Mon Sep 17 00:00:00 2001
From: RobertJoonas
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 e30c5a7f1..bee5a0653 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 0ffa5ce31..400b9e4de 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 693d8f63d..bf2900757 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 a136df59c..cb5a4c8b2 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 6edee08ea..c82cb9f16 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 9b5e4ba88..093a2436f 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 fb72a149f..7816e8ed4 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 72bc5fef1..31075d0b4 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 2edbc2dc8..43cf4ce3e 100644
--- a/Plausible.ClickhouseEventV2.html
+++ b/Plausible.ClickhouseEventV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index 91435d66f..684547b7d 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 3778fb3a5..2e7278baa 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 89f2d6538..15d6d59af 100644
--- a/Plausible.ClickhouseSessionV2.html
+++ b/Plausible.ClickhouseSessionV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html
index 435027506..0e1703892 100644
--- a/Plausible.ConfigHelpers.html
+++ b/Plausible.ConfigHelpers.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html
index c126d08b5..0fbb34bcd 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 4b560ba29..8768814f5 100644
--- a/Plausible.DataMigration.NumericIDs.html
+++ b/Plausible.DataMigration.NumericIDs.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.PopulateEventSessionColumns.html b/Plausible.DataMigration.PopulateEventSessionColumns.html
index 5dbf05602..e9266bbc9 100644
--- a/Plausible.DataMigration.PopulateEventSessionColumns.html
+++ b/Plausible.DataMigration.PopulateEventSessionColumns.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index ade93513f..6b2514eda 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -14,7 +14,7 @@
-
+
@@ -1162,23 +1162,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.DataMigration.SiteImports.html b/Plausible.DataMigration.SiteImports.html
index b038f9184..5ba61d5b4 100644
--- a/Plausible.DataMigration.SiteImports.html
+++ b/Plausible.DataMigration.SiteImports.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.VersionedSessions.html b/Plausible.DataMigration.VersionedSessions.html
index da7bfb339..25c014f51 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 883295437..a5e7e0466 100644
--- a/Plausible.DataMigration.html
+++ b/Plausible.DataMigration.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DebugReplayInfo.html b/Plausible.DebugReplayInfo.html
index 20ff89e21..5d82a72f5 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 0998c995e..ca0b6736e 100644
--- a/Plausible.Ecto.EventName.html
+++ b/Plausible.Ecto.EventName.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ecto.Types.CompiledRegex.html b/Plausible.Ecto.Types.CompiledRegex.html
index ba06ca309..887aab27b 100644
--- a/Plausible.Ecto.Types.CompiledRegex.html
+++ b/Plausible.Ecto.Types.CompiledRegex.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Exports.html b/Plausible.Exports.html
index 95b850bfc..70647a3fa 100644
--- a/Plausible.Exports.html
+++ b/Plausible.Exports.html
@@ -14,7 +14,7 @@
-
+
@@ -382,7 +382,7 @@ tables into the format of imported_*
tables for a we
-Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
+Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
"plausible_io_20241231.zip"
@@ -405,10 +405,10 @@ tables into the format of imported_*
tables for a we
-Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
+Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
"attachment; filename=\"plausible_io_20241231.zip\""
-iex> content_disposition("📊.zip")
+iex> content_disposition("📊.zip")
"attachment; filename=\"plausible-export.zip\"; filename*=utf-8''%F0%9F%93%8A.zip"
@@ -725,14 +725,14 @@ tables into the format of imported_*
tables for a we
-Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
+Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
-DBConnection.run(pool, fn conn ->
+DBConnection.run(pool, fn conn ->
conn
- |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
- |> Stream.into(File.stream!("export.zip"))
- |> Stream.run()
-end)
+ |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
+ |> Stream.into(File.stream!("export.zip"))
+ |> Stream.run()
+end)
diff --git a/Plausible.Factory.html b/Plausible.Factory.html
index 733253587..9b4d0b66e 100644
--- a/Plausible.Factory.html
+++ b/Plausible.Factory.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnel.Const.html b/Plausible.Funnel.Const.html
index 199886af0..71f417971 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 4c0d1641a..e90e5ac01 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 cbdd431fa..ff5e5964a 100644
--- a/Plausible.Funnel.html
+++ b/Plausible.Funnel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html
index 160fc8348..756765baf 100644
--- a/Plausible.Funnels.html
+++ b/Plausible.Funnels.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index 7e1e301ef..1f3eb7537 100644
--- a/Plausible.Geo.html
+++ b/Plausible.Geo.html
@@ -14,7 +14,7 @@
-
+
@@ -260,8 +260,8 @@ and MaxMind license key.
Examples
- In the case of a DB-IP database:
iex> database_type()
-"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
+ In the case of a DB-IP database:
iex> database_type()
+"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
"GeoLite2-City"
@@ -302,8 +302,8 @@ asynchronously.
Examples
- Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
-:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
+ Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
+:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
:ok
@@ -332,21 +332,21 @@ asynchronously.
Examples
-iex> lookup("8.7.6.5")
-%{
- "city" => %{
+iex> lookup("8.7.6.5")
+%{
+ "city" => %{
"geoname_id" => 5349755,
- "names" => %{
+ "names" => %{
"de" => "Fontana",
"en" => "Fontana",
"ja" => "フォンタナ",
"ru" => "Фонтана"
- }
- },
- "continent" => %{
+ }
+ },
+ "continent" => %{
"code" => "NA",
"geoname_id" => 6255149,
- "names" => %{
+ "names" => %{
"de" => "Nordamerika",
"en" => "North America",
"es" => "Norteamérica",
@@ -355,12 +355,12 @@ asynchronously."pt-BR" => "América do Norte",
"ru" => "Северная Америка",
"zh-CN" => "北美洲"
- }
- },
- "country" => %{
+ }
+ },
+ "country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -369,20 +369,20 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "location" => %{
+ }
+ },
+ "location" => %{
"accuracy_radius" => 50,
"latitude" => 34.1211,
"longitude" => -117.4362,
"metro_code" => 803,
"time_zone" => "America/Los_Angeles"
- },
- "postal" => %{"code" => "92336"},
- "registered_country" => %{
+ },
+ "postal" => %{"code" => "92336"},
+ "registered_country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -391,13 +391,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -406,10 +406,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.Goal.Revenue.html b/Plausible.Goal.Revenue.html
index 226848c04..977284525 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 49b7a7e0b..cf0d2faa0 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index 7ba86d2e1..800f91982 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 beab2d4b6..b3e41de75 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 9651ae7ea..1421bd246 100644
--- a/Plausible.Google.API.html
+++ b/Plausible.Google.API.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.GA4.API.html b/Plausible.Google.GA4.API.html
index 8c49d471b..07f55fa36 100644
--- a/Plausible.Google.GA4.API.html
+++ b/Plausible.Google.GA4.API.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.GA4.HTTP.html b/Plausible.Google.GA4.HTTP.html
index e20a31533..53f3dbea6 100644
--- a/Plausible.Google.GA4.HTTP.html
+++ b/Plausible.Google.GA4.HTTP.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.GA4.ReportRequest.html b/Plausible.Google.GA4.ReportRequest.html
index 5f06d3678..fb8e330a0 100644
--- a/Plausible.Google.GA4.ReportRequest.html
+++ b/Plausible.Google.GA4.ReportRequest.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.HTTP.html b/Plausible.Google.HTTP.html
index 41af2958b..535ca6b3c 100644
--- a/Plausible.Google.HTTP.html
+++ b/Plausible.Google.HTTP.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.UA.API.html b/Plausible.Google.UA.API.html
index 34f4e8a14..701d9bf1c 100644
--- a/Plausible.Google.UA.API.html
+++ b/Plausible.Google.UA.API.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.UA.HTTP.html b/Plausible.Google.UA.HTTP.html
index 1b2059e5f..e739ace0f 100644
--- a/Plausible.Google.UA.HTTP.html
+++ b/Plausible.Google.UA.HTTP.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.UA.ReportRequest.html b/Plausible.Google.UA.ReportRequest.html
index 05d0f17c1..8ce25214a 100644
--- a/Plausible.Google.UA.ReportRequest.html
+++ b/Plausible.Google.UA.ReportRequest.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HTTPClient.Interface.html b/Plausible.HTTPClient.Interface.html
index 35f5b9dcb..aff4191dc 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 4590717ed..04c7d86d2 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 20163d9c0..527fc62c8 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 8cd9efb9b..0a8f5d282 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 b0ba7ca7b..d07b11316 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -1153,23 +1153,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 a8e51d8fb..27d82ce34 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 465d39460..f2f56726f 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -14,7 +14,7 @@
-
+
@@ -257,13 +257,13 @@ or from local storage for which it uses iex> date_range([
-...> %{"filename" => "imported_devices_20190101_20210101.csv"},
+Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
+...> %{"filename" => "imported_devices_20190101_20210101.csv"},
...> "pages_20200101_20220101.csv"
-...> ])
-Date.range(~D[2019-01-01], ~D[2022-01-01])
+...> ])
+Date.range(~D[2019-01-01], ~D[2022-01-01])
-iex> date_range([])
+iex> date_range([])
nil
@@ -292,13 +292,13 @@ or from local storage for which it uses iex> extract_table("my_data.csv")
+Extracts the table name from the provided filename.
Raises if the filename doesn't conform to the expected format.
Examples:
iex> extract_table("my_data.csv")
** (ArgumentError) invalid filename
-iex> extract_table("imported_devices_00010101_20250101.csv")
+iex> extract_table("imported_devices_00010101_20250101.csv")
"imported_devices"
-iex> extract_table("devices_00010101_20250101.csv")
+iex> extract_table("devices_00010101_20250101.csv")
"imported_devices"
@@ -321,8 +321,8 @@ or from local storage for which it uses
-Returns local directory for CSV imports storage.
Builds upon $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
Examples:
iex> local_dir = local_dir(_site_id = 37)
-iex> String.ends_with?(local_dir, "/plausible-imports/37")
+Returns local directory for CSV imports storage.
Builds upon $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
Examples:
iex> local_dir = local_dir(_site_id = 37)
+iex> String.ends_with?(local_dir, "/plausible-imports/37")
true
@@ -382,14 +382,14 @@ or from local storage for which it uses iex> parse_filename!("my_data.csv")
+Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
** (ArgumentError) invalid filename
-iex> parse_filename!("imported_devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("imported_devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
-iex> parse_filename!("devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
@@ -417,13 +417,13 @@ or from local storage for which it uses iex> valid_filename?("my_data.csv")
+Checks if the provided filename conforms to the expected format.
Examples:
iex> valid_filename?("my_data.csv")
false
-iex> valid_filename?("imported_devices_00010101_20250101.csv")
+iex> valid_filename?("imported_devices_00010101_20250101.csv")
true
-iex> valid_filename?("devices_00010101_20250101.csv")
+iex> valid_filename?("devices_00010101_20250101.csv")
true
diff --git a/Plausible.Imported.GoogleAnalytics4.html b/Plausible.Imported.GoogleAnalytics4.html
index c64bf724f..f1d5bdf39 100644
--- a/Plausible.Imported.GoogleAnalytics4.html
+++ b/Plausible.Imported.GoogleAnalytics4.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.ImportSources.html b/Plausible.Imported.ImportSources.html
index 42f122774..02086aef2 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 fc789b253..5f29cfcd9 100644
--- a/Plausible.Imported.Importer.html
+++ b/Plausible.Imported.Importer.html
@@ -14,7 +14,7 @@
-
+
@@ -183,30 +183,30 @@ scope of importer logic and is expected to be implemented separately.
In case it's necessary to run the whole import job fully synchronously, the
Plausible.Workers.ImportAnalytics
worker sends an Oban.Notifier
message
-on completion, failure or transient failure of the import.
A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
+on completion, failure or transient failure of the import.A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
site,
user,
start_date: ~D[2005-01-01],
- end_date: Date.utc_today(),
+ end_date: Date.utc_today(),
# this option is necessary to setup the calling process as listener
listen?: true
-)
+)
-import_id = job.args[:import_id]
+import_id = job.args[:import_id]
-receive do
- {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
- IO.puts("Job completed")
+receive do
+ {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
+ IO.puts("Job completed")
- {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed transiently")
+ {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed transiently")
- {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed permanently")
-after
+ {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed permanently")
+after
15_000 ->
- IO.puts("Job didn't finish in 15 seconds")
-end
In a more realistic scenario, job scheduling will be done inside a GenServer process
+
IO.puts("Job didn't finish in 15 seconds")
+end
In a more realistic scenario, job scheduling will be done inside a GenServer process
like LiveView, where notifications can be listened for via handle_info/2
.
diff --git a/Plausible.Imported.NoopImporter.html b/Plausible.Imported.NoopImporter.html
index 19fbaf6a6..54f78a724 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 a23eda485..622f6f909 100644
--- a/Plausible.Imported.SiteImport.html
+++ b/Plausible.Imported.SiteImport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.UniversalAnalytics.html b/Plausible.Imported.UniversalAnalytics.html
index e3e207ab3..b1289b583 100644
--- a/Plausible.Imported.UniversalAnalytics.html
+++ b/Plausible.Imported.UniversalAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.html b/Plausible.Imported.html
index e133403e1..77ec14a9e 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 3231dc498..bfa46ed8f 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -1153,23 +1153,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 24dfbef5a..f6a0499a9 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 4b1ce3c70..cfd8f455d 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 65293f933..566553591 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 0e8e1810a..a38f8252e 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 6c28d583f..0ebc14802 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 231405107..e2d9a88c8 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 6fec8fd2d..018dfa284 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 b225f430b..f4dbef2fc 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 f714f6731..b6d44529a 100644
--- a/Plausible.License.html
+++ b/Plausible.License.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html
index c8d042a0a..8f6f7385a 100644
--- a/Plausible.Mailer.html
+++ b/Plausible.Mailer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.MigrationUtils.html b/Plausible.MigrationUtils.html
index 15c2164d9..b69addca8 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 bada6f413..418954215 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 67a46391d..6203a785c 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 825b19498..7d71bc73f 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 2dee84ecd..d0a54da0f 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 a06868387..f0ee2ffca 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 964423867..430eaec4e 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 f09b3f710..8a574b0ea 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 e7b43baf8..90d8e2eec 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 45c2706c5..856c8154b 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 8b5b28401..d3b49b027 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 d77e7afe5..239fccc8b 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index 02fa3ca44..e041a7a9d 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index cfcae12ec..fee08a50a 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html
index 0b7642c02..507f07986 100644
--- a/Plausible.RateLimit.html
+++ b/Plausible.RateLimit.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index 57ab0138d..60af50710 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index 1c52e38f4..00b09106b 100644
--- a/Plausible.Repo.html
+++ b/Plausible.Repo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RequestLogger.html b/Plausible.RequestLogger.html
index fa8811318..d63098e2c 100644
--- a/Plausible.RequestLogger.html
+++ b/Plausible.RequestLogger.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.S3.html b/Plausible.S3.html
index e88b39cf8..6720832b3 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -14,7 +14,7 @@
-
+
@@ -316,7 +316,7 @@ The URL expires in 24 hours.
In the current implementation the bucket alwa
Returns the pre-configured S3 bucket for CSV exports.
config :plausible, Plausible.S3,
- exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
+ exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
"test-exports"
@@ -348,8 +348,8 @@ The URL expires in 24 hours.In the current implementation the bucket alwa
-
Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
-%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
+Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
+%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
@@ -371,9 +371,9 @@ The URL expires in 24 hours.In the current implementation the bucket alwa
-Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
-iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
-iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
+Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
+iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
+iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
@@ -402,7 +402,7 @@ The URL expires in 24 hours.In the current implementation the bucket alwa
Returns the pre-configured S3 bucket for CSV imports.
config :plausible, Plausible.S3,
- imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
+ imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
"test-imports"
diff --git a/Plausible.Sentry.Client.html b/Plausible.Sentry.Client.html
index 8a3203514..4291ec48a 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 892f80301..4a9da5df8 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 1a0861887..c3669bdd3 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 8af8a704f..d67436982 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 680de08c5..2b1ec98b0 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 53660b710..22fd42735 100644
--- a/Plausible.Shield.CountryRuleCache.html
+++ b/Plausible.Shield.CountryRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.HostnameRule.html b/Plausible.Shield.HostnameRule.html
index 6a2bda16d..daf0da14b 100644
--- a/Plausible.Shield.HostnameRule.html
+++ b/Plausible.Shield.HostnameRule.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.HostnameRuleCache.html b/Plausible.Shield.HostnameRuleCache.html
index 6b3d25e36..947b79830 100644
--- a/Plausible.Shield.HostnameRuleCache.html
+++ b/Plausible.Shield.HostnameRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.IPRule.html b/Plausible.Shield.IPRule.html
index 212ca7915..366f4233e 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 46333f5d9..97eb836b0 100644
--- a/Plausible.Shield.IPRuleCache.html
+++ b/Plausible.Shield.IPRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.PageRule.html b/Plausible.Shield.PageRule.html
index 0cbbcdf20..0aab16fb4 100644
--- a/Plausible.Shield.PageRule.html
+++ b/Plausible.Shield.PageRule.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.PageRuleCache.html b/Plausible.Shield.PageRuleCache.html
index 5d1d4b8fa..49d3ed159 100644
--- a/Plausible.Shield.PageRuleCache.html
+++ b/Plausible.Shield.PageRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shields.html b/Plausible.Shields.html
index 5b0503256..3cf3e834d 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 9f9ee9dbe..5b3dd7853 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 09288d78c..96efc4fcb 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 d52abfb9d..7b0203cc7 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 c6e26da85..b5f3b38b4 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 ec3a77291..8bd9db6af 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 507959361..de4ed4fe0 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 c9e8d54cd..147bae7e4 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 8e79f4fb9..cbb638533 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 88a23e868..927519ba5 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 b1979eb88..ac66ae37c 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 170daa2f9..043ad7f4b 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 21f0168cf..db5942ead 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 092db65ee..583eff137 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 50b7454ef..3c62193b4 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 46ee17fba..35c862bdb 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 0d3fe0ed4..bd9bd9126 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 ff764e7fc..0ac578327 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 9153182c6..ea046e704 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index e604bc613..ce3d1ae03 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index fc7e1aec8..028c0875c 100644
--- a/Plausible.Sites.html
+++ b/Plausible.Sites.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Aggregate.html b/Plausible.Stats.Aggregate.html
index 83dfaf2e3..912dc8294 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 0c6468c95..7f7f63286 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 ee3c7d876..7c5b24703 100644
--- a/Plausible.Stats.Breakdown.html
+++ b/Plausible.Stats.Breakdown.html
@@ -14,7 +14,7 @@
-
+
@@ -157,7 +157,7 @@ Pages
- breakdown(site, query, property, metrics, pagination, opts \\ [])
+ breakdown(site, query, metrics, pagination, opts \\ [])
@@ -176,18 +176,18 @@ Pages
Functions
-
+
-
+
-
+
Link to this function
- breakdown(site, query, property, metrics, pagination, opts \\ [])
+ breakdown(site, query, metrics, pagination, opts \\ [])
-
+
View Source
diff --git a/Plausible.Stats.Clickhouse.html b/Plausible.Stats.Clickhouse.html
index c65685143..349790d87 100644
--- a/Plausible.Stats.Clickhouse.html
+++ b/Plausible.Stats.Clickhouse.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Compare.html b/Plausible.Stats.Compare.html
index 449b59a4a..e408edf3a 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 a72891040..1a281c574 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 ae966ea2d..dbe321821 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 811398fa9..53b205e15 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 87a2a71c0..73a94445e 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 50f7802fd..d2c2293f8 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 3bce2d043..3c387b067 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 b2ac6e5b8..04e8ea059 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -14,7 +14,7 @@
-
+
@@ -283,14 +283,14 @@ Pages
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-%{"event:page" => {:matches, "/blog/**"}}
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+%{"event:page" => {:matches, "/blog/**"}}
-iex> Filters.parse("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> Filters.parse("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
-iex> Filters.parse(nil)
-%{}
+iex> Filters.parse(nil)
+%{}
diff --git a/Plausible.Stats.Fragments.html b/Plausible.Stats.Fragments.html
index 4f9944175..01958bd51 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 99ddd151b..00a490806 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 fa304d7bd..0682f6418 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 dd78327aa..f3a3645d3 100644
--- a/Plausible.Stats.Imported.html
+++ b/Plausible.Stats.Imported.html
@@ -14,7 +14,7 @@
-
+
@@ -157,7 +157,7 @@ Pages
@@ -192,14 +192,14 @@ Pages
Functions
-
+
-
+
Link to this function
- merge_imported(q, site, query, property, metrics)
+ merge_imported(q, site, query, metrics)
diff --git a/Plausible.Stats.Interval.html b/Plausible.Stats.Interval.html
index ec76fffe0..6379a2f95 100644
--- a/Plausible.Stats.Interval.html
+++ b/Plausible.Stats.Interval.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Metrics.html b/Plausible.Stats.Metrics.html
index 7571d6bac..4706d8f64 100644
--- a/Plausible.Stats.Metrics.html
+++ b/Plausible.Stats.Metrics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Props.html b/Plausible.Stats.Props.html
index 12b43dca9..0e4d747da 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 3014c790d..671f380f9 100644
--- a/Plausible.Stats.Query.html
+++ b/Plausible.Stats.Query.html
@@ -14,7 +14,7 @@
-
+
@@ -255,7 +255,7 @@ Pages
t()
-
+
View Source
@@ -277,6 +277,7 @@ Pages
interval: term(),
now: term(),
period: term(),
+ property: term(),
sample_threshold: term()
}
@@ -306,7 +307,7 @@ Pages
from(site, params)
-
+
View Source
@@ -328,7 +329,7 @@ Pages
get_all_filters_by_prefix(query, prefix)
-
+
View Source
@@ -350,7 +351,7 @@ Pages
get_filter_by_prefix(query, prefix)
-
+
View Source
@@ -372,7 +373,7 @@ Pages
has_event_filters?(query)
-
+
View Source
@@ -394,7 +395,7 @@ Pages
include_imported?(query, site, requested?)
-
+
View Source
@@ -422,7 +423,7 @@ Pages
put_filter(query, key, val)
-
+
View Source
@@ -444,7 +445,7 @@ Pages
remove_event_filters(query, opts)
-
+
View Source
@@ -466,7 +467,7 @@ Pages
trace(query, metrics)
-
+
View Source
@@ -489,6 +490,7 @@ Pages
interval: term(),
now: term(),
period: term(),
+ property: term(),
sample_threshold: term()
},
[atom()]
@@ -502,6 +504,7 @@ Pages
interval: term(),
now: term(),
period: term(),
+ property: term(),
sample_threshold: term()
}
diff --git a/Plausible.Stats.Sampling.html b/Plausible.Stats.Sampling.html
index 6a5f4824e..c05d4c1f8 100644
--- a/Plausible.Stats.Sampling.html
+++ b/Plausible.Stats.Sampling.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.TableDecider.html b/Plausible.Stats.TableDecider.html
index 17ca65ed0..b58bad06d 100644
--- a/Plausible.Stats.TableDecider.html
+++ b/Plausible.Stats.TableDecider.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Timeseries.html b/Plausible.Stats.Timeseries.html
index 907641f57..76084ab31 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 212956011..60d7e98a7 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 16e096a19..8c7cc3520 100644
--- a/Plausible.Stats.html
+++ b/Plausible.Stats.html
@@ -14,7 +14,7 @@
-
+
@@ -165,7 +165,7 @@ Pages
@@ -238,14 +238,14 @@ Pages
-
+
-
+
Link to this function
- breakdown(site, query, prop, metrics, pagination)
+ breakdown(site, query, metrics, pagination)
diff --git a/Plausible.Test.Support.HTML.html b/Plausible.Test.Support.HTML.html
index 582a8d2cb..13cebfe23 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 43b71a5a0..332b6761e 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 2c8da3858..7f771b06d 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index 26818d85c..8cc575616 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index f99c41746..8ffee748e 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index 8a4f787bf..691d4fda1 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 2b86503ef..b30054bd0 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 e94c4357d..3194db2b7 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 f89c3e833..61fb8b6e0 100644
--- a/Plausible.Workers.CleanInvitations.html
+++ b/Plausible.Workers.CleanInvitations.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ClickhouseCleanSites.html b/Plausible.Workers.ClickhouseCleanSites.html
index 296831a6c..19176b49c 100644
--- a/Plausible.Workers.ClickhouseCleanSites.html
+++ b/Plausible.Workers.ClickhouseCleanSites.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ExpireDomainChangeTransitions.html b/Plausible.Workers.ExpireDomainChangeTransitions.html
index 3f296986c..27fb426d7 100644
--- a/Plausible.Workers.ExpireDomainChangeTransitions.html
+++ b/Plausible.Workers.ExpireDomainChangeTransitions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ExportAnalytics.html b/Plausible.Workers.ExportAnalytics.html
index 9e3e61882..95856145f 100644
--- a/Plausible.Workers.ExportAnalytics.html
+++ b/Plausible.Workers.ExportAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ImportAnalytics.html b/Plausible.Workers.ImportAnalytics.html
index 602d314ab..07654c9d9 100644
--- a/Plausible.Workers.ImportAnalytics.html
+++ b/Plausible.Workers.ImportAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.LocalImportAnalyticsCleaner.html b/Plausible.Workers.LocalImportAnalyticsCleaner.html
index 0f65f96bf..4a151cfdf 100644
--- a/Plausible.Workers.LocalImportAnalyticsCleaner.html
+++ b/Plausible.Workers.LocalImportAnalyticsCleaner.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.LockSites.html b/Plausible.Workers.LockSites.html
index 3365c8560..1316e65d3 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 e2b314148..69464d9d7 100644
--- a/Plausible.Workers.NotifyAnnualRenewal.html
+++ b/Plausible.Workers.NotifyAnnualRenewal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.NotifyExportedAnalytics.html b/Plausible.Workers.NotifyExportedAnalytics.html
index 2f1ae5f90..a9c883091 100644
--- a/Plausible.Workers.NotifyExportedAnalytics.html
+++ b/Plausible.Workers.NotifyExportedAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.RotateSalts.html b/Plausible.Workers.RotateSalts.html
index bc6ef07ce..f24ab7430 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 e574c2c0b..64bfb2cc9 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 1e31e739c..070639778 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 d17acd8b0..6a434b9e3 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 4f35fa76b..6a84aa4e2 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 6de2646a5..55c7e6e77 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 5a20cff62..5aa564205 100644
--- a/Plausible.Workers.SpikeNotifier.html
+++ b/Plausible.Workers.SpikeNotifier.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index d998b4fe7f7571a54b0caa2dda7cca4a46d79539..9c63ddd6b5a4e76c4fd610e5b2384818e1e791da 100644
GIT binary patch
delta 147296
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