google-cloud-storage 1.45.0 → 1.56.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.
@@ -15,6 +15,7 @@
15
15
 
16
16
  require "google/cloud/storage/version"
17
17
  require "google/apis/storage_v1"
18
+ require "google/cloud/config"
18
19
  require "digest"
19
20
  require "mini_mime"
20
21
  require "pathname"
@@ -36,6 +37,11 @@ module Google
36
37
  # @private
37
38
  attr_accessor :credentials
38
39
 
40
+ # @private
41
+ def universe_domain
42
+ service.universe_domain
43
+ end
44
+
39
45
  ##
40
46
  # Creates a new Service instance.
41
47
  # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
@@ -43,20 +49,20 @@ module Google
43
49
  timeout: nil, open_timeout: nil, read_timeout: nil,
44
50
  send_timeout: nil, host: nil, quota_project: nil,
45
51
  max_elapsed_time: nil, base_interval: nil, max_interval: nil,
46
- multiplier: nil, upload_chunk_size: nil
52
+ multiplier: nil, upload_chunk_size: nil, universe_domain: nil
53
+ host ||= Google::Cloud::Storage.configure.endpoint
47
54
  @project = project
48
55
  @credentials = credentials
49
56
  @service = API::StorageService.new
50
57
  @service.client_options.application_name = "gcloud-ruby"
51
- @service.client_options.application_version = \
52
- Google::Cloud::Storage::VERSION
58
+ @service.client_options.application_version = Google::Cloud::Storage::VERSION
53
59
  @service.client_options.open_timeout_sec = (open_timeout || timeout)
54
60
  @service.client_options.read_timeout_sec = (read_timeout || timeout)
55
61
  @service.client_options.send_timeout_sec = (send_timeout || timeout)
56
62
  @service.client_options.transparent_gzip_decompression = false
57
63
  @service.request_options.retries = retries || 3
58
64
  @service.request_options.header ||= {}
59
- @service.request_options.header["x-goog-api-client"] = \
65
+ @service.request_options.header["x-goog-api-client"] =
60
66
  "gl-ruby/#{RUBY_VERSION} gccl/#{Google::Cloud::Storage::VERSION}"
61
67
  @service.request_options.header["Accept-Encoding"] = "gzip"
62
68
  @service.request_options.quota_project = quota_project if quota_project
@@ -68,6 +74,13 @@ module Google
68
74
  @service.request_options.upload_chunk_size = upload_chunk_size if upload_chunk_size
69
75
  @service.authorization = @credentials.client if @credentials
70
76
  @service.root_url = host if host
77
+ @service.universe_domain = universe_domain || Google::Cloud::Storage.configure.universe_domain
78
+ begin
79
+ @service.verify_universe_domain!
80
+ rescue Google::Apis::UniverseDomainError => e
81
+ # TODO: Create a Google::Cloud::Error subclass for this.
82
+ raise Google::Cloud::Error, e.message
83
+ end
71
84
  end
72
85
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
73
86
 
@@ -83,11 +96,12 @@ module Google
83
96
 
84
97
  ##
85
98
  # Retrieves a list of buckets for the given project.
86
- def list_buckets prefix: nil, token: nil, max: nil, user_project: nil, options: {}
99
+ def list_buckets prefix: nil, token: nil, max: nil, user_project: nil, soft_deleted: nil, options: {}
87
100
  execute do
88
101
  service.list_buckets \
89
102
  @project, prefix: prefix, page_token: token, max_results: max,
90
- user_project: user_project(user_project), options: options
103
+ user_project: user_project(user_project),
104
+ soft_deleted: soft_deleted, options: options
91
105
  end
92
106
  end
93
107
 
@@ -98,12 +112,16 @@ module Google
98
112
  if_metageneration_match: nil,
99
113
  if_metageneration_not_match: nil,
100
114
  user_project: nil,
115
+ soft_deleted: nil,
116
+ generation: nil,
101
117
  options: {}
102
118
  execute do
103
119
  service.get_bucket bucket_name,
104
120
  if_metageneration_match: if_metageneration_match,
