gaapi 0.0.1alpha1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 4dc705d6ef1673cc61fd228e716935310202fb97
4
- data.tar.gz: cce405242ef7cc676bbecb13bf1718c72955d117
2
+ SHA256:
3
+ metadata.gz: ffff326579e103303525b129d3befd2c26304126a20bb7c1f3f54b1aa6d0c7bd
4
+ data.tar.gz: cef8c48c415155959499cb1c8faec0a422c8cb592ef4159fba906afcbeb47297
5
5
  SHA512:
6
- metadata.gz: a009423f2f1b1c53c85b4cb4de3fd25263924065c96b116f872e0c7e3d91d4ffad2b1e3cebdb7c5ece6c492b26b2caab096fd31e9e1eff436e6620ce9e0ef3b5
7
- data.tar.gz: 6e91d1973d4442dadb9f476db61cf9aec8295122b1f6150e3ef84ae4b576c9efad21e9746f3546d2fa54a46d94296831f684dd9ce2926ef55dd4477fc597086a
6
+ metadata.gz: edf53d316f4c32fadddf748770779f6ab56dd26192b2a3683d42c938e63ae79f2310460cbc7aa87bae516d7ae8fe3166093c5933907ab786e7573cca476eef0d
7
+ data.tar.gz: 5d67cb658c49b4b883cf75c09d0fb08089d1662ff40ed1a11adfa2e50c0a4bc79299f150f0876e1009a22fe9e8c4b5376db87c06dec7be02b7cd004567a74691
data/bin/gaapi CHANGED
@@ -4,4 +4,5 @@
4
4
  $LOAD_PATH.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
5
  require "gaapi"
6
6
 
7
- Main.call
7
+ GAAPI::Main.call
8
+ # FIXME: This doesn't seem to return the status to the shell the way we want.
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GAAPI
4
+ # An access token generated from a credential file provided by Google Analystics.
5
+ # The credential file is suitable for using in applications where humans aren't
6
+ # involved, such as scheduled jobs. To obtain a credential file, follow the instructions
7
+ # at https://developers.google.com/identity/protocols/OAuth2ServiceAccount.
8
+ class AccessToken
9
+ # Get a new access token. The actual token is lazily-generated, so no call is
10
+ # made to Google Analytics until #token is called.
11
+ # @param credential_file [String] File name of a credential file provided by
12
+ # Google Analytics.
13
+ def initialize(credential_file = nil)
14
+ @credential_file = credential_file || File.expand_path("~/.gaapi/ga-api-key")
15
+ stat = File::Stat.new(@credential_file)
16
+ raise "#{@credential_file} must be readable and writable only by you." if stat.world_readable? || stat.world_writable?
17
+ end
18
+
19
+ # An access token that can be used in a request to Google Analytics Reporting API v4.
20
+ # @return [String] An access token.
21
+ def token
22
+ (@token ||= fetch_access_token)["access_token"]
23
+ end
24
+ alias to_s token
25
+
26
+ private
27
+
28
+ def fetch_access_token
29
+ File.open(@credential_file) do |fd|
30
+ authorization = Google::Auth::ServiceAccountCredentials.make_creds(
31
+ json_key_io: fd,
32
+ scope: "https://www.googleapis.com/auth/analytics.readonly"
33
+ )
34
+ authorization.fetch_access_token!
35
+ end
36
+ end
37
+ end
38
+ end
data/lib/gaapi/main.rb CHANGED
@@ -2,104 +2,123 @@
2
2
 
3
3
  require "optparse"
4
4
 
5
- ##
6
- # Basic runner for nginx config file generation.
7
- module Main
8
- class << self
9
- def call
10
- options = process_options
5
+ module GAAPI
6
+ module Main
7
+ class << self
8
+ def call
9
+ begin
10
+ return 1 if (options = process_options).nil?
11
+
12
+ puts "options: #{options.inspect}" if options[:debug]
13
+
14
+ # return unless (result = Query.call(options))
15
+ query = Query.new((options[:query_file] || $stdin).read,
16
+ options[:view_id],
17
+ options[:access_token],
18
+ options[:start_date],
19
+ options[:end_date])
20
+ puts "query: #{query.inspect}" if options[:debug]
21
+ rescue StandardError => e
22
+ $stderr.puts e.message # rubocop:disable Style/StderrPuts
23
+ return 1
24
+ end
11
25
 
