plausible_api 0.0.3 → 0.1.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3960123efcdafae0607d993403d5d3ed6108952b623e282e08d97abe5d68b337
4
- data.tar.gz: 7c03a6435a1d62ca54c07969e09141a546014b093b5ac6e1150b33031f0bdbbf
3
+ metadata.gz: 22016ef4c32d7f1d0470a619111b0134134e3c272ed62a6630f3f81184e7cd50
4
+ data.tar.gz: ef9f7efae941960ca78dca62b4b5f02207ddfb6ebeffb174120edcc0c14b7eec
5
5
  SHA512:
6
- metadata.gz: 5b6330d478c5affc54605998832e32d38f72659099279f40cb550a84eda0c0593b61efe0af7c7b0ff581e93ed2c191c47518a9eb6d9fee73fb68617372d85f1f
7
- data.tar.gz: 53a8202c35ce4507e6144ffb3623ef899822b179b11b716ec60a079aefbbb2fea89d0be1c4e31e6b625c8540dfb5a1160d81224d2a06af9b31d848e422743830
6
+ metadata.gz: dfa7ec056c52894e489838410ec922d90544e80dca6525718c5c8629fa9fb9faece1fb76dd28f0fc8c6f455187ab46d5bd00e5d60ad7f7a8458c38e77ef60a5e
7
+ data.tar.gz: c858040b75e37e69c5d50813b78cf1ccf6708d24982ad865727adeb1a501839ed3b2a0244e8128fb99919dc97b41176c78bf870b1130be332bbfd07b27ee49bc
data/.gitignore CHANGED
@@ -1 +1,9 @@
1
- *.gem
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ *.gem
@@ -0,0 +1,74 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as
6
+ contributors and maintainers pledge to making participation in our project and
7
+ our community a harassment-free experience for everyone, regardless of age, body
8
+ size, disability, ethnicity, gender identity and expression, level of experience,
9
+ nationality, personal appearance, race, religion, or sexual identity and
10
+ orientation.
11
+
12
+ ## Our Standards
13
+
14
+ Examples of behavior that contributes to creating a positive environment
15
+ include:
16
+
17
+ * Using welcoming and inclusive language
18
+ * Being respectful of differing viewpoints and experiences
19
+ * Gracefully accepting constructive criticism
20
+ * Focusing on what is best for the community
21
+ * Showing empathy towards other community members
22
+
23
+ Examples of unacceptable behavior by participants include:
24
+
25
+ * The use of sexualized language or imagery and unwelcome sexual attention or
26
+ advances
27
+ * Trolling, insulting/derogatory comments, and personal or political attacks
28
+ * Public or private harassment
29
+ * Publishing others' private information, such as a physical or electronic
30
+ address, without explicit permission
31
+ * Other conduct which could reasonably be considered inappropriate in a
32
+ professional setting
33
+
34
+ ## Our Responsibilities
35
+
36
+ Project maintainers are responsible for clarifying the standards of acceptable
37
+ behavior and are expected to take appropriate and fair corrective action in
38
+ response to any instances of unacceptable behavior.
39
+
40
+ Project maintainers have the right and responsibility to remove, edit, or
41
+ reject comments, commits, code, wiki edits, issues, and other contributions
42
+ that are not aligned to this Code of Conduct, or to ban temporarily or
43
+ permanently any contributor for other behaviors that they deem inappropriate,
44
+ threatening, offensive, or harmful.
45
+
46
+ ## Scope
47
+
48
+ This Code of Conduct applies both within project spaces and in public spaces
49
+ when an individual is representing the project or its community. Examples of
50
+ representing a project or community include using an official project e-mail
51
+ address, posting via an official social media account, or acting as an appointed
52
+ representative at an online or offline event. Representation of a project may be
53
+ further defined and clarified by project maintainers.
54
+
55
+ ## Enforcement
56
+
57
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
+ reported by contacting the project team at luctus@gmail.com. All
59
+ complaints will be reviewed and investigated and will result in a response that
60
+ is deemed necessary and appropriate to the circumstances. The project team is
61
+ obligated to maintain confidentiality with regard to the reporter of an incident.
62
+ Further details of specific enforcement policies may be posted separately.
63
+
64
+ Project maintainers who do not follow or enforce the Code of Conduct in good
65
+ faith may face temporary or permanent repercussions as determined by other
66
+ members of the project's leadership.
67
+
68
+ ## Attribution
69
+
70
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
+ available at [https://contributor-covenant.org/version/1/4][version]
72
+
73
+ [homepage]: https://contributor-covenant.org
74
+ [version]: https://contributor-covenant.org/version/1/4/
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in plausible_api.gemspec
4
+ gemspec
5
+
6
+ gem "rake", "~> 12.0"
7
+ gem "minitest", "~> 5.0"
data/Gemfile.lock ADDED
@@ -0,0 +1,21 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ plausible_api (0.1.5)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ minitest (5.14.3)
10
+ rake (12.3.3)
11
+
12
+ PLATFORMS
13
+ ruby
14
+
15
+ DEPENDENCIES
16
+ minitest (~> 5.0)
17
+ plausible_api!
18
+ rake (~> 12.0)
19
+
20
+ BUNDLED WITH
21
+ 2.1.4
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 Gustavo Garcia
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md CHANGED
@@ -9,7 +9,11 @@ gem 'plausible_api'
9
9
  ```
10
10
  Then you need to initialize a Client with your `site_id` (the domain) and your `token`.
11
11
  ```rb
12
- c = PlausibleApi::Client.new(site_id: 'dailytics.com', token: '123123')
12
+ c = PlausibleApi::Client.new('dailytics.com', '123123')
13
+
14
+ # Test if the site and token are valid
15
+ c.valid?
16
+ => true
13
17
  ```
14
18
 
15
19
  ### Stats > Aggregate
@@ -19,10 +23,11 @@ You have all these options to get the aggregate stats
19
23
  # Use the default parameters (3mo period + the 4 main metrics)
20
24
  c.aggregate
21
25
 
22
- # Set parameters (period, metrics, filter, date)
26
+ # Set parameters (period, metrics, filter, compare)
23
27
  c.aggregate({ period: '30d' })
24
28
  c.aggregate({ period: '30d', metrics: 'visitors,pageviews' })
25
29
  c.aggregate({ period: '30d', metrics: 'visitors,pageviews', filters: 'event:page==/order/confirmation' })
30
+ c.aggregate({ period: 'custom', date: '2021-01-01,2021-02-10' })
26
31
 
27
32
  # You'll get something like this:
28
33
  => {"bounce_rate"=>{"value"=>81.0}, "pageviews"=>{"value"=>29}, "visit_duration"=>{"value"=>247.0}, "visitors"=>{"value"=>14}}
@@ -35,29 +40,55 @@ You have all these options to get the timeseries
35
40
  # Use the default parameters (3mo period)
36
41
  c.timeseries
37
42
 
38
- # Set parameters (period, metrics, filter, date)
43
+ # Set parameters (period, filters, interval)
39
44
  c.timeseries({ period: '7d' })
40
- c.timeseries({ period: '7d', filters: 'event:page==/order/confirmation', date: '2020/02/10' })
45
+ c.timeseries({ period: '7d', filters: 'event:page==/order/confirmation' })
46
+ c.timeseries({ period: 'custom', date: '2021-01-01,2021-02-15' })
41
47
 
42
48
  # You'll get something like this:
43
49
  => [{"date"=>"2021-01-11", "value"=>100}, {"date"=>"2021-01-12", "value"=>120}, {"date"=>"2021-01-13", "value"=>80}...]
44
50
  ```
45
51
 
46
- ### Realtime >> Visitors
52
+ ### Stats > Breakdown
53
+ ```rb
54
+ # Use the default parameters (30d, event:page)
55
+ c.breakdown
56
+
57
+ # Set parameters (property, period, metrics, limit, page, filters, date)
58
+ c.breakdown({ property: 'visit:source' })
59
+ c.breakdown({ property: 'visit:source', metrics: 'visitors,pageviews' })
60
+ c.breakdown({ property: 'visit:source', metrics: 'visitors,pageviews', period: '30d' })
61
+ c.breakdown({ property: 'visit:source', metrics: 'visitors,pageviews', period: 'custom', date: '2021-01-01,2021-02-01' })
62
+
63
+ # You'll get something like this:
64
+ => [{"page"=>"/", "visitors"=>41}, {"page"=>"/plans/", "visitors"=>14}, {"page"=>"/agencies/", "visitors"=>8}, {"page"=>"/features/", "visitors"=>8}, {"page"=>"/ready/", "visitors"=>5}, {"page"=>"/contact/", "visitors"=>4}, {"page"=>"/about/", "visitors"=>3}, {"page"=>"/donate/", "visitors"=>3}]
65
+ ```
66
+
67
+ ### Realtime > Visitors
47
68
 
48
- You have a uniq way to call this data
69
+ It's as simple as:
49
70
  ```rb
50
71
  c.realtime_visitors
72
+
73
+ => 13
51
74
  ```
52
75
 
76
+
53
77
  ## Development
54
- ```
55
- $ gem build plausible_api.gemspec
56
- $ gem install ./plausible_api-X.X.X.gem
57
- $ irb
58
- irb(main) > require 'plausible_api'
59
- ```
60
78
 
61
- ## Todo
62
- - Tests
63
- - Options validation
79
+ 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.
80
+
81
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
82
+
83
+ ## Contributing
84
+
85
+ Bug reports and pull requests are welcome on GitHub at https://github.com/dailytics/plausible_api. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/dailytics/plausible_api/blob/main/CODE_OF_CONDUCT.md).
86
+
87
+
88
+ ## License
89
+
90
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
91
+
92
+ ## Code of Conduct
93
+
94
+ Everyone interacting in the PlausibleApi project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/dailytics/plausible_api/blob/main/CODE_OF_CONDUCT.md).
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "plausible_api"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/lib/plausible_api.rb CHANGED
@@ -1,13 +1,7 @@
1
- # frozen_string_literal: true
2
-
3
- require 'plausible_api/api/client'
1
+ require 'plausible_api/version'
2
+ require 'plausible_api/client'
4
3
 