105
121
  if_metageneration_not_match: if_metageneration_not_match,
106
122
  user_project: user_project(user_project),
123
+ soft_deleted: soft_deleted,
124
+ generation: generation,
107
125
  options: options
108
126
  end
109
127
  end
@@ -112,14 +130,16 @@ module Google
112
130
  # Creates a new bucket.
113
131
  # Returns Google::Apis::StorageV1::Bucket.
114
132
  def insert_bucket bucket_gapi, acl: nil, default_acl: nil,
115
- user_project: nil, options: {}
133
+ user_project: nil, enable_object_retention: nil,
134
+ options: {}
116
135
  execute do
117
136
  service.insert_bucket \
118
137
  @project, bucket_gapi,
119
138
  predefined_acl: acl,
120
139
  predefined_default_object_acl: default_acl,
121
140
  user_project: user_project(user_project),
122
- options: options
141
+ options: options,
142
+ enable_object_retention: enable_object_retention
123
143
  end
124
144
  end
125
145
 
@@ -349,13 +369,17 @@ module Google
349
369
  # Retrieves a list of files matching the criteria.
350
370
  def list_files bucket_name, delimiter: nil, max: nil, token: nil,
351
371
  prefix: nil, versions: nil, user_project: nil,
352
- options: {}
372
+ match_glob: nil, include_folders_as_prefixes: nil,
373
+ soft_deleted: nil, options: {}
353
374
  execute do
354
375
  service.list_objects \
355
376
  bucket_name, delimiter: delimiter, max_results: max,
356
377
  page_token: token, prefix: prefix,
357
378
  versions: versions,
358
379
  user_project: user_project(user_project),
380
+ match_glob: match_glob,
381
+ include_folders_as_prefixes: include_folders_as_prefixes,
382
+ soft_deleted: soft_deleted,
359
383
  options: options
360
384
  end
361
385
  end
@@ -439,6 +463,7 @@ module Google
439
463
  if_metageneration_not_match: nil,
440
464
  key: nil,
441
465
  user_project: nil,
466
+ soft_deleted: nil,
442
467
  options: {}
443
468
  execute do
444
469
  service.get_object \
@@ -449,6 +474,7 @@ module Google
449
474
  if_metageneration_match: if_metageneration_match,
450
475
  if_metageneration_not_match: if_metageneration_not_match,
451
476
  user_project: user_project(user_project),
477
+ soft_deleted: soft_deleted,
452
478
  options: key_options(key).merge(options)
453
479
  end
454
480
  end
@@ -521,7 +547,6 @@ module Google
521
547
  if_metageneration_match: nil,
522
548
  user_project: nil,
523
549
  options: {}
524
-
525
550
  source_objects = compose_file_source_objects source_files, if_source_generation_match
526
551
  compose_req = Google::Apis::StorageV1::ComposeRequest.new source_objects: source_objects,
527
552
  destination: destination_gapi
@@ -580,6 +605,7 @@ module Google
580
605
  if_metageneration_not_match: nil,
581
606
  predefined_acl: nil,
582
607
  user_project: nil,
608
+ override_unlocked_retention: nil,
583
609
  options: {}
584
610
  file_gapi ||= Google::Apis::StorageV1::Object.new
585
611
 
@@ -599,10 +625,49 @@ module Google
599
625
  if_metageneration_not_match: if_metageneration_not_match,
600
626
  predefined_acl: predefined_acl,
601
627
  user_project: user_project(user_project),
628
+ override_unlocked_retention: override_unlocked_retention,
602
629
  options: options
603
630
  end
604
631
  end
605
632
 