12
- puts "options: #{options.inspect}" if options[:debug]
26
+ return 0 if options[:dry_run]
13
27
 
14
- # return unless (result = Query.call(options))
15
- query = Query.new((options[:query_file] || STDIN).read, options)
28
+ result = query.execute
29
+ puts "result: #{result.inspect}" if options[:debug]
16
30
 
17
- return if options[:dry_run]
31
+ unless result.success?
32
+ # Show the output unformatted, because we don't know what we're going
33
+ # to get back.
34
+ puts result.body
35
+ return 1
36
+ end
18
37
 
19
- result = query.execute
38
+ case options[:output_format]
39
+ when :csv
40
+ puts result.csv
41
+ else
42
+ puts result.pp
43
+ end
20
44
 
21
- if result.code != "200"
22
- puts "Request failed #{result.code}"
23
- puts Query.pp(result.body)
24
- return
45
+ 0
25
46
  end
26
47
 
27
- case options[:output_format]
28
- when :csv
29
- puts Query.csv(result.body)
30
- else
31
- puts Query.pp(result.body)
32
- end
33
- end
48
+ def process_options
49
+ options = {}
50
+ credential_file = File.join(Dir.home, ".gaapi/ga-api-key")
51
+ parsed_options = OptionParser.new do |opts|
52
+ opts.banner = "Usage: [options] VIEW_ID"
53
+ opts.accept(Date)
54
+
55
+ opts.on("-a TOKEN",
56
+ "--access-token TOKEN",
57
+ "An access token obtained from https://developers.google.com/oauthplayground.") do |access_token|
58
+ options[:access_token] = access_token
59
+ end
34
60
 
35
- def process_options
36
- options = { credentials: File.join(Dir.home, ".gaapi/ga-api-key") }
37
- opts = OptionParser.new do |opts|
38
- opts.banner = "Usage: [options] VIEW_ID"
39
- opts.accept(Date)
61
+ opts.on("--csv",
62
+ "Output result as a csv file.") do
63
+ options[:output_format] = :csv
64
+ end
40
65
 
41
- opts.on("-a TOKEN",
42
- "--access-token TOKEN",
43
- "An access token obtained from https://developers.google.com/oauthplayground.") do |access_token|
44
- options[:access_token] = access_token
45
- end
66
+ opts.on("-c CREDENTIALS",
67
+ "--credentials CREDENTIALS",
68
+ "Location of the credentials file. Default: `#{credential_file}`.") do |credentials|
69
+ credential_file = credentials
70
+ end
46
71
 
47
- opts.on("--csv",
48
- "Output result as a csv file.") do
49
- options[:output_format] = :csv
50
- end
72
+ opts.on("-d", "--debug", "Print debugging information.") do
73
+ options[:debug] = true
74
+ end
51
75
 
52
- opts.on("-c CREDENTIALS",
53
- "--credentials CREDENTIALS",
54
- "Location of the credentials file. Default: #{options[:credentials]}.") do |credentials|
55
- options[:credentials] = credentials
76
+ opts.on("-e",
77
+ "--end-date END_DATE",
78
+ Date,
79
+ "Report including END_DATE.") do |end_date|
80
+ options[:end_date] = end_date
56
81
  end
57
82
 
58
- opts.on("-d", "--debug", "Print debugging information.") do
59
- options[:debug] = true
60
- end
83
+ opts.on("-n", "--dry-run", "Don't actually send the query to Google.") do
84
+ options[:dry_run] = true
85
+ end
61
86
 
62
- opts.on("-e",
63
- "--end-date END_DATE",
64
- Date,
65
- "Report including END_DATE.") do |end_date|
66
- options[:end_date] = end_date
87
+ opts.on("-q QUERYFILE",
88
+ "--query-file QUERYFILE",
89
+ "File containing the query. Default STDIN.") do |query_file|
90
+ options[:query_file] = File.open(query_file)
91
+ end
92
+
93
+ opts.on("-s",
94
+ "--start-date START_DATE",
95
+ Date,
96
+ "Report including START_DATE.") do |start_date|
97
+ options[:start_date] = start_date
98
+ end
67
99
  end