5
4
  module PlausibleApi
6
- class << self
7
- attr_writer :logger
8
-
9
- def logger
10
- @logger ||= Logger.new($stdout).tap { |log| log.progname = self.name }
11
- end
12
- end
13
- end
5
+ class Error < StandardError; end
6
+ # Your code goes here...
7
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'plausible_api/stats/base'
4
+ require 'plausible_api/stats/realtime/visitors'
5
+ require 'plausible_api/stats/aggregate'
6
+ require 'plausible_api/stats/timeseries'
7
+ require 'plausible_api/stats/breakdown'
8
+
9
+ require 'json'
10
+ require "net/http"
11
+ require "uri"
12
+ require "cgi"
13
+
14
+ module PlausibleApi
15
+ class Client
16
+
17
+ BASE_URL = 'https://plausible.io'
18
+
19
+ def initialize(site_id, token)
20
+ @site_id = site_id.to_s
21
+ @token = token.to_s
22
+ end
23
+
24
+ def aggregate(options = {})
25
+ call PlausibleApi::Stats::Aggregate.new(options)
26
+ end
27
+
28
+ def timeseries(options = {})
29
+ call PlausibleApi::Stats::Timeseries.new(options)
30
+ end
31
+
32
+ def breakdown(options = {})
33
+ call PlausibleApi::Stats::Breakdown.new(options)
34
+ end
35
+
36
+ def realtime_visitors
37
+ call PlausibleApi::Stats::Realtime::Visitors.new
38
+ end
39
+
40
+ def valid?
41
+ realtime_visitors.is_a? Integer
42
+ end
43
+
44
+ private
45
+ def call(api)
46
+ raise StandardError.new "There is some invalid parameters." unless api.valid?
47
+
48
+ url = "#{BASE_URL}#{api.request_url.gsub('$SITE_ID', @site_id)}"
49
+ uri = URI.parse(url)
50
+
51
+ req = Net::HTTP::Get.new(uri.request_uri)
52
+ req.add_field('Authorization', "Bearer #{@token}")
53
+
54
+ http = Net::HTTP.new(uri.host, uri.port)
55
+ http.use_ssl = true
56
+
57
+ api.parse_response http.request(req).body
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlausibleApi
4
+ module Stats
5
+ class Aggregate < Base
6
+ def initialize(options = {})
7
+ @period = options[:period] || '30d'
8
+ @metrics = options[:metrics] || 'visitors,pageviews,bounce_rate,visit_duration'
9
+ @filters = options[:filters]
10
+ @compare = options[:compare]
11
+ @date = options[:date]
12
+ @period = 'custom' if @date
13
+ end
14
+
15
+ def request_url_base
16
+ "/api/v1/stats/aggregate?site_id=$SITE_ID"
17
+ end
18
+
19
+ def parse_response(body)
20
+ JSON.parse body
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlausibleApi
4
+ module Stats
5
+ class Base
6
+ def initialize(options = {})
7
+ raise NotImplementedError
8
+ end
9
+
10
+ def request_url_base
11
+ raise NotImplementedError
12
+ end
13
+
14
+ def request_url
15
+ url = request_url_base
16
+ url += "&period=#{@period}" if defined?(@period) && @period
17
+ url += "&metrics=#{@metrics}" if defined?(@metrics) && @metrics
18
+ url += "&filters=#{CGI.escape(@filters)}" if defined?(@filters) && @filters
19
+ url += "&compare=#{@compare}" if defined?(@compare) && @compare
20
+ url += "&interval=#{@interval}" if defined?(@interval) && @interval
21
+ url += "&property=#{@property}" if defined?(@property) && @property
22
+ url += "&limit=#{@limit}" if defined?(@limit) && @limit
23
+ url += "&page=#{@page}" if defined?(@page) && @page
24
+ url += "&date=#{@date}" if defined?(@date) && @date
25
+ url
26
+ end
27
+
28
+ def parse_response(body)
29
+ raise NotImplementedError
30
+ end
31
+
32
+ def valid?
33
+ errors.empty?
34
+ end
35
+
36
+ def errors
37
+ allowed_period = %w(12mo 6mo month 30d 7d day custom)
38
+ allowed_metrics = %w(visitors pageviews bounce_rate visit_duration)
39
+ allowed_compare = %w(previous_period)
40
+ allowed_interval = %w(date month)
41
+ allowed_property = %w(event:page event:source event:referrer event:utm_medium
42
+ event:utm_source event:utm_campaign event:device event:browser event:browser_version
43
+ event:os event:os_version event:country)
44
+ e = 'Not a valid parameter. Allowed parameters are: '
45
+
46
+ errors = []
47
+ if defined?(@period) && @period
48
+ errors.push({ period: "#{e}#{allowed_period.join(', ')}" }) unless allowed_period.include? @period
49
+ end
50
+ if defined?(@metrics) && @metrics
51
+ metrics_array = @metrics.split(',')
52
+ errors.push({ metrics: "#{e}#{allowed_metrics.join(', ')}" }) unless metrics_array & allowed_metrics == metrics_array
53
+ end
54
+ if defined?(@compare) && @compare
55
+ errors.push({ compare: "#{e}#{allowed_compare.join(', ')}" }) unless allowed_compare.include? @compare
56
+ end
57
+ if defined?(@interval) && @interval
58
+ errors.push({ interval: "#{e}#{allowed_interval.join(', ')}" }) unless allowed_interval.include? @interval
59
+ end
60
+ if defined?(@property) && @property
61
+ errors.push({ property: "#{e}#{allowed_property.join(', ')}" }) unless allowed_property.include? @property
62
+ end
63
+ if defined?(@filters) && @filters
64
+ filters_array = @filters.to_s.split(';')
65
+ filters_array.each do |f|
66
+ parts = f.split("==")
67
+ errors.push({ filters: "Unrecognized filter: #{f}" }) unless parts.length == 2
68
+ errors.push({ filters: "Unknown metric for filter: #{parts[0]}" }) unless allowed_property.include? parts[0]
69
+ end
70
+ end
71
+ if defined?(@limit) && @limit
72
+ errors.push({ limit: "Limit param must be a positive number" }) unless @limit.is_a? Integer and @limit > 0
73
+ end
74
+ if defined?(@page) && @page
75
+ errors.push({ page: "Page param must be a positive number" }) unless @page.is_a? Integer and @page > 0
76
+ end
77
+ if defined?(@date) && @date
78
+ errors.push({ date: 'You must define the period parameter as custom' }) unless @period == 'custom'
79
+ date_array = @date.split(",")
80
+ errors.push({ date: 'You must define start and end dates divided by comma' }) unless date_array.length == 2
81
+ regex = /\d{4}\-\d{2}\-\d{2}/
82
+ errors.push({ date: 'Wrong format for the start date' }) unless date_array[0] =~ regex
83
+ errors.push({ date: 'Wrong format for the end date' }) unless date_array[1] =~ regex
84
+ end
85
+ errors
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlausibleApi
4
+ module Stats
5
+ class Breakdown < Base
6
+ def initialize(options = {})
7
+ @property = options[:property] || 'event:page' # required
8
+ @period = options[:period] || '30d' # required
9
+ @metrics = options[:metrics]
10
+ @limit = options[:limit]
11
+ @page = options[:page]
12
+ @filters = options[:filters]
13
+ @date = options[:date]
14
+ @period = 'custom' if @date
15
+
16
+ end
17
+
18
+ def request_url_base
19
+ "/api/v1/stats/breakdown?site_id=$SITE_ID"
20
+ end
21
+
22
+ def parse_response(body)
23
+ JSON.parse(body)['results']
24
+ end
25
+ end
26
+ end
27
+ end
@@ -3,13 +3,17 @@
3
3
  module PlausibleApi
