PK!D yy&bin2fasta/.converter.cpp.cppimporthash]qXA/Users/kimja/programming/python/bin2fasta/bin2fasta/converter.cppqaX e3e7bd28e5f460ce8f24e6c59685f705qq.PK!6D!bin2fasta/.rendered.converter.cpp/*cppimport */ #include int add(int i, int j) { return i + j; } PYBIND11_MODULE(converter, m) { m.def("add", &add, "A function which adds two numbers"); } PK!j*,,bin2fasta/__init__.pyfrom .main import main __all__ = ['main'] PK!ibin2fasta/converter.cpp/*cppimport <% setup_pybind11(cfg) %> */ #include int add(int i, int j) { return i + j; } PYBIND11_MODULE(converter, m) { m.def("add", &add, "A function which adds two numbers"); } PK!! bin2fasta/main.pyimport sys import click from tqdm import tqdm class FileStreamer: """Generic file opener context""" def __init__(self, fname, mode): self.fname = fname self.mode = mode self.fd = None def __enter__(self): self.fd = open(self.fname, self.mode) return self def __exit__(self, exc_type, exc_val, exc_tb): self.fd.close() class BitReader(FileStreamer): """Read individual bits of file""" def read(self): while True: byte = self.fd.read(1) if len(byte) == 0: return b = ord(byte) for i in range(7, -1, -1): yield (b >> i) & 1 class SequenceReader(FileStreamer): """Read only bases from FASTA file""" def read(self): ignore = True while True: char = self.fd.read(1) if len(char) == 0: return if char == '>': ignore = True continue elif char == '\n': ignore = False continue if not ignore: yield char TABLE_BIN2FASTA = {0: {0: 'A', 1: 'G'}, 1: {0: 'T', 1: 'C'}} TABLE_FASTA2BIN = {'A': '00', 'G': '01', 'T': '10', 'C': '11'} @click.command() @click.argument('filename', type=click.Path(exists=True)) @click.option( '-D', '--decode', is_flag=True, default=False, help='Enable conversion from FASTA to binary.') @click.option( '-o', '--output', type=click.File('w'), default='-', help='File to write to.') def main(filename, decode, output): """Store any file as a fasta file""" if decode: with SequenceReader(filename, mode='r') as fd: data = '' for base in tqdm(fd.read()): out = TABLE_FASTA2BIN[base] data += out if len(data) == 8: int_ = 0 for bit in data: int_ = (int_ << 1) | int(bit) data = '' byte = int_.to_bytes(1, byteorder=sys.byteorder) output.buffer.write(byte) else: section_length = 250 output.write('>Sequence_master\n') with BitReader(filename, mode='rb') as fd: last = None for i, bit in enumerate(tqdm(fd.read())): if (i+1) % section_length == 0: output.write(f'\n>Sequence_{hex(i)}\n') if last is None: last = bit else: out = TABLE_BIN2FASTA[last][bit] last = None output.write(out) if __name__ == '__main__': main() PK!bin2fasta/tests/__init__.pyPK!]bin2fasta/tests/test_all.pyfrom click.testing import CliRunner from ..main import main def test_integration(): runner = CliRunner() with runner.isolated_filesystem(): # setup environment content = 'Hello World!' fname = 'test.dat' with open(fname, 'w') as fd: fd.write(content) # run conversions result_b2f = runner.invoke( main, [fname, '-o', 'tmp.fasta']) result_f2b = runner.invoke( main, ['--decode', '-o', 'out.dat', 'tmp.fasta']) assert result_b2f.exit_code == 0 assert result_f2b.exit_code == 0 # check result with open('out.dat') as fd: conv_content = fd.read() assert content == conv_content PK!Ho_`&,*bin2fasta-0.0.1.dist-info/entry_points.txtN+I/N.,()J3JK,.Ir3PK!H STTbin2fasta-0.0.1.dist-info/WHEEL 1 0 нR. \I$ơ7.ZON `h6oi14m,b4>4ɛpK>X;baP>PK!H˾U"bin2fasta-0.0.1.dist-info/METADATATmO0_qHICiiZV }Ahε5u`;@w -h4Mdy;]rg;Z'+c #cʩ%9iQ;d/>wJp6WFѴ_齫N+ -S2y\1Q-5##j)wjpT ǰ|-qV1WƸJZÉHIv擀K= }UXdxKuiUQ9ևO"Q'rn[^JɁr4»~?g2y|G'Y] ƙ 61˩kmEuSvM3 UI_ nuDCۄ>&VQR$4Q߀/-`o`ԾNyJ\ )zVCYo-0o*L<8|T\a3124pN_h׮0oPK!D yy&bin2fasta/.converter.cpp.cppimporthashPK!6D!bin2fasta/.rendered.converter.cppPK!j*,,bin2fasta/__init__.pyPK!ibin2fasta/converter.cppPK!! #bin2fasta/main.pyPK! bin2fasta/tests/__init__.pyPK!]/bin2fasta/tests/test_all.pyPK!Ho_`&,*Fbin2fasta-0.0.1.dist-info/entry_points.txtPK!H STTbin2fasta-0.0.1.dist-info/WHEELPK!H˾U"Ebin2fasta-0.0.1.dist-info/METADATAPK!H5@u Ibin2fasta-0.0.1.dist-info/RECORDPK ?