sheets_v4 0.5.0 → 0.6.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
2
  SHA256:
3
- metadata.gz: ea8bb19ec472d573c796d277e420c088273c087aa9ffe4ebbb63df0a2ffb69ae
4
- data.tar.gz: 5a2dca82c26a9efdd7584a5c33f4e4d9bfa1f8ac0003cf504d936554e6bb9f7d
3
+ metadata.gz: 60f10846ff0c3b62cb29c487499eb717897a2b28916606de7d3199fe0424435f
4
+ data.tar.gz: a6bb345b4379f94dbaa82b266943c144321e3bcf3404db34c1788e766813a766
5
5
  SHA512:
6
- metadata.gz: 0676d4dcff6bd008104638a1a593cfcf638ad990d15a6f1a2f71cba44e0a387e5c3e527978cb3fc9e0517ecf9ef35dd8fac2348ac993f58f28147769261d3412
7
- data.tar.gz: ab5ae3a72384e45ee10411d1f1a89231ef9092393e686e81b0cb9e7734b216c039589697f2ef5e7d3313b677f5ea022ac8b2135adaa57e7e01c6032a12de0bb0
6
+ metadata.gz: 6914986ccca02b55b260b2a39e6777ce5e2cbca03f6fd00053d8ed96a960456831ee008bd175448da343eeaf0bcfc8c67309e489035b9792ec4ce51aba29d917
7
+ data.tar.gz: f76c250d9b9bec531ca6185ef3b2b351df6e0a12eccb1d6f862cf6a63d4b81305798630d992d3ec22fb44a94cbd488f3736e85da6ff72302eb7b7cf87017e176
data/CHANGELOG.md CHANGED
@@ -4,6 +4,14 @@ Changes for each release are listed in this file.
4
4
 
