google-cloud-bigquery 1.14.0 → 1.42.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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHENTICATION.md +17 -54
  3. data/CHANGELOG.md +377 -0
  4. data/CONTRIBUTING.md +328 -116
  5. data/LOGGING.md +1 -1
  6. data/OVERVIEW.md +21 -20
  7. data/TROUBLESHOOTING.md +2 -8
  8. data/lib/google/cloud/bigquery/argument.rb +197 -0
  9. data/lib/google/cloud/bigquery/convert.rb +155 -173
  10. data/lib/google/cloud/bigquery/copy_job.rb +74 -26
  11. data/lib/google/cloud/bigquery/credentials.rb +5 -12
  12. data/lib/google/cloud/bigquery/data.rb +109 -18
  13. data/lib/google/cloud/bigquery/dataset/access.rb +474 -52
  14. data/lib/google/cloud/bigquery/dataset/list.rb +7 -13
  15. data/lib/google/cloud/bigquery/dataset/tag.rb +67 -0
  16. data/lib/google/cloud/bigquery/dataset.rb +1044 -287
  17. data/lib/google/cloud/bigquery/external/avro_source.rb +107 -0
  18. data/lib/google/cloud/bigquery/external/bigtable_source/column.rb +404 -0
  19. data/lib/google/cloud/bigquery/external/bigtable_source/column_family.rb +945 -0
  20. data/lib/google/cloud/bigquery/external/bigtable_source.rb +230 -0
  21. data/lib/google/cloud/bigquery/external/csv_source.rb +481 -0
  22. data/lib/google/cloud/bigquery/external/data_source.rb +771 -0
  23. data/lib/google/cloud/bigquery/external/json_source.rb +170 -0
  24. data/lib/google/cloud/bigquery/external/parquet_source.rb +148 -0
  25. data/lib/google/cloud/bigquery/external/sheets_source.rb +166 -0
  26. data/lib/google/cloud/bigquery/external.rb +50 -2256
  27. data/lib/google/cloud/bigquery/extract_job.rb +226 -61
  28. data/lib/google/cloud/bigquery/insert_response.rb +1 -3
  29. data/lib/google/cloud/bigquery/job/list.rb +10 -14
  30. data/lib/google/cloud/bigquery/job.rb +289 -14
  31. data/lib/google/cloud/bigquery/load_job.rb +810 -136
  32. data/lib/google/cloud/bigquery/model/list.rb +5 -9
  33. data/lib/google/cloud/bigquery/model.rb +247 -16
  34. data/lib/google/cloud/bigquery/policy.rb +432 -0
  35. data/lib/google/cloud/bigquery/project/list.rb +6 -11
  36. data/lib/google/cloud/bigquery/project.rb +509 -250
  37. data/lib/google/cloud/bigquery/query_job.rb +594 -128
  38. data/lib/google/cloud/bigquery/routine/list.rb +165 -0
  39. data/lib/google/cloud/bigquery/routine.rb +1227 -0
  40. data/lib/google/cloud/bigquery/schema/field.rb +413 -63
  41. data/lib/google/cloud/bigquery/schema.rb +221 -48
  42. data/lib/google/cloud/bigquery/service.rb +204 -112
  43. data/lib/google/cloud/bigquery/standard_sql.rb +269 -53
  44. data/lib/google/cloud/bigquery/table/async_inserter.rb +86 -43
  45. data/lib/google/cloud/bigquery/table/list.rb +6 -11
  46. data/lib/google/cloud/bigquery/table.rb +1470 -377
  47. data/lib/google/cloud/bigquery/time.rb +6 -0
  48. data/lib/google/cloud/bigquery/version.rb +1 -1
  49. data/lib/google/cloud/bigquery.rb +4 -6
  50. data/lib/google-cloud-bigquery.rb +14 -13
  51. metadata +66 -38
@@ -35,7 +35,7 @@ module Google
35
35
  # access.add_owner_group "owners@example.com"
36
36
  # access.add_writer_user "writer@example.com"
37
37
  # access.remove_writer_user "readers@example.com"
38
- # access.add_reader_special :all
38
+ # access.add_reader_special :all_users
39
39
  # end
40
40
  #
41
41
  class Access
@@ -48,18 +48,23 @@ module Google
48
48
 
49
49
  # @private
50
50
  SCOPES = {
51
- "user" => :user_by_email,
52
- "user_by_email" => :user_by_email,
53
- "userByEmail" => :user_by_email,
51
+ "domain" => :domain,
54
52
  "group" => :group_by_email,
55
53
  "group_by_email" => :group_by_email,
56
54
  "groupByEmail" => :group_by_email,
57
- "domain" => :domain,
55
+ "iam_member" => :iam_member,
56
+ "iamMember" => :iam_member,
57
+ "routine" => :routine,
58
58
  "special" => :special_group,
59
59
  "special_group" => :special_group,
60
60
  "specialGroup" => :special_group,
61
- "view" => :view
61
+ "user" => :user_by_email,
62
+ "user_by_email" => :user_by_email,
63
+ "userByEmail" => :user_by_email,
64
+ "view" => :view,
65
+ "dataset" => :dataset
62
66
  }.freeze