4
4
  module Stats
5
5
  module Realtime
6
- class Visitors
6
+ class Visitors < PlausibleApi::Stats::Base
7
7
  def initialize
8
8
  end
9
9
 
10
- def request_url
10
+ def request_url_base
11
11
  "/api/v1/stats/realtime/visitors?site_id=$SITE_ID"
12
12
  end
13
+
14
+ def parse_response(body)
15
+ body.to_i
16
+ end
13
17
  end
14
18
  end
15
19
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PlausibleApi
4
+ module Stats
5
+ class Timeseries < Base
6
+ def initialize(options = {})
7
+ @period = options[:period] || '30d'
8
+ @filters = options[:filters]
9
+ @interval = options[:interval]
10
+ @date = options[:date]
11
+ @period = 'custom' if @date
12
+ end
13
+
14
+ def request_url_base
15
+ "/api/v1/stats/timeseries?site_id=$SITE_ID"
16
+ end
17
+
18
+ def parse_response(body)
19
+ JSON.parse(body)['results']
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,3 +1,3 @@
1
1
  module PlausibleApi
2
- VERSION = '0.0.3'
3
- end
2
+ VERSION = "0.1.5"
3
+ end
@@ -1,22 +1,27 @@
1
- # frozen_string_literal: true
1
+ require_relative 'lib/plausible_api/version'
2
2
 