5
5
  This project adheres to [Semantic Versioning](https://semver.org/) for its releases.
6
6
 
7
+ ## v0.6.0 (2023-10-03)
8
+
9
+ [Full Changelog](https://github.com/main-branch/sheets_v4/compare/v0.5.0..v0.6.0)
10
+
11
+ Changes since v0.5.0:
12
+
13
+ * 2eab61d Update documentation explaining how to construct and validate a request (#17)
14
+
7
15
  ## v0.5.0 (2023-10-01)
8
16
 
9
17
  [Full Changelog](https://github.com/main-branch/sheets_v4/compare/v0.4.0..v0.5.0)
data/README.md CHANGED
@@ -9,29 +9,51 @@
9
9
 
10
10
  Unofficial helpers for the Google Sheets V4 API
11
11
 
12
- * [Important Links for Programming Google Sheets](#important-links-for-programming-google-sheets)
13
- * [General API Documentation](#general-api-documentation)
14
- * [Ruby Implementation of the Sheets API](#ruby-implementation-of-the-sheets-api)
15
- * [Other Links](#other-links)
16
12
  * [Installation](#installation)
13
+ * [Important links for programming Google Sheets](#important-links-for-programming-google-sheets)
14
+ * [General API documentation](#general-api-documentation)
15
+ * [Ruby implementation of the Sheets API](#ruby-implementation-of-the-sheets-api)
16
+ * [Other Links](#other-links)
17
+ * [Getting Started](#getting-started)
18
+ * [Creating a Google Cloud project](#creating-a-google-cloud-project)
19
+ * [Enable the APIs you want to use](#enable-the-apis-you-want-to-use)
20
+ * [Create a Google API credentials](#create-a-google-api-credentials)
17
21
  * [Usage](#usage)
18
22
  * [Obtaining an authenticated SheetsService](#obtaining-an-authenticated-sheetsservice)
23
+ * [Building a request](#building-a-request)
24
+ * [Method 1: constructing requests using `Google::Apis::SheetsV4::*` objects](#method-1-constructing-requests-using-googleapissheetsv4-objects)
25
+ * [Method 2: constructing requests using hashes](#method-2-constructing-requests-using-hashes)
26
+ * [Which method should be used?](#which-method-should-be-used)
27
+ * [Validating requests](#validating-requests)
19
28
  * [Colors](#colors)
20
29
  * [Development](#development)
21
- * [Creating a Google API Service Account](#creating-a-google-api-service-account)
22
30
  * [Contributing](#contributing)
23
31
  * [License](#license)
24
32
 
25
- ## Important Links for Programming Google Sheets
33
+ ## Installation
26
34
 
27
- ### General API Documentation
35
+ Install the gem and add to the application's Gemfile by executing:
36
+
37
+ ```shell
38
+ bundle add sheets_v4
39
+ ```
40
+
41
+ If bundler is not being used to manage dependencies, install the gem by executing:
42
+
43
+ ```shell
44
+ gem install sheets_v4
45
+ ```
46
+
47
+ ## Important links for programming Google Sheets
48
+
49
+ ### General API documentation
28
50
 
29
51
  * [Google Sheets API Overview](https://developers.google.com/sheets/api)
30
52
  * [Google Sheets API Reference](https://developers.google.com/sheets/api/reference/rest)
31
53
  * [Batch Update Requests](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request)
32
54
  * [Discovery Document for the Sheets API](https://sheets.googleapis.com/$discovery/rest?version=v4)
33
55
 
34
- ### Ruby Implementation of the Sheets API
56
+ ### Ruby implementation of the Sheets API
35
57
 
36
58
  * [SheetsService Class](https://github.com/googleapis/google-api-ruby-client/blob/main/generated/google-apis-sheets_v4/lib/google/apis/sheets_v4/service.rb)
37
59
  * [All Other Sheets Classes](https://github.com/googleapis/google-api-ruby-client/blob/main/generated/google-apis-sheets_v4/lib/google/apis/sheets_v4/classes.rb)
@@ -40,19 +62,25 @@ Unofficial helpers for the Google Sheets V4 API
40
62
 
41
63
  * [Apps Script for Sheets](https://developers.google.com/apps-script/guides/sheets)
42
64
 
43
- ## Installation
65
+ ## Getting Started
44
66
 
45
- Install the gem and add to the application's Gemfile by executing:
67
+ In order to use this gem, you will need to obtain a Google API sheets service
68
+ credential following the instructions below.
46
69
 
47
- ```shell
48
- bundle add sheets_v4
49
- ```
70
+ ### Creating a Google Cloud project
50
71
 
51
- If bundler is not being used to manage dependencies, install the gem by executing:
72
+ Create a Google Cloud project using [these directions](https://developers.google.com/workspace/guides/create-project).
52
73
 
53
- ```shell
54
- gem install sheets_v4
55
- ```
74
+ ### Enable the APIs you want to use
75
+
76
+ Enable the Sheets API for this project using [these directions](https://developers.google.com/workspace/guides/enable-apis).
77
+
78
+ ### Create a Google API credentials
79
+
80
+ Create a service account and download credentials using [these directions](https://developers.google.com/workspace/guides/create-credentials#service-account).
81
+
82
+ You can store the download credential files anywhere on your system. The recommended
83
+ location is `~/.google-api-credential.json`.
56
84
 
57
85
  ## Usage
58
86
 
@@ -86,19 +114,165 @@ If the credential is stored elsewhere, pass the credential_source to `SheetsV4.s
86
114
  manually. `credential_source` can be a String:
87
115
 
88
116
  ```Ruby
89
- sheets_service = SheetsV4.sheets_service(credential_sourvce: File.read('credential.json'))
117
+ sheets_service = SheetsV4.sheets_service(credential_source: File.read('credential.json'))
90
118
  ```
91
119
 
92
120
  an IO object:
93
121
 
94
122
  ```Ruby
95
123
  sheets_service = File.open('credential.json') do |credential_source|
96
- SheetsV4.sheets_service(credential_sourvce:)
124
+ SheetsV4.sheets_service(credential_source:)
97
125
  end
98
126
  ```
99
127
 
100
128
  or an already constructed `Google::Auth::*`` object.
101
129
 
130
+ ### Building a request
131
+
132
+ To use the Sheets API, you need to construct JSON formatted requests.
133
+
134
+ These requests can be constructed using two different methods:
135
+ 1. constructing requests using `Google::Apis::SheetsV4::*` objects or
136
+ 2. constructing requests using hashes
137
+
138
+ The following two sections show how each method can be used to construct
139
+ a request to update a row of values in a sheet.
140
+
141
+ For these two examples, values in the `values` array will be written to the
142
+ sheet whose ID is 0. The values will be written one per row starting at cell A1.
143
+
144
+ ```Ruby
145
+ values = %w[one two three four] # 'one' goes in A1, 'two' goes in A2, etc.
146
+ ```
147
+
148
+ The method `SheetsService#batch_update_spreadsheet` will be used to write the values. This
149
+ method takes a `batch_update_spreadsheet_request` object with a `update_cells` request
150
+ that defines the update to perform.
151
+
152
+ #### Method 1: constructing requests using `Google::Apis::SheetsV4::*` objects
153
+
154
+ When using this method, keep the Ruby source file containing the SheetsService class
155
+ ([google/apis/sheets_v4/service.rb](https://github.com/googleapis/google-api-ruby-client/blob/main/generated/google-apis-sheets_v4/lib/google/apis/sheets_v4/service.rb))
156
+ and the Ruby source file containing the defitions of the request & data classes
157
+ ([lib/google/apis/sheets_v4/classes.rb](https://github.com/googleapis/google-api-ruby-client/blob/main/generated/google-apis-sheets_v4/lib/google/apis/sheets_v4/classes.rb))
158
+ open for easy searching. These files will give you all the information you need
159
+ to construct valid requests.
160
+
161
+ Here is the example constructing requests using `Google::Apis::SheetsV4::*` objects
162
+
163
+ ```Ruby
164
+ def values = %w[one two three four]
165
+
166
+ def row_data(value)
167
+ Google::Apis::SheetsV4::RowData.new(
168
+ values: [
169
+ Google::Apis::SheetsV4::CellData.new(
170
+ user_entered_value:
171
+ Google::Apis::SheetsV4::ExtendedValue.new(string_value: value.to_s)
172
+ )
173
+ ]
174
+ )
175
+ end
176
+
177
+ def rows
178
+ values.map { |value| row_data(value) }
179
+ end
180
+
181
+ def write_values_request
182
+ fields = 'user_entered_value'
183
+ start = Google::Apis::SheetsV4::GridCoordinate.new(
184
+ sheet_id: 0, row_index: 0, column_index: 0
185
+ )
186
+ Google::Apis::SheetsV4::Request.new(
187
+ update_cells: Google::Apis::SheetsV4::UpdateCellsRequest.new(rows:, fields:, start:)
188
+ )
189
+ end
190
+
191
+ requests = Google::Apis::SheetsV4::BatchUpdateSpreadsheetRequest.new(requests: [write_values_request])
192
+
193
+ spreadsheet_id = '18FAcgotK7nDfLTOTQuGCIjKwxkJMAguhn1OVzpFFgWY'
194
+ SheetsV4.sheets_service.batch_update_spreadsheet(spreadsheet_id, requests)
195
+ ```
196
+
197
+ #### Method 2: constructing requests using hashes
198
+
199
+ When constructing requests using this method, keep the [Google Sheets Rest API Reference](https://developers.google.com/sheets/api/reference/rest)
200
+ documentation open. In particular, [the Batch Update Requests page](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#cutpasterequest)
201
+ is particularly useful for building spreadsheet batch update requests.
202
+
203
+ One caveat to keep in mind is that the Rest API documents object properties using
204
+ Camel case BUT the Ruby API requires snake case.
205
+
206
+ For instance, the Rest API documents the properties for a grid coordinate to be
207
+ "sheetId", "rowIndex", and "columnIndex". However, in the Ruby API, you should
208
+ construct this object using snake case:
209
+
210
+ ```Ruby
211
+ grid_coordinate = { sheet_id: 0, row_index: 0, column_index: 0 }
212
+ ```
213
+
214
+ Here is the example constructing requests using hashes:
215
+
216
+ ```Ruby
217
+ def values = %w[one two three four]
218
+
219
+ def rows
220
+ values.map do |value|
221
+ { values: [{ user_entered_value: { string_value: value } }] }
222
+ end
223
+ end
224
+
225
+ def write_values_request
226
+ fields = 'user_entered_value'
227
+ start = { sheet_id: 0, row_index: 0, column_index: 0 }
228
+ { update_cells: { rows:, fields:, start: } }
229
+ end
230
+
231
+ requests = { requests: [write_values_request] }
232
+
233
+ spreadsheet_id = '18FAcgotK7nDfLTOTQuGCIjKwxkJMAguhn1OVzpFFgWY'
234
+ response = SheetsV4.sheets_service.batch_update_spreadsheet(spreadsheet_id, requests)
235
+ ```
236
+
237
+ #### Which method should be used?
238
+
239
+ Either method will do the same job. I prefer "Method 2: constructing requests using
240
+ hashes" because my code is more concise and easy to read.
241
+
242
+ While either method can produce a malformed request, "Method 2" is more likely to
243
+ result in malformed requests. Unfortunately, when given a malformed request, the
244
+ Google Sheets API will do one of following depending on the nature of the problem:
245
+
246
+ 1. Raise a `Google::Apis::ClientError` with some additional information
247
+ 2. Raise a `Google::Apis::ClientError` with no additional information (this the most
248
+ common result)
249
+ 3. Not return an error with some of the batch requests not having the expected outcome
250
+
251
+ Luckily, this library provides a way to validate that requests are valid and
252
+ identifies precisely where the request objects do not conform to the API description.
253
+ That is the subject of the next section [Validating requests](#validating-requests).
254
+
255
+ ### Validating requests
256
+
257
+ The [`SheetsV4.validate_api_object`](https://rubydoc.info/gems/sheets_v4/SheetsV4#validate_api_object-class_method)
258
+ method can be used to validate request objects prior to using them in the Google
259
+ Sheets API.
260
+
261
+ This method takes a `schema_name` and an `object` to validate. Schema names can be
262
+ listed using [`SheetsV4.api_object_schema_names`](https://rubydoc.info/gems/sheets_v4/SheetsV4#api_object_schema_names-class_method).
263
+
264
+ This method will either return `true` if `object` conforms to the schema OR it
265
+ will raise a RuntimeError noting where the object structure did not conform to
266
+ the schema.
267
+
268
+ In the previous examples (see [Building a request](#building-a-request)), the
269
+ following line can be inserted after the `requests = ...` line to validate the
270
+ request:
271
+
272
+ ```Ruby
273
+ SheetsV4.validate_api_object(schema: 'batch_update_spreadsheet_request', object: requests)
274
+ ```
275
+
102
276
  ### Colors
103
277
 
104
278
  Color objects (with appropriate :red, :green, :blue values) can be retrieved by name
@@ -114,8 +288,8 @@ SheetsV4::Color.black #=> {:red=>0.0, :green=>0.0, :blue=>0.0}
114
288
 
115
289
  ## Development
116
290
 
117
- After checking out the repo, run `bin/setup` to install dependencies. Then, run
118
- `rake spec` to run the tests. You can also run `bin/console` for an interactive
291
+ After checking out the repo, run `bin/setup` to install dependencies and then, run
292
+ `rake` to run the tests, static analysis, etc. You can also run `bin/console` for an interactive
119
293
  prompt that will allow you to experiment.
120
294
 
121
295
  To install this gem onto your local machine, run `bundle exec rake install`. To
@@ -124,9 +298,6 @@ release a new version, update the version number in `version.rb`, and then run
124
298
  commits and the created tag, and push the `.gem` file to
125
299
  [rubygems.org](https://rubygems.org).
126
300
 
127
- ## Creating a Google API Service Account
128
-
129
-
130
301
  ## Contributing
131
302
 
132
303
  Bug reports and pull requests are welcome on [the main-branch/sheets_v4 GitHub project](https://github.com/main-branch/sheets_v4).
@@ -2,5 +2,5 @@
2
2
 
3
3
  module SheetsV4
4
4
  # The version of this gem
5
- VERSION = '0.5.0'
5
+ VERSION = '0.6.0'
6
6
  end
data/lib/sheets_v4.rb CHANGED
@@ -19,12 +19,16 @@ module SheetsV4
19
19
  #
20
20
  # Simplifies creating and configuring a the credential.
21
21
  #
22
- # @example using the crednetial in `~/.google-api-credential`
22
+ # @example using the credential in `~/.google-api-credential`
23
23
  # SheetsV4.sheets_service
24
24
  #
25
25
  # @example using a credential passed in as a string
26
- # credential_source = File.read(File.join(Dir.home, '.credential'))
27
- # SheetsV4.sheets_service(credential_source:
26
+ # credential_source = File.read(File.expand_path('~/.google-api-credential.json'))
27
+ # SheetsV4.sheets_service(credential_source:)
28
+ #
29
+ # @example using a credential passed in as an IO
30
+ # credential_source = File.open(File.expand_path('~/.google-api-credential.json'))
31
+ # SheetsV4.sheets_service(credential_source:)
28
32
  #
29
33
  # @param credential_source [nil, String, IO, Google::Auth::*] may
30
34
  # be either an already constructed credential, the credential read into a String or
@@ -50,10 +54,10 @@ module SheetsV4
50
54
  # Validate the object using the named JSON schema
51
55
  #
52
56
  # The JSON schemas are loaded from the Google Disocvery API. The schemas names are
53
- # returned by `SheetsV4.api_object_schemas.keys`.
57
+ # returned by `SheetsV4.api_object_schema_names`.
54
58
  #
55
59
  # @example
56
- # schema_name = 'BatchUpdateSpreadsheetRequest'
60
+ # schema_name = 'batch_update_spreadsheet_request'
57
61
  # object = { 'requests' => [] }
58
62
  # SheetsV4.validate_api_object(schema_name:, object:)
59
63
  #
@@ -69,6 +73,17 @@ module SheetsV4
69
73
  SheetsV4::ValidateApiObjects::Validate.new(logger:).call(schema_name:, object:)
70
74
  end
71
75
 
76
+ # List the names of the schemas available to use in the Google Sheets API
77
+ #
78
+ # @example List the name of the schemas available
79
+ # SheetsV4.api_object_schema_names #=> ["add_banding_request", "add_banding_response", ...]
80
+ #
81
+ # @return [Array<String>] the names of the schemas available
82
+ #
83
+ def self.api_object_schema_names(logger: Logger.new(nil))
84
+ SheetsV4::ValidateApiObjects::LoadSchemas.new(logger:).call.keys.sort
85
+ end
86
+
72
87
  # Given the name of the color, return a Google Sheets API color object
73
88
  #
74
89
  # Available color names are listed using `SheetsV4.color_names`.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sheets_v4
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Couball
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-10-02 00:00:00.000000000 Z
11
+ date: 2023-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler-audit