67
+ attr_reader :rules
63
68
 
64
69
  # @private
65
70
  GROUPS = {
@@ -74,7 +79,9 @@ module Google
74
79
  "projectWriters" => "projectWriters",
75
80
  "all" => "allAuthenticatedUsers",
76
81
  "all_authenticated_users" => "allAuthenticatedUsers",
77
- "allAuthenticatedUsers" => "allAuthenticatedUsers"
82
+ "allAuthenticatedUsers" => "allAuthenticatedUsers",
83
+ "all_users" => "allUsers",
84
+ "allUsers" => "allUsers"
78
85
  }.freeze
79
86
 
80
87
  ##
@@ -148,6 +155,26 @@ module Google
148
155
  add_access_role_scope_value :reader, :group, email
149
156
  end
150
157
 
158
+ ##
159
+ # Add reader access to some other type of member that appears in the IAM
160
+ # Policy but isn't a user, group, domain, or special group.
161
+ #
162
+ # @param [String] identity The identity reference.
163
+ #
164
+ # @example
165
+ # require "google/cloud/bigquery"
166
+ #
167
+ # bigquery = Google::Cloud::Bigquery.new
168
+ # dataset = bigquery.dataset "my_dataset"
169
+ #
170
+ # dataset.access do |access|
171
+ # access.add_reader_iam_member "entity@example.com"
172
+ # end
173
+ #
174
+ def add_reader_iam_member identity
175
+ add_access_role_scope_value :reader, :iam_member, identity
176
+ end
177
+
151
178
  ##
152
179
  # Add reader access to a domain.
153
180
  #
@@ -172,7 +199,7 @@ module Google
172
199
  # Add reader access to a special group.
173
200
  #
174
201
  # @param [String] group Accepted values are `owners`, `writers`,
175
- # `readers`, and `all`.
202
+ # `readers`, `all_authenticated_users`, and `all_users`.
176
203
  #
177
204
  # @example
178
205
  # require "google/cloud/bigquery"
@@ -181,13 +208,40 @@ module Google
181
208
  # dataset = bigquery.dataset "my_dataset"
182
209
  #
183
210
  # dataset.access do |access|
184
- # access.add_reader_special :all
211
+ # access.add_reader_special :all_users
185
212
  # end
186
213
  #
187
214
  def add_reader_special group
188
215
  add_access_role_scope_value :reader, :special, group
189
216
  end
190
217
 
218
+ ##
219
+ # Add access to a routine from a different dataset. Queries executed
220
+ # against that routine will have read access to views/tables/routines
221
+ # in this dataset. Only UDF is supported for now. The role field is
222
+ # not required when this field is set. If that routine is updated by
223
+ # any user, access to the routine needs to be granted again via an
224
+ # update operation.
225
+ #
226
+ # @param [Google::Cloud::Bigquery::Routine] routine A routine object.
227
+ #
228
+ # @example
229
+ # require "google/cloud/bigquery"
230
+ #
231
+ # bigquery = Google::Cloud::Bigquery.new
232
+ # dataset = bigquery.dataset "my_dataset"
233
+ # other_dataset = bigquery.dataset "my_other_dataset", skip_lookup: true
234
+ #
235
+ # routine = other_dataset.routine "my_routine"
236
+ #
237
+ # dataset.access do |access|
238
+ # access.add_reader_routine routine
239
+ # end
240
+ #
241
+ def add_reader_routine routine
242
+ add_access_routine routine
243
+ end
244
+
191
245
  ##
192
246
  # Add reader access to a view.
193
247
  #
@@ -203,9 +257,9 @@ module Google
203
257
  #
204
258
  # bigquery = Google::Cloud::Bigquery.new
205
259
  # dataset = bigquery.dataset "my_dataset"
206
- # other_dataset = bigquery.dataset "my_other_dataset"
260
+ # other_dataset = bigquery.dataset "my_other_dataset", skip_lookup: true
207
261
  #
208
- # view = other_dataset.table "my_view"
262
+ # view = other_dataset.table "my_view", skip_lookup: true
209
263
  #
210
264
  # dataset.access do |access|
211
265
  # access.add_reader_view view
@@ -215,6 +269,44 @@ module Google
215
269
  add_access_view view
216
270
  end
217
271
 