3
- lib = File.expand_path('lib', __dir__)
4
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "plausible_api"
5
+ spec.version = PlausibleApi::VERSION
6
+ spec.authors = ["Gustavo Garcia"]
7
+ spec.email = ["gustavo@dailytics.com"]
5
8
 
6
- require 'plausible_api/version'
9
+ spec.summary = 'A simple Plausible API wrapper for Rails'
10
+ spec.description = 'A very humble wrapper for the new API by Plausible'
11
+ spec.homepage = "https://github.com/dailytics/plausible_api"
12
+ spec.license = "MIT"
13
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
7
14
 
8
- Gem::Specification.new do |s|
9
- s.name = 'plausible_api'
10
- s.version = PlausibleApi::VERSION
11
- s.summary = 'A simple Plausible API wrapper for Rails'
12
- s.description = 'A very humble wrapper for the new API by Plausible'
13
- s.authors = ['Gustavo Garcia']
14
- s.email = 'gustavo@dailytics.com'
15
- s.homepage = 'https://github.com/dailytics/plausible-api'
16
- s.license = 'MIT'
17
- s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec)/}) }
18
- s.require_paths = ['lib']
15
+ spec.metadata["homepage_uri"] = spec.homepage
16
+ spec.metadata["source_code_uri"] = "https://github.com/dailytics/plausible_api"
17
+ spec.metadata["changelog_uri"] = "https://github.com/dailytics/plausible_api"
19
18
 