633
+ ##
634
+ # Moves file from source to destination path within bucket
635
+ def move_file name,
636
+ source_file,
637
+ destination_file,
638
+ if_generation_match: nil,
639
+ if_generation_not_match: nil,
640
+ if_metageneration_match: nil,
641
+ if_metageneration_not_match: nil,
642
+ if_source_generation_match: nil,
643
+ if_source_generation_not_match: nil,
644
+ if_source_metageneration_match: nil,
645
+ if_source_metageneration_not_match: nil,
646
+ user_project: nil,
647
+ fields: nil,
648
+ quota_user: nil,
649
+ user_ip: nil,
650
+ options: {}
651
+ execute do
652
+ service.move_object name,
653
+ source_file,
654
+ destination_file,
655
+ if_generation_match: if_generation_match,
656
+ if_generation_not_match: if_generation_not_match,
657
+ if_metageneration_match: if_metageneration_match,
658
+ if_metageneration_not_match: if_metageneration_not_match,
659
+ if_source_generation_match: if_source_generation_match,
660
+ if_source_generation_not_match: if_source_generation_not_match,
661
+ if_source_metageneration_match: if_source_metageneration_match,
662
+ if_source_metageneration_not_match: if_source_metageneration_not_match,
663
+ user_project: user_project(user_project),
664
+ fields: fields,
665
+ quota_user: quota_user,
666
+ user_ip: user_ip,
667
+ options: options
668
+ end
669
+ end
670
+
606
671
  ##
607
672
  # Permanently deletes a file.
608
673
  def delete_file bucket_name,
@@ -614,7 +679,6 @@ module Google
614
679
  if_metageneration_not_match: nil,
615
680
  user_project: nil,
616
681
  options: {}
617
-
618
682
  if options[:retries].nil?
619
683
  is_idempotent = retry? generation: generation, if_generation_match: if_generation_match
620
684
  options = is_idempotent ? {} : { retries: 0 }
@@ -632,6 +696,50 @@ module Google
632
696
  end
633
697
  end
634
698
 
699
+ ##
700
+ # Restore soft deleted bucket
701
+ def restore_bucket bucket_name,
702
+ generation,
703
+ options: {}
704
+ execute do
705
+ service.restore_bucket bucket_name, generation,
706
+ options: options
707
+ end
708
+ end
709
+
710
+ ##
711
+ # Restores a soft-deleted object.
712
+ def restore_file bucket_name,
713
+ file_path,
714
+ generation,
715
+ copy_source_acl: nil,
716
+ if_generation_match: nil,
717
+ if_generation_not_match: nil,
718
+ if_metageneration_match: nil,
719
+ if_metageneration_not_match: nil,
720
+ projection: nil,
721
+ user_project: nil,
722
+ fields: nil,
723
+ options: {}
724
+ if options[:retries].nil?
725
+ is_idempotent = retry? generation: generation, if_generation_match: if_generation_match
726
+ options = is_idempotent ? {} : { retries: 0 }
727
+ end
728
+
729
+ execute do
730
+ service.restore_object bucket_name, file_path, generation,
731
+ copy_source_acl: copy_source_acl,
732
+ if_generation_match: if_generation_match,
733
+ if_generation_not_match: if_generation_not_match,
734
+ if_metageneration_match: if_metageneration_match,
735
+ if_metageneration_not_match: if_metageneration_not_match,
736
+ projection: projection,
737
+ user_project: user_project(user_project),
738
+ fields: fields,
739
+ options: options
740
+ end
741
+ end
742
+
635
743
  ##
636
744
  # Retrieves a list of ACLs for the given file.
637
745
  def list_file_acls bucket_name, file_name, user_project: nil, options: {}
@@ -680,7 +788,6 @@ module Google
680
788
  # Returns Google::Apis::StorageV1::HmacKey.
681
789
  def create_hmac_key service_account_email, project_id: nil,
682
790
  user_project: nil, options: {}
683
-
684
791
  if options[:retries].nil?
685
792
  options = options.merge({ retries: 0 })
686
793
  end
@@ -841,8 +948,7 @@ module Google
841
948
  headers = (options[:header] ||= {})
842
949
  headers["x-goog-#{source}encryption-algorithm"] = "AES256"
843
950
  headers["x-goog-#{source}encryption-key"] = Base64.strict_encode64 key
844
- headers["x-goog-#{source}encryption-key-sha256"] = \
845
- Base64.strict_encode64 key_sha256
951
+ headers["x-goog-#{source}encryption-key-sha256"] = Base64.strict_encode64 key_sha256
846
952
  options
847
953
  end