272
+ ##
273
+ # Add reader access to a dataset.
274
+ #
275
+ # @param [Google::Cloud::Bigquery::DatasetAccessEntry, Hash<String,String> ] dataset A DatasetAccessEntry
276
+ # or a Hash object. Required
277
+ #
278
+ # @example
279
+ # require "google/cloud/bigquery"
280
+ #
281
+ # bigquery = Google::Cloud::Bigquery.new
282
+ # dataset = bigquery.dataset "my_dataset"
283
+ # other_dataset = bigquery.dataset "my_other_dataset", skip_lookup: true
284
+ #
285
+ # params = {
286
+ # dataset_id: other_dataset.dataset_id,
287
+ # project_id: other_dataset.project_id,
288
+ # target_types: ["VIEWS"]
289
+ # }
290
+ #
291
+ # dataset.access do |access|
292
+ # access.add_reader_dataset params
293
+ # end
294
+ #
295
+ # @example
296
+ # require "google/cloud/bigquery"
297
+ #
298
+ # bigquery = Google::Cloud::Bigquery.new
299
+ # dataset = bigquery.dataset "my_dataset"
300
+ # other_dataset = bigquery.dataset "my_other_dataset", skip_lookup: true
301
+ #
302
+ # dataset.access do |access|
303
+ # access.add_reader_dataset other_dataset.access_entry(target_types: ["VIEWS"])
304
+ # end
305
+ #
306
+ def add_reader_dataset dataset
307
+ add_access_dataset dataset
308
+ end
309
+
218
310
  ##
219
311
  # Add writer access to a user.
220
312
  #
@@ -253,6 +345,26 @@ module Google
253
345
  add_access_role_scope_value :writer, :group, email
254
346
  end
255
347
 
348
+ ##
349
+ # Add writer access to some other type of member that appears in the IAM
350
+ # Policy but isn't a user, group, domain, or special group.
351
+ #
352
+ # @param [String] identity The identity reference.
353
+ #
354
+ # @example
355
+ # require "google/cloud/bigquery"
356
+ #
357
+ # bigquery = Google::Cloud::Bigquery.new
358
+ # dataset = bigquery.dataset "my_dataset"
359
+ #
360
+ # dataset.access do |access|
361
+ # access.add_writer_iam_member "entity@example.com"
362
+ # end
363
+ #
364
+ def add_writer_iam_member identity
365
+ add_access_role_scope_value :writer, :iam_member, identity
366
+ end
367
+
256
368
  ##
257
369
  # Add writer access to a domain.
258
370
  #
@@ -277,7 +389,7 @@ module Google
277
389
  # Add writer access to a special group.
278
390
  #
279
391
  # @param [String] group Accepted values are `owners`, `writers`,
280
- # `readers`, and `all`.
392
+ # `readers`, `all_authenticated_users`, and `all_users`.
281
393
  #
282
394
  # @example
283
395
  # require "google/cloud/bigquery"
@@ -286,7 +398,7 @@ module Google
286
398
  # dataset = bigquery.dataset "my_dataset"
287
399
  #
288
400
  # dataset.access do |access|
289
- # access.add_writer_special :all
401
+ # access.add_writer_special :all_users
290
402
  # end
291
403
  #
292
404
  def add_writer_special group
@@ -331,6 +443,26 @@ module Google
331
443
  add_access_role_scope_value :owner, :group, email
332
444
  end
333
445
 
446
+ ##
447
+ # Add owner access to some other type of member that appears in the IAM
448
+ # Policy but isn't a user, group, domain, or special group.
449
+ #
450
+ # @param [String] identity The identity reference.
451
+ #
452
+ # @example
453
+ # require "google/cloud/bigquery"
454
+ #
455
+ # bigquery = Google::Cloud::Bigquery.new
456
+ # dataset = bigquery.dataset "my_dataset"
457
+ #
458
+ # dataset.access do |access|
459
+ # access.add_owner_iam_member "entity@example.com"
460
+ # end
461
+ #
462
+ def add_owner_iam_member identity
463
+ add_access_role_scope_value :owner, :iam_member, identity
464
+ end
465
+
334
466
  ##
335
467
  # Add owner access to a domain.
336
468
  #
@@ -355,7 +487,7 @@ module Google
355
487
  # Add owner access to a special group.
356
488
  #
357
489
  # @param [String] group Accepted values are `owners`, `writers`,
358
- # `readers`, and `all`.
490
+ # `readers`, `all_authenticated_users`, and `all_users`.
359
491
  #
360
492
  # @example
361
493
  # require "google/cloud/bigquery"
@@ -364,7 +496,7 @@ module Google
364
496
  # dataset = bigquery.dataset "my_dataset"
365
497
  #
366
498
  # dataset.access do |access|
367
- # access.add_owner_special :all
499
+ # access.add_owner_special :all_users
368
500
  # end
369
501
  #
370
502
  def add_owner_special group
@@ -409,6 +541,26 @@ module Google
409
541
  remove_access_role_scope_value :reader, :group, email
410
542
  end
411
543
 