20
- s.add_dependency 'faraday', '~> 1.0'
21
- s.required_ruby_version = '>= 2.4'
22
- end
19
+ # Specify which files should be added to the gem when it is released.
20
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
21
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
22
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
23
+ end
24
+ spec.bindir = "exe"
25
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
+ spec.require_paths = ["lib"]
27
+ end
metadata CHANGED
@@ -1,48 +1,47 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plausible_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gustavo Garcia
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-10 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: faraday
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.0'
11
+ date: 2021-02-23 00:00:00.000000000 Z
12
+ dependencies: []
27
13
  description: A very humble wrapper for the new API by Plausible
28
- email: gustavo@dailytics.com
14
+ email:
15
+ - gustavo@dailytics.com
29
16
  executables: []
30
17
  extensions: []
31
18
  extra_rdoc_files: []
32
19
  files:
33
20
  - ".gitignore"
21
+ - CODE_OF_CONDUCT.md
22
+ - Gemfile
23
+ - Gemfile.lock
24
+ - LICENSE.txt
34
25
  - README.md
26
+ - Rakefile
27
+ - bin/console
28
+ - bin/setup
35
29
  - lib/plausible_api.rb
36
- - lib/plausible_api/api/client.rb
37
- - lib/plausible_api/api/stats/aggregate.rb
38
- - lib/plausible_api/api/stats/realtime/visitors.rb
39
- - lib/plausible_api/api/stats/timeseries.rb
30
+ - lib/plausible_api/client.rb
31
+ - lib/plausible_api/stats/aggregate.rb
32
+ - lib/plausible_api/stats/base.rb
33
+ - lib/plausible_api/stats/breakdown.rb
34
+ - lib/plausible_api/stats/realtime/visitors.rb
35
+ - lib/plausible_api/stats/timeseries.rb
40
36
  - lib/plausible_api/version.rb
