Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## [0.1.2] - 2025-05-09

- Add `Gslide::HTTPError`, `Gslide::UnauthorizedError` and `Gslide::QuotaExceededError` #10

## [0.1.1] - 2025-04-14

- Use a regular expression for finding a presentation id from url #8
Expand Down
4 changes: 3 additions & 1 deletion lib/gslide.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,7 @@

module Gslide
class Error < StandardError; end

class HTTPError < Error; end
class UnauthorizedError < HTTPError; end
class QuotaExceededError < HTTPError; end
end
36 changes: 34 additions & 2 deletions lib/gslide/concerns/requests.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,21 @@ def get_request(uri, auth_token: "")
req = Net::HTTP::Get.new(uri.to_s)
req['Authorization'] = "Bearer #{auth_token}"

Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
http.request(req)
end
response_body = JSON(res.body)

case res
when Net::HTTPSuccess
response_body
when Net::HTTPUnauthorized
msg = response_body["error"] ? response_body["error"]["message"] : "Unauthorized"
raise Gslide::UnauthorizedError, msg
else
msg = response_body["error"] ? response_body["error"]["message"] : "HTTPError"
raise Gslide::HTTPError, msg
end
end

def post_request(uri, auth_token: "", body: {})
Expand All @@ -19,9 +31,29 @@ def post_request(uri, auth_token: "", body: {})

req.body = body

Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
http.request(req)
end

response_body = JSON(res.body)

case res
when Net::HTTPSuccess
response_body
when Net::HTTPUnauthorized
msg = response_body["error"] ? response_body["error"]["message"] : "Unauthorized"
raise Gslide::UnauthorizedError, msg
when Net::HTTPTooManyRequests
# "Quota exceeded for quota metric 'Write requests' and limit 'Write requests per minute per user' of service 'slides.googleapis.com' for consumer 'project_number:012345678901'."
if response_body["error"] && response_body["error"]["message"] =~ /Quota exceeded/
raise Gslide::QuotaExceededError, msg
else
raise Gslide::HTTPError, msg || "TooManyRequests"
end
else
msg = response_body["error"] ? response_body["error"]["message"] : "HTTPError"
raise Gslide::HTTPError, msg
end
end
end
end
Expand Down
7 changes: 1 addition & 6 deletions lib/gslide/models/editor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,7 @@ def insert_presentation(options = {})
uri = URI(GOOGLE_SLIDES + "")

# "title" is the only allowed field in the request body
res = post_request(uri, auth_token: @token, body: options.to_json)
response_body = JSON(res.body)

if response_body["error"]
raise Gslide::Error.new(response_body["error"]["message"])
end
response_body = post_request(uri, auth_token: @token, body: options.to_json)
Presentation.new response_body["presentationId"], auth: self
end
end
Expand Down
21 changes: 7 additions & 14 deletions lib/gslide/models/presentation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ def initialize(id_or_url, auth: nil)
def get
uri = URI(GOOGLE_SLIDES + "/#{@id}")

res = get_request(uri, auth_token: @auth.token)
JSON(res.body).convert_keys {|k| k.snake_case.to_sym }
response_body = get_request(uri, auth_token: @auth.token)
response_body.convert_keys {|k| k.snake_case.to_sym }
end

def link_url
Expand All @@ -36,23 +36,16 @@ def batch_update(options = {})
uri = URI(GOOGLE_SLIDES + "/#{@id}:batchUpdate")
request_body = options.convert_keys { |k| k.to_s.lower_camel_case }.to_json

res = post_request(uri, auth_token: @auth.token, body: request_body)
response_body = JSON(res.body)

if response_body["error"]
raise Gslide::Error.new(response_body["error"]["message"])
end
response_body = post_request(uri, auth_token: @auth.token, body: request_body)
response_body["presentationId"] == @id

rescue Gslide::Error => e
if e.message =~ /Quota exceeded/ && (retries += 1) < 3
# "Quota exceeded for quota metric 'Write requests' and limit 'Write requests per minute per user' of service 'slides.googleapis.com' for consumer 'project_number:012345678901'."
rescue Gslide::QuotaExceededError
if (retries += 1) < 3
sleep 10 + retries * retries * 10

retry
end
# all retries failed, re-raise exception
raise e
# all retries failed, raise exception
raise
end

def get_slide_ids
Expand Down
18 changes: 5 additions & 13 deletions lib/gslide/models/spreadsheet.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ def initialize(id, auth: nil)
def get
uri = URI(GOOGLE_SHEETS + "/#{@id}")

res = get_request(uri, auth_token: @auth.token)
JSON(res.body).convert_keys {|k| k.snake_case.to_sym }
response_body = get_request(uri, auth_token: @auth.token)
response_body.convert_keys {|k| k.snake_case.to_sym }
end

def link_url
Expand All @@ -32,12 +32,7 @@ def batch_update(options = {})
uri = URI(GOOGLE_SHEETS + "/#{@id}:batchUpdate")
request_body = options.convert_keys { |k| k.to_s.lower_camel_case }.to_json

res = post_request(uri, auth_token: @auth.token, body: request_body)
response_body = JSON(res.body)

if response_body["error"]
raise Gslide::Error.new(response_body["error"]["message"])
end
response_body = post_request(uri, auth_token: @auth.token, body: request_body)
response_body["spreadsheetId"] == @id
end

Expand All @@ -58,11 +53,8 @@ def create(options = {})
request_body = options.convert_keys { |k| k.to_s.lower_camel_case }.to_json

uri = URI(GOOGLE_SHEETS)
res = post_request(uri, auth_token: @auth.token, body: request_body)
response_body = JSON(res.body)
if response_body["error"]
raise Gslide::Error.new(response_body["error"]["message"])
end
response_body = post_request(uri, auth_token: @auth.token, body: request_body)

spreadsheet_id = response_body["spreadsheetId"]
Spreadsheet.new(spreadsheet_id, auth: @auth)
end
Expand Down
2 changes: 1 addition & 1 deletion lib/gslide/version.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# frozen_string_literal: true

module Gslide
VERSION = "0.1.1"
VERSION = "0.1.2"
end