544
+ ##
545
+ # Remove reader access from some other type of member that appears in the IAM
546
+ # Policy but isn't a user, group, domain, or special group.
547
+ #
548
+ # @param [String] identity The identity reference.
549
+ #
550
+ # @example
551
+ # require "google/cloud/bigquery"
552
+ #
553
+ # bigquery = Google::Cloud::Bigquery.new
554
+ # dataset = bigquery.dataset "my_dataset"
555
+ #
556
+ # dataset.access do |access|
557
+ # access.remove_reader_iam_member "entity@example.com"
558
+ # end
559
+ #
560
+ def remove_reader_iam_member identity
561
+ remove_access_role_scope_value :reader, :iam_member, identity
562
+ end
563
+
412
564
  ##
413
565
  # Remove reader access from a domain.
414
566
  #
@@ -433,7 +585,7 @@ module Google
433
585
  # Remove reader access from a special group.
434
586
  #
435
587
  # @param [String] group Accepted values are `owners`, `writers`,
436
- # `readers`, and `all`.
588
+ # `readers`, `all_authenticated_users`, and `all_users`.
437
589
  #
438
590
  # @example
439
591
  # require "google/cloud/bigquery"
@@ -442,13 +594,35 @@ module Google
442
594
  # dataset = bigquery.dataset "my_dataset"
443
595
  #
444
596
  # dataset.access do |access|
445
- # access.remove_reader_special :all
597
+ # access.remove_reader_special :all_users
446
598
  # end
447
599
  #
448
600
  def remove_reader_special group
449
601
  remove_access_role_scope_value :reader, :special, group
450
602
  end
451
603
 
604
+ ##
605
+ # Remove reader access from a routine from a different dataset.
606
+ #
607
+ # @param [Google::Cloud::Bigquery::Routine] routine A routine object.
608
+ #
609
+ # @example
610
+ # require "google/cloud/bigquery"
611
+ #
612
+ # bigquery = Google::Cloud::Bigquery.new
613
+ # dataset = bigquery.dataset "my_dataset"
614
+ # other_dataset = bigquery.dataset "my_other_dataset", skip_lookup: true
615
+ #
616
+ # routine = other_dataset.routine "my_routine", skip_lookup: true
617
+ #
618
+ # dataset.access do |access|
619
+ # access.remove_reader_routine routine
620
+ # end
621
+ #
622
+ def remove_reader_routine routine
623
+ remove_access_routine routine
624
+ end
625
+
452
626
  ##
453
627
  # Remove reader access from a view.
454
628
  #
@@ -464,9 +638,9 @@ module Google
464
638
  #
465
639
  # bigquery = Google::Cloud::Bigquery.new
466
640
  # dataset = bigquery.dataset "my_dataset"
467
- # other_dataset = bigquery.dataset "my_other_dataset"
641
+ # other_dataset = bigquery.dataset "my_other_dataset", skip_lookup: true
468
642
  #
469
- # view = other_dataset.table "my_view"
643
+ # view = other_dataset.table "my_view", skip_lookup: true
470
644
  #
471
645
  # dataset.access do |access|
472
646
  # access.remove_reader_view view
@@ -476,6 +650,44 @@ module Google
476
650
  remove_access_view view
477
651
  end
478
652
 
653
+ ##
654
+ # Removes reader access of a dataset.
655
+ #
656
+ # @param [Google::Cloud::Bigquery::DatasetAccessEntry, Hash<String,String> ] dataset A DatasetAccessEntry
657
+ # or a Hash object. Required
658
+ #
659
+ # @example
660
+ # require "google/cloud/bigquery"
661
+ #
662
+ # bigquery = Google::Cloud::Bigquery.new
663
+ # dataset = bigquery.dataset "my_dataset"
664
+ # other_dataset = bigquery.dataset "my_other_dataset", skip_lookup: true
665
+ #
666
+ # params = {
667
+ # dataset_id: other_dataset.dataset_id,
668
+ # project_id: other_dataset.project_id,
669
+ # target_types: ["VIEWS"]
670
+ # }
671
+ #
672
+ # dataset.access do |access|
673
+ # access.remove_reader_dataset params
674
+ # end
675
+ #
676
+ # @example
677
+ # require "google/cloud/bigquery"
678
+ #
679
+ # bigquery = Google::Cloud::Bigquery.new
680
+ # dataset = bigquery.dataset "my_dataset"
681
+ # other_dataset = bigquery.dataset "my_other_dataset", skip_lookup: true
682
+ #
683
+ # dataset.access do |access|
684
+ # access.remove_reader_dataset other_dataset.access_entry(target_types: ["VIEWS"])
685
+ # end
686
+ #
687
+ def remove_reader_dataset dataset
688
+ remove_access_dataset dataset
689
+ end
690
+
479
691
  ##
480
692
  # Remove writer access from a user.
481
693
  #
@@ -514,6 +726,26 @@ module Google
514
726
  remove_access_role_scope_value :writer, :group, email
515
727
  end
516
728
 
