google-cloud-firestore 0.24.2 → 0.25.0

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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/CHANGELOG.md +26 -0
  4. data/EMULATOR.md +49 -0
  5. data/lib/google-cloud-firestore.rb +6 -1
  6. data/lib/google/cloud/firestore.rb +36 -8
  7. data/lib/google/cloud/firestore/batch.rb +1 -1
  8. data/lib/google/cloud/firestore/client.rb +152 -4
  9. data/lib/google/cloud/firestore/collection_reference.rb +1 -1
  10. data/lib/google/cloud/firestore/commit_response.rb +1 -1
  11. data/lib/google/cloud/firestore/convert.rb +53 -38
  12. data/lib/google/cloud/firestore/credentials.rb +2 -2
  13. data/lib/google/cloud/firestore/document_reference.rb +2 -1
  14. data/lib/google/cloud/firestore/document_snapshot.rb +5 -5
  15. data/lib/google/cloud/firestore/field_path.rb +2 -2
  16. data/lib/google/cloud/firestore/field_value.rb +139 -9
  17. data/lib/google/cloud/firestore/query.rb +21 -15
  18. data/lib/google/cloud/firestore/query_snapshot.rb +1 -1
  19. data/lib/google/cloud/firestore/service.rb +31 -13
  20. data/lib/google/cloud/firestore/transaction.rb +39 -5
  21. data/lib/google/cloud/firestore/v1.rb +152 -0
  22. data/lib/google/cloud/firestore/v1/credentials.rb +42 -0
  23. data/lib/google/cloud/firestore/v1/doc/google/firestore/v1/common.rb +64 -0
  24. data/lib/google/cloud/firestore/v1/doc/google/firestore/v1/document.rb +136 -0
  25. data/lib/google/cloud/firestore/v1/doc/google/firestore/v1/firestore.rb +574 -0
  26. data/lib/google/cloud/firestore/v1/doc/google/firestore/v1/query.rb +219 -0
  27. data/lib/google/cloud/firestore/v1/doc/google/firestore/v1/write.rb +237 -0
  28. data/lib/google/cloud/firestore/v1/doc/google/protobuf/any.rb +130 -0
  29. data/lib/google/cloud/firestore/v1/doc/google/protobuf/empty.rb +29 -0
  30. data/lib/google/cloud/firestore/v1/doc/google/protobuf/timestamp.rb +109 -0
  31. data/lib/google/cloud/firestore/v1/doc/google/protobuf/wrappers.rb +26 -0
  32. data/lib/google/cloud/firestore/v1/doc/google/rpc/status.rb +84 -0
  33. data/lib/google/cloud/firestore/v1/firestore_client.rb +1044 -0
  34. data/lib/google/cloud/firestore/v1/firestore_client_config.json +100 -0
  35. data/lib/google/cloud/firestore/v1beta1.rb +1 -1
  36. data/lib/google/cloud/firestore/v1beta1/credentials.rb +1 -1
  37. data/lib/google/cloud/firestore/v1beta1/doc/google/firestore/v1beta1/common.rb +1 -1
  38. data/lib/google/cloud/firestore/v1beta1/doc/google/firestore/v1beta1/document.rb +1 -1
  39. data/lib/google/cloud/firestore/v1beta1/doc/google/firestore/v1beta1/firestore.rb +1 -1
  40. data/lib/google/cloud/firestore/v1beta1/doc/google/firestore/v1beta1/query.rb +1 -1
  41. data/lib/google/cloud/firestore/v1beta1/doc/google/firestore/v1beta1/write.rb +41 -1
  42. data/lib/google/cloud/firestore/v1beta1/doc/google/protobuf/any.rb +1 -1
  43. data/lib/google/cloud/firestore/v1beta1/doc/google/protobuf/empty.rb +1 -1
  44. data/lib/google/cloud/firestore/v1beta1/doc/google/protobuf/timestamp.rb +1 -1
  45. data/lib/google/cloud/firestore/v1beta1/doc/google/protobuf/wrappers.rb +1 -65
  46. data/lib/google/cloud/firestore/v1beta1/doc/google/rpc/status.rb +1 -1
  47. data/lib/google/cloud/firestore/v1beta1/firestore_client.rb +1 -1
  48. data/lib/google/cloud/firestore/v1beta1/firestore_client_config.json +1 -1
  49. data/lib/google/cloud/firestore/version.rb +1 -1
  50. data/lib/google/cloud/firestore/watch/enumerator_queue.rb +0 -2
  51. data/lib/google/cloud/firestore/watch/inventory.rb +2 -2
  52. data/lib/google/cloud/firestore/watch/listener.rb +16 -17
  53. data/lib/google/cloud/firestore/watch/order.rb +1 -1
  54. data/lib/google/firestore/v1/common_pb.rb +45 -0
  55. data/lib/google/firestore/v1/document_pb.rb +50 -0
  56. data/lib/google/firestore/v1/firestore_pb.rb +220 -0
  57. data/lib/google/firestore/v1/firestore_services_pb.rb +87 -0
  58. data/lib/google/firestore/v1/query_pb.rb +105 -0
  59. data/lib/google/firestore/v1/write_pb.rb +79 -0
  60. data/lib/google/firestore/v1beta1/firestore_services_pb.rb +2 -1
  61. data/lib/google/firestore/v1beta1/write_pb.rb +3 -0
  62. metadata +26 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a5ba1c47b78cf38ed102313b8069a1cd53404c7a46982fcbd9ec431d824c3b7e
