plausible_api 0.3 → 0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +25 -14
- data/lib/plausible_api/api_base.rb +41 -0
- data/lib/plausible_api/client.rb +15 -8
- data/lib/plausible_api/configuration.rb +10 -1
- data/lib/plausible_api/event/base.rb +2 -16
- data/lib/plausible_api/event/post.rb +3 -17
- data/lib/plausible_api/stats/aggregate.rb +4 -9
- data/lib/plausible_api/stats/base.rb +39 -60
- data/lib/plausible_api/stats/breakdown.rb +2 -7
- data/lib/plausible_api/stats/realtime/visitors.rb +3 -3
- data/lib/plausible_api/stats/timeseries.rb +2 -7
- data/lib/plausible_api/utils.rb +16 -0
- data/lib/plausible_api/version.rb +1 -1
- data/lib/plausible_api.rb +0 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee32c7197a3fd13ad0d1f4b4e0cb5571f9c98bd010ecf17e25943900c11f4616
|
4
|
+
data.tar.gz: 4f04483bf2726ad0ef5150d0660428f2475858b96ee2963cbc0bb48170a2b883
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00f08349d212a36a721fff764dc6866268deaf6e088293f0f7700e9b02deeb0fa0babf319630c237eee5b422b4661618a3f7683c97fc32d733e5d3c5c208d48d
|
7
|
+
data.tar.gz: d6698061cf63da01aafd53ab0c9442991da22fc4550b424d57c19b1eef3669b6134b1b7fc74f103423f699428eba79d788af45715e8f577720716581cb5b33c5
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -7,15 +7,38 @@ Add this gem to your Gemfile:
|
|
7
7
|
```rb
|
8
8
|
gem 'plausible_api'
|
9
9
|
```
|
10
|
-
Then you need to initialize a Client with your `site_id` (the domain) and your `
|
10
|
+
Then you need to initialize a Client with your `site_id` (the domain) and your `api_key`.
|
11
|
+
Optionally, you can pass a third parameter in case you are using a self-hosted instance of Plausible (You don't need to add this third parameter if your are using the comercial version of Plausible).
|
11
12
|
```rb
|
12
|
-
|
13
|
+
# Using the comercial version:
|
14
|
+
c = PlausibleApi::Client.new("mysite.com", "MYAPIKEY")
|
15
|
+
|
16
|
+
# Using a self hosted instance
|
17
|
+
c = PlausibleApi::Client.new("mysite.com", "MYAPIKEY", "https://my-hosted-plausible.com")
|
13
18
|
|
14
19
|
# Test if the site and token are valid
|
15
20
|
c.valid?
|
16
21
|
=> true
|
17
22
|
```
|
18
23
|
|
24
|
+
If you will always work with the same site, you can set some (or all) of these 3 parameters
|
25
|
+
before initializing the client. On a Ruby on Rails app, you can add this to an initializer like
|
26
|
+
`config/initializers/plausible.rb`
|
27
|
+
|
28
|
+
```rb
|
29
|
+
# Do not include a trailing slash
|
30
|
+
PlausibleApi.configure do |config|
|
31
|
+
config.base_url = "https://your-plausible-instance.com"
|
32
|
+
config.site_id = "dailytics.com"
|
33
|
+
config.api_key = "123123"
|
34
|
+
end
|
35
|
+
```
|
36
|
+
|
37
|
+
And then, initializing the client simply like this:
|
38
|
+
```rb
|
39
|
+
c = PlausibleApi::Client.new
|
40
|
+
```
|
41
|
+
|
19
42
|
### Stats > Aggregate
|
20
43
|
|
21
44
|
You have all these options to get the aggregate stats
|
@@ -87,18 +110,6 @@ c.event({
|
|
87
110
|
})
|
88
111
|
```
|
89
112
|
|
90
|
-
|
91
|
-
### Self-hosted Plausible instances
|
92
|
-
|
93
|
-
If you are using a self-hosted Plausible instance, you can set the `base_url` before initializing the client. On a Ruby on Rails app, you can add this to an initializer like `config/initializers/plausible.rb`
|
94
|
-
|
95
|
-
```rb
|
96
|
-
# Do not include a trailing slash
|
97
|
-
PlausibleApi.configure do |config|
|
98
|
-
config.base_url = "https://your-plausible-instance.com"
|
99
|
-
end
|
100
|
-
```
|
101
|
-
|
102
113
|
## Development
|
103
114
|
|
104
115
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module PlausibleApi
|
2
|
+
class ApiBase < Utils
|
3
|
+
def request_class
|
4
|
+
# Net::HTTP::Post
|
5
|
+
raise NotImplementedError
|
6
|
+
end
|
7
|
+
|
8
|
+
def request_path
|
9
|
+
# "/api/event"
|
10
|
+
raise NotImplementedError
|
11
|
+
end
|
12
|
+
|
13
|
+
def request_auth?
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
def request_body
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def request_body?
|
22
|
+
present?(request_body)
|
23
|
+
end
|
24
|
+
|
25
|
+
def request_headers
|
26
|
+
{"content-type" => "application/json"}
|
27
|
+
end
|
28
|
+
|
29
|
+
def parse_response(body)
|
30
|
+
raise NotImplementedError
|
31
|
+
end
|
32
|
+
|
33
|
+
def errors
|
34
|
+
raise NotImplementedError
|
35
|
+
end
|
36
|
+
|
37
|
+
def valid?
|
38
|
+
errors.empty?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/plausible_api/client.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "plausible_api/utils"
|
4
|
+
require "plausible_api/api_base"
|
3
5
|
require "plausible_api/stats/base"
|
4
6
|
require "plausible_api/stats/realtime/visitors"
|
5
7
|
require "plausible_api/stats/aggregate"
|
@@ -14,10 +16,15 @@ require "uri"
|
|
14
16
|
require "cgi"
|
15
17
|
|
16
18
|
module PlausibleApi
|
17
|
-
class Client
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
class Client < Utils
|
20
|
+
|
21
|
+
attr_accessor :configuration
|
22
|
+
|
23
|
+
def initialize(site_id = nil, api_key = nil, base_url = nil)
|
24
|
+
@configuration = Configuration.new
|
25
|
+
@configuration.api_key = presence(api_key) || PlausibleApi.configuration.api_key
|
26
|
+
@configuration.site_id = presence(site_id) || PlausibleApi.configuration.site_id
|
27
|
+
@configuration.base_url = presence(base_url) || PlausibleApi.configuration.base_url
|
21
28
|
end
|
22
29
|
|
23
30
|
def aggregate(options = {})
|
@@ -53,14 +60,14 @@ module PlausibleApi
|
|
53
60
|
|
54
61
|
def call(api)
|
55
62
|
raise Error, api.errors unless api.valid?
|
56
|
-
raise ConfigurationError,
|
63
|
+
raise ConfigurationError, configuration.errors unless configuration.valid?
|
57
64
|
|
58
|
-
url = "#{
|
65
|
+
url = "#{configuration.base_url}#{api.request_path.gsub("$SITE_ID", configuration.site_id)}"
|
59
66
|
uri = URI.parse(url)
|
60
67
|
|
61
68
|
req = api.request_class.new(uri.request_uri)
|
62
69
|
req.initialize_http_header(api.request_headers)
|
63
|
-
req.add_field("authorization", "Bearer #{
|
70
|
+
req.add_field("authorization", "Bearer #{configuration.api_key}") if api.request_auth?
|
64
71
|
req.body = api.request_body if api.request_body?
|
65
72
|
|
66
73
|
http = Net::HTTP.new(uri.host, uri.port)
|
@@ -71,7 +78,7 @@ module PlausibleApi
|
|
71
78
|
if SUCCESS_CODES.include?(response.code)
|
72
79
|
api.parse_response response.body
|
73
80
|
else
|
74
|
-
raise
|
81
|
+
raise Error.new response
|
75
82
|
end
|
76
83
|
end
|
77
84
|
end
|
@@ -1,10 +1,13 @@
|
|
1
1
|
module PlausibleApi
|
2
2
|
class Configuration
|
3
|
-
attr_accessor :base_url
|
3
|
+
attr_accessor :base_url, :default_user_agent, :api_key, :site_id
|
4
4
|
|
5
5
|
# Setting up default values
|
6
6
|
def initialize
|
7
7
|
@base_url = "https://plausible.io"
|
8
|
+
@default_user_agent = "plausible_api_ruby/#{PlausibleApi::VERSION}"
|
9
|
+
@api_key = nil
|
10
|
+
@site_id = nil
|
8
11
|
end
|
9
12
|
|
10
13
|
def valid?
|
@@ -20,6 +23,12 @@ module PlausibleApi
|
|
20
23
|
elsif base_url.end_with?("/")
|
21
24
|
errors.push(base_url: "base_url should not end with a trailing slash")
|
22
25
|
end
|
26
|
+
if api_key.nil? || api_key.empty?
|
27
|
+
errors.push(api_key: "api_key is required")
|
28
|
+
end
|
29
|
+
if site_id.nil? || site_id.empty?
|
30
|
+
errors.push(site_id: "site_id is required")
|
31
|
+
end
|
23
32
|
errors
|
24
33
|
end
|
25
34
|
end
|
@@ -1,31 +1,17 @@
|
|
1
1
|
module PlausibleApi
|
2
2
|
module Event
|
3
|
-
class Base
|
4
|
-
DEFAULT_USER_AGENT = "plausible_api_ruby/#{PlausibleApi::VERSION}"
|
5
|
-
|
3
|
+
class Base < ApiBase
|
6
4
|
def request_class
|
7
5
|
Net::HTTP::Post
|
8
6
|
end
|
9
7
|
|
10
|
-
def
|
8
|
+
def request_path
|
11
9
|
"/api/event"
|
12
10
|
end
|
13
11
|
|
14
|
-
def request_url
|
15
|
-
request_url_base
|
16
|
-
end
|
17
|
-
|
18
12
|
def request_auth?
|
19
13
|
false
|
20
14
|
end
|
21
|
-
|
22
|
-
def request_body?
|
23
|
-
true
|
24
|
-
end
|
25
|
-
|
26
|
-
def valid?
|
27
|
-
errors.empty?
|
28
|
-
end
|
29
15
|
end
|
30
16
|
end
|
31
17
|
end
|
@@ -3,7 +3,6 @@
|
|
3
3
|
module PlausibleApi
|
4
4
|
module Event
|
5
5
|
class Post < Base
|
6
|
-
DEFAULT_USER_AGENT = "plausible_api_ruby/#{PlausibleApi::VERSION}"
|
7
6
|
VALID_REVENUE_KEYS = %i[amount currency].freeze
|
8
7
|
OPTIONS_IN_HEADERS = %i[ip user_agent].freeze
|
9
8
|
|
@@ -16,7 +15,7 @@ module PlausibleApi
|
|
16
15
|
|
17
16
|
@domain = @options[:domain]
|
18
17
|
@ip = @options[:ip]
|
19
|
-
@user_agent = presence(@options[:user_agent]) ||
|
18
|
+
@user_agent = presence(@options[:user_agent]) || PlausibleApi.configuration.default_user_agent
|
20
19
|
@name = presence(@options[:name]) || "pageview"
|
21
20
|
@url = presence(@options[:url]) || "app://localhost/#{@name}"
|
22
21
|
@referrer = @options[:referrer]
|
@@ -60,10 +59,10 @@ module PlausibleApi
|
|
60
59
|
|
61
60
|
if present?(@revenue)
|
62
61
|
if @revenue.is_a?(Hash)
|
63
|
-
unless
|
62
|
+
unless @revenue.keys.map(&:to_sym).all? { |key| VALID_REVENUE_KEYS.include?(key) }
|
64
63
|
errors.push(
|
65
64
|
revenue: "revenue must have keys #{VALID_REVENUE_KEYS.join(", ")} " \
|
66
|
-
|
65
|
+
"but was #{@revenue.inspect}"
|
67
66
|
)
|
68
67
|
end
|
69
68
|
else
|
@@ -83,19 +82,6 @@ module PlausibleApi
|
|
83
82
|
def valid_revenue_keys?(revenue)
|
84
83
|
revenue.keys.sort.map(&:to_sym) == VALID_REVENUE_KEYS.sort
|
85
84
|
end
|
86
|
-
|
87
|
-
def present?(value)
|
88
|
-
!value.nil? && !value.empty?
|
89
|
-
end
|
90
|
-
|
91
|
-
def blank?(value)
|
92
|
-
!present?(value)
|
93
|
-
end
|
94
|
-
|
95
|
-
def presence(value)
|
96
|
-
return nil if blank?(value)
|
97
|
-
value
|
98
|
-
end
|
99
85
|
end
|
100
86
|
end
|
101
87
|
end
|
@@ -3,20 +3,15 @@
|
|
3
3
|
module PlausibleApi
|
4
4
|
module Stats
|
5
5
|
class Aggregate < Base
|
6
|
-
|
7
6
|
def initialize(options = {})
|
8
|
-
super({
|
9
|
-
|
10
|
-
|
7
|
+
super({period: "30d",
|
8
|
+
metrics: "visitors,visits,pageviews,views_per_visit,bounce_rate,visit_duration,events"}
|
9
|
+
.merge(options))
|
11
10
|
end
|
12
11
|
|
13
|
-
def
|
12
|
+
def request_path_base
|
14
13
|
"/api/v1/stats/aggregate?site_id=$SITE_ID"
|
15
14
|
end
|
16
|
-
|
17
|
-
def parse_response(body)
|
18
|
-
JSON.parse(body)['results']
|
19
|
-
end
|
20
15
|
end
|
21
16
|
end
|
22
17
|
end
|
@@ -2,100 +2,79 @@
|
|
2
2
|
|
3
3
|
module PlausibleApi
|
4
4
|
module Stats
|
5
|
-
class Base
|
5
|
+
class Base < ApiBase
|
6
|
+
ALLOWED_PERIODS = %w[12mo 6mo month 30d 7d day custom]
|
7
|
+
ALLOWED_METRICS = %w[visitors visits pageviews views_per_visit bounce_rate visit_duration events]
|
8
|
+
ALLOWED_COMPARE = %w[previous_period]
|
9
|
+
ALLOWED_INTERVALS = %w[date month]
|
10
|
+
ALLOWED_PROPERTIES = %w[event:goal event:page visit:entry_page visit:exit_page visit:source
|
11
|
+
visit:referrer visit:utm_medium visit:utm_source visit:utm_campaign
|
12
|
+
visit:utm_content visit:utm_term visit:device visit:browser
|
13
|
+
visit:browser_version visit:os visit:os_version visit:country visit:region visit:city
|
14
|
+
event:props:.+]
|
15
|
+
ALLOWED_FILTER_OPERATORS = %w[== != \|]
|
6
16
|
|
7
17
|
def initialize(options = {})
|
8
|
-
@options = {
|
9
|
-
|
10
|
-
|
11
|
-
@options[:period] =
|
12
|
-
end
|
13
|
-
|
14
|
-
def request_url_base
|
15
|
-
raise NotImplementedError
|
18
|
+
@options = {compare: nil, date: nil, filters: nil, interval: nil,
|
19
|
+
limit: nil, metrics: nil, page: nil, period: nil,
|
20
|
+
property: nil}.merge(options)
|
21
|
+
@options[:period] = "custom" if @options[:date]
|
16
22
|
end
|
17
23
|
|
18
24
|
def request_class
|
19
25
|
Net::HTTP::Get
|
20
26
|
end
|
21
27
|
|
22
|
-
def
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
def request_body
|
27
|
-
nil
|
28
|
-
end
|
29
|
-
|
30
|
-
def request_url
|
31
|
-
params = @options.select{ |_,v| !v.to_s.empty? }
|
32
|
-
[request_url_base, URI.encode_www_form(params)].reject{|e| e.empty?}.join('&')
|
33
|
-
end
|
34
|
-
|
35
|
-
def request_headers
|
36
|
-
{}
|
37
|
-
end
|
38
|
-
|
39
|
-
def request_auth?
|
40
|
-
true
|
28
|
+
def request_path
|
29
|
+
params = @options.select { |_, v| !v.to_s.empty? }
|
30
|
+
[request_path_base, URI.encode_www_form(params)].reject { |e| e.empty? }.join("&")
|
41
31
|
end
|
42
32
|
|
43
33
|
def parse_response(body)
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
def valid?
|
48
|
-
errors.empty?
|
34
|
+
JSON.parse(body)["results"]
|
49
35
|
end
|
50
36
|
|
51
37
|
def errors
|
52
|
-
|
53
|
-
allowed_metrics = %w(visitors visits pageviews views_per_visit bounce_rate visit_duration events)
|
54
|
-
allowed_compare = %w(previous_period)
|
55
|
-
allowed_interval = %w(date month)
|
56
|
-
allowed_property = %w(event:page visit:entry_page visit:exit_page visit:source visit:referrer
|
57
|
-
visit:utm_medium visit:utm_source visit:utm_campaign visit:device visit:browser
|
58
|
-
visit:browser_version visit:os visit:os_version visit:country)
|
59
|
-
e = 'Not a valid parameter. Allowed parameters are: '
|
38
|
+
e = "Not a valid parameter. Allowed parameters are: "
|
60
39
|
|
61
40
|
errors = []
|
62
41
|
if @options[:period]
|
63
|
-
errors.push({
|
42
|
+
errors.push({period: "#{e}#{ALLOWED_PERIODS.join(", ")}"}) unless ALLOWED_PERIODS.include? @options[:period]
|
64
43
|
end
|
65
44
|
if @options[:metrics]
|
66
|
-
metrics_array = @options[:metrics].split(
|
67
|
-
errors.push({
|
45
|
+
metrics_array = @options[:metrics].split(",")
|
46
|
+
errors.push({metrics: "#{e}#{ALLOWED_METRICS.join(", ")}"}) unless metrics_array & ALLOWED_METRICS == metrics_array
|
68
47
|
end
|
69
48
|
if @options[:compare]
|
70
|
-
errors.push({
|
49
|
+
errors.push({compare: "#{e}#{ALLOWED_COMPARE.join(", ")}"}) unless ALLOWED_COMPARE.include? @options[:compare]
|
71
50
|
end
|
72
51
|
if @options[:interval]
|
73
|
-
errors.push({
|
52
|
+
errors.push({interval: "#{e}#{ALLOWED_INTERVALS.join(", ")}"}) unless ALLOWED_INTERVALS.include? @options[:interval]
|
74
53
|
end
|
75
54
|
if @options[:property]
|
76
|
-
|
55
|
+
unless @options[:property].match?(/^(#{ALLOWED_PROPERTIES.join('|')})$/)
|
56
|
+
errors.push({property: "#{e}#{ALLOWED_PROPERTIES.join(", ")}"}) unless ALLOWED_PROPERTIES.include? @options[:property]
|
57
|
+
end
|
77
58
|
end
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
parts = f.split("==")
|
82
|
-
errors.push({ filters: "Unrecognized filter: #{f}" }) unless parts.length == 2
|
83
|
-
errors.push({ filters: "Unknown metric for filter: #{parts[0]}" }) unless allowed_property.include? parts[0]
|
59
|
+
@options[:filters]&.split(";")&.each do |filter|
|
60
|
+
unless filter.match?(/^(#{ALLOWED_PROPERTIES.join('|')})(#{ALLOWED_FILTER_OPERATORS.join('|')})(.+)$/)
|
61
|
+
errors.push({filters: "Filter #{filter} is not valid"})
|
84
62
|
end
|
85
63
|
end
|
64
|
+
|
86
65
|
if @options[:limit]
|
87
|
-
errors.push({
|
66
|
+
errors.push({limit: "Limit param must be a positive number"}) unless @options[:limit].to_i > 0
|
88
67
|
end
|
89
68
|
if @options[:page]
|
90
|
-
errors.push({
|
69
|
+
errors.push({page: "Page param must be a positive number"}) unless @options[:page].to_i > 0
|
91
70
|
end
|
92
71
|
if @options[:date]
|
93
|
-
errors.push({
|
72
|
+
errors.push({date: "You must define the period parameter as custom"}) unless @options[:period] == "custom"
|
94
73
|
date_array = @options[:date].split(",")
|
95
|
-
errors.push({
|
96
|
-
regex = /\d{4}
|
97
|
-
errors.push({
|
98
|
-
errors.push({
|
74
|
+
errors.push({date: "You must define start and end dates divided by comma"}) unless date_array.length == 2
|
75
|
+
regex = /\d{4}-\d{2}-\d{2}/
|
76
|
+
errors.push({date: "Wrong format for the start date"}) unless date_array[0]&.match?(regex)
|
77
|
+
errors.push({date: "Wrong format for the end date"}) unless date_array[1]&.match?(regex)
|
99
78
|
end
|
100
79
|
errors
|
101
80
|
end
|
@@ -3,18 +3,13 @@
|
|
3
3
|
module PlausibleApi
|
4
4
|
module Stats
|
5
5
|
class Breakdown < Base
|
6
|
-
|
7
6
|
def initialize(options = {})
|
8
|
-
super({
|
7
|
+
super({period: "30d", property: "event:page"}.merge(options))
|
9
8
|
end
|
10
9
|
|
11
|
-
def
|
10
|
+
def request_path_base
|
12
11
|
"/api/v1/stats/breakdown?site_id=$SITE_ID"
|
13
12
|
end
|
14
|
-
|
15
|
-
def parse_response(body)
|
16
|
-
JSON.parse(body)['results']
|
17
|
-
end
|
18
13
|
end
|
19
14
|
end
|
20
15
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module PlausibleApi
|
3
|
+
module PlausibleApi
|
4
4
|
module Stats
|
5
5
|
module Realtime
|
6
6
|
class Visitors < PlausibleApi::Stats::Base
|
7
|
-
def
|
7
|
+
def request_path_base
|
8
8
|
"/api/v1/stats/realtime/visitors?site_id=$SITE_ID"
|
9
9
|
end
|
10
10
|
|
@@ -14,4 +14,4 @@ module PlausibleApi
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
17
|
-
end
|
17
|
+
end
|
@@ -3,18 +3,13 @@
|
|
3
3
|
module PlausibleApi
|
4
4
|
module Stats
|
5
5
|
class Timeseries < Base
|
6
|
-
|
7
6
|
def initialize(options = {})
|
8
|
-
super({
|
7
|
+
super({period: "30d"}.merge(options))
|
9
8
|
end
|
10
9
|
|
11
|
-
def
|
10
|
+
def request_path_base
|
12
11
|
"/api/v1/stats/timeseries?site_id=$SITE_ID"
|
13
12
|
end
|
14
|
-
|
15
|
-
def parse_response(body)
|
16
|
-
JSON.parse(body)['results']
|
17
|
-
end
|
18
13
|
end
|
19
14
|
end
|
20
15
|
end
|
data/lib/plausible_api.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plausible_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.4'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gustavo Garcia
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
11
|
+
date: 2024-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A very humble wrapper for the new API by Plausible
|
14
14
|
email:
|
@@ -29,6 +29,7 @@ files:
|
|
29
29
|
- examples/basic.rb
|
30
30
|
- examples/event.rb
|
31
31
|
- lib/plausible_api.rb
|
32
|
+
- lib/plausible_api/api_base.rb
|
32
33
|
- lib/plausible_api/client.rb
|
33
34
|
- lib/plausible_api/configuration.rb
|
34
35
|
- lib/plausible_api/event/base.rb
|
@@ -38,6 +39,7 @@ files:
|
|
38
39
|
- lib/plausible_api/stats/breakdown.rb
|
39
40
|
- lib/plausible_api/stats/realtime/visitors.rb
|
40
41
|
- lib/plausible_api/stats/timeseries.rb
|
42
|
+
- lib/plausible_api/utils.rb
|
41
43
|
- lib/plausible_api/version.rb
|
42
44
|
- plausible_api.gemspec
|
43
45
|
homepage: https://github.com/dailytics/plausible_api
|