729
+ ##
730
+ # Remove writer access from some other type of member that appears in the IAM
731
+ # Policy but isn't a user, group, domain, or special group.
732
+ #
733
+ # @param [String] identity The identity reference.
734
+ #
735
+ # @example
736
+ # require "google/cloud/bigquery"
737
+ #
738
+ # bigquery = Google::Cloud::Bigquery.new
739
+ # dataset = bigquery.dataset "my_dataset"
740
+ #
741
+ # dataset.access do |access|
742
+ # access.remove_writer_iam_member "entity@example.com"
743
+ # end
744
+ #
745
+ def remove_writer_iam_member identity
746
+ remove_access_role_scope_value :writer, :iam_member, identity
747
+ end
748
+
517
749
  ##
518
750
  # Remove writer access from a domain.
519
751
  #
@@ -538,7 +770,7 @@ module Google
538
770
  # Remove writer access from a special group.
539
771
  #
540
772
  # @param [String] group Accepted values are `owners`, `writers`,
541
- # `readers`, and `all`.
773
+ # `readers`, `all_authenticated_users`, and `all_users`.
542
774
  #
543
775
  # @example
544
776
  # require "google/cloud/bigquery"
@@ -547,7 +779,7 @@ module Google
547
779
  # dataset = bigquery.dataset "my_dataset"
548
780
  #
549
781
  # dataset.access do |access|
550
- # access.remove_writer_special :all
782
+ # access.remove_writer_special :all_users
551
783
  # end
552
784
  #
553
785
  def remove_writer_special group
@@ -592,6 +824,26 @@ module Google
592
824
  remove_access_role_scope_value :owner, :group, email
593
825
  end
594
826
 
827
+ ##
828
+ # Remove owner access from some other type of member that appears in the IAM
829
+ # Policy but isn't a user, group, domain, or special group.
830
+ #
831
+ # @param [String] identity The identity reference.
832
+ #
833
+ # @example
834
+ # require "google/cloud/bigquery"
835
+ #
836
+ # bigquery = Google::Cloud::Bigquery.new
837
+ # dataset = bigquery.dataset "my_dataset"
838
+ #
839
+ # dataset.access do |access|
840
+ # access.remove_owner_iam_member "entity@example.com"
841
+ # end
842
+ #
843
+ def remove_owner_iam_member identity
844
+ remove_access_role_scope_value :owner, :iam_member, identity
845
+ end
846
+
595
847
  ##
596
848
  # Remove owner access from a domain.
597
849
  #
@@ -616,7 +868,7 @@ module Google
616
868
  # Remove owner access from a special group.
617
869
  #
618
870
  # @param [String] group Accepted values are `owners`, `writers`,
619
- # `readers`, and `all`.
871
+ # `readers`, `all_authenticated_users`, and `all_users`.
620
872
  #
621
873
  # @example
622
874
  # require "google/cloud/bigquery"
@@ -625,7 +877,7 @@ module Google
625
877
  # dataset = bigquery.dataset "my_dataset"
626
878
  #
627
879
  # dataset.access do |access|
628
- # access.remove_owner_special :all
880
+ # access.remove_owner_special :all_users
629
881
  # end
630
882
  #
631
883
  def remove_owner_special group
@@ -668,6 +920,25 @@ module Google
668
920
  lookup_access_role_scope_value :reader, :group, email
669
921
  end
670
922
 
923
+ ##
924
+ # Checks reader access for some other type of member that appears in the IAM
925
+ # Policy but isn't a user, group, domain, or special group.
926
+ #
927
+ # @param [String] identity The identity reference.
928
+ #
929
+ # @example
930
+ # require "google/cloud/bigquery"
931
+ #
932
+ # bigquery = Google::Cloud::Bigquery.new
933
+ # dataset = bigquery.dataset "my_dataset"
934
+ #
935
+ # access = dataset.access
936
+ # access.reader_iam_member? "entity@example.com" #=> false
937
+ #
938
+ def reader_iam_member? identity
939
+ lookup_access_role_scope_value :reader, :iam_member, identity
940
+ end
941
+
671
942
  ##
672
943
  # Checks reader access for a domain.
673
944
  #
@@ -691,7 +962,7 @@ module Google
691
962
  # Checks reader access for a special group.
692
963
  #
693
964
  # @param [String] group Accepted values are `owners`, `writers`,
694
- # `readers`, and `all`.
965
+ # `readers`, `all_authenticated_users`, and `all_users`.
695
966
  #
696
967
  # @example
697
968
  # require "google/cloud/bigquery"
@@ -700,12 +971,38 @@ module Google
700
971
  # dataset = bigquery.dataset "my_dataset"
701
972
  #
702
973
  # access = dataset.access
703
- # access.reader_special? :all #=> false
974
+ # access.reader_special? :all_users #=> false
704
975
  #
705
976
  def reader_special? group
706
977
  lookup_access_role_scope_value :reader, :special, group