4
- data.tar.gz: 14bdfd709f1e330991d638d40cdb822e173247bc5504c13890a47ce78efc568c
3
+ metadata.gz: 20e48c6792126fe8c5a79b40397c538b31ebc323b14047ffea02469105548a05
4
+ data.tar.gz: fdc7adba72dfb45c176538777c3c7fcd75d0fe17938b2732589e2f7cae52ff73
5
5
  SHA512:
6
- metadata.gz: 871dfc5e79e50134cf47f13cf4c17eae85d12aa0724782d2db56401da2d8f543aded7162ede2c19067cf9d992364aa631dd2ef6a3d82281d24fc0f80ee3d35f7
7
- data.tar.gz: 7cc1808bf7bd93503748619b96db974d14f9780afa6c9b7790a83943220337df4c51eaace902b4f176d7300a0270da5bbde5181998421f2e42d8014bb3917fb8
6
+ metadata.gz: 4b878632115005af9f47874d6ac9655e12a20017786f234c8cf77949a54c3b3a8f67e86d73819e42fc7c0dc62102d5fdee54d3406932e724b4cee6efc99726e1
7
+ data.tar.gz: feb031af0e58139b0e039e8230c1921f72a91e0cdfe5b31d8d3c39823fa1a30e12f1569f26d29a0623ebf0c6790eb5b49bf164c5405c36b447a0d561d0cbdf34
data/.yardopts CHANGED
@@ -9,6 +9,7 @@
9
9
  -
10
10
  OVERVIEW.md
11
11
  AUTHENTICATION.md
12
+ EMULATOR.md
12
13
  LOGGING.md
13
14
  CONTRIBUTING.md
14
15
  TROUBLESHOOTING.md
data/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # Release History
2
2
 
3
+ ### 0.25.0 / 2019-02-01
4
+
5
+ * Switch Firestore to use the V1 API:
6
+ * Add V1 service to the low level API.
7
+ * Add numeric transform methods
8
+ * Add the following methods to Client:
9
+ * Client#field_increment
10
+ * Client#field_maximum
11
+ * Client#field_minimum
12
+ * Add the following methods to FieldValue:
13
+ * FieldValue.increment
14
+ * FieldValue.maximum
15
+ * FieldValue.minimum
16
+ * Add field_mask argument to get_all method:
17
+ * Allows specific portions of the document data to be returned.
18
+ * Add list_collections alias.
19
+ * Make use of Credentials#project_id
20
+ * Use Credentials#project_id
21
+ If a project_id is not provided, use the value on the Credentials object.
22
+ This value was added in googleauth 0.7.0.
23
+ * Loosen googleauth dependency
24
+ Allow for new releases up to 0.10.
25
+ The googleauth devs have committed to maintanining the current API
26
+ and will not make backwards compatible changes before 0.10.
27
+ * Add Firestore emulator support.
28
+
3
29
  ### 0.24.2 / 2018-09-20
4
30
 
5
31
  * Add fix for comparing NaN values
