Skip to content

Commit 9c3ea5d

Browse files
committed
fix: ensure that pin metadata files are closed after reading them in
1 parent 754224c commit 9c3ea5d

1 file changed

Lines changed: 31 additions & 23 deletions

File tree

pins/boards.py

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import contextlib
34
import functools
45
import inspect
56
import logging
@@ -156,9 +157,8 @@ def pin_meta(self, name, version: str = None) -> Meta:
156157
meta_name = self.meta_factory.get_meta_name(*components)
157158

158159
path_meta = self.construct_path([*components, meta_name])
159-
f, local = self._open_pin_meta(path_meta)
160-
161-
meta = self.meta_factory.read_pin_yaml(f, pin_name, selected_version, local=local)
160+
with self._open_pin_meta(path_meta) as (f, local):
161+
meta = self.meta_factory.read_pin_yaml(f, pin_name, selected_version, local=local)
162162

163163
return meta
164164

@@ -788,14 +788,18 @@ def _load_data(self, meta, pin_version_path):
788788

789789
# filesystem and cache methods --------------------------------------------
790790

791+
@contextlib.contextmanager
791792
def _open_pin_meta(self, path):
792793
f = self.fs.open(path)
793-
self._touch_cache(path)
794+
try:
795+
self._touch_cache(path)
794796

795-
# optional additional data to put in Meta.local
796-
local = {}
797+
# optional additional data to put in Meta.local
798+
local = {}
797799

798-
return f, local
800+
yield f, local
801+
finally:
802+
self.fs.close(f)
799803

800804
def _get_cache_path(self, pin_name, version=None, fname=None):
801805
version_part = [version] if version is not None else []
@@ -934,8 +938,8 @@ def pin_meta(self, name, version=None):
934938
# note that pins on this board should point to versions, so we use an
935939
# empty string to mark version (it ultimately is ignored)
936940
path_meta = self.construct_path([pin_name, "", meta_name])
937-
f, local = self._open_pin_meta(path_meta)
938-
meta = self.meta_factory.read_pin_yaml(f, pin_name, VersionRaw(""), local=local)
941+
with self._open_pin_meta(path_meta) as (f, local):
942+
meta = self.meta_factory.read_pin_yaml(f, pin_name, VersionRaw(""), local=local)
939943

940944
# TODO(#59,#83): handle caching, and then re-enable pin_read.
941945
# self._touch_cache(path_meta)
@@ -1143,22 +1147,26 @@ def pin_versions_prune(self, *args, **kwargs):
11431147
)
11441148
super().pin_versions_prune(*args, **kwargs)
11451149

1150+
@contextlib.contextmanager
11461151
def _open_pin_meta(self, path):
11471152
f = self.fs.open(path)
1148-
self._touch_cache(path)
1149-
1150-
# optional additional data to put in Meta.local
1151-
user_name, content_name, bundle_id = str(path).split("/")[:3]
1152-
user_guid = self.fs._user_name_cache[user_name]
1153-
content_guid = self.fs._content_name_cache[(user_guid, content_name)]
1154-
1155-
local = {
1156-
"content_id": content_guid,
1157-
"version": bundle_id,
1158-
"url": f"{self.fs.api.server_url}/content/{content_guid}/",
1159-
}
1160-
1161-
return f, local
1153+
try:
1154+
self._touch_cache(path)
1155+
1156+
# optional additional data to put in Meta.local
1157+
user_name, content_name, bundle_id = str(path).split("/")[:3]
1158+
user_guid = self.fs._user_name_cache[user_name]
1159+
content_guid = self.fs._content_name_cache[(user_guid, content_name)]
1160+
1161+
local = {
1162+
"content_id": content_guid,
1163+
"version": bundle_id,
1164+
"url": f"{self.fs.api.server_url}/content/{content_guid}/",
1165+
}
1166+
1167+
yield f, local
1168+
finally:
1169+
self.fs.close(f)
11621170

11631171
def validate_pin_name(self, name) -> None:
11641172
# this should be the default behavior, expecting a full pin name.

0 commit comments

Comments
 (0)