707
978
  end
708
979
 
980
+ ##
981
+ # Checks access for a routine from a different dataset. Queries executed
982
+ # against that routine will have read access to views/tables/routines
983
+ # in this dataset. Only UDF is supported for now. The role field is
984
+ # not required when this field is set. If that routine is updated by
985
+ # any user, access to the routine needs to be granted again via an
986
+ # update operation.
987
+ #
988
+ # @param [Google::Cloud::Bigquery::Routine] routine A routine object.
989
+ #
990
+ # @example
991
+ # require "google/cloud/bigquery"
992
+ #
993
+ # bigquery = Google::Cloud::Bigquery.new
994
+ # dataset = bigquery.dataset "my_dataset"
995
+ # other_dataset = bigquery.dataset "my_other_dataset", skip_lookup: true
996
+ #
997
+ # routine = other_dataset.routine "my_routine", skip_lookup: true
998
+ #
999
+ # access = dataset.access
1000
+ # access.reader_routine? routine #=> false
1001
+ #
1002
+ def reader_routine? routine
1003
+ lookup_access_routine routine
1004
+ end
1005
+
709
1006
  ##
710
1007
  # Checks reader access for a view.
711
1008
  #
@@ -721,9 +1018,9 @@ module Google
721
1018
  #
722
1019
  # bigquery = Google::Cloud::Bigquery.new
723
1020
  # dataset = bigquery.dataset "my_dataset"
724
- # other_dataset = bigquery.dataset "my_other_dataset"
1021
+ # other_dataset = bigquery.dataset "my_other_dataset", skip_lookup: true
725
1022
  #
726
- # view = other_dataset.table "my_view"
1023
+ # view = other_dataset.table "my_view", skip_lookup: true
727
1024
  #
728
1025
  # access = dataset.access
729
1026
  # access.reader_view? view #=> false
@@ -732,6 +1029,40 @@ module Google
732
1029
  lookup_access_view view
733
1030
  end
734
1031
 
1032
+ ##
1033
+ # Checks reader access for a dataset.
1034
+ #
1035
+ # @param [Google::Cloud::Bigquery::DatasetAccessEntry, Hash<String,String> ] dataset A DatasetAccessEntry
1036
+ # or a Hash object. Required
1037
+ #
1038
+ # @example
1039
+ # require "google/cloud/bigquery"
1040
+ #
1041
+ # bigquery = Google::Cloud::Bigquery.new
1042
+ # dataset = bigquery.dataset "my_dataset"
1043
+ # other_dataset = bigquery.dataset "my_other_dataset", skip_lookup: true
1044
+ #
1045
+ # params = {
1046
+ # dataset_id: other_dataset.dataset_id,
1047
+ # project_id: other_dataset.project_id,
1048
+ # target_types: ["VIEWS"]
1049
+ # }
1050
+ #
1051
+ # dataset.access.reader_dataset? params
1052
+ #
1053
+ # @example
1054
+ # require "google/cloud/bigquery"
1055
+ #
1056
+ # bigquery = Google::Cloud::Bigquery.new
1057
+ # dataset = bigquery.dataset "my_dataset"
1058
+ # other_dataset = bigquery.dataset "my_other_dataset", skip_lookup: true
1059
+ #
1060
+ # dataset.access.reader_dataset? other_dataset.access_entry(target_types: ["VIEWS"])
1061
+ #
1062
+ def reader_dataset? dataset
1063
+ lookup_access_dataset dataset
1064
+ end
1065
+
735
1066
  ##
736
1067
  # Checks writer access for a user.
737
1068
  #
@@ -768,6 +1099,25 @@ module Google
768
1099
  lookup_access_role_scope_value :writer, :group, email
769
1100
  end
770
1101
 
1102
+ ##
1103
+ # Checks writer access for some other type of member that appears in the IAM
1104
+ # Policy but isn't a user, group, domain, or special group.
1105
+ #
1106
+ # @param [String] identity The identity reference.
1107
+ #
1108
+ # @example
1109
+ # require "google/cloud/bigquery"
1110
+ #
1111
+ # bigquery = Google::Cloud::Bigquery.new
1112
+ # dataset = bigquery.dataset "my_dataset"
1113
+ #
1114
+ # access = dataset.access
1115
+ # access.writer_iam_member? "entity@example.com" #=> false
1116
+ #
1117
+ def writer_iam_member? identity
1118
+ lookup_access_role_scope_value :writer, :iam_member, identity
1119
+ end
1120
+
771
1121
  ##
772
1122
  # Checks writer access for a domain.
773
1123
  #
@@ -791,7 +1141,7 @@ module Google
791
1141
  # Checks writer access for a special group.
792
1142
  #
793
1143
  # @param [String] group Accepted values are `owners`, `writers`,
794
- # `readers`, and `all`.
1144
+ # `readers`, `all_authenticated_users`, and `all_users`.
795
1145
  #