848
954
 
@@ -16,7 +16,7 @@
16
16
  module Google
17
17
  module Cloud
18
18
  module Storage
19
- VERSION = "1.45.0".freeze
19
+ VERSION = "1.56.0".freeze
20
20
  end
21
21
  end
22
22
  end
@@ -67,6 +67,8 @@ module Google
67
67
  # @param [Integer] send_timeout How long, in seconds, before receiving response from server times out. Optional.
68
68
  # @param [String] endpoint Override of the endpoint host name. Optional.
69
69
  # If the param is nil, uses the default endpoint.
70
+ # @param universe_domain [String] Override of the universe domain. Optional.
71
+ # If unset or nil, uses the default unvierse domain
70
72
  # @param [Integer] upload_chunk_size The chunk size of storage upload, in bytes.
71
73
  # The default value is 100 MB, i.e. 104_857_600 bytes. To disable chunking and upload
72
74
  # the complete file regardless of size, pass 0 as the chunk size.
@@ -92,20 +94,21 @@ module Google
92
94
  timeout: nil, open_timeout: nil, read_timeout: nil,
93
95
  send_timeout: nil, endpoint: nil, project: nil, keyfile: nil,
94
96
  max_elapsed_time: nil, base_interval: nil, max_interval: nil,
95
- multiplier: nil, upload_chunk_size: nil
97
+ multiplier: nil, upload_chunk_size: nil, universe_domain: nil
96
98
  scope ||= configure.scope
97
99
  retries ||= configure.retries
98
100
  timeout ||= configure.timeout
99
- open_timeout ||= (configure.open_timeout || timeout)
100
- read_timeout ||= (configure.read_timeout || timeout)
101
- send_timeout ||= (configure.send_timeout || timeout)
101
+ open_timeout ||= configure.open_timeout || timeout
102
+ read_timeout ||= configure.read_timeout || timeout
103
+ send_timeout ||= configure.send_timeout || timeout
102
104
  endpoint ||= configure.endpoint
103
- credentials ||= (keyfile || default_credentials(scope: scope))
105
+ credentials ||= keyfile || default_credentials(scope: scope)
104
106
  max_elapsed_time ||= configure.max_elapsed_time
105
107
  base_interval ||= configure.base_interval
106
108
  max_interval ||= configure.max_interval
107
109
  multiplier ||= configure.multiplier
108
110
  upload_chunk_size ||= configure.upload_chunk_size
111
+ universe_domain ||= configure.universe_domain
109
112
 
110
113
  unless credentials.is_a? Google::Auth::Credentials
111
114
  credentials = Storage::Credentials.new credentials, scope: scope
@@ -121,7 +124,8 @@ module Google
121
124
  read_timeout: read_timeout, send_timeout: send_timeout,
122
125
  host: endpoint, quota_project: configure.quota_project,
123
126
  max_elapsed_time: max_elapsed_time, base_interval: base_interval,
124
- max_interval: max_interval, multiplier: multiplier, upload_chunk_size: upload_chunk_size
127
+ max_interval: max_interval, multiplier: multiplier, upload_chunk_size: upload_chunk_size,
128
+ universe_domain: universe_domain
125
129
  )
126
130
  )
127
131
  end
@@ -145,6 +149,8 @@ module Google
145
149
  # @param [Integer] send_timeout How long, in seconds, before receiving response from server times out. Optional.
146
150
  # @param [String] endpoint Override of the endpoint host name. Optional.
147
151
  # If the param is nil, uses the default endpoint.
152
+ # @param universe_domain [String] Override of the universe domain. Optional.
153
+ # If unset or nil, uses the default unvierse domain
148
154
  # @param [Integer] upload_chunk_size The chunk size of storage upload, in bytes.
149
155
  # The default value is 100 MB, i.e. 104_857_600 bytes. To disable chunking and upload
150
156
  # the complete file regardless of size, pass 0 as the chunk size.
@@ -166,7 +172,7 @@ module Google
166
172
  def self.anonymous retries: nil, timeout: nil, open_timeout: nil,
