Skip to content

Commit 607ebbc

Browse files
authored
Add metadata to fake_gcloud (#8243)
1 parent 9940bdb commit 607ebbc

File tree

4 files changed

+48
-7
lines changed

4 files changed

+48
-7
lines changed

pkg/fake_gcloud/lib/mem_storage.dart

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'dart:async';
22
import 'dart:convert';
33

44
import 'package:_discoveryapis_commons/_discoveryapis_commons.dart';
5+
import 'package:clock/clock.dart';
56
import 'package:crypto/crypto.dart';
67
import 'package:gcloud/storage.dart';
78
import 'package:logging/logging.dart';
@@ -67,9 +68,13 @@ class MemStorage implements Storage {
6768
_logger.info('Copy object from $src to $dest');
6869
final srcUri = Uri.parse(src);
6970
final destUri = Uri.parse(dest);
70-
await bucket(srcUri.host)
71-
.read(srcUri.path.substring(1))
72-
.pipe(bucket(destUri.host).write(destUri.path.substring(1)));
71+
final srcBucket = _buckets[srcUri.host]!;
72+
final srcObject = srcBucket._files[srcUri.path.substring(1)]!;
73+
await bucket(destUri.host).writeBytes(
74+
destUri.path.substring(1),
75+
srcObject.content,
76+
metadata: metadata ?? srcObject.metadata,
77+
);
7378
}
7479

7580
/// Serializes the content of the Storage to the [sink], with a line-by-line
@@ -107,18 +112,38 @@ class MemStorage implements Storage {
107112
'name': file.name,
108113
'content': base64.encode(file.content),
109114
'updated': file.updated.toUtc().toIso8601String(),
110-
'metadata': null, // TODO: add metadata support
115+
'metadata': {
116+
'contentType': file.metadata.contentType,
117+
'contentEncoding': file.metadata.contentEncoding,
118+
'cacheControl': file.metadata.cacheControl,
119+
'contentDisposition': file.metadata.contentDisposition,
120+
'contentLanguage': file.metadata.contentLanguage,
121+
'custom': file.metadata.custom,
122+
},
111123
};
112124
}
113125

114126
_File _decodeFile(Map<String, dynamic> map) {
115127
final content = base64.decode(map['content'] as String);
116128
final updated = DateTime.parse(map['updated'] as String);
129+
final meta = map['metadata'] ?? <String, Object?>{};
117130
return _File(
118131
bucketName: map['bucket'] as String,
119132
name: map['name'] as String,
120133
content: content,
121134
updated: updated,
135+
metadata: ObjectMetadata(
136+
acl: Acl([]),
137+
contentType: meta['contentType'] as String?,
138+
contentEncoding: meta['contentEncoding'] as String?,
139+
cacheControl: meta['cacheControl'] as String?,
140+
contentDisposition: meta['contentDisposition'] as String?,
141+
contentLanguage: meta['contentLanguage'] as String?,
142+
custom: (meta['custom'] as Map?)?.map(
143+
(k, v) => MapEntry(k as String, v as String),
144+
) ??
145+
<String, String>{},
146+
),
122147
);
123148
}
124149
}
@@ -141,12 +166,12 @@ class _File implements BucketObjectEntry {
141166
required this.bucketName,
142167
required this.name,
143168
required this.content,
169+
required this.metadata,
144170
DateTime? updated,
145171
}) : // TODO: use a real CRC32 check
146172
crc32CChecksum = content.fold<int>(0, (a, b) => a + b) & 0xffffffff,
147173
md5Hash = md5.convert(content).bytes,
148-
updated = updated ?? DateTime.now().toUtc(),
149-
metadata = ObjectMetadata(acl: Acl([]));
174+
updated = updated ?? clock.now().toUtc();
150175

151176
@override
152177
Uri get downloadLink => Uri(scheme: 'gs', host: bucketName, path: name);
@@ -199,10 +224,18 @@ class _Bucket implements Bucket {
199224
buffer.addAll(data);
200225
return buffer;
201226
}).then((content) {
227+
var meta = metadata ?? ObjectMetadata();
228+
if (acl != null) {
229+
meta = meta.replace(acl: acl);
230+
}
231+
if (contentType != null) {
232+
meta = meta.replace(contentType: contentType);
233+
}
202234
_files[objectName] = _File(
203235
bucketName: bucketName,
204236
name: objectName,
205237
content: content,
238+
metadata: meta,
206239
);
207240
_logger.info('Completed ${content.length} bytes: $objectName');
208241
});

pkg/fake_gcloud/pubspec.lock

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ packages:
5454
url: "https://pub.dev"
5555
source: hosted
5656
version: "2.1.1"
57+
clock:
58+
dependency: "direct main"
59+
description:
60+
name: clock
61+
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
62+
url: "https://pub.dev"
63+
source: hosted
64+
version: "1.1.2"
5765
collection:
5866
dependency: transitive
5967
description:

pkg/fake_gcloud/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ environment:
88
dependencies:
99
gcloud: ^0.8.16
1010
logging: '>=0.11.3 <2.0.0'
11+
clock: ^1.1.0
1112

1213
dev_dependencies:
1314
coverage: any # test already depends on it

pkg/fake_gcloud/test/mem_storage_test.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ void main() {
9393

9494
final sb = StringBuffer();
9595
storage.writeTo(sb);
96-
expect(sb.length, 118);
9796

9897
final newStorage = MemStorage();
9998
newStorage.readFrom(sb.toString().split('\n'));

0 commit comments

Comments
 (0)