68
-
69
- opts.on("-n", "--dry-run", "Don't actually send the query to Google.") do
70
- options[:dry_run] = true
100
+ parsed_options.parse!
101
+ unless ARGV.size == 1
102
+ $stderr.puts("gaapi: You must provide a view ID.\n" + parsed_options.to_s) # rubocop:disable Style/StderrPuts
103
+ return nil
71
104
  end
105
+ options[:view_id] = ARGV[0]
72
106
 
73
- opts.on("-q QUERYFILE",
74
- "--query-file QUERYFILE",
75
- "File containing the query. Default STDIN.") do |query_file|
76
- options[:query_file] = File.open(query_file)
77
- end
107
+ options[:access_token] ||= GAAPI::AccessToken.new(credential_file)
78
108
 
79
- opts.on("-s",
80
- "--start-date START_DATE",
81
- Date,
82
- "Report including START_DATE.") do |start_date|
83
- options[:start_date] = start_date
109
+ if options[:end_date].nil? && !options[:start_date].nil?
110
+ options[:end_date] = options[:start_date]
111
+ elsif options[:start_date].nil? && !options[:end_date].nil?
112
+ options[:start_date] = options[:end_date]
113
+ elsif options[:start_date].nil? && options[:end_date].nil?
114
+ options[:end_date] = options[:start_date] = (Date.today - 1).to_s
84
115
  end
85
- end
86
- opts.parse!
87
- opts.abort("You must provide a view ID. \n" + opts.to_s) unless ARGV.size == 1
88
- options[:view_id] = ARGV[0]
89
-
90
- if options[:end_date].nil? && !options[:start_date].nil?
91
- options[:end_date] = options[:start_date]
92
- elsif options[:start_date].nil? && !options[:end_date].nil?
93
- options[:start_date] = options[:end_date]
94
- elsif options[:start_date].nil? && options[:end_date].nil?
95
- options[:end_date] = options[:start_date] = (Date.today - 1).to_s
96
- end
97
116
 
98
- options
117
+ options
118
+ end
99
119
  end
100
120
  end
101
121
  end
102
-
103
122
  # Some hints:
104
123
  # https://stackoverflow.com/a/41179467/3109926
105
124
  # http://www.daimto.com/google-service-accounts-with-json-file/
data/lib/gaapi/query.rb CHANGED
@@ -3,172 +3,47 @@
3
3
  require "csv"
4
4
  require "net/http"
5
5
 