167
173
  read_timeout: nil, send_timeout: nil, endpoint: nil,
168
174
  max_elapsed_time: nil, base_interval: nil, max_interval: nil,
169
- multiplier: nil, upload_chunk_size: nil
175
+ multiplier: nil, upload_chunk_size: nil, universe_domain: nil
170
176
  open_timeout ||= timeout
171
177
  read_timeout ||= timeout
172
178
  send_timeout ||= timeout
@@ -175,7 +181,8 @@ module Google
175
181
  nil, nil, retries: retries, timeout: timeout, open_timeout: open_timeout,
176
182
  read_timeout: read_timeout, send_timeout: send_timeout, host: endpoint,
177
183
  max_elapsed_time: max_elapsed_time, base_interval: base_interval,
178
- max_interval: max_interval, multiplier: multiplier, upload_chunk_size: upload_chunk_size
184
+ max_interval: max_interval, multiplier: multiplier, upload_chunk_size: upload_chunk_size,
185
+ universe_domain: universe_domain
179
186
  )
180
187
  )
181
188
  end
@@ -79,11 +79,11 @@ module Google
79
79
  def storage scope: nil, retries: nil, timeout: nil, open_timeout: nil, read_timeout: nil, send_timeout: nil,
80
80
  max_elapsed_time: nil, base_interval: nil, max_interval: nil, multiplier: nil, upload_chunk_size: nil
81
81
  Google::Cloud.storage @project, @keyfile, scope: scope,
82
- retries: (retries || @retries),
83
- timeout: (timeout || @timeout),
84
- open_timeout: (open_timeout || timeout),
85
- read_timeout: (read_timeout || timeout),
86
- send_timeout: (send_timeout || timeout),
82
+ retries: retries || @retries,
83
+ timeout: timeout || @timeout,
84
+ open_timeout: open_timeout || timeout,
85
+ read_timeout: read_timeout || timeout,
86
+ send_timeout: send_timeout || timeout,
87
87
  max_elapsed_time: max_elapsed_time,
88
88
  base_interval: base_interval,
89
89
  max_interval: max_interval,
@@ -149,9 +149,9 @@ module Google
149
149
  scope: scope,
150
150
  retries: retries,
151
151
  timeout: timeout,
152
- open_timeout: (open_timeout || timeout),
153
- read_timeout: (read_timeout || timeout),
154
- send_timeout: (send_timeout || timeout),
152
+ open_timeout: open_timeout || timeout,
153
+ read_timeout: read_timeout || timeout,
154
+ send_timeout: send_timeout || timeout,
155
155
  max_elapsed_time: max_elapsed_time,
156
156
  base_interval: base_interval,
157
157
  max_interval: max_interval,
@@ -162,7 +162,6 @@ module Google
162
162
  end
163
163
 
164
164
  # Set the default storage configuration
165
- # rubocop:disable Metrics/BlockLength
166
165
  Google::Cloud.configure.add_config! :storage do |config|
167
166
  default_project = Google::Cloud::Config.deferred do
168
167
  ENV["STORAGE_PROJECT"]
@@ -192,7 +191,6 @@ Google::Cloud.configure.add_config! :storage do |config|
192
191
  config.add_field! :read_timeout, nil, match: Integer
193
192
  config.add_field! :send_timeout, nil, match: Integer
194
193
  config.add_field! :upload_chunk_size, nil, match: Integer
195
- # TODO: Remove once discovery document is updated.
196
- config.add_field! :endpoint, "https://storage.googleapis.com/", match: String
194
+ config.add_field! :endpoint, nil, match: String, allow_nil: true
195
+ config.add_field! :universe_domain, nil, match: String, allow_nil: true
197
196
  end
198
- # rubocop:enable Metrics/BlockLength
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-cloud-storage
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.45.0
4
+ version: 1.56.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Moore
8
8
  - Chris Smith
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2023-11-06 00:00:00.000000000 Z
11
+ date: 2025-04-21 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: google-cloud-core
@@ -26,53 +25,61 @@ dependencies:
26
25
  - !ruby/object:Gem::Version
27
26
  version: '1.6'