41
37
  - plausible_api.gemspec
42
- homepage: https://github.com/dailytics/plausible-api
38
+ homepage: https://github.com/dailytics/plausible_api
43
39
  licenses:
44
40
  - MIT
45
- metadata: {}
41
+ metadata:
42
+ homepage_uri: https://github.com/dailytics/plausible_api
43
+ source_code_uri: https://github.com/dailytics/plausible_api
44
+ changelog_uri: https://github.com/dailytics/plausible_api
46
45
  post_install_message:
47
46
  rdoc_options: []
48
47
  require_paths:
@@ -51,7 +50,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
51
50
  requirements:
52
51
  - - ">="
53
52
  - !ruby/object:Gem::Version
54
- version: '2.4'
53
+ version: 2.3.0
55
54
  required_rubygems_version: !ruby/object:Gem::Requirement
56
55
  requirements:
57
56
  - - ">="
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'plausible_api/api/stats/realtime/visitors'
4
- require 'plausible_api/api/stats/aggregate'
5
- require 'plausible_api/api/stats/timeseries'
6
-
7
- require 'faraday'
8
- require 'json'
9
-
10
- module PlausibleApi
11
- class Client
12
-
13
- BASE_URL = 'https://plausible.io'
14
-
15
- def initialize(site_id:, token:)
16
- @site_id = site_id.to_s
17
- @token = token.to_s
18
- end
19
-
20
- def aggregate(options = {})
21
- call PlausibleApi::Stats::Aggregate.new(options)
22
- end
23
-
24
- def timeseries(options = {})
25
- call PlausibleApi::Stats::Timeseries.new(options)
26
- end
27
-
28
- def realtime_visitors
29
- call PlausibleApi::Stats::Realtime::Visitors.new
30
- end
31
-
32
- private
33
- def call(api)
34
- url = "#{BASE_URL}#{api.request_url.gsub('$SITE_ID', @site_id)}"
35
- puts url
36
- res = Faraday.get(url) do |req|
37
- req.headers['Authorization'] = "Bearer #{@token}"
38
- end
39
- JSON.parse res.body
40
- end
41
- end
42
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module PlausibleApi
4
- module Stats
5
- class Aggregate
6
- def initialize(options = {})
7
- @period = options[:period] || '30d'
8
- @metrics = options[:metrics] || 'visitors,pageviews,bounce_rate,visit_duration'
9
- @filters = options[:filters]
10
- @date = options[:date]
11
- end
12
-
13
- def request_url
14
- url = "/api/v1/stats/aggregate?site_id=$SITE_ID"
15
- if @period
16
- url += "&period=#{@period}"
17
- end
18
- if @metrics
19
- url += "&metrics=#{@metrics}"
20
- end
21
- if @filters
22
- url += "&filters=#{CGI.escape(@filters)}"
23
- end
24
- if @date
25
- url += "&date=#{@date}"
26
- end
27
- url
28
- end
29
- end
30
- end
31
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module PlausibleApi
4
- module Stats
5
- class Timeseries
6
- def initialize(options = {})
7
- @period = options[:period] || '30d'
8
- @filters = options[:filters]
9
- @date = options[:date]
10
- end
11
-
12
- def request_url
13
- url = "/api/v1/stats/timeseries?site_id=$SITE_ID"
14
- if @period
15
- url += "&period=#{@period}"
16
- end
17
- if @filters
18
- url += "&filters=#{CGI.escape(@filters)}"
19
- end
20
- if @date
21
- url += "&date=#{@date}"
22
- end
23
- url
24
- end
25
- end
26
- end
27
- end