796
1146
  # @example
797
1147
  # require "google/cloud/bigquery"
@@ -800,7 +1150,7 @@ module Google
800
1150
  # dataset = bigquery.dataset "my_dataset"
801
1151
  #
802
1152
  # access = dataset.access
803
- # access.writer_special? :all #=> false
1153
+ # access.writer_special? :all_users #=> false
804
1154
  #
805
1155
  def writer_special? group
806
1156
  lookup_access_role_scope_value :writer, :special, group
@@ -842,6 +1192,25 @@ module Google
842
1192
  lookup_access_role_scope_value :owner, :group, email
843
1193
  end
844
1194
 
1195
+ ##
1196
+ # Checks owner access for some other type of member that appears in the IAM
1197
+ # Policy but isn't a user, group, domain, or special group.
1198
+ #
1199
+ # @param [String] identity The identity reference.
1200
+ #
1201
+ # @example
1202
+ # require "google/cloud/bigquery"
1203
+ #
1204
+ # bigquery = Google::Cloud::Bigquery.new
1205
+ # dataset = bigquery.dataset "my_dataset"
1206
+ #
1207
+ # access = dataset.access
1208
+ # access.owner_iam_member? "entity@example.com" #=> false
1209
+ #
1210
+ def owner_iam_member? identity
1211
+ lookup_access_role_scope_value :owner, :iam_member, identity
1212
+ end
1213
+
845
1214
  ##
846
1215
  # Checks owner access for a domain.
847
1216
  #
@@ -865,7 +1234,7 @@ module Google
865
1234
  # Checks owner access for a special group.
866
1235
  #
867
1236
  # @param [String] group Accepted values are `owners`, `writers`,
868
- # `readers`, and `all`.
1237
+ # `readers`, `all_authenticated_users`, and `all_users`.
869
1238
  #
870
1239
  # @example
871
1240
  # require "google/cloud/bigquery"
@@ -874,7 +1243,7 @@ module Google
874
1243
  # dataset = bigquery.dataset "my_dataset"
875
1244
  #
876
1245
  # access = dataset.access
877
- # access.owner_special? :all #=> false
1246
+ # access.owner_special? :all_users #=> false
878
1247
  #
879
1248
  def owner_special? group
880
1249
  lookup_access_role_scope_value :owner, :special, group
@@ -885,10 +1254,8 @@ module Google
885
1254
  rules = Array gapi.access
886
1255
  new.tap do |s|
887
1256
  s.instance_variable_set :@rules, rules
888
- s.instance_variable_set :@original_rules_hashes,
889
- rules.map(&:to_h)
890
- s.instance_variable_set :@dataset_reference,
891
- gapi.dataset_reference
1257
+ s.instance_variable_set :@original_rules_hashes, rules.map(&:to_h)
1258
+ s.instance_variable_set :@dataset_reference, gapi.dataset_reference
892
1259
  end
893
1260
  end
894
1261
 
@@ -902,18 +1269,14 @@ module Google
902
1269
  # @private
903
1270
  def validate_role role
904
1271
  good_role = ROLES[role.to_s]
905
- if good_role.nil?
906
- raise ArgumentError "Unable to determine role for #{role}"
907
- end
1272
+ raise ArgumentError "Unable to determine role for #{role}" if good_role.nil?
908
1273
  good_role
909
1274
  end
910
1275
 
911
1276
  # @private
912
1277
  def validate_scope scope
913
1278
  good_scope = SCOPES[scope.to_s]
914
- if good_scope.nil?
915
- raise ArgumentError "Unable to determine scope for #{scope}"
916
- end
1279
+ raise ArgumentError "Unable to determine scope for #{scope}" if good_scope.nil?
917
1280
  good_scope
918
1281
  end
919
1282
 
@@ -933,6 +1296,18 @@ module Google
933
1296
  end
934
1297
  end
935
1298
 
1299
+ # @private
1300
+ #
1301
+ # Checks the type of user input and converts it to acceptable format.
1302
+ #
1303
+ def validate_dataset dataset
1304
+ if dataset.is_a? Google::Apis::BigqueryV2::DatasetAccessEntry
1305
+ dataset
1306
+ else
1307
+ Service.dataset_access_entry_from_hash dataset
1308
+ end
1309
+ end
1310
+
936
1311
  # @private
937
1312
  def add_access_role_scope_value role, scope, value
938
1313
  role = validate_role role
@@ -943,7 +1318,17 @@ module Google
943
1318
  @rules.reject!(&find_by_scope_and_value(scope, value))
944
1319
  # Add new rule for this role, scope, and value
945
1320
  opts = { role: role, scope => value }
