google-cloud-datastore 1.3.0 → 1.4.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.
- checksums.yaml +4 -4
- data/lib/google-cloud-datastore.rb +30 -0
- data/lib/google/cloud/datastore.rb +68 -13
- data/lib/google/cloud/datastore/commit.rb +1 -1
- data/lib/google/cloud/datastore/convert.rb +1 -1
- data/lib/google/cloud/datastore/credentials.rb +6 -6
- data/lib/google/cloud/datastore/dataset.rb +25 -35
- data/lib/google/cloud/datastore/dataset/lookup_results.rb +15 -13
- data/lib/google/cloud/datastore/dataset/query_results.rb +3 -2
- data/lib/google/cloud/datastore/entity.rb +5 -3
- data/lib/google/cloud/datastore/gql_query.rb +8 -4
- data/lib/google/cloud/datastore/key.rb +6 -5
- data/lib/google/cloud/datastore/properties.rb +5 -5
- data/lib/google/cloud/datastore/query.rb +16 -10
- data/lib/google/cloud/datastore/read_only_transaction.rb +11 -10
- data/lib/google/cloud/datastore/service.rb +15 -8
- data/lib/google/cloud/datastore/transaction.rb +11 -10
- data/lib/google/cloud/datastore/version.rb +1 -1
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5158282d2e12b211e22031224f6f4e18e48e621f824cf21411cf7d4283f3150
|
4
|
+
data.tar.gz: 88de52c6fab28a2e66ad66dc96867c19b08a665da4eb61d478538472ea83ff27
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38d06cae20a6f5ed9125af1aa2a2314d18290608fe0dbf810c3cdea855ca615fb1de64ccb05e04c16a5fc63acd3786fc4fc24c25d8cba5238c38137785662fda
|
7
|
+
data.tar.gz: 411b854b3f2f1f05d274da447b3779b79b19ba2831db349d52bf139bbdda1cc72750c530764ba586da9ae0ebe4b51ae0a040853494d3b327942a6e719a11e0dc
|
@@ -20,6 +20,8 @@
|
|
20
20
|
|
21
21
|
gem "google-cloud-core"
|
22
22
|
require "google/cloud"
|
23
|
+
require "google/cloud/config"
|
24
|
+
require "googleauth"
|
23
25
|
|
24
26
|
module Google
|
25
27
|
module Cloud
|
@@ -123,3 +125,31 @@ module Google
|
|
123
125
|
end
|
124
126
|
end
|
125
127
|
end
|
128
|
+
|
129
|
+
# Set the default bigquery configuration
|
130
|
+
Google::Cloud.configure.add_config! :datastore do |config|
|
131
|
+
default_project = Google::Cloud::Config.deferred do
|
132
|
+
ENV["DATASTORE_DATASET"] || ENV["DATASTORE_PROJECT"]
|
133
|
+
end
|
134
|
+
default_creds = Google::Cloud::Config.deferred do
|
135
|
+
Google::Cloud::Config.credentials_from_env(
|
136
|
+
"DATASTORE_CREDENTIALS", "DATASTORE_CREDENTIALS_JSON",
|
137
|
+
"DATASTORE_KEYFILE", "DATASTORE_KEYFILE_JSON"
|
138
|
+
)
|
139
|
+
end
|
140
|
+
default_emulator = Google::Cloud::Config.deferred do
|
141
|
+
ENV["DATASTORE_EMULATOR_HOST"]
|
142
|
+
end
|
143
|
+
|
144
|
+
config.add_field! :project_id, default_project, match: String, allow_nil: true
|
145
|
+
config.add_alias! :project, :project_id
|
146
|
+
config.add_field! :credentials, default_creds,
|
147
|
+
match: [String, Hash, Google::Auth::Credentials],
|
148
|
+
allow_nil: true
|
149
|
+
config.add_alias! :keyfile, :credentials
|
150
|
+
config.add_field! :scope, nil, match: [String, Array]
|
151
|
+
config.add_field! :timeout, nil, match: Integer
|
152
|
+
config.add_field! :client_config, nil, match: Hash
|
153
|
+
config.add_field! :emulator_host, default_emulator,
|
154
|
+
match: String, allow_nil: true
|
155
|
+
end
|
@@ -18,6 +18,8 @@ require "google/cloud/datastore/errors"
|
|
18
18
|
require "google/cloud/datastore/dataset"
|
19
19
|
require "google/cloud/datastore/transaction"
|
20
20
|
require "google/cloud/datastore/credentials"
|
21
|
+
require "google/cloud/config"
|
22
|
+
require "google/cloud/env"
|
21
23
|
|
22
24
|
module Google
|
23
25
|
module Cloud
|
@@ -29,11 +31,14 @@ module Google
|
|
29
31
|
# relational databases, but there are some key differences to be aware of to
|
30
32
|
# make the most of using Datastore.
|
31
33
|
#
|
32
|
-
# The goal of google-cloud is to provide
|
33
|
-
# Rubyists.
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
34
|
+
# The goal of google-cloud is to provide an API that is comfortable to
|
35
|
+
# Rubyists. Your authentication credentials are detected automatically in
|
36
|
+
# Google Cloud Platform environments such as Google Compute Engine, Google
|
37
|
+
# App Engine and Google Kubernetes Engine. In other environments you can
|
38
|
+
# configure authentication easily, either directly in your code or via
|
39
|
+
# environment variables. Read more about the options for connecting in the
|
40
|
+
# [Authentication
|
41
|
+
# Guide](https://googlecloudplatform.github.io/google-cloud-ruby/#/docs/guides/authentication).
|
37
42
|
#
|
38
43
|
# ```ruby
|
39
44
|
# require "google/cloud/datastore"
|
@@ -586,7 +591,7 @@ module Google
|
|
586
591
|
# @param [Hash] client_config A hash of values to override the default
|
587
592
|
# behavior of the API client. See Google::Gax::CallSettings. Optional.
|
588
593
|
# @param [String] emulator_host Datastore emulator host. Optional.
|
589
|
-
# If the param is nil,
|
594
|
+
# If the param is nil, uses the value of the `emulator_host` config.
|
590
595
|
# @param [String] project Alias for the `project_id` argument. Deprecated.
|
591
596
|
# @param [String] keyfile Alias for the `credentials` argument.
|
592
597
|
# Deprecated.
|
@@ -613,20 +618,24 @@ module Google
|
|
613
618
|
def self.new project_id: nil, credentials: nil, scope: nil, timeout: nil,
|
614
619
|
client_config: nil, emulator_host: nil, project: nil,
|
615
620
|
keyfile: nil
|
616
|
-
project_id ||= (project ||
|
621
|
+
project_id ||= (project || default_project_id)
|
617
622
|
project_id = project_id.to_s # Always cast to a string
|
618
|
-
|
623
|
+
raise ArgumentError, "project_id is missing" if project_id.empty?
|
619
624
|
|
620
|
-
|
625
|
+
scope ||= configure.scope
|
626
|
+
timeout ||= configure.timeout
|
627
|
+
client_config ||= configure.client_config
|
628
|
+
emulator_host ||= configure.emulator_host
|
621
629
|
if emulator_host
|
622
630
|
return Datastore::Dataset.new(
|
623
631
|
Datastore::Service.new(
|
624
632
|
project_id, :this_channel_is_insecure,
|
625
|
-
host: emulator_host, client_config: client_config
|
633
|
+
host: emulator_host, client_config: client_config
|
634
|
+
)
|
635
|
+
)
|
626
636
|
end
|
627
637
|
|
628
|
-
credentials ||= keyfile
|
629
|
-
credentials ||= Datastore::Credentials.default(scope: scope)
|
638
|
+
credentials ||= (keyfile || default_credentials(scope: scope))
|
630
639
|
unless credentials.is_a? Google::Auth::Credentials
|
631
640
|
credentials = Datastore::Credentials.new credentials, scope: scope
|
632
641
|
end
|
@@ -634,7 +643,53 @@ module Google
|
|
634
643
|
Datastore::Dataset.new(
|
635
644
|
Datastore::Service.new(
|
636
645
|
project_id, credentials,
|
637
|
-
timeout: timeout, client_config: client_config
|
646
|
+
timeout: timeout, client_config: client_config
|
647
|
+
)
|
648
|
+
)
|
649
|
+
end
|
650
|
+
|
651
|
+
##
|
652
|
+
# Configure the Google Cloud Datastore library.
|
653
|
+
#
|
654
|
+
# The following Datastore configuration parameters are supported:
|
655
|
+
#
|
656
|
+
# * `project_id` - (String) Identifier for a Datastore project. (The
|
657
|
+
# parameter `project` is considered deprecated, but may also be used.)
|
658
|
+
# * `credentials` - (String, Hash, Google::Auth::Credentials) The path to
|
659
|
+
# the keyfile as a String, the contents of the keyfile as a Hash, or a
|
660
|
+
# Google::Auth::Credentials object. (See {Datastore::Credentials}) (The
|
661
|
+
# parameter `keyfile` is considered deprecated, but may also be used.)
|
662
|
+
# * `scope` - (String, Array<String>) The OAuth 2.0 scopes controlling
|
663
|
+
# the set of resources and operations that the connection can access.
|
664
|
+
# * `timeout` - (Integer) Default timeout to use in requests.
|
665
|
+
# * `client_config` - (Hash) A hash of values to override the default
|
666
|
+
# behavior of the API client.
|
667
|
+
# * `emulator_host` - (String) Host name of the emulator. Defaults to
|
668
|
+
# `ENV["DATASTORE_EMULATOR_HOST"]`
|
669
|
+
#
|
670
|
+
# @return [Google::Cloud::Config] The configuration object the
|
671
|
+
# Google::Cloud::Datastore library uses.
|
672
|
+
#
|
673
|
+
def self.configure
|
674
|
+
yield Google::Cloud.configure.datastore if block_given?
|
675
|
+
|
676
|
+
Google::Cloud.configure.datastore
|
677
|
+
end
|
678
|
+
|
679
|
+
##
|
680
|
+
# @private Default project.
|
681
|
+
def self.default_project_id
|
682
|
+
Google::Cloud.configure.datastore.project_id ||
|
683
|
+
Google::Cloud.configure.project_id ||
|
684
|
+
Google::Cloud.env.project_id
|
685
|
+
end
|
686
|
+
|
687
|
+
##
|
688
|
+
# @private Default credentials.
|
689
|
+
def self.default_credentials scope: nil
|
690
|
+
Google::Cloud.configure.datastore.credentials ||
|
691
|
+
Google::Cloud.configure.credentials ||
|
692
|
+
Datastore::Credentials.default(scope: scope)
|
638
693
|
end
|
639
694
|
end
|
640
695
|
end
|
@@ -146,7 +146,7 @@ module Google
|
|
146
146
|
value.rewind
|
147
147
|
v.blob_value = value.read.force_encoding("ASCII-8BIT")
|
148
148
|
else
|
149
|
-
|
149
|
+
raise Google::Cloud::Datastore::PropertyError,
|
150
150
|
"A property of type #{value.class} is not supported."
|
151
151
|
end
|
152
152
|
v
|
@@ -38,19 +38,19 @@ module Google
|
|
38
38
|
# datastore.project_id #=> "my-todo-project"
|
39
39
|
#
|
40
40
|
class Credentials < Google::Auth::Credentials
|
41
|
-
SCOPE = ["https://www.googleapis.com/auth/datastore"]
|
42
|
-
PATH_ENV_VARS = %w
|
41
|
+
SCOPE = ["https://www.googleapis.com/auth/datastore"].freeze
|
42
|
+
PATH_ENV_VARS = %w[DATASTORE_CREDENTIALS
|
43
43
|
DATASTORE_KEYFILE
|
44
44
|
GOOGLE_CLOUD_CREDENTIALS
|
45
45
|
GOOGLE_CLOUD_KEYFILE
|
46
|
-
GCLOUD_KEYFILE
|
47
|
-
JSON_ENV_VARS = %w
|
46
|
+
GCLOUD_KEYFILE].freeze
|
47
|
+
JSON_ENV_VARS = %w[DATASTORE_CREDENTIALS_JSON
|
48
48
|
DATASTORE_KEYFILE_JSON
|
49
49
|
GOOGLE_CLOUD_CREDENTIALS_JSON
|
50
50
|
GOOGLE_CLOUD_KEYFILE_JSON
|
51
|
-
GCLOUD_KEYFILE_JSON
|
51
|
+
GCLOUD_KEYFILE_JSON].freeze
|
52
52
|
DEFAULT_PATHS = \
|
53
|
-
["~/.config/gcloud/application_default_credentials.json"]
|
53
|
+
["~/.config/gcloud/application_default_credentials.json"].freeze
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
@@ -13,7 +13,6 @@
|
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
15
|
|
16
|
-
require "google/cloud/env"
|
17
16
|
require "google/cloud/datastore/convert"
|
18
17
|
require "google/cloud/datastore/credentials"
|
19
18
|
require "google/cloud/datastore/service"
|
@@ -82,17 +81,7 @@ module Google
|
|
82
81
|
def project_id
|
83
82
|
service.project
|
84
83
|
end
|
85
|
-
|
86
|
-
|
87
|
-
##
|
88
|
-
# @private Default project_id.
|
89
|
-
def self.default_project_id
|
90
|
-
ENV["DATASTORE_DATASET"] ||
|
91
|
-
ENV["DATASTORE_PROJECT"] ||
|
92
|
-
ENV["GOOGLE_CLOUD_PROJECT"] ||
|
93
|
-
ENV["GCLOUD_PROJECT"] ||
|
94
|
-
Google::Cloud.env.project_id
|
95
|
-
end
|
84
|
+
alias project project_id
|
96
85
|
|
97
86
|
##
|
98
87
|
# Generate IDs for a Key before creating an entity.
|
@@ -112,12 +101,11 @@ module Google
|
|
112
101
|
#
|
113
102
|
def allocate_ids incomplete_key, count = 1
|
114
103
|
if incomplete_key.complete?
|
115
|
-
|
116
|
-
"An incomplete key must be provided."
|
104
|
+
raise Datastore::KeyError, "An incomplete key must be provided."
|
117
105
|
end
|
118
106
|
|
119
107
|
ensure_service!
|
120
|
-
incomplete_keys = count
|
108
|
+
incomplete_keys = Array.new(count) { incomplete_key.to_grpc }
|
121
109
|
allocate_res = service.allocate_ids(*incomplete_keys)
|
122
110
|
allocate_res.keys.map { |key| Key.from_grpc key }
|
123
111
|
end
|
@@ -177,7 +165,7 @@ module Google
|
|
177
165
|
def save *entities
|
178
166
|
commit { |c| c.save(*entities) }
|
179
167
|
end
|
180
|
-
|
168
|
+
alias upsert save
|
181
169
|
|
182
170
|
##
|
183
171
|
# Insert one or more entities to the Datastore. An InvalidArgumentError
|
@@ -353,7 +341,7 @@ module Google
|
|
353
341
|
end
|
354
342
|
find_all(key, consistency: consistency).first
|
355
343
|
end
|
356
|
-
|
344
|
+
alias get find
|
357
345
|
|
358
346
|
##
|
359
347
|
# Retrieve the entities for the provided keys. The order of results is
|
@@ -387,7 +375,7 @@ module Google
|
|
387
375
|
consistency: consistency)
|
388
376
|
LookupResults.from_grpc lookup_res, service, consistency
|
389
377
|
end
|
390
|
-
|
378
|
+
alias lookup find_all
|
391
379
|
|
392
380
|
##
|
393
381
|
# Retrieve entities specified by a Query.
|
@@ -455,7 +443,7 @@ module Google
|
|
455
443
|
def run query, namespace: nil, consistency: nil
|
456
444
|
ensure_service!
|
457
445
|
unless query.is_a?(Query) || query.is_a?(GqlQuery)
|
458
|
-
|
446
|
+
raise ArgumentError, "Cannot run a #{query.class} object."
|
459
447
|
end
|
460
448
|
check_consistency! consistency
|
461
449
|
query_res = service.run_query query.to_grpc, namespace,
|
@@ -463,7 +451,7 @@ module Google
|
|
463
451
|
QueryResults.from_grpc query_res, service, namespace,
|
464
452
|
query.to_grpc.dup
|
465
453
|
end
|
466
|
-
|
454
|
+
alias run_query run
|
467
455
|
|
468
456
|
##
|
469
457
|
# Creates a Datastore Transaction.
|
@@ -557,10 +545,10 @@ module Google
|
|
557
545
|
# Create new transaction and retry the block
|
558
546
|
tx = Transaction.new service, previous_transaction: tx.id
|
559
547
|
retry
|
560
|
-
rescue
|
548
|
+
rescue StandardError
|
561
549
|
begin
|
562
550
|
tx.rollback
|
563
|
-
rescue
|
551
|
+
rescue StandardError
|
564
552
|
raise TransactionError,
|
565
553
|
"Transaction failed to commit and rollback."
|
566
554
|
end
|
@@ -614,17 +602,17 @@ module Google
|
|
614
602
|
begin
|
615
603
|
yield tx
|
616
604
|
tx.commit
|
617
|
-
rescue
|
605
|
+
rescue StandardError
|
618
606
|
begin
|
619
607
|
tx.rollback
|
620
|
-
rescue
|
608
|
+
rescue StandardError
|
621
609
|
raise TransactionError,
|
622
610
|
"Transaction failed to commit and rollback."
|
623
611
|
end
|
624
612
|
raise TransactionError, "Transaction failed to commit."
|
625
613
|
end
|
626
614
|
end
|
627
|
-
|
615
|
+
alias snapshot read_only_transaction
|
628
616
|
|
629
617
|
##
|
630
618
|
# Create a new Query instance. This is a convenience method to make the
|
@@ -868,11 +856,11 @@ module Google
|
|
868
856
|
entity = Entity.new
|
869
857
|
|
870
858
|
# Set the key
|
871
|
-
if key_or_path.flatten.first.is_a?
|
872
|
-
|
873
|
-
|
874
|
-
|
875
|
-
|
859
|
+
entity.key = if key_or_path.flatten.first.is_a? Datastore::Key
|
860
|
+
key_or_path.flatten.first
|
861
|
+
else
|
862
|
+
key key_or_path, project: project, namespace: namespace
|
863
|
+
end
|
876
864
|
|
877
865
|
yield entity if block_given?
|
878
866
|
|
@@ -885,7 +873,7 @@ module Google
|
|
885
873
|
# @private Raise an error unless an active connection to the service is
|
886
874
|
# available.
|
887
875
|
def ensure_service!
|
888
|
-
|
876
|
+
raise "Must have active connection to service" unless service
|
889
877
|
end
|
890
878
|
|
891
879
|
def validate_deadline deadline
|
@@ -895,10 +883,12 @@ module Google
|
|
895
883
|
end
|
896
884
|
|
897
885
|
def check_consistency! consistency
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
886
|
+
return if [:eventual, :strong, nil].include? consistency
|
887
|
+
|
888
|
+
error_msg = format("Consistency must be :eventual or :strong, " \
|
889
|
+
"not %<bad_consistency>s.",
|
890
|
+
bad_consistency: consistency.inspect)
|
891
|
+
raise ArgumentError, error_msg
|
902
892
|
end
|
903
893
|
end
|
904
894
|
end
|
@@ -110,7 +110,8 @@ module Google
|
|
110
110
|
ensure_service!
|
111
111
|
lookup_res = @service.lookup(
|
112
112
|
*Array(@deferred).flatten.map(&:to_grpc),
|
113
|
-
consistency: @consistency, transaction: @transaction
|
113
|
+
consistency: @consistency, transaction: @transaction
|
114
|
+
)
|
114
115
|
self.class.from_grpc lookup_res, @service, @consistency
|
115
116
|
end
|
116
117
|
|
@@ -199,18 +200,8 @@ module Google
|
|
199
200
|
end
|
200
201
|
end
|
201
202
|
|
202
|
-
protected
|
203
|
-
|
204
|
-
##
|
205
|
-
# @private Raise an error unless an active connection to the service
|
206
|
-
# is available.
|
207
|
-
def ensure_service!
|
208
|
-
msg = "Must have active connection to datastore service to get next"
|
209
|
-
fail msg if @service.nil?
|
210
|
-
end
|
211
|
-
|
212
203
|
##
|
213
|
-
# Convenience method to convert GRPC entities to google-cloud
|
204
|
+
# @private Convenience method to convert GRPC entities to google-cloud
|
214
205
|
# entities.
|
215
206
|
def self.to_gcloud_entities grpc_entity_results
|
216
207
|
# Entities are nested in an object.
|
@@ -221,11 +212,22 @@ module Google
|
|
221
212
|
end
|
222
213
|
|
223
214
|
##
|
224
|
-
# Convenience method to convert GRPC keys to google-cloud
|
215
|
+
# @private Convenience method to convert GRPC keys to google-cloud
|
216
|
+
# keys.
|
225
217
|
def self.to_gcloud_keys grpc_keys
|
226
218
|
# Keys are not nested in an object like entities are.
|
227
219
|
Array(grpc_keys).map { |key| Key.from_grpc key }
|
228
220
|
end
|
221
|
+
|
222
|
+
protected
|
223
|
+
|
224
|
+
##
|
225
|
+
# @private Raise an error unless an active connection to the service
|
226
|
+
# is available.
|
227
|
+
def ensure_service!
|
228
|
+
msg = "Must have active connection to datastore service to get next"
|
229
|
+
raise msg if @service.nil?
|
230
|
+
end
|
229
231
|
end
|
230
232
|
end
|
231
233
|
end
|
@@ -59,7 +59,7 @@ module Google
|
|
59
59
|
#
|
60
60
|
# @return [Google::Cloud::Datastore::Cursor]
|
61
61
|
attr_reader :end_cursor
|
62
|
-
|
62
|
+
alias cursor end_cursor
|
63
63
|
|
64
64
|
##
|
65
65
|
# The state of the query after the current batch.
|
@@ -157,6 +157,7 @@ module Google
|
|
157
157
|
return nil if end_cursor.nil?
|
158
158
|
ensure_service!
|
159
159
|
query.start_cursor = cursor.to_grpc # should always be a Cursor...
|
160
|
+
query.offset = 0 # Never carry an offset across batches
|
160
161
|
query_res = service.run_query query, namespace
|
161
162
|
self.class.from_grpc query_res, service, namespace, query
|
162
163
|
end
|
@@ -378,7 +379,7 @@ module Google
|
|
378
379
|
# is available.
|
379
380
|
def ensure_service!
|
380
381
|
msg = "Must have active connection to datastore service to get next"
|
381
|
-
|
382
|
+
raise msg if @service.nil? || @query.nil?
|
382
383
|
end
|
383
384
|
end
|
384
385
|
end
|
@@ -267,12 +267,14 @@ module Google
|
|
267
267
|
#
|
268
268
|
# task = datastore.find "Task", "sampleTask"
|
269
269
|
# task.persisted? #=> true
|
270
|
-
#
|
270
|
+
# # Because the entity is persisted, the following would raise
|
271
|
+
# # task.key = datastore.key "Task"
|
271
272
|
# task.key.frozen? #=> true
|
272
|
-
#
|
273
|
+
# # Because the key is frozen, the following would raise
|
274
|
+
# # task.key.id = 9876543221
|
273
275
|
#
|
274
276
|
def key= new_key
|
275
|
-
|
277
|
+
raise "This entity's key is immutable." if persisted?
|
276
278
|
@key = new_key
|
277
279
|
end
|
278
280
|
|
@@ -160,11 +160,13 @@ module Google
|
|
160
160
|
if value.is_a? Google::Cloud::Datastore::Cursor
|
161
161
|
@grpc.named_bindings[name.to_s] = \
|
162
162
|
Google::Datastore::V1::GqlQueryParameter.new(
|
163
|
-
cursor: value.to_grpc
|
163
|
+
cursor: value.to_grpc
|
164
|
+
)
|
164
165
|
else
|
165
166
|
@grpc.named_bindings[name.to_s] = \
|
166
167
|
Google::Datastore::V1::GqlQueryParameter.new(
|
167
|
-
value: Convert.to_value(value)
|
168
|
+
value: Convert.to_value(value)
|
169
|
+
)
|
168
170
|
end
|
169
171
|
end
|
170
172
|
end
|
@@ -209,11 +211,13 @@ module Google
|
|
209
211
|
if value.is_a? Google::Cloud::Datastore::Cursor
|
210
212
|
@grpc.positional_bindings << \
|
211
213
|
Google::Datastore::V1::GqlQueryParameter.new(
|
212
|
-
cursor: value.to_grpc
|
214
|
+
cursor: value.to_grpc
|
215
|
+
)
|
213
216
|
else
|
214
217
|
@grpc.positional_bindings << \
|
215
218
|
Google::Datastore::V1::GqlQueryParameter.new(
|
216
|
-
value: Convert.to_value(value)
|
219
|
+
value: Convert.to_value(value)
|
220
|
+
)
|
217
221
|
end
|
218
222
|
end
|
219
223
|
end
|
@@ -64,10 +64,10 @@ module Google
|
|
64
64
|
# task.key.project #=> "my-todo-project"
|
65
65
|
#
|
66
66
|
attr_accessor :project
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
alias project_id project
|
68
|
+
alias project_id= project=
|
69
|
+
alias dataset_id project
|
70
|
+
alias dataset_id= project=
|
71
71
|
|
72
72
|
##
|
73
73
|
# The namespace of the Key.
|
@@ -282,7 +282,8 @@ module Google
|
|
282
282
|
grpc = Google::Datastore::V1::Key.new(path: grpc_path)
|
283
283
|
if project || namespace
|
284
284
|
grpc.partition_id = Google::Datastore::V1::PartitionId.new(
|
285
|
-
project_id: project.to_s, namespace_id: namespace.to_s
|
285
|
+
project_id: project.to_s, namespace_id: namespace.to_s
|
286
|
+
)
|
286
287
|
end
|
287
288
|
grpc
|
288
289
|
end
|
@@ -38,14 +38,14 @@ module Google
|
|
38
38
|
key = ensure_key_type key
|
39
39
|
@hash[key]
|
40
40
|
end
|
41
|
-
|
41
|
+
alias read []
|
42
42
|
|
43
43
|
def []= key, value
|
44
44
|
key = ensure_key_type key
|
45
45
|
value = ensure_value_type value
|
46
46
|
@hash[key] = value
|
47
47
|
end
|
48
|
-
|
48
|
+
alias write []=
|
49
49
|
|
50
50
|
def exist? key
|
51
51
|
key = ensure_key_type key
|
@@ -70,7 +70,7 @@ module Google
|
|
70
70
|
def to_h
|
71
71
|
@hash.dup
|
72
72
|
end
|
73
|
-
|
73
|
+
alias to_hash to_h
|
74
74
|
|
75
75
|
def to_grpc
|
76
76
|
# Convert to Hash with Google::Datastore::V1::Value values.
|
@@ -89,7 +89,7 @@ module Google
|
|
89
89
|
# otherwise a PropertyError is raised.
|
90
90
|
def ensure_key_type key
|
91
91
|
return key.to_s if key.respond_to? :to_s
|
92
|
-
|
92
|
+
raise "Property key #{key} must be a String."
|
93
93
|
end
|
94
94
|
|
95
95
|
# rubocop:disable all
|
@@ -120,7 +120,7 @@ module Google
|
|
120
120
|
elsif defined?(BigDecimal) && BigDecimal === value
|
121
121
|
return value
|
122
122
|
end
|
123
|
-
|
123
|
+
raise PropertyError, "A property of type #{value.class} is not supported."
|
124
124
|
end
|
125
125
|
# rubocop:enable all
|
126
126
|
end
|
@@ -84,7 +84,8 @@ module Google
|
|
84
84
|
def kind *kinds
|
85
85
|
kinds.each do |kind|
|
86
86
|
grpc_kind = Google::Datastore::V1::KindExpression.new(
|
87
|
-
name: kind
|
87
|
+
name: kind
|
88
|
+
)
|
88
89
|
@grpc.kind << grpc_kind
|
89
90
|
end
|
90
91
|
|
@@ -185,7 +186,8 @@ module Google
|
|
185
186
|
Google::Datastore::V1::Filter.new(
|
186
187
|
property_filter: Google::Datastore::V1::PropertyFilter.new(
|
187
188
|
property: Google::Datastore::V1::PropertyReference.new(
|
188
|
-
name: name
|
189
|
+
name: name
|
190
|
+
),
|
189
191
|
op: Convert.to_prop_filter_op(operator),
|
190
192
|
value: Convert.to_value(value)
|
191
193
|
)
|
@@ -193,7 +195,7 @@ module Google
|
|
193
195
|
|
194
196
|
self
|
195
197
|
end
|
196
|
-
|
198
|
+
alias filter where
|
197
199
|
|
198
200
|
##
|
199
201
|
# Add a filter for entities that inherit from a key.
|
@@ -273,7 +275,8 @@ module Google
|
|
273
275
|
def order name, direction = :asc
|
274
276
|
@grpc.order << Google::Datastore::V1::PropertyOrder.new(
|
275
277
|
property: Google::Datastore::V1::PropertyReference.new(
|
276
|
-
name: name
|
278
|
+
name: name
|
279
|
+
),
|
277
280
|
direction: prop_order_direction(direction)
|
278
281
|
)
|
279
282
|
|
@@ -342,12 +345,12 @@ module Google
|
|
342
345
|
elsif cursor.is_a? String
|
343
346
|
@grpc.start_cursor = Convert.decode_bytes cursor
|
344
347
|
else
|
345
|
-
|
348
|
+
raise ArgumentError, "Can't set a cursor using a #{cursor.class}."
|
346
349
|
end
|
347
350
|
|
348
351
|
self
|
349
352
|
end
|
350
|
-
|
353
|
+
alias cursor start
|
351
354
|
|
352
355
|
##
|
353
356
|
# Retrieve only select properties from the matched entities.
|
@@ -383,13 +386,15 @@ module Google
|
|
383
386
|
names.each do |name|
|
384
387
|
grpc_projection = Google::Datastore::V1::Projection.new(
|
385
388
|
property: Google::Datastore::V1::PropertyReference.new(
|
386
|
-
name: name
|
389
|
+
name: name
|
390
|
+
)
|
391
|
+
)
|
387
392
|
@grpc.projection << grpc_projection
|
388
393
|
end
|
389
394
|
|
390
395
|
self
|
391
396
|
end
|
392
|
-
|
397
|
+
alias projection select
|
393
398
|
|
394
399
|
##
|
395
400
|
# Group results by a list of properties.
|
@@ -410,13 +415,14 @@ module Google
|
|
410
415
|
def group_by *names
|
411
416
|
names.each do |name|
|
412
417
|
grpc_property = Google::Datastore::V1::PropertyReference.new(
|
413
|
-
name: name
|
418
|
+
name: name
|
419
|
+
)
|
414
420
|
@grpc.distinct_on << grpc_property
|
415
421
|
end
|
416
422
|
|
417
423
|
self
|
418
424
|
end
|
419
|
-
|
425
|
+
alias distinct_on group_by
|
420
426
|
|
421
427
|
# @private
|
422
428
|
def to_grpc
|
@@ -95,7 +95,7 @@ module Google
|
|
95
95
|
end
|
96
96
|
find_all(key).first
|
97
97
|
end
|
98
|
-
|
98
|
+
alias get find
|
99
99
|
|
100
100
|
##
|
101
101
|
# Retrieve the entities for the provided keys. The lookup is run within
|
@@ -123,7 +123,7 @@ module Google
|
|
123
123
|
transaction: @id)
|
124
124
|
Dataset::LookupResults.from_grpc lookup_res, service, nil, @id
|
125
125
|
end
|
126
|
-
|
126
|
+
alias lookup find_all
|
127
127
|
|
128
128
|
##
|
129
129
|
# Retrieve entities specified by a Query. The query is run within the
|
@@ -148,27 +148,27 @@ module Google
|
|
148
148
|
def run query, namespace: nil
|
149
149
|
ensure_service!
|
150
150
|
unless query.is_a?(Query) || query.is_a?(GqlQuery)
|
151
|
-
|
151
|
+
raise ArgumentError, "Cannot run a #{query.class} object."
|
152
152
|
end
|
153
153
|
query_res = service.run_query query.to_grpc, namespace,
|
154
154
|
transaction: @id
|
155
155
|
Dataset::QueryResults.from_grpc query_res, service, namespace,
|
156
156
|
query.to_grpc.dup
|
157
157
|
end
|
158
|
-
|
158
|
+
alias run_query run
|
159
159
|
|
160
160
|
##
|
161
161
|
# Begins a transaction.
|
162
162
|
# This method is run when a new ReadOnlyTransaction is created.
|
163
163
|
#
|
164
164
|
def start
|
165
|
-
|
165
|
+
raise TransactionError, "Transaction already opened." unless @id.nil?
|
166
166
|
|
167
167
|
ensure_service!
|
168
168
|
tx_res = service.begin_transaction read_only: true
|
169
169
|
@id = tx_res.transaction
|
170
170
|
end
|
171
|
-
|
171
|
+
alias begin_transaction start
|
172
172
|
|
173
173
|
##
|
174
174
|
# Commits the transaction.
|
@@ -190,8 +190,9 @@ module Google
|
|
190
190
|
# tx.commit
|
191
191
|
#
|
192
192
|
def commit
|
193
|
-
|
194
|
-
|
193
|
+
if @id.nil?
|
194
|
+
raise TransactionError, "Cannot commit when not in a transaction."
|
195
|
+
end
|
195
196
|
|
196
197
|
ensure_service!
|
197
198
|
|
@@ -220,7 +221,7 @@ module Google
|
|
220
221
|
#
|
221
222
|
def rollback
|
222
223
|
if @id.nil?
|
223
|
-
|
224
|
+
raise TransactionError, "Cannot rollback when not in a transaction."
|
224
225
|
end
|
225
226
|
|
226
227
|
ensure_service!
|
@@ -241,7 +242,7 @@ module Google
|
|
241
242
|
# @private Raise an error unless an active connection to the service is
|
242
243
|
# available.
|
243
244
|
def ensure_service!
|
244
|
-
|
245
|
+
raise "Must have active connection to service" unless service
|
245
246
|
end
|
246
247
|
end
|
247
248
|
end
|
@@ -58,7 +58,8 @@ module Google
|
|
58
58
|
timeout: timeout,
|
59
59
|
client_config: client_config,
|
60
60
|
lib_name: "gccl",
|
61
|
-
lib_version: Google::Cloud::Datastore::VERSION
|
61
|
+
lib_version: Google::Cloud::Datastore::VERSION
|
62
|
+
)
|
62
63
|
end
|
63
64
|
attr_accessor :mocked_service
|
64
65
|
|
@@ -95,8 +96,11 @@ module Google
|
|
95
96
|
query = nil
|
96
97
|
end
|
97
98
|
read_options = generate_read_options consistency, transaction
|
98
|
-
|
99
|
-
|
99
|
+
if namespace
|
100
|
+
partition_id = Google::Datastore::V1::PartitionId.new(
|
101
|
+
namespace_id: namespace
|
102
|
+
)
|
103
|
+
end
|
100
104
|
|
101
105
|
execute do
|
102
106
|
service.run_query project,
|
@@ -158,13 +162,16 @@ module Google
|
|
158
162
|
def generate_read_options consistency, transaction
|
159
163
|
if consistency == :eventual
|
160
164
|
return Google::Datastore::V1::ReadOptions.new(
|
161
|
-
read_consistency: :EVENTUAL
|
165
|
+
read_consistency: :EVENTUAL
|
166
|
+
)
|
162
167
|
elsif consistency == :strong
|
163
|
-
return
|
164
|
-
read_consistency: :STRONG
|
168
|
+
return Google::Datastore::V1::ReadOptions.new(
|
169
|
+
read_consistency: :STRONG
|
170
|
+
)
|
165
171
|
elsif transaction
|
166
|
-
return
|
167
|
-
transaction: transaction
|
172
|
+
return Google::Datastore::V1::ReadOptions.new(
|
173
|
+
transaction: transaction
|
174
|
+
)
|
168
175
|
end
|
169
176
|
nil
|
170
177
|
end
|
@@ -85,7 +85,7 @@ module Google
|
|
85
85
|
# Do not save yet
|
86
86
|
entities
|
87
87
|
end
|
88
|
-
|
88
|
+
alias upsert save
|
89
89
|
|
90
90
|
##
|
91
91
|
# Insert entities in a transaction. An InvalidArgumentError will raised
|
@@ -194,7 +194,7 @@ module Google
|
|
194
194
|
end
|
195
195
|
find_all(key).first
|
196
196
|
end
|
197
|
-
|
197
|
+
alias get find
|
198
198
|
|
199
199
|
##
|
200
200
|
# Retrieve the entities for the provided keys. The lookup is run within
|
@@ -219,7 +219,7 @@ module Google
|
|
219
219
|
transaction: @id)
|
220
220
|
LookupResults.from_grpc lookup_res, service, nil, @id
|
221
221
|
end
|
222
|
-
|
222
|
+
alias lookup find_all
|
223
223
|
|
224
224
|
##
|
225
225
|
# Retrieve entities specified by a Query. The query is run within the
|
@@ -254,27 +254,27 @@ module Google
|
|
254
254
|
def run query, namespace: nil
|
255
255
|
ensure_service!
|
256
256
|
unless query.is_a?(Query) || query.is_a?(GqlQuery)
|
257
|
-
|
257
|
+
raise ArgumentError, "Cannot run a #{query.class} object."
|
258
258
|
end
|
259
259
|
query_res = service.run_query query.to_grpc, namespace,
|
260
260
|
transaction: @id
|
261
261
|
QueryResults.from_grpc query_res, service, namespace,
|
262
262
|
query.to_grpc.dup
|
263
263
|
end
|
264
|
-
|
264
|
+
alias run_query run
|
265
265
|
|
266
266
|
##
|
267
267
|
# Begins a transaction.
|
268
268
|
# This method is run when a new Transaction is created.
|
269
269
|
def start
|
270
|
-
|
270
|
+
raise TransactionError, "Transaction already opened." unless @id.nil?
|
271
271
|
|
272
272
|
ensure_service!
|
273
273
|
tx_res = service.begin_transaction \
|
274
274
|
previous_transaction: @previous_transaction
|
275
275
|
@id = tx_res.transaction
|
276
276
|
end
|
277
|
-
|
277
|
+
alias begin_transaction start
|
278
278
|
|
279
279
|
##
|
280
280
|
# Commits a transaction.
|
@@ -320,8 +320,9 @@ module Google
|
|
320
320
|
# end
|
321
321
|
#
|
322
322
|
def commit
|
323
|
-
|
324
|
-
|
323
|
+
if @id.nil?
|
324
|
+
raise TransactionError, "Cannot commit when not in a transaction."
|
325
|
+
end
|
325
326
|
|
326
327
|
yield @commit if block_given?
|
327
328
|
|
@@ -365,7 +366,7 @@ module Google
|
|
365
366
|
# end
|
366
367
|
def rollback
|
367
368
|
if @id.nil?
|
368
|
-
|
369
|
+
raise TransactionError, "Cannot rollback when not in a transaction."
|
369
370
|
end
|
370
371
|
|
371
372
|
ensure_service!
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: google-cloud-datastore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Moore
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-02-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: google-cloud-core
|
@@ -17,14 +17,14 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '1.
|
20
|
+
version: '1.2'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '1.
|
27
|
+
version: '1.2'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: google-gax
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -127,16 +127,16 @@ dependencies:
|
|
127
127
|
name: rubocop
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
129
129
|
requirements:
|
130
|
-
- - "
|
130
|
+
- - "~>"
|
131
131
|
- !ruby/object:Gem::Version
|
132
|
-
version: 0.
|
132
|
+
version: 0.50.0
|
133
133
|
type: :development
|
134
134
|
prerelease: false
|
135
135
|
version_requirements: !ruby/object:Gem::Requirement
|
136
136
|
requirements:
|
137
|
-
- - "
|
137
|
+
- - "~>"
|
138
138
|
- !ruby/object:Gem::Version
|
139
|
-
version: 0.
|
139
|
+
version: 0.50.0
|
140
140
|
- !ruby/object:Gem::Dependency
|
141
141
|
name: simplecov
|
142
142
|
requirement: !ruby/object:Gem::Requirement
|
@@ -241,7 +241,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
241
241
|
version: '0'
|
242
242
|
requirements: []
|
243
243
|
rubyforge_project:
|
244
|
-
rubygems_version: 2.7.
|
244
|
+
rubygems_version: 2.7.6
|
245
245
|
signing_key:
|
246
246
|
specification_version: 4
|
247
247
|
summary: API Client library for Google Cloud Datastore
|