28
27
  - !ruby/object:Gem::Dependency
29
- name: google-apis-iamcredentials_v1
28
+ name: google-apis-core
30
29
  requirement: !ruby/object:Gem::Requirement
31
30
  requirements:
32
31
  - - "~>"
33
32
  - !ruby/object:Gem::Version
34
- version: '0.1'
33
+ version: '0.13'
35
34
  type: :runtime
36
35
  prerelease: false
37
36
  version_requirements: !ruby/object:Gem::Requirement
38
37
  requirements:
39
38
  - - "~>"
40
39
  - !ruby/object:Gem::Version
41
- version: '0.1'
40
+ version: '0.13'
42
41
  - !ruby/object:Gem::Dependency
43
- name: google-apis-storage_v1
42
+ name: google-apis-iamcredentials_v1
44
43
  requirement: !ruby/object:Gem::Requirement
45
44
  requirements:
46
45
  - - "~>"
47
46
  - !ruby/object:Gem::Version
48
- version: 0.29.0
47
+ version: '0.18'
49
48
  type: :runtime
50
49
  prerelease: false
51
50
  version_requirements: !ruby/object:Gem::Requirement
52
51
  requirements:
53
52
  - - "~>"
54
53
  - !ruby/object:Gem::Version
55
- version: 0.29.0
54
+ version: '0.18'
56
55
  - !ruby/object:Gem::Dependency
57
- name: googleauth
56
+ name: google-apis-storage_v1
58
57
  requirement: !ruby/object:Gem::Requirement
59
58
  requirements:
60
59
  - - ">="
61
60
  - !ruby/object:Gem::Version
62
- version: 0.16.2
63
- - - "<"
64
- - !ruby/object:Gem::Version
65
- version: 2.a
61
+ version: '0.42'
66
62
  type: :runtime
67
63
  prerelease: false
68
64
  version_requirements: !ruby/object:Gem::Requirement
69
65
  requirements:
70
66
  - - ">="
71
67
  - !ruby/object:Gem::Version
72
- version: 0.16.2
73
- - - "<"
68
+ version: '0.42'
69
+ - !ruby/object:Gem::Dependency
70
+ name: googleauth
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.9'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
74
81
  - !ruby/object:Gem::Version
75
- version: 2.a
82
+ version: '1.9'
76
83
  - !ruby/object:Gem::Dependency
77
84
  name: digest-crc
78
85
  requirement: !ruby/object:Gem::Requirement
@@ -121,14 +128,14 @@ dependencies:
121
128
  requirements:
122
129
  - - "~>"
123
130
  - !ruby/object:Gem::Version
124
- version: 1.25.1
131
+ version: 1.30.0
125
132
  type: :development
126
133
  prerelease: false
127
134
  version_requirements: !ruby/object:Gem::Requirement
128
135
  requirements:
129
136
  - - "~>"
130
137
  - !ruby/object:Gem::Version
131
- version: 1.25.1
138
+ version: 1.30.0
132
139
  - !ruby/object:Gem::Dependency
133
140
  name: minitest
134
141
  requirement: !ruby/object:Gem::Requirement
@@ -317,7 +324,6 @@ homepage: https://github.com/googleapis/google-cloud-ruby/tree/master/google-clo
317
324
  licenses:
318
325
  - Apache-2.0
319
326
  metadata: {}
320
- post_install_message:
321
327
  rdoc_options: []
322
328
  require_paths:
323
329
  - lib
@@ -325,15 +331,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
325
331
  requirements:
326
332
  - - ">="
327
333
  - !ruby/object:Gem::Version
328
- version: '2.5'
334
+ version: 3.0.0
329
335
  required_rubygems_version: !ruby/object:Gem::Requirement
330
336
  requirements:
331
337
  - - ">="
332
338
  - !ruby/object:Gem::Version
333
339
  version: '0'
334
340
  requirements: []
335
- rubygems_version: 3.4.19
336
- signing_key:
341
+ rubygems_version: 3.6.5
337
342
  specification_version: 4
338
343
  summary: API Client library for Google Cloud Storage
339
344
  test_files: []