946
- @rules << Google::Apis::BigqueryV2::Dataset::Access.new(opts)
1321
+ @rules << Google::Apis::BigqueryV2::Dataset::Access.new(**opts)
1322
+ end
1323
+
1324
+ # @private
1325
+ def add_access_routine routine
1326
+ value = routine.routine_ref
1327
+ # Remove existing routine rule, if any
1328
+ @rules.reject!(&find_by_scope_and_resource_ref(:routine, value))
1329
+ # Add new rule for this role, scope, and value
1330
+ opts = { routine: value }
1331
+ @rules << Google::Apis::BigqueryV2::Dataset::Access.new(**opts)
947
1332
  end
948
1333
 
949
1334
  # @private
@@ -951,10 +1336,21 @@ module Google
951
1336
  # scope is view, make sure value is in the right format
952
1337
  value = validate_view value
953
1338
  # Remove existing view rule, if any
954
- @rules.reject!(&find_view(value))
1339
+ @rules.reject!(&find_by_scope_and_resource_ref(:view, value))
955
1340
  # Add new rule for this role, scope, and value
956
1341
  opts = { view: value }
957
- @rules << Google::Apis::BigqueryV2::Dataset::Access.new(opts)
1342
+ @rules << Google::Apis::BigqueryV2::Dataset::Access.new(**opts)
1343
+ end
1344
+
1345
+ # @private
1346
+ def add_access_dataset dataset
1347
+ # scope is dataset, make sure value is in the right format
1348
+ value = validate_dataset dataset
1349
+ # Remove existing rule for input dataset, if any
1350
+ @rules.reject!(&find_by_scope_and_resource_ref(:dataset, value))
1351
+ # Add new rule for this role, scope, and value
1352
+ opts = { dataset: value }
1353
+ @rules << Google::Apis::BigqueryV2::Dataset::Access.new(**opts)
958
1354
  end
959
1355
 
960
1356
  # @private
@@ -969,12 +1365,26 @@ module Google
969
1365
  )
970
1366
  end
971
1367
 
1368
+ # @private
1369
+ def remove_access_routine routine
1370
+ # Remove existing routine rule, if any
1371
+ @rules.reject!(&find_by_scope_and_resource_ref(:routine, routine.routine_ref))
1372
+ end
1373
+
972
1374
  # @private
973
1375
  def remove_access_view value
974
1376
  # scope is view, make sure value is in the right format
975
1377
  value = validate_view value
976
1378
  # Remove existing view rule, if any
977
- @rules.reject!(&find_view(value))
1379
+ @rules.reject!(&find_by_scope_and_resource_ref(:view, value))
1380
+ end
1381
+
1382
+ # @private
1383
+ def remove_access_dataset dataset
1384
+ # scope is dataset, make sure value is in the right format
1385
+ value = validate_dataset dataset
1386
+ # Remove existing rule for input dataset, if any
1387
+ @rules.reject!(&find_by_scope_and_resource_ref(:dataset, value))
978
1388
  end
979
1389
 
980
1390
  # @private
@@ -984,9 +1394,13 @@ module Google
984
1394
  # If scope is special group, make sure value is in the list
985
1395
  value = validate_special_group value if scope == :special_group
986
1396
  # Detect any rules of this role, scope, and value
987
- !(!@rules.detect(
988
- &find_by_role_and_scope_and_value(role, scope, value)
989
- ))
1397
+ !(!@rules.detect(&find_by_role_and_scope_and_value(role, scope, value)))
1398
+ end
1399
+
1400
+ # @private
1401
+ def lookup_access_routine routine
1402
+ # Detect routine rule, if any
1403
+ !(!@rules.detect(&find_by_scope_and_resource_ref(:routine, routine.routine_ref)))
990
1404
  end
991
1405
 
992
1406
  # @private
@@ -994,7 +1408,15 @@ module Google
994
1408
  # scope is view, make sure value is in the right format
995
1409
  value = validate_view value
996
1410
  # Detect view rule, if any
997
- !(!@rules.detect(&find_view(value)))
1411
+ !(!@rules.detect(&find_by_scope_and_resource_ref(:view, value)))
1412
+ end
1413
+
1414
+ # @private
1415
+ def lookup_access_dataset dataset
1416
+ # scope is dataset, make sure value is in the right format
1417
+ value = validate_dataset dataset
1418
+ # Detect existing rule for input dataset, if any
1419
+ !(!@rules.detect(&find_by_scope_and_resource_ref(:dataset, value)))
998
1420
  end
999
1421
 
1000
1422
  # @private
@@ -1013,11 +1435,11 @@ module Google
1013
1435
  end
1014
1436
  end
1015
1437
 
1016
- # @private
1017
- def find_view value
1438
+ # @private Compare hash representations to find table_ref, routine_ref.
1439
+ def find_by_scope_and_resource_ref scope, value
1018
1440
  lambda do |a|
1019
1441
  h = a.to_h
1020
- h[:view].to_h == value.to_h
1442
+ h[scope].to_h == value.to_h
1021
1443
  end
1022
1444
  end
1023
1445
  end