6
- class Query
7
- class << self
8
- def call(options)
9
- # http://www.rubydoc.info/github/google/google-api-ruby-client/toplevel
10
- # https://github.com/google/google-auth-library-ruby
11
- scopes = %w[
12
- https://www.googleapis.com/auth/analytics
13
- https://www.googleapis.com/auth/analytics.readonly
14
- ]
15
-
16
- authorization = Google::Auth::ServiceAccountCredentials.make_creds(
17
- json_key_io: File
18
- .open(options[:credentials] || File.join(Dir.home,
19
- ".ga-credentials/ga-api-key")),
20
- scope: scopes
21
- )
22
-
23
- service = Google::Apis::AnalyticsreportingV4::AnalyticsReportingService.new
24
- service.authorization = authorization
25
-
26
- request = Google::Apis::AnalyticsreportingV4::ReportRequest.new(
27
- view_id: options[:view_id],
28
- date_ranges: [Google::Apis::AnalyticsreportingV4::DateRange.new(
29
- start_date: options[:start_date],
30
- end_date: options[:end_date]
31
- )],
32
- # dimensions: [
33
- # Google::Apis::AnalyticsreportingV4::Dimension.new(name: "ga:segment")
34
- # # Google::Apis::AnalyticsreportingV4::Dimension.new(name: "ga:adContent"),
35
- # # Google::Apis::AnalyticsreportingV4::Dimension.new(name: "ga:campaign"),
36
- # # Google::Apis::AnalyticsreportingV4::Dimension.new(name: "ga:keyword"),
37
- # # Google::Apis::AnalyticsreportingV4::Dimension.new(name: "ga:medium"),
38
- # # Google::Apis::AnalyticsreportingV4::Dimension.new(name: "ga:socialNetwork"),
39
- # # Google::Apis::AnalyticsreportingV4::Dimension.new(name: "ga:source")
40
- # ],
41
- metrics: [
42
- # Google::Apis::AnalyticsreportingV4::Metric.new(
43
- # expression: "ga:bounces"
44
- # ),
45
- Google::Apis::AnalyticsreportingV4::Metric.new(
46
- expression: "ga:newUsers"
47
- ),
48
- Google::Apis::AnalyticsreportingV4::Metric.new(
49
- expression: "ga:pageviewsPerSession"
50
- ),
51
- Google::Apis::AnalyticsreportingV4::Metric.new(
52
- expression: "ga:sessions"
53
- ),
54
- Google::Apis::AnalyticsreportingV4::Metric.new(
55
- expression: "ga:sessionDuration"
56
- ),
57
- # Google::Apis::AnalyticsreportingV4::Metric.new(
58
- # expression: "ga:organicSearches"
59
- # ),
60
- Google::Apis::AnalyticsreportingV4::Metric.new(
61
- expression: "ga:users"
62
- )
63
- ],
64
- metric_filter_clauses: [
65
- Google::Apis::AnalyticsreportingV4::MetricFilterClause.new(
66
- filters: [
67
- Google::Apis::AnalyticsreportingV4::MetricFilter.new(
68
- metric_name: "ga:pageviews",
69
- comparison_value: "0",
70
- operator: "GREATER_THAN"
71
- )
72
- ]
73
- )
74
- ],
75
- include_empty_rows: true
76
- )
77
-
78
- # puts "request.to_json: #{JSON.pretty_generate(JSON.parse(request.to_json))}" if options[:debug]
79
- get_reports_requests = Google::Apis::AnalyticsreportingV4::GetReportsRequest.new(report_requests: [request])
80
- # puts get_reports_requests.to_json if options[:debug]
81
- puts JSON.pretty_generate(JSON.parse(get_reports_requests.to_json)) if options[:debug]
82
- return nil if options[:dry_run]
83
-
84
- result = service.batch_get_reports(get_reports_requests)
85
- puts "result: #{result.inspect}" if options[:debug]
86
- result
87
- end
88
-
89
- def csv(result)
90
- result = result.to_json if result.is_a?(Google::Apis::AnalyticsreportingV4::GetReportsResponse)
91
- result = JSON.parse(result) if result.is_a?(String)
92
- CSV.generate do |csv|
93
- result["reports"].each do |report|
94
- # puts report.column_header.dimensions.inspect
95
- # puts report.column_header.metric_header.metric_header_entries.map(&:name).inspect
96
- csv << csv_header_row(report)
97
- report["data"]["rows"].each do |row|
98
- csv << csv_data_row(row["dimensions"], row["metrics"])
99
- end
100
- csv << csv_data_row("Totals", report["data"]["totals"]) if report["data"]["totals"]
101
- end
102
- end
103
- end
104
-
105
- def csv_data_row(row_headers, metrics)
106
- (Array(row_headers) || []) + metrics[0]["values"]
107
- end
108
-
109
- def csv_header_row(report)
110
- (report["columnHeader"]["dimensions"] || []) + report["columnHeader"]["metricHeader"]["metricHeaderEntries"].map do |entry|
111
- entry["name"]
6
+ module GAAPI
7
+ class Query
8
+ # Create a Query object.
9
+ # @param access_token [String] A valid access token with which to make a request to
10
+ # the specified View ID.
11
+ # @param end_date [Date, String] The end date for the report.
12
+ # @param query_string [String] The query in JSON format.
13
+ # @param start_date [Date, String] The start date for the report.
14
+ # @param view_id [String] The view ID of the property for which to submit the
15
+ # query.
16
+ def initialize(query_string, view_id, access_token, start_date, end_date)
17
+ @access_token = access_token
18
+ query_string = JSON.parse(query_string) unless query_string.is_a?(Hash)
19
+ @query = {}
20
+ @query["reportRequests"] = query_string["reportRequests"].map do |report_request|
21
+ report_request["viewId"] = view_id
22
+ report_request["dateRanges"] = [
23
+ "startDate": start_date.to_s,
24
+ "endDate": end_date.to_s
25
+ ]
26
+ report_request
112
27
  end
