Skip to content

Commit 2438bc3

Browse files
committed
Add close and closed? methods to Tabix class with corresponding tests
1 parent 2b31142 commit 2438bc3

2 files changed

Lines changed: 30 additions & 0 deletions

File tree

lib/hts/tabix.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ def build_index(index_name = nil, min_shift: 0)
6868
end
6969

7070
def load_index(index_name = nil)
71+
check_closed
7172
if index_name
7273
LibHTS.tbx_index_load2(@file_name, index_name)
7374
else
@@ -76,14 +77,17 @@ def load_index(index_name = nil)
7677
end
7778

7879
def index_loaded?
80+
check_closed
7981
!@idx.null?
8082
end
8183

8284
def name2id(name)
85+
check_closed
8386
LibHTS.tbx_name2id(@idx, name)
8487
end
8588

8689
def seqnames
90+
check_closed
8791
nseq = FFI::MemoryPointer.new(:int)
8892
LibHTS.tbx_seqnames(@idx, nseq).then do |pts|
8993
pts.read_array_of_pointer(nseq.read_int).map(&:read_string)
@@ -101,6 +105,20 @@ def query(region, start = nil, end_ = nil, &block)
101105
end
102106
end
103107

108+
def close
109+
return if closed?
110+
111+
# @idx is an internal index (LibHTS::Tbx, a ManagedStruct).
112+
# Do not call tbx_destroy here; the FFI finalizer will
113+
# release the underlying C struct when @idx becomes unreachable.
114+
@idx = nil
115+
super
116+
end
117+
118+
def closed?
119+
@hts_file.nil? || @hts_file.null?
120+
end
121+
104122
private
105123

106124
def queryi(id, start, end_, &block)
@@ -131,5 +149,9 @@ def query_yield(qiter)
131149
LibHTS.hts_itr_destroy(qiter)
132150
end
133151
end
152+
153+
def check_closed
154+
raise IOError, "closed Tabix" if closed?
155+
end
134156
end
135157
end

test/tabix_test.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ def test_file_format
2727
assert_equal "vcf", @bcf.file_format
2828
end
2929

30+
def test_close
31+
assert_equal false, @bcf.closed?
32+
@bcf.close
33+
assert_equal true, @bcf.closed?
34+
# second close should be no-op
35+
assert_nil @bcf.close
36+
end
37+
3038
def test_name2id
3139
assert_equal 0, @bcf.name2id("poo")
3240
end

0 commit comments

Comments
 (0)