gslide 0.1.0 → 0.1.2

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: 3b59859f25a2ec7a2e3477e43f1fd9130c2f39cac573da00949db781721e0c00
4
- data.tar.gz: 3931e3260c7230dc6661baab6b5411c372aef15732a336738dc829f5fa27794f
3
+ metadata.gz: c60628d84c354c773b26428a27bf090324f9d480e7fbaa21f61b9eff373afcfd
4
+ data.tar.gz: 35dfbc790360627c4829f6747e9e25532ab0342d8044c61259e77bf050e85f2c
5
5
  SHA512:
6
- metadata.gz: 7c04e204a3469bbaf902cc32f631476ca8af0d20138f38cfcf146d21ecb0491831333a262418b0eb3e5d95b1d3ab498f1de037d45b7fb34e6bf6360e08b9e5ba
7
- data.tar.gz: d79224b147b6f6f6dabbfedd9e3f1ab2d49093b2e7622e9333edbe1c41a1d2b59e16b099230ceeee5ff4be11467fc4343971ec444b611c9fe800d30839e39e80
6
+ metadata.gz: 3998d8e6e183a9a7f1bc4164284a26fa4296c11187dcbf848f8dbe0f75ba6fdc5bb6b9e4407007d1cd7a11d6fd3f5c46b023b7fcda9000a23f3c2fdf0c88eddf
7
+ data.tar.gz: '086712b43b87c1a09ee7563c028af143282dc22f3fd74762c0e0dd2d99c81f8d78268affa80be92b1f3eb6e5fe98700356132d8d7f97f6d59ed9e50535333228'
data/CHANGELOG.md CHANGED
@@ -1,4 +1,11 @@
1
- ## [Unreleased]
1
+ ## [0.1.2] - 2025-05-09
2
+
3
+ - Add `Gslide::HTTPError`, `Gslide::UnauthorizedError` and `Gslide::QuotaExceededError` #10
4
+
5
+ ## [0.1.1] - 2025-04-14
6
+
7
+ - Use a regular expression for finding a presentation id from url [#8](https://github.com/lininglink/gslide/pull/8)
8
+ - Add retry logic for slide batch_update [#7](https://github.com/lininglink/gslide/pull/7)
2
9
 
3
10
  ## [0.1.0] - 2025-03-31
4
11
 
data/README.md CHANGED
@@ -1,10 +1,24 @@
1
+ [![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](https://rubydoc.info/gems/gslide)
2
+ [![Gem](https://img.shields.io/gem/v/gslide)](https://rubygems.org/gems/gslide)
3
+
1
4
  # Gslide
2
5
 
3
6
  Welcome to Gslide! This is an approach to build a Google Slides file for practical use.
4
7
 
5
8
  ## Installation
6
9
 
7
- > Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
10
+ ```sh
11
+ gem install gslide
12
+ ```
13
+
14
+ - Use [bundler](https://bundler.io/)
15
+
16
+ ```bash
17
+ bundle add gslide
18
+ bundle install
19
+ ```
20
+
21
+ - From Github
8
22
 
9
23
  Install the gem and add to the application's Gemfile by executing:
10
24
 
@@ -7,9 +7,21 @@ module Gslide
7
7
  req = Net::HTTP::Get.new(uri.to_s)
8
8
  req['Authorization'] = "Bearer #{auth_token}"
9
9
 
10
- Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
10
+ res = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
11
11
  http.request(req)
12
12
  end
13
+ response_body = JSON(res.body)
14
+
15
+ case res
16
+ when Net::HTTPSuccess
17
+ response_body
18
+ when Net::HTTPUnauthorized
19
+ msg = response_body["error"] ? response_body["error"]["message"] : "Unauthorized"
20
+ raise Gslide::UnauthorizedError, msg
21
+ else
22
+ msg = response_body["error"] ? response_body["error"]["message"] : "HTTPError"
23
+ raise Gslide::HTTPError, msg
24
+ end
13
25
  end
14
26
 
15
27
  def post_request(uri, auth_token: "", body: {})
@@ -19,9 +31,29 @@ module Gslide
19
31
 
20
32
  req.body = body
21
33
 
22
- Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
34
+ res = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
23
35
  http.request(req)
24
36
  end
37
+
38
+ response_body = JSON(res.body)
39
+
40
+ case res
41
+ when Net::HTTPSuccess
42
+ response_body
43
+ when Net::HTTPUnauthorized
44
+ msg = response_body["error"] ? response_body["error"]["message"] : "Unauthorized"
45
+ raise Gslide::UnauthorizedError, msg
46
+ when Net::HTTPTooManyRequests
47
+ # "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'."
48
+ if response_body["error"] && response_body["error"]["message"] =~ /Quota exceeded/
49
+ raise Gslide::QuotaExceededError, msg
50
+ else
51
+ raise Gslide::HTTPError, msg || "TooManyRequests"
52
+ end
53
+ else
54
+ msg = response_body["error"] ? response_body["error"]["message"] : "HTTPError"
55
+ raise Gslide::HTTPError, msg
56
+ end
25
57
  end
26
58
  end
27
59
  end
@@ -23,12 +23,7 @@ module Gslide
23
23
  uri = URI(GOOGLE_SLIDES + "")
24
24
 
25
25
  # "title" is the only allowed field in the request body
26
- res = post_request(uri, auth_token: @token, body: options.to_json)
27
- response_body = JSON(res.body)
28
-
29
- if response_body["error"]
30
- raise Gslide::Error.new(response_body["error"]["message"])
31
- end
26
+ response_body = post_request(uri, auth_token: @token, body: options.to_json)
32
27
  Presentation.new response_body["presentationId"], auth: self
33
28
  end
34
29
  end
@@ -7,8 +7,10 @@ module Gslide
7
7
 
8
8
  attr_reader :id
9
9
 
10
- def initialize(id, auth: nil)
11
- @id = id
10
+ PRESENTATION_PATTERN = %r[/presentation/d/([a-zA-Z0-9\-_]+)?]
11
+
12
+ def initialize(id_or_url, auth: nil)
13
+ @id = (url_id = id_or_url.match(PRESENTATION_PATTERN)) ? url_id[1] : id_or_url
12
14
  @auth = auth
13
15
  end
14
16
 
@@ -17,8 +19,8 @@ module Gslide
17
19
  def get
18
20
  uri = URI(GOOGLE_SLIDES + "/#{@id}")
19
21
 
20
- res = get_request(uri, auth_token: @auth.token)
21
- JSON(res.body).convert_keys {|k| k.snake_case.to_sym }
22
+ response_body = get_request(uri, auth_token: @auth.token)
23
+ response_body.convert_keys {|k| k.snake_case.to_sym }
22
24
  end
23
25
 
24
26
  def link_url
@@ -29,16 +31,21 @@ module Gslide
29
31
  # @return True when update successful.
30
32
  # @see https://developers.google.com/slides/api/reference/rest/v1/presentations/batchUpdate#request-body
31
33
  def batch_update(options = {})
34
+ retries ||= 0
35
+
32
36
  uri = URI(GOOGLE_SLIDES + "/#{@id}:batchUpdate")
33
37
  request_body = options.convert_keys { |k| k.to_s.lower_camel_case }.to_json
34
38
 
35
- res = post_request(uri, auth_token: @auth.token, body: request_body)
36
- response_body = JSON(res.body)
39
+ response_body = post_request(uri, auth_token: @auth.token, body: request_body)
40
+ response_body["presentationId"] == @id
41
+ rescue Gslide::QuotaExceededError
42
+ if (retries += 1) < 3
43
+ sleep 10 + retries * retries * 10
37
44
 
38
- if response_body["error"]
39
- raise Gslide::Error.new(response_body["error"]["message"])
45
+ retry
40
46
  end
41
- response_body["presentationId"] == @id
47
+ # all retries failed, raise exception
48
+ raise
42
49
  end
43
50
 
44
51
  def get_slide_ids
@@ -17,8 +17,8 @@ module Gslide
17
17
  def get
18
18
  uri = URI(GOOGLE_SHEETS + "/#{@id}")
19
19
 
20
- res = get_request(uri, auth_token: @auth.token)
21
- JSON(res.body).convert_keys {|k| k.snake_case.to_sym }
20
+ response_body = get_request(uri, auth_token: @auth.token)
21
+ response_body.convert_keys {|k| k.snake_case.to_sym }
22
22
  end
23
23
 
24
24
  def link_url
@@ -32,12 +32,7 @@ module Gslide
32
32
  uri = URI(GOOGLE_SHEETS + "/#{@id}:batchUpdate")
33
33
  request_body = options.convert_keys { |k| k.to_s.lower_camel_case }.to_json
34
34
 
35
- res = post_request(uri, auth_token: @auth.token, body: request_body)
36
- response_body = JSON(res.body)
37
-
38
- if response_body["error"]
39
- raise Gslide::Error.new(response_body["error"]["message"])
40
- end
35
+ response_body = post_request(uri, auth_token: @auth.token, body: request_body)
41
36
  response_body["spreadsheetId"] == @id
42
37
  end
43
38
 
@@ -58,11 +53,8 @@ module Gslide
58
53
  request_body = options.convert_keys { |k| k.to_s.lower_camel_case }.to_json
59
54
 
60
55
  uri = URI(GOOGLE_SHEETS)
61
- res = post_request(uri, auth_token: @auth.token, body: request_body)
62
- response_body = JSON(res.body)
63
- if response_body["error"]
64
- raise Gslide::Error.new(response_body["error"]["message"])
65
- end
56
+ response_body = post_request(uri, auth_token: @auth.token, body: request_body)
57
+
66
58
  spreadsheet_id = response_body["spreadsheetId"]
67
59
  Spreadsheet.new(spreadsheet_id, auth: @auth)
68
60
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Gslide
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.2"
5
5
  end
data/lib/gslide.rb CHANGED
@@ -7,5 +7,7 @@ require "gslide/models/models"
7
7
 
8
8
  module Gslide
9
9
  class Error < StandardError; end
10
-
10
+ class HTTPError < Error; end
11
+ class UnauthorizedError < HTTPError; end
12
+ class QuotaExceededError < HTTPError; end
11
13
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gslide
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kang-Kyu Lee
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-03-31 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies: []
12
12
  description: Allows to modify a Google Slides file by API requests.
13
13
  email:
@@ -52,7 +52,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
54
  requirements: []
55
- rubygems_version: 3.6.6
55
+ rubygems_version: 3.6.7
56
56
  specification_version: 4
57
57
  summary: Google Slides API client.
58
58
  test_files: []