28
+ # puts "query: #{JSON.pretty_generate(query)}"
113
29
  end
114
30
 
115
- def pp(result)
116
- JSON.pretty_generate(JSON.parse(result))
31
+ # Send the requested query to Google Analytics and return the response.
32
+ # @return [HTTPResponse] The response from the request.
33
+ def execute
34
+ uri = URI.parse("https://analyticsreporting.googleapis.com/v4/reports:batchGet")
35
+ https = Net::HTTP.new(uri.host, uri.port)
36
+ https.use_ssl = true
37
+ # https.set_debug_output($stdout)
38
+ request = Net::HTTP::Post.new(uri.request_uri,
39
+ "Content-Type" => "application/json",
40
+ "Authorization" => "Bearer #{access_token}")
41
+ request.body = query.to_json
42
+ Response.new(https.request(request))
117
43
  end
118
- end
119
-
120
- def initialize(query_string, options)
121
- # puts "query_string: #{query_string}"
122
- puts "Initializing query. Options: #{options.inspect}" if options[:debug]
123
44
 
124
- puts "options[:access_token]: #{options[:access_token]}"
125
- @access_token = options[:access_token]
126
- puts "options[:credentials]: #{options[:credentials]}"
127
- @access_token ||= access_token_from_credentials(options[:credentials])
128
- puts "Final access_token: #{access_token}"
129
- @dry_run = options[:dry_run]
130
-
131
- query_string = JSON.parse(query_string) unless query_string.is_a?(Hash)
132
- @query = {}
133
- @query["reportRequests"] = query_string["reportRequests"].map do |report_request|
134
- report_request["viewId"] = options[:view_id]
135
- report_request["dateRanges"] = [
136
- "startDate": options[:start_date],
137
- "endDate": options[:end_date]
138
- ]
139
- report_request
140
- end
141
- # puts "query: #{JSON.pretty_generate(query)}"
142
- end
45
+ private
143
46
 
144
- def execute
145
- uri = URI.parse("https://analyticsreporting.googleapis.com/v4/reports:batchGet")
146
- https = Net::HTTP.new(uri.host, uri.port)
147
- https.use_ssl = true
148
- # https.set_debug_output($stdout)
149
- request = Net::HTTP::Post.new(uri.request_uri,
150
- "Content-Type" => "application/json",
151
- "Authorization" => "Bearer #{access_token}")
152
- request.body = query.to_json
153
- response = https.request(request)
154
- response
155
- end
156
-
157
- private
158
-
159
- attr_reader :access_token, :dry_run, :query
160
-
161
- def access_token_from_credentials(credential_file_name)
162
- stat = File::Stat.new(credential_file_name)
163
- if stat.world_readable? || stat.world_writable?
164
- raise "#{credential_file_name} must be readable and writable only by you."
165
- end
166
- authorization = Google::Auth::ServiceAccountCredentials.make_creds(
167
- json_key_io: File.open(credential_file_name),
168
- scope: "https://www.googleapis.com/auth/analytics.readonly"
169
- )
170
- token = authorization.fetch_access_token!
171
- puts token
172
- token["access_token"]
47
+ attr_reader :access_token, :query
173
48
  end
174
49
  end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GAAPI
