From bbbe216272e4a630cf117147067f34d86ccb0616 Mon Sep 17 00:00:00 2001 From: Kang-Kyu Lee Date: Tue, 6 May 2025 12:00:52 -0700 Subject: [PATCH 1/5] Refactor: response body; two new errors --- lib/gslide.rb | 4 +++- lib/gslide/concerns/requests.rb | 36 +++++++++++++++++++++++++++++-- lib/gslide/models/editor.rb | 7 +----- lib/gslide/models/presentation.rb | 22 +++++++------------ lib/gslide/models/spreadsheet.rb | 11 +++------- 5 files changed, 49 insertions(+), 31 deletions(-) diff --git a/lib/gslide.rb b/lib/gslide.rb index b522459..96485a0 100644 --- a/lib/gslide.rb +++ b/lib/gslide.rb @@ -7,5 +7,7 @@ module Gslide class Error < StandardError; end - + class HTTPError < Error; end + class UnauthorizedError < HTTPError; end + class QuotaExceededError < HTTPError; end end diff --git a/lib/gslide/concerns/requests.rb b/lib/gslide/concerns/requests.rb index b7be051..b9055e5 100644 --- a/lib/gslide/concerns/requests.rb +++ b/lib/gslide/concerns/requests.rb @@ -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: {}) @@ -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 diff --git a/lib/gslide/models/editor.rb b/lib/gslide/models/editor.rb index b49c32a..8a09258 100644 --- a/lib/gslide/models/editor.rb +++ b/lib/gslide/models/editor.rb @@ -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 diff --git a/lib/gslide/models/presentation.rb b/lib/gslide/models/presentation.rb index 325d18a..29e5690 100644 --- a/lib/gslide/models/presentation.rb +++ b/lib/gslide/models/presentation.rb @@ -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 @@ -36,23 +36,17 @@ 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 diff --git a/lib/gslide/models/spreadsheet.rb b/lib/gslide/models/spreadsheet.rb index 3fc56ae..a4ea959 100644 --- a/lib/gslide/models/spreadsheet.rb +++ b/lib/gslide/models/spreadsheet.rb @@ -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 @@ -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 From 6c0e5199664b2f9c24c52356dce40ac3a42df742 Mon Sep 17 00:00:00 2001 From: Kang-Kyu Lee Date: Tue, 6 May 2025 12:30:55 -0700 Subject: [PATCH 2/5] Do not forget spreadsheet draft --- lib/gslide/models/spreadsheet.rb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/gslide/models/spreadsheet.rb b/lib/gslide/models/spreadsheet.rb index a4ea959..7f6c44d 100644 --- a/lib/gslide/models/spreadsheet.rb +++ b/lib/gslide/models/spreadsheet.rb @@ -53,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 From d81430633448854c290e3789c693dcc2f05e02dc Mon Sep 17 00:00:00 2001 From: Kang-Kyu Lee Date: Tue, 6 May 2025 15:24:25 -0700 Subject: [PATCH 3/5] Fix indent --- lib/gslide/models/presentation.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/gslide/models/presentation.rb b/lib/gslide/models/presentation.rb index 29e5690..055dd4c 100644 --- a/lib/gslide/models/presentation.rb +++ b/lib/gslide/models/presentation.rb @@ -44,9 +44,8 @@ def batch_update(options = {}) retry end - # all retries failed, raise exception + # all retries failed, raise exception raise - end def get_slide_ids From a9d60785dea368128ecb67341f7e71fb9ec78d09 Mon Sep 17 00:00:00 2001 From: Kang-Kyu Lee Date: Fri, 9 May 2025 10:23:02 -0700 Subject: [PATCH 4/5] Add new version to changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34d5ab3..ad468cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 From e74dd56dec61f62d31f064d7606fe9329165a49e Mon Sep 17 00:00:00 2001 From: Kang-Kyu Lee Date: Fri, 9 May 2025 10:23:38 -0700 Subject: [PATCH 5/5] Release a new version 0.1.2 --- lib/gslide/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/gslide/version.rb b/lib/gslide/version.rb index 40bc4cf..85d7498 100644 --- a/lib/gslide/version.rb +++ b/lib/gslide/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Gslide - VERSION = "0.1.1" + VERSION = "0.1.2" end