data/EMULATOR.md ADDED
@@ -0,0 +1,49 @@
1
+ # Google Cloud Firestore Emulator
2
+
3
+ To develop and test your application locally, you can use the [Google Cloud
4
+ Firestore
5
+ Emulator](https://cloud.google.com/firestore/docs/security/test-rules-emulator#install_the_emulator),
6
+ which provides local emulation of the production Google Cloud Firestore
7
+ environment. You can start the Google Cloud Firestore emulator using the
8
+ [`firebase` command-line tool](https://firebase.google.com/docs/cli/).
9
+
10
+ When you run the Cloud Firestore emulator you will see a message similar to the
11
+ following printed:
12
+
13
+ ```
14
+ $ firebase serve --only firestore
15
+ API endpoint: http://[::1]:8080
16
+ API endpoint: http://127.0.0.1:8080
17
+ Dev App Server is now running.
18
+ ```
19
+
20
+ Now you can connect to the emulator using the `FIRESTORE_EMULATOR_HOST`
21
+ environment variable:
22
+
23
+ ```ruby
24
+ require "google/cloud/firestore"
25
+
26
+ # Make Firestore use the emulator
27
+ ENV["FIRESTORE_EMULATOR_HOST"] = "127.0.0.1:8080"
28
+
29
+ firestore = Google::Cloud::Firestore.new project_id: "emulator-project-id"
30
+
31
+ # Get a document reference
32
+ nyc_ref = firestore.doc "cities/NYC"
33
+
34
+ nyc_ref.set({ name: "New York City" }) # Document created
35
+ ```
36
+
37
+ Or by providing the `emulator_host` argument:
38
+
39
+ ```ruby
40
+ require "google/cloud/firestore"
41
+
42
+ firestore = Google::Cloud::Firestore.new project_id: "emulator-project-id",
43
+ emulator_host: "127.0.0.1:8080"
44
+
45
+ # Get a document reference
46
+ nyc_ref = firestore.doc "cities/NYC"
47
+
48
+ nyc_ref.set({ name: "New York City" }) # Document created
49
+ ```
@@ -119,14 +119,19 @@ Google::Cloud.configure.add_config! :firestore do |config|
119
119
  "FIRESTORE_KEYFILE", "FIRESTORE_KEYFILE_JSON"
120
120
  )
121
121
  end
122
+ default_emulator = Google::Cloud::Config.deferred do
123
+ ENV["FIRESTORE_EMULATOR_HOST"]
124
+ end
122
125
 
123
126
  config.add_field! :project_id, default_project, match: String, allow_nil: true
124
127
  config.add_alias! :project, :project_id
125
128
  config.add_field! :credentials, default_creds,
126
- match: [String, Hash, Google::Auth::Credentials],
129
+ match: [String, Hash, Google::Auth::Credentials],
127
130
  allow_nil: true
128
131
  config.add_alias! :keyfile, :credentials
129
132
  config.add_field! :scope, nil, match: [String, Array]
130
133
  config.add_field! :timeout, nil, match: Integer
131
134
  config.add_field! :client_config, nil, match: Hash
135
+ config.add_field! :emulator_host, default_emulator,
136
+ match: String, allow_nil: true
132
137
  end
@@ -32,6 +32,9 @@ module Google
32
32
  # See {file:OVERVIEW.md Firestore Overview}.
33
33
  #
34
34
  module Firestore
35
+ # rubocop:disable Metrics/AbcSize
36
+ # rubocop:disable Metrics/MethodLength
37
+
35
38
  ##
36
39
  # Creates a new object for connecting to the Firestore service.
37
40
  # Each call creates a new connection.
@@ -55,6 +58,8 @@ module Google
55
58
  # @param [Integer] timeout Default timeout to use in requests. Optional.
56
59
  # @param [Hash] client_config A hash of values to override the default
57
60
  # behavior of the API client. Optional.
61
+ # @param [String] emulator_host Firestore emulator host. Optional.
62
+ # If the param is nil, uses the value of the `emulator_host` config.
58
63
  # @param [String] project Alias for the `project_id` argument. Deprecated.
59
64
  # @param [String] keyfile Alias for the `credentials` argument.
60
65
  # Deprecated.
@@ -67,28 +72,49 @@ module Google
67
72
  # firestore = Google::Cloud::Firestore.new
68
73
  #
69
74
  def self.new project_id: nil, credentials: nil, scope: nil, timeout: nil,
70
- client_config: nil, project: nil, keyfile: nil
71
- project_id ||= (project || default_project_id)
72
- project_id = project_id.to_s # Always cast to a string
73
- raise ArgumentError, "project_id is missing" if project_id.empty?
74
-
75
- scope ||= configure.scope
76
- timeout ||= configure.timeout
75
+ client_config: nil, emulator_host: nil, project: nil,
76
+ keyfile: nil
77
+ project_id ||= (project || default_project_id)
78
+ scope ||= configure.scope
79
+ timeout ||= configure.timeout
77
80
  client_config ||= configure.client_config
81
+ emulator_host ||= configure.emulator_host
82
+
83
+ if emulator_host
84
+ project_id = project_id.to_s
85
+ raise ArgumentError, "project_id is missing" if project_id.empty?
86
+
87
+ return Firestore::Client.new(
88
+ Firestore::Service.new(
89
+ project_id, :this_channel_is_insecure,
90
+ host: emulator_host, timeout: timeout,
91
+ client_config: client_config
92
+ )
93
+ )
94
+ end
78
95
 
79
96
  credentials ||= (keyfile || default_credentials(scope: scope))
80
97
  unless credentials.is_a? Google::Auth::Credentials
81
98
  credentials = Firestore::Credentials.new credentials, scope: scope
82
99
  end
83
100
 
101
+ if credentials.respond_to? :project_id
102
+ project_id ||= credentials.project_id
103
+ end
104
+ project_id = project_id.to_s
105
+ raise ArgumentError, "project_id is missing" if project_id.empty?
106
+
84
107
  Firestore::Client.new(
85
108
  Firestore::Service.new(
86
- project_id, credentials, timeout: timeout,
109
+ project_id, credentials, timeout: timeout,
87
110
  client_config: client_config
88
111
  )
89
112
  )
90
113
  end
91
114
 
115
+ # rubocop:enable Metrics/AbcSize
116
+ # rubocop:enable Metrics/MethodLength
117
+
92
118
  ##
93
119
  # Configure the Google Cloud Firestore library.
94
120
  #
@@ -105,6 +131,8 @@ module Google
105
131
  # * `timeout` - (Integer) Default timeout to use in requests.
106
132
  # * `client_config` - (Hash) A hash of values to override the default
107
133
  # behavior of the API client.
134
+ # * `emulator_host` - (String) Host name of the emulator. Defaults to
135
+ # `ENV["FIRESTORE_EMULATOR_HOST"]`
108
136
  #
109
137
  # @return [Google::Cloud::Config] The configuration object the
110
138
  # Google::Cloud::Firestore library uses.
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
 
16
- require "google/cloud/firestore/v1beta1"
16
+ require "google/cloud/firestore/v1"
17
17
  require "google/cloud/firestore/collection_reference"
18
18
  require "google/cloud/firestore/document_reference"
19
19
  require "google/cloud/firestore/document_snapshot"
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
 
16
- require "google/cloud/firestore/v1beta1"
16
+ require "google/cloud/firestore/v1"
17
17
  require "google/cloud/firestore/service"
18
18
  require "google/cloud/firestore/field_path"
19
19
  require "google/cloud/firestore/field_value"
@@ -108,6 +108,7 @@ module Google
108
108
  collection_ids.each { |collection_id| yield col(collection_id) }
109
109
  end
110
110
  alias collections cols
111
+ alias list_collections cols
111
112
 
112
113
  ##
113
114
  # Retrieves a collection.
@@ -173,6 +174,17 @@ module Google
173
174
  # @param [String, DocumentReference, Array<String|DocumentReference>]
174
175
  # docs One or more strings representing the path of the document, or
175
176
  # document reference objects.
177
+ # @param [Array<String|FieldPath>] field_mask One or more field path
178
+ # values, representing the fields of the document to be returned. If a
179
+ # document has a field that is not present in this mask, that field
180
+ # will not be returned in the response. All fields are returned when
181
+ # the mask is not set.
182
+ #
183
+ # A field path can either be a {FieldPath} object, or a dotted string
184
+ # representing the nested fields. In other words the string represents
185
+ # individual fields joined by ".". Fields containing `~`, `*`, `/`,
186
+ # `[`, `]`, and `.` cannot be in a dotted string, and should provided
187
+ # using a {FieldPath} object instead. (See {#field_path}.)
176
188
  #
177
189
  # @yield [documents] The block for accessing the document snapshots.
178
190
  # @yieldparam [DocumentSnapshot] document A document snapshot.
@@ -190,16 +202,37 @@ module Google
190
202
  # puts "#{city.document_id} has #{city[:population]} residents."
191
203
  # end
192
204
  #
193
- def get_all *docs
205
+ # @example Get docs using a field mask:
206
+ # require "google/cloud/firestore"
207
+ #
208
+ # firestore = Google::Cloud::Firestore.new
209
+ #
210
+ # # Get and print city documents
211
+ # cities = ["cities/NYC", "cities/SF", "cities/LA"]
212
+ # firestore.get_all(cities, field_mask: [:population]).each do |city|
213
+ # puts "#{city.document_id} has #{city[:population]} residents."
214
+ # end
215
+ #
216
+ def get_all *docs, field_mask: nil
194
217
  ensure_service!
195
218
 
196
- return enum_for(:get_all, docs) unless block_given?
219
+ unless block_given?
220
+ return enum_for(:get_all, docs, field_mask: field_mask)
221
+ end
197
222
 
198
223
  doc_paths = Array(docs).flatten.map do |doc_path|
199
224
  coalesce_doc_path_argument doc_path
200
225
  end
226
+ mask = Array(field_mask).map do |field_path|
227
+ if field_path.is_a? FieldPath
228
+ field_path.formatted_string
229
+ else
230
+ FieldPath.parse(field_path).formatted_string
231
+ end
232
+ end
233
+ mask = nil if mask.empty?
201
234
 
202
- results = service.get_documents doc_paths
235
+ results = service.get_documents doc_paths, mask: mask
203
236
  results.each do |result|
204
237
  next if result.result.nil?
205
238
  yield DocumentSnapshot.from_batch_result(result, self)
@@ -352,6 +385,121 @@ module Google
352
385
  FieldValue.array_delete(*values)
353
386
  end
354
387
 
388
+ ##
389
+ # Creates a sentinel value to indicate the addition the given value to
390
+ # the field's current value.
391
+ #
392
+ # If the field's current value is not an integer or a double value
393
+ # (Numeric), or if the field does not yet exist, the transformation will
394
+ # set the field to the given value. If either of the given value or the
395
+ # current field value are doubles, both values will be interpreted as
396
+ # doubles. Double arithmetic and representation of double values follow
397
+ # IEEE 754 semantics. If there is positive/negative integer overflow,
398
+ # the field is resolved to the largest magnitude positive/negative
399
+ # integer.
400
+ #
401
+ # @param [Numeric] value The value to add to the given value. Required.
402
+ #
403
+ # @return [FieldValue] The increment field value object.
404
+ #
405
+ # @raise [ArgumentError] if the value is not a Numeric.
406
+ #
407
+ # @example
408
+ # require "google/cloud/firestore"
409
+ #
410
+ # firestore = Google::Cloud::Firestore.new
411
+ #
412
+ # # Get a document reference
413
+ # nyc_ref = firestore.doc "cities/NYC"
414
+ #
415
+ # # Set the population to increment by 1.
416
+ # increment_value = firestore.field_increment 1
417
+ #
418
+ # nyc_ref.update({ name: "New York City",
419
+ # population: increment_value })
420
+ #
421
+ def field_increment value
422
+ FieldValue.increment value
423
+ end
424
+
425
+ ##
426
+ # Creates a sentinel value to indicate the setting the field to the
427
+ # maximum of its current value and the given value.
428
+ #
429
+ # If the field is not an integer or double (Numeric), or if the field
430
+ # does not yet exist, the transformation will set the field to the given
431
+ # value. If a maximum operation is applied where the field and the input
432
+ # value are of mixed types (that is - one is an integer and one is a
433
+ # double) the field takes on the type of the larger operand. If the
434
+ # operands are equivalent (e.g. 3 and 3.0), the field does not change.
435
+ # 0, 0.0, and -0.0 are all zero. The maximum of a zero stored value and
436
+ # zero input value is always the stored value. The maximum of any
437
+ # numeric value x and NaN is NaN.
438
+ #
439
+ # @param [Numeric] value The value to compare against the given value to
440
+ # calculate the maximum value to set. Required.
441
+ #
442
+ # @return [FieldValue] The maximum field value object.
443
+ #
444
+ # @raise [ArgumentError] if the value is not a Numeric.
445
+ #
446
+ # @example
447
+ # require "google/cloud/firestore"
448
+ #
449
+ # firestore = Google::Cloud::Firestore.new
450
+ #
451
+ # # Get a document reference
452
+ # nyc_ref = firestore.doc "cities/NYC"
453
+ #
454
+ # # Set the population to be at maximum 4,000,000.
455
+ # maximum_value = firestore.field_maximum 4000000
456
+ #
457
+ # nyc_ref.update({ name: "New York City",
458
+ # population: maximum_value })
459
+ #
460
+ def field_maximum value
461
+ FieldValue.maximum value
462
+ end
463
+
464
+ ##
465
+ # Creates a sentinel value to indicate the setting the field to the
466
+ # minimum of its current value and the given value.
467
+ #
468
+ # If the field is not an integer or double (Numeric), or if the field
469
+ # does not yet exist, the transformation will set the field to the input
470
+ # value. If a minimum operation is applied where the field and the input
471
+ # value are of mixed types (that is - one is an integer and one is a
472
+ # double) the field takes on the type of the smaller operand. If the
473
+ # operands are equivalent (e.g. 3 and 3.0), the field does not change.
474
+ # 0, 0.0, and -0.0 are all zero. The minimum of a zero stored value and
475
+ # zero input value is always the stored value. The minimum of any
476
+ # numeric value x and NaN is NaN.
477
+ #
478
+ # @param [Numeric] value The value to compare against the given value to
479
+ # calculate the minimum value to set. Required.
480
+ #
481
+ # @return [FieldValue] The minimum field value object.
482
+ #
483
+ # @raise [ArgumentError] if the value is not a Numeric.
484
+ #
485
+ # @example
486
+ # require "google/cloud/firestore"
487
+ #
488
+ # firestore = Google::Cloud::Firestore.new
489
+ #
490
+ # # Get a document reference
491
+ # nyc_ref = firestore.doc "cities/NYC"
492
+ #
493
+ # # Set the population to be at minimum 1,000,000.
494
+ # minimum_value = firestore.field_minimum 1000000
495
+ #
496
+ # nyc_ref.update({ name: "New York City",
497
+ # population: minimum_value })
498
+ #
499
+ def field_minimum value
500
+ FieldValue.minimum value
501
+ end
502
+
355
503
  # @!endgroup
356
504
 
357
505
  # @!group Operations
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
 
16
- require "google/cloud/firestore/v1beta1"
16
+ require "google/cloud/firestore/v1"
17
17
  require "google/cloud/firestore/document_reference"
18
18
  require "google/cloud/firestore/document_snapshot"
19
19
  require "google/cloud/firestore/query"
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
 
16
- require "google/cloud/firestore/v1beta1"
16
+ require "google/cloud/firestore/v1"
17
17
  require "google/cloud/firestore/convert"
18
18
 
19
19
  module Google
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
 
16
- require "google/cloud/firestore/v1beta1"
16
+ require "google/cloud/firestore/v1"
17
17
  require "google/cloud/firestore/field_path"
18
18
  require "time"
19
19
  require "stringio"
@@ -85,40 +85,40 @@ module Google
85
85
 
86
86
  def raw_to_value obj
87
87
  if NilClass === obj
88
- Google::Firestore::V1beta1::Value.new null_value: :NULL_VALUE
88
+ Google::Firestore::V1::Value.new null_value: :NULL_VALUE
89
89
  elsif TrueClass === obj || FalseClass === obj
90
- Google::Firestore::V1beta1::Value.new boolean_value: obj
90
+ Google::Firestore::V1::Value.new boolean_value: obj
91
91
  elsif Integer === obj
92
- Google::Firestore::V1beta1::Value.new integer_value: obj
92
+ Google::Firestore::V1::Value.new integer_value: obj
93
93
  elsif Numeric === obj # Any number not an integer is a double
94
- Google::Firestore::V1beta1::Value.new double_value: obj.to_f
94
+ Google::Firestore::V1::Value.new double_value: obj.to_f
95
95
  elsif Time === obj || DateTime === obj || Date === obj
96
- Google::Firestore::V1beta1::Value.new \
96
+ Google::Firestore::V1::Value.new \
97
97
  timestamp_value: time_to_timestamp(obj.to_time)
98
98
  elsif String === obj || Symbol === obj
99
- Google::Firestore::V1beta1::Value.new string_value: obj.to_s
99
+ Google::Firestore::V1::Value.new string_value: obj.to_s
100
100
  elsif Google::Cloud::Firestore::DocumentReference === obj
101
- Google::Firestore::V1beta1::Value.new reference_value: obj.path
101
+ Google::Firestore::V1::Value.new reference_value: obj.path
102
102
  elsif Array === obj
103
103
  values = obj.map { |o| raw_to_value(o) }
104
- Google::Firestore::V1beta1::Value.new(array_value:
105
- Google::Firestore::V1beta1::ArrayValue.new(values: values))
104
+ Google::Firestore::V1::Value.new(array_value:
105
+ Google::Firestore::V1::ArrayValue.new(values: values))
106
106
  elsif Hash === obj
107
107
  # keys have been changed to strings before the hash gets here
108
108
  geo_pairs = hash_is_geo_point? obj
109
109
  if geo_pairs
110
- Google::Firestore::V1beta1::Value.new(
110
+ Google::Firestore::V1::Value.new(
111
111
  geo_point_value: hash_to_geo_point(obj, geo_pairs)
112
112
  )
113
113
  else
114
114
  fields = hash_to_fields obj
115
- Google::Firestore::V1beta1::Value.new(map_value:
116
- Google::Firestore::V1beta1::MapValue.new(fields: fields))
115
+ Google::Firestore::V1::Value.new(map_value:
116
+ Google::Firestore::V1::MapValue.new(fields: fields))
117
117
  end
118
118
  elsif obj.respond_to?(:read) && obj.respond_to?(:rewind)
119
119
  obj.rewind
120
120
  content = obj.read.force_encoding "ASCII-8BIT"
121
- Google::Firestore::V1beta1::Value.new bytes_value: content
121
+ Google::Firestore::V1::Value.new bytes_value: content
122
122
  else
123
123
  raise ArgumentError,
124
124
  "A value of type #{obj.class} is not supported."
@@ -156,11 +156,11 @@ module Google
156
156
  data, field_paths_and_values = remove_field_value_from data
157
157
 
158
158
  if data.any? || field_paths_and_values.empty?
159
- write = Google::Firestore::V1beta1::Write.new(
160
- update: Google::Firestore::V1beta1::Document.new(
159
+ write = Google::Firestore::V1::Write.new(
160
+ update: Google::Firestore::V1::Document.new(
161
161
  name: doc_path,
162
162
  fields: hash_to_fields(data)),
163
- current_document: Google::Firestore::V1beta1::Precondition.new(
163
+ current_document: Google::Firestore::V1::Precondition.new(
164
164
  exists: false)
165
165
  )
166
166
  writes << write
@@ -171,7 +171,7 @@ module Google
171
171
 
172
172
  if data.empty?
173
173
  transform_write.current_document = \
174
- Google::Firestore::V1beta1::Precondition.new(exists: false)
174
+ Google::Firestore::V1::Precondition.new(exists: false)
175
175
  end
176
176
 
177
177
  writes << transform_write
@@ -207,8 +207,8 @@ module Google
207
207
 
208
208
  data, field_paths_and_values = remove_field_value_from data
209
209
 
210
- writes << Google::Firestore::V1beta1::Write.new(
211
- update: Google::Firestore::V1beta1::Document.new(
210
+ writes << Google::Firestore::V1::Write.new(
211
+ update: Google::Firestore::V1::Document.new(
212
212
  name: doc_path,
213
213
  fields: hash_to_fields(data))
214
214
  )
@@ -278,11 +278,11 @@ module Google
278
278
  end
279
279
 
280
280
  if data.any? || field_paths.any? || (allow_empty && field_paths_and_values.empty?)
281
- writes << Google::Firestore::V1beta1::Write.new(
282
- update: Google::Firestore::V1beta1::Document.new(
281
+ writes << Google::Firestore::V1::Write.new(
282
+ update: Google::Firestore::V1::Document.new(
283
283
  name: doc_path,
284
284
  fields: hash_to_fields(data)),
285
- update_mask: Google::Firestore::V1beta1::DocumentMask.new(
285
+ update_mask: Google::Firestore::V1::DocumentMask.new(
286
286
  field_paths: field_paths.map(&:formatted_string).sort)
287
287
  )
288
288
  end
@@ -339,18 +339,18 @@ module Google
339
339
  end
340
340
 
341
341
  if data.any? || delete_paths.any?
342
- write = Google::Firestore::V1beta1::Write.new(
343
- update: Google::Firestore::V1beta1::Document.new(
342
+ write = Google::Firestore::V1::Write.new(
343
+ update: Google::Firestore::V1::Document.new(
344
344
  name: doc_path,
345
345
  fields: hash_to_fields(data)),
346
- update_mask: Google::Firestore::V1beta1::DocumentMask.new(
346
+ update_mask: Google::Firestore::V1::DocumentMask.new(
347
347
  field_paths: (field_paths).map(&:formatted_string).sort),
348
- current_document: Google::Firestore::V1beta1::Precondition.new(
348
+ current_document: Google::Firestore::V1::Precondition.new(
349
349
  exists: true)
350
350
  )
351
351
  if update_time
352
352
  write.current_document = \
353
- Google::Firestore::V1beta1::Precondition.new(
353
+ Google::Firestore::V1::Precondition.new(
354
354
  update_time: time_to_timestamp(update_time))
355
355
  end
356
356
  writes << write
@@ -360,7 +360,7 @@ module Google
360
360
  transform_write = transform_write doc_path, field_paths_and_values
361
361
  if data.empty?
362
362
  transform_write.current_document = \
363
- Google::Firestore::V1beta1::Precondition.new(exists: true)
363
+ Google::Firestore::V1::Precondition.new(exists: true)
364
364
  end
365
365
  writes << transform_write
366
366
  end
@@ -373,13 +373,13 @@ module Google
373
373
  raise ArgumentError, "cannot specify both exists and update_time"
374
374
  end
375
375
 
376
- write = Google::Firestore::V1beta1::Write.new(
376
+ write = Google::Firestore::V1::Write.new(
377
377
  delete: doc_path
378
378
  )
379
379
 
380
380
  unless exists.nil? && update_time.nil?
381
381
  write.current_document = \
382
- Google::Firestore::V1beta1::Precondition.new({
382
+ Google::Firestore::V1::Precondition.new({
383
383
  exists: exists, update_time: time_to_timestamp(update_time)
384
384
  }.delete_if { |_, v| v.nil? })
385
385
  end
@@ -584,8 +584,8 @@ module Google
584
584
  to_field_transform field_path, field_value
585
585
  end
586
586
 
587
- Google::Firestore::V1beta1::Write.new(
588
- transform: Google::Firestore::V1beta1::DocumentTransform.new(
587
+ Google::Firestore::V1::Write.new(
588
+ transform: Google::Firestore::V1::DocumentTransform.new(
589
589
  document: doc_path,
590
590
  field_transforms: field_transforms
591
591
  )
@@ -594,19 +594,34 @@ module Google
594
594
 
595
595
  def to_field_transform field_path, field_value
596
596
  if field_value.type == :server_time
597
- Google::Firestore::V1beta1::DocumentTransform::FieldTransform.new(
597
+ Google::Firestore::V1::DocumentTransform::FieldTransform.new(
598
598
  field_path: field_path.formatted_string,
599
599
  set_to_server_value: :REQUEST_TIME
600
600
  )
601
601
  elsif field_value.type == :array_union
602
- Google::Firestore::V1beta1::DocumentTransform::FieldTransform.new(
602
+ Google::Firestore::V1::DocumentTransform::FieldTransform.new(
603
603
  field_path: field_path.formatted_string,
604
- append_missing_elements: raw_to_value(Array(field_value.values)).array_value
604
+ append_missing_elements: raw_to_value(Array(field_value.value)).array_value
605
605
  )
606
606
  elsif field_value.type == :array_delete
607
- Google::Firestore::V1beta1::DocumentTransform::FieldTransform.new(
607
+ Google::Firestore::V1::DocumentTransform::FieldTransform.new(
608
608
  field_path: field_path.formatted_string,
609
- remove_all_from_array: raw_to_value(Array(field_value.values)).array_value
609
+ remove_all_from_array: raw_to_value(Array(field_value.value)).array_value
610
+ )
611
+ elsif field_value.type == :increment
612
+ Google::Firestore::V1::DocumentTransform::FieldTransform.new(
613
+ field_path: field_path.formatted_string,
614
+ increment: raw_to_value(field_value.value)
615
+ )
616
+ elsif field_value.type == :maximum
617
+ Google::Firestore::V1::DocumentTransform::FieldTransform.new(
618
+ field_path: field_path.formatted_string,
619
+ maximum: raw_to_value(field_value.value)
620
+ )
621
+ elsif field_value.type == :minimum
622
+ Google::Firestore::V1::DocumentTransform::FieldTransform.new(
623
+ field_path: field_path.formatted_string,
624
+ minimum: raw_to_value(field_value.value)
610
625
  )
611
626
  else
612
627
  raise ArgumentError, "unknown field transform #{field_value.type}"