4
+ # Holds the result of a Google Analytics query, and provides some methods to
5
+ # present the result in useful ways.
6
+ class Response
7
+ attr_reader :response
8
+
9
+ # Raw body of the response. Typically only used for diagnostic purposes.
10
+ def body
11
+ response.body
12
+ end
13
+
14
+ # Raw code of the response. Typically only used for diagnostic purposes.
15
+ def code
16
+ response.code
17
+ end
18
+
19
+ # Convert a response from Google Analytics into a comma-separated values
20
+ # format file.
21
+ # @return [String] The result of the query formatted as a comma-separated
22
+ # values string.
23
+ def csv
24
+ result = to_json
25
+ @csv ||= CSV.generate do |csv|
26
+ result["reports"].each do |report|
27
+ # puts report.column_header.dimensions.inspect
28
+ # puts report.column_header.metric_header.metric_header_entries.map(&:name).inspect
29
+ csv << csv_header_row(report)
30
+ report["data"]["rows"].each do |row|
31
+ csv << csv_data_row(row["dimensions"], row["metrics"])
32
+ end
33
+ csv << csv_data_row("Totals", report["data"]["totals"]) if report["data"]["totals"]
34
+ end
35
+ end
36
+ end
37
+
38
+ def initialize(response)
39
+ @response = response
40
+ end
41
+
42
+ # Return the JSON result in a readable format.
43
+ # @return [String] The JSON result formatted in a human-readable way.
44
+ def pp
45
+ @pp ||= JSON.pretty_generate(to_json)
46
+ end
47
+
48
+ # Return true if the request was successful.
49
+ # @return [Boolean] True if the request was successful (response code 200).
50
+ def success?
51
+ code == "200"
52
+ end
53
+
54
+ # Return the body of the response
55
+ # @return [String] JSON-formatted response in a String.
56
+ def to_json
57
+ @to_json ||= JSON.parse(to_s)
58
+ end
59
+
60
+ # Return the body of the response
61
+ # @return [String] JSON-formatted response in a String.
62
+ def to_s
63
+ response.body
64
+ end
65
+
66
+ private
67
+
68
+ def csv_data_row(row_headers, metrics)
69
+ (Array(row_headers) || []) + metrics[0]["values"]
70
+ end
71
+
72
+ def csv_header_row(report)
73
+ (report["columnHeader"]["dimensions"] || []) + report["columnHeader"]["metricHeader"]["metricHeaderEntries"].map do |entry|
74
+ entry["name"]
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GAAPI
4
+ VERSION = "0.2.0"
5
+ end
data/lib/gaapi.rb CHANGED
@@ -3,5 +3,7 @@
3
3
  # http://www.rubydoc.info/github/google/google-api-ruby-client/
4
4
  require "google/apis/analyticsreporting_v4"
5
5
  require "googleauth"
6
+ require "gaapi/access_token.rb"
6
7
  require "gaapi/main.rb"
7
8
  require "gaapi/query.rb"
9
+ require "gaapi/response.rb"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gaapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1alpha1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Larry Reid
@@ -9,8 +9,50 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-03-23 00:00:00.000000000 Z
12
+ date: 2018-09-06 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: chandler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: minitest
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: webmock
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
14
56
  - !ruby/object:Gem::Dependency
15
57
  name: google-api-client
16
58
  requirement: !ruby/object:Gem::Requirement
@@ -25,6 +67,20 @@ dependencies:
25
67
  - - "~>"
26
68
  - !ruby/object:Gem::Version
27
69
  version: '0.19'
70
+ - !ruby/object:Gem::Dependency
71
+ name: googleauth
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
28
84
  description: |2
29
85
  Submit queries expressed in JSON to Google Analytics. Can be run
30
86
  from unattended scripts, batch jobs, etc.
@@ -36,8 +92,11 @@ extra_rdoc_files: []
36
92
  files:
37
93
  - bin/gaapi
38
94
  - lib/gaapi.rb
95
+ - lib/gaapi/access_token.rb
39
96
  - lib/gaapi/main.rb
40
97
  - lib/gaapi/query.rb
98
+ - lib/gaapi/response.rb
99
+ - lib/gaapi/version.rb
41
100
  homepage: https://github.com/weenhanceit/gaapi
42
101
  licenses:
43
102
  - MIT
@@ -54,12 +113,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
54
113
  version: '0'
55
114
  required_rubygems_version: !ruby/object:Gem::Requirement
56
115
  requirements:
57
- - - ">"
116
+ - - ">="
58
117
  - !ruby/object:Gem::Version
59
- version: 1.3.1
118
+ version: '0'
60
119
  requirements: []
61
120
  rubyforge_project:
62
- rubygems_version: 2.5.2.1
121
+ rubygems_version: 2.7.6
63
122
  signing_key:
64
123
  specification_version: 4
65
124
  summary: Query Google Analytics from the command line.