From 2c4b5714f6f58f73dca44d4b852233ca09ccee5a Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Fri, 21 Jan 2022 13:15:43 -0500 Subject: [PATCH 01/15] For #33: expect HTTPS in tests --- test_vquest/test_vquest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test_vquest/test_vquest.py b/test_vquest/test_vquest.py index 89f460e..fd4b566 100644 --- a/test_vquest/test_vquest.py +++ b/test_vquest/test_vquest.py @@ -111,7 +111,7 @@ def test_vquest(self): self.assertEqual(self.post.call_count, 1) self.assertEqual( self.post.call_args.args, - ('http://www.imgt.org/IMGT_vquest/analysis', )) + ('https://www.imgt.org/IMGT_vquest/analysis', )) config_used = self.config.copy() # Whatever input type was given the actual type submitted to the form # will be "inline" to allow chunking of sequences if needed. The @@ -274,7 +274,7 @@ def test_vquest(self): self.assertEqual(self.post.call_count, 1) self.assertEqual( self.post.call_args.args, - ('http://www.imgt.org/IMGT_vquest/analysis', )) + ('https://www.imgt.org/IMGT_vquest/analysis', )) def test_vquest_main(self): """Test that an html file with an error message is parsed correctly for cmd-line usage.""" From 8dbecd4ad0b307299d4d936f1b5a89f9464c7f1d Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Fri, 21 Jan 2022 13:30:20 -0500 Subject: [PATCH 02/15] For #33: switch to HTTPS --- vquest/request.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vquest/request.py b/vquest/request.py index 06a3f65..0282cd1 100644 --- a/vquest/request.py +++ b/vquest/request.py @@ -12,7 +12,7 @@ LOGGER = logging.getLogger(__name__) -URL = "http://www.imgt.org/IMGT_vquest/analysis" +URL = "https://www.imgt.org/IMGT_vquest/analysis" DELAY = 1 # for rate-limiting multiple requests CHUNK_SIZE = 50 # to stay within V-QUEST's limit on sequences in one go From 8f0a181172200695f63797058eb062379a639102 Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Fri, 21 Jan 2022 13:44:37 -0500 Subject: [PATCH 03/15] For #34: changelog [skip ci] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2fe368..620299c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## dev + +### Fixed + + * Requests to the IMGT server now use HTTPS ([#34]) + +[#34]: https://github.com/ressy/vquest/pull/34 + ## 0.0.9 - 2021-07-20 ### Added From e16e9893e569b77b89db64b966cdc02ceea2d1e4 Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Tue, 27 Sep 2022 10:36:12 -0400 Subject: [PATCH 04/15] make package namespace match readme --- vquest/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vquest/__init__.py b/vquest/__init__.py index 32ca52b..193fae3 100644 --- a/vquest/__init__.py +++ b/vquest/__init__.py @@ -6,6 +6,8 @@ import logging from .version import __version__ +from .request import vquest +from .config import DEFAULTS, OPTIONS, load_config, layer_configs LOGGER = logging.getLogger(__name__) LOGGER.propagate = False LOGGER.addHandler(logging.StreamHandler()) From 825a81f88a6c444a6fd1aeb11e122145be4155ce Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Tue, 27 Sep 2022 10:37:34 -0400 Subject: [PATCH 05/15] update URLs for new repo remote --- README.md | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1e33dfc..0325c35 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Automate IMGT V-QUEST usage on imgt.org -[![vquest](https://circleci.com/gh/ressy/vquest.svg?style=shield)](https://circleci.com/gh/ressy/vquest) +[![vquest](https://circleci.com/gh/shawhahnlab/vquest.svg?style=shield)](https://circleci.com/gh/shawhahnlab/vquest) [IMGT](http://imgt.org)'s [V-QUEST](http://www.imgt.org/IMGT_vquest/analysis) is only available via a web interface. This Python package automates V-QUEST diff --git a/setup.py b/setup.py index fad8fea..b60b78d 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ description="Automate IMGT V-QUEST usage on imgt.org", long_description=long_description, long_description_content_type="text/markdown", - url="https://github.com/ressy/vquest", + url="https://github.com/shawhahnlab/vquest", packages=setuptools.find_packages(), package_data={"vquest": ["data/*"]}, entry_points={"console_scripts": [ From 1f1e61489d5be328d3aa33c7c7df073e21f47498 Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Tue, 27 Sep 2022 11:14:23 -0400 Subject: [PATCH 06/15] more namespace fixes --- vquest/__init__.py | 2 -- vquest/__main__.py | 8 ++++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/vquest/__init__.py b/vquest/__init__.py index 193fae3..32ca52b 100644 --- a/vquest/__init__.py +++ b/vquest/__init__.py @@ -6,8 +6,6 @@ import logging from .version import __version__ -from .request import vquest -from .config import DEFAULTS, OPTIONS, load_config, layer_configs LOGGER = logging.getLogger(__name__) LOGGER.propagate = False LOGGER.addHandler(logging.StreamHandler()) diff --git a/vquest/__main__.py b/vquest/__main__.py index 02ea880..b041f6e 100644 --- a/vquest/__main__.py +++ b/vquest/__main__.py @@ -6,9 +6,9 @@ import logging import argparse from pathlib import Path -import vquest +from vquest import __doc__ as main_doc from vquest import LOGGER -from . import request +from .request import vquest from .config import DEFAULTS, OPTIONS, load_config, layer_configs from .util import airr_to_fasta from .version import __version__ @@ -23,7 +23,7 @@ def main(arglist=None): args = parser.parse_args(arglist) LOGGER.setLevel(max(10, logging.WARNING - 10*args.verbose)) config_full = __setup_config(args, parser) - output = request.vquest(config_full, collapse=args.collapse) + output = vquest(config_full, collapse=args.collapse) __process_output(args, output) LOGGER.info("Done.") @@ -84,7 +84,7 @@ def __process_output(args, output): def __setup_arg_parser(): parser = argparse.ArgumentParser( - description=vquest.__doc__, + description=main_doc, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument("config", nargs="*", help="YAML configuration file") parser.add_argument( From c12319ad65e8d3c2da1720fb6b014eb6b75b9cfe Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Tue, 27 Sep 2022 11:15:12 -0400 Subject: [PATCH 07/15] hedge against missing newlines in AIRR results I had this floating around for a bit but hadn't committed yet. No test for this but I'd rather just get it included for now. --- vquest/request.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vquest/request.py b/vquest/request.py index 0282cd1..e5ab1c6 100644 --- a/vquest/request.py +++ b/vquest/request.py @@ -94,4 +94,8 @@ def _collapse_outputs(outputs): else: airr = output_chunk["vquest_airr.tsv"].decode() output["vquest_airr.tsv"] += "\n".join(airr.splitlines()[1:]) + # I've seen cases where there may or may not be a final newline, so + # let's make sure there always is + if not output["vquest_airr.tsv"].endswith("\n"): + output["vquest_airr.tsv"] += "\n" return output From 4ae7d7c519c2d1c71a90995af03c3dcc673d361a Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Tue, 27 Sep 2022 11:25:53 -0400 Subject: [PATCH 08/15] group common imports in vquest.vq --- README.md | 2 +- vquest/__main__.py | 19 ++++++++----------- vquest/vq.py | 7 +++++++ 3 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 vquest/vq.py diff --git a/README.md b/README.md index 0325c35..8fb09ec 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Here the aligned FASTA text is printed directly to standard output. Example Python usage: - >>> from vquest import * + >>> from vquest.vq import * >>> config = layer_configs(DEFAULTS, {"species": "rhesus-monkey", "receptorOrLocusType": "IG", "fileSequences": "seqs.fasta"}) >>> result = vquest(config) >>> result.keys() diff --git a/vquest/__main__.py b/vquest/__main__.py index b041f6e..c10d908 100644 --- a/vquest/__main__.py +++ b/vquest/__main__.py @@ -8,10 +8,7 @@ from pathlib import Path from vquest import __doc__ as main_doc from vquest import LOGGER -from .request import vquest -from .config import DEFAULTS, OPTIONS, load_config, layer_configs -from .util import airr_to_fasta -from .version import __version__ +from vquest import vq def main(arglist=None): """Command-line interface for V-QUEST requests""" @@ -23,7 +20,7 @@ def main(arglist=None): args = parser.parse_args(arglist) LOGGER.setLevel(max(10, logging.WARNING - 10*args.verbose)) config_full = __setup_config(args, parser) - output = vquest(config_full, collapse=args.collapse) + output = vq.vquest(config_full, collapse=args.collapse) __process_output(args, output) LOGGER.info("Done.") @@ -32,7 +29,7 @@ def __setup_config(args, parser): # All the possible vquest options. They're grouped by section as the keys # to inner dictionaries. vquest_opts = [] - for opt_section in OPTIONS: + for opt_section in vq.OPTIONS: vquest_opts.extend(opt_section["options"].keys()) vquest_args = {k: v for k, v in args_set.items() if k in vquest_opts} # If no config file(s) and no vquest args were given, just print the help @@ -44,7 +41,7 @@ def __setup_config(args, parser): " ".join(["%s=%s" % (key, val) for key, val in args_set.items()])) # Overlay the default config, configs given as files, and then options # given as command line arguments - configs = [load_config(config) for config in args.config] + configs = [vq.load_config(config) for config in args.config] for filename, config in zip(args.config, configs): if config: msg = " ".join(["%s=%s" % (key, val) for key, val in config.items()]) @@ -54,7 +51,7 @@ def __setup_config(args, parser): configs = [config for config in configs if config] LOGGER.debug("overriding command-line options: %s", " ".join(["%s=%s" % (key, val) for key, val in vquest_args.items()])) - config_full = layer_configs(DEFAULTS, *configs, vquest_args) + config_full = vq.layer_configs(vq.DEFAULTS, *configs, vquest_args) LOGGER.debug("final config: %s", " ".join(["%s=%s" % (key, val) for key, val in config_full.items()])) LOGGER.info("Configuration prepared") @@ -63,7 +60,7 @@ def __setup_config(args, parser): def __process_output(args, output): if args.align: LOGGER.info("Writing FASTA to stdout") - print(airr_to_fasta(output["vquest_airr.tsv"]), end="") + print(vq.airr_to_fasta(output["vquest_airr.tsv"]), end="") else: args.outdir.mkdir(parents=True, exist_ok=True) if args.collapse: @@ -91,7 +88,7 @@ def __setup_arg_parser(): "--verbose", "-v", action="count", default=0, help="increase logging verbosity") parser.add_argument( - "--version", "-V", action="version", version=__version__) + "--version", "-V", action="version", version=vq.__version__) parser.add_argument( "--outdir", "-o", default=".", type=Path, help="directory for output files (. by default)") # https://stackoverflow.com/a/52403318/4499968 @@ -108,7 +105,7 @@ def __setup_arg_parser(): "from AIRR results and print as FASTA. " "If there is no text in the sequence_alignment column " "for a given sequence the original sequence is used instead.")) - for opt_section in OPTIONS: + for opt_section in vq.OPTIONS: option_parser = parser.add_argument_group( title="V-QUEST options: \"%s\" section" % opt_section["section"], description=opt_section["description"]) diff --git a/vquest/vq.py b/vquest/vq.py new file mode 100644 index 0000000..cb66e40 --- /dev/null +++ b/vquest/vq.py @@ -0,0 +1,7 @@ +""" +Common imports grouped here for convenience. +""" +from .request import vquest +from .config import DEFAULTS, OPTIONS, load_config, layer_configs +from .util import airr_to_fasta +from .version import __version__ From e9e3dcab041de46fecc5ae2ee6ac083665bdd1b3 Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Tue, 27 Sep 2022 11:27:01 -0400 Subject: [PATCH 09/15] fix circleci URLs --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8fb09ec..61c9cc0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Automate IMGT V-QUEST usage on imgt.org -[![vquest](https://circleci.com/gh/shawhahnlab/vquest.svg?style=shield)](https://circleci.com/gh/shawhahnlab/vquest) +[![vquest](https://circleci.com/gh/ShawHahnLab/vquest.svg?style=shield)](https://circleci.com/gh/ShawHahnLab/vquest) [IMGT](http://imgt.org)'s [V-QUEST](http://www.imgt.org/IMGT_vquest/analysis) is only available via a web interface. This Python package automates V-QUEST From e705b11106bc5d1630c283d216d329cc2a3774b4 Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Tue, 27 Sep 2022 11:41:47 -0400 Subject: [PATCH 10/15] For #36: changelog [skip ci] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 620299c..0740c00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,16 @@ ## dev +### Changed + + * Repository now at ([#36]) + ### Fixed + * Usage example now matches packaged structure ([#36]) * Requests to the IMGT server now use HTTPS ([#34]) +[#36]: https://github.com/ShawHahnLab/vquest/pull/36 [#34]: https://github.com/ressy/vquest/pull/34 ## 0.0.9 - 2021-07-20 From c1d7c99424ffc391fc0414fbae5009094faaa091 Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Tue, 11 Oct 2022 14:43:58 -0400 Subject: [PATCH 11/15] failing tests for new fastq support --- .../test_vquest/TestVquestFasta/config.yml | 2 + .../TestVquestFasta/config_inline.yml | 10 ++ .../TestVquestFasta/expected/Parameters.txt | 12 ++ .../TestVquestFasta/expected/vquest_airr.tsv | 2 + .../test_vquest/TestVquestFasta/response.dat | Bin 0 -> 1635 bytes .../test_vquest/TestVquestFasta/seqs.fasta | 5 + .../test_vquest/TestVquestFastq/config.yml | 2 + .../TestVquestFastq/config_inline.yml | 10 ++ .../TestVquestFastq/expected/Parameters.txt | 12 ++ .../TestVquestFastq/expected/vquest_airr.tsv | 2 + .../test_vquest/TestVquestFastq/response.dat | Bin 0 -> 1635 bytes .../test_vquest/TestVquestFastq/seqs.fastq | 4 + test_vquest/test_vquest.py | 108 ++++++++++++++++++ 13 files changed, 169 insertions(+) create mode 100644 test_vquest/data/test_vquest/TestVquestFasta/config.yml create mode 100644 test_vquest/data/test_vquest/TestVquestFasta/config_inline.yml create mode 100644 test_vquest/data/test_vquest/TestVquestFasta/expected/Parameters.txt create mode 100644 test_vquest/data/test_vquest/TestVquestFasta/expected/vquest_airr.tsv create mode 100644 test_vquest/data/test_vquest/TestVquestFasta/response.dat create mode 100644 test_vquest/data/test_vquest/TestVquestFasta/seqs.fasta create mode 100644 test_vquest/data/test_vquest/TestVquestFastq/config.yml create mode 100644 test_vquest/data/test_vquest/TestVquestFastq/config_inline.yml create mode 100644 test_vquest/data/test_vquest/TestVquestFastq/expected/Parameters.txt create mode 100644 test_vquest/data/test_vquest/TestVquestFastq/expected/vquest_airr.tsv create mode 100644 test_vquest/data/test_vquest/TestVquestFastq/response.dat create mode 100644 test_vquest/data/test_vquest/TestVquestFastq/seqs.fastq diff --git a/test_vquest/data/test_vquest/TestVquestFasta/config.yml b/test_vquest/data/test_vquest/TestVquestFasta/config.yml new file mode 100644 index 0000000..3eaf7c4 --- /dev/null +++ b/test_vquest/data/test_vquest/TestVquestFasta/config.yml @@ -0,0 +1,2 @@ +species: rhesus-monkey +receptorOrLocusType: IG diff --git a/test_vquest/data/test_vquest/TestVquestFasta/config_inline.yml b/test_vquest/data/test_vquest/TestVquestFasta/config_inline.yml new file mode 100644 index 0000000..9f625d1 --- /dev/null +++ b/test_vquest/data/test_vquest/TestVquestFasta/config_inline.yml @@ -0,0 +1,10 @@ +species: rhesus-monkey +receptorOrLocusType: IG +resultType: excel +xv_outputtype: 3 +sequences: | + >IGKV2-ACR*02 + GACATTGTGATGACCCAGACTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCAGCCTCCATCTCCTGCAGGTCTAGTCA + GAGCCTCTTGGATAGTGACGGGTACACCTGTTTGGACTGGTACCTGCAGAAGCCAGGCCAGTCTCCACAGCTCCTGATCT + ATGAGGTTTCCAACCGGGTCTCTGGAGTCCCTGACAGGTTCAGTGGCAGTGGGTCAGNCACTGATTTCACACTGAAAATC + AGCCGGGTGGAAGCTGAGGATGTTGGGGTGTATTACTGTATGCAAAGTATAGAGTTTCCTCC diff --git a/test_vquest/data/test_vquest/TestVquestFasta/expected/Parameters.txt b/test_vquest/data/test_vquest/TestVquestFasta/expected/Parameters.txt new file mode 100644 index 0000000..2df2969 --- /dev/null +++ b/test_vquest/data/test_vquest/TestVquestFasta/expected/Parameters.txt @@ -0,0 +1,12 @@ +Date Tue Dec 01 22:08:11 CET 2020 +IMGT/V-QUEST program version 3.5.21 +IMGT/V-QUEST reference directory release 202049-2 +Species Macaca mulatta +Receptor type or locus IG +IMGT/V-QUEST reference directory set F+ORF+ in-frame P +Search for insertions and deletions no +Nb of nucleotides to add (or exclude) in 3' of the V-REGION for the evaluation of the alignment score 0 +Nb of nucleotides to exclude in 5' of the V-REGION for the evaluation of the nb of mutations 0 +Analysis of scFv no +Number of submitted sequences 1 + diff --git a/test_vquest/data/test_vquest/TestVquestFasta/expected/vquest_airr.tsv b/test_vquest/data/test_vquest/TestVquestFasta/expected/vquest_airr.tsv new file mode 100644 index 0000000..48c3345 --- /dev/null +++ b/test_vquest/data/test_vquest/TestVquestFasta/expected/vquest_airr.tsv @@ -0,0 +1,2 @@ +sequence_id sequence sequence_aa rev_comp productive complete_vdj vj_in_frame stop_codon locus v_call d_call j_call c_call sequence_alignment sequence_alignment_aa germline_alignment germline_alignment_aa junction junction_aa np1 np1_aa np2 np2_aa cdr1 cdr1_aa cdr2 cdr2_aa cdr3 cdr3_aa fwr1 fwr1_aa fwr2 fwr2_aa fwr3 fwr3_aa fwr4 fwr4_aa v_score v_identity v_support v_cigar d_score d_identity d_support d_cigar j_score j_identity j_support j_cigar c_score c_identity c_support c_cigar v_sequence_start v_sequence_end v_germline_start v_germline_end v_alignment_start v_alignment_end d_sequence_start d_sequence_end d_germline_start d_germline_end d_alignment_start d_alignment_end j_sequence_start j_sequence_end j_germline_start j_germline_end j_alignment_start j_alignment_end cdr1_start cdr1_end cdr2_start cdr2_end cdr3_start cdr3_end fwr1_start fwr1_end fwr2_start fwr2_end fwr3_start fwr3_end fwr4_start fwr4_end v_sequence_alignment v_sequence_alignment_aa d_sequence_alignment d_sequence_alignment_aa j_sequence_alignment j_sequence_alignment_aa c_sequence_alignment c_sequence_alignment_aa v_germline_alignment v_germline_alignment_aa d_germline_alignment d_germline_alignment_aa j_germline_alignment j_germline_alignment_aa c_germline_alignment c_germline_alignment_aa junction_length junction_aa_length np1_length np2_length n1_length n2_length p3v_length p5d_length p3d_length p5j_length consensus_count duplicate_count cell_id clone_id rearrangement_id repertoire_id rearrangement_set_id sequence_analysis_category d_number 5prime_trimmed_n_nb 3prime_trimmed_n_nb insertions deletions junction_decryption +IGKV2-ACR*02 gacattgtgatgacccagactccactctccctgcccgtcacccctggagagccagcctccatctcctgcaggtctagtcagagcctcttggatagtgacgggtacacctgtttggactggtacctgcagaagccaggccagtctccacagctcctgatctatgaggtttccaaccgggtctctggagtccctgacaggttcagtggcagtgggtcagncactgatttcacactgaaaatcagccgggtggaagctgaggatgttggggtgtattactgtatgcaaagtatagagtttcctcc F F IGK Macmul IGKV2S20*01 F gacattgtgatgacccagactccactctccctgcccgtcacccctggagagccagcctccatctcctgcaggtctagtcagagcctcttggatagt...gacgggtacacctgtttggactggtacctgcagaagccaggccagtctccacagctcctgatctatgaggtt.....................tccaaccgggtctctggagtccct...gacaggttcagtggcagtggg......tcagncactgatttcacactgaaaatcagccgggtggaagctgaggatgttggggtgtattactgtatgcaaagtatagagtttcctcc DIVMTQTPLSLPVTPGEPASISCRSSQSLLDS.DGYTCLDWYLQKPGQSPQLLIYEV.......SNRVSGVP.DRFSGSG..SXTDFTLKISRVEAEDVGVYYCMQSIEFP gatattgtgatgacccagactccactctccctgccagtcacccctggagagccggcctccatctcctgcaggtctagtcagagcctcttggatagtgaggatggaaacacctatttggaatggtacctgcagaagccaggccagtctccacagcccttgatttatgaggtt.....................tccaaccgggcctctggagtccca...gacaggttcagtggcagtggg......tcagacactgatttcacactgaaaatcagcagagtggaggctgaggatgttggggtttattactgcatgcaaggtatagagtatcctcc DIVMTQTPLSLPVTPGEPASISCRSSQSLLDSEDGNTYLEWYLQKPGQSPQPLIYEV.......SNRASGVP.DRFSGSG..SDTDFTLKISRVEAEDVGVYYCMQGIEYP cagagcctcttggatagtgacgggtacacctgt QSLLDSDGYTC gaggtttcc EVS atgcaaagtatagagtttcctcc MQSIEFP gacattgtgatgacccagactccactctccctgcccgtcacccctggagagccagcctccatctcctgcaggtctagt DIVMTQTPLSLPVTPGEPASISCRSS ttggactggtacctgcagaagccaggccagtctccacagctcctgatctat LDWYLQKPGQSPQLLIY aaccgggtctctggagtccctgacaggttcagtggcagtgggtcagncactgatttcacactgaaaatcagccgggtggaagctgaggatgttggggtgtattactgt NRVSGVPDRFSGSGSXTDFTLKISRVEAEDVGVYYC 1294 93.20 2=1X32=1X17=1X42=3D2=1X2=2X6=1X6=1X34=1X1=1X4=1X19=1X12=1X25=1M25=1X1=1X5=1X17=1X8=1X6=1X9=1X6= 1 302 1 335 1 335 79 111 163 171 280 302 1 78 112 162 172 279 gacattgtgatgacccagactccactctccctgcccgtcacccctggagagccagcctccatctcctgcaggtctagtcagagcctcttggatagt...gacgggtacacctgtttggactggtacctgcagaagccaggccagtctccacagctcctgatctatgaggtt.....................tccaaccgggtctctggagtccct...gacaggttcagtggcagtggg......tcagncactgatttcacactgaaaatcagccgggtggaagctgaggatgttggggtgtattactgtatgcaaagtatagagtttcctcc DIVMTQTPLSLPVTPGEPASISCRSSQSLLDS.DGYTCLDWYLQKPGQSPQLLIYEV.......SNRVSGVP.DRFSGSG..SXTDFTLKISRVEAEDVGVYYCMQSIEFP gatattgtgatgacccagactccactctccctgccagtcacccctggagagccggcctccatctcctgcaggtctagtcagagcctcttggatagtgaggatggaaacacctatttggaatggtacctgcagaagccaggccagtctccacagcccttgatttatgaggtt.....................tccaaccgggcctctggagtccca...gacaggttcagtggcagtggg......tcagacactgatttcacactgaaaatcagcagagtggaggctgaggatgttggggtttattactgcatgcaaggtatagagtatcctcc DIVMTQTPLSLPVTPGEPASISCRSSQSLLDSEDGNTYLEWYLQKPGQSPQPLIYEV.......SNRASGVP.DRFSGSG..SDTDFTLKISRVEAEDVGVYYCMQGIEYP 0 0 0 0 0 0 1 (noindelsearch) 0 0 0 diff --git a/test_vquest/data/test_vquest/TestVquestFasta/response.dat b/test_vquest/data/test_vquest/TestVquestFasta/response.dat new file mode 100644 index 0000000000000000000000000000000000000000..c4ebadd8420acc99c35145edd0d495bf706e1ae2 GIT binary patch literal 1635 zcmZ|Pc{CJS90%|*w$aFlQP#;aL&6BY#!e_gMamOGX(GGE zG9$Z;#7N$7DrOj>ELk4!pO$mp_x^G3J?GxvAKyPdwifIhPyh%70&v#G+W~$G-~QS5 zGWK$S7tRYCg2YAOa}gD^7QdT2B!wW`PYx$|Hj&24K-{e2!49rCQD zM6k-iggCMs<2f4nbHzz3C{C(0dZ3DT)Pad${W}3A;ds0 zY7@5`IlG(HrBU_yd!%j>al*Z|;PAQm7peCXE>^57mWJ88b1 zIb%hZ#+u2ZWCb46Y5qGoH693EBMEq*bb^VK+e5vCuz7DyOqG*Pi(n8vbVg!Ti!i?M zK+MO+S{R(Sb7jqIc!jmsIj&R1Q-qOC*_In%5FKj3C>1TYGVlPb{!T}m-LxT@(3%vO zl-X@#smo?-!3~O{`2?L|0|5Ad`<4E0;gJ2p!-7M-LU5SNzE~_07ZSF3!R{Iz#UJx+ zH&u738kY>WolMd_PcSK;KLn!pI?UCzP8&(RMkG4y?F_!NHXyYw6@}R}jdH2NVpk{B z3R1X5S3X^WTEgY!GRCwJCAX>ctY=uK>`LTjQN@}hXfUM22s!|`Zw!67NQ_je$W<5P8lyB$74 zY>Xo2NcOVgqA<*KJ$|@mQ zc+rSq^y zJbBIH%BgB}KTD;(I|0UcoB5Z&r`i(gIFcWuu_WEBA8qdHd92*#dKwcraF>OuL=JZ` zC7bmHiPxDxtA4)cVC^LlGvuL)Hu0C4M?02ADqb(III28=SmF6^$}Mc%j!C(K%rA_1kuCWjb2HMoBbAuKfGH=eD; zwzs-O3vU_OFPE3*K-?2jP^Eb-BWfrlWwx`(5sJ%Msqk7WS zJSmg6LV__MPez;pEkUs(N*j;LXJmZ$mJxF>-Jr94uVuWNqhm@&MZR}J3|R)Wm@sqh z>!h2#3$H?3^RCXWYtt4hi*r}!qgER()f}@ES5jvfqg>&))~WbFb!!jOr6H3Wr~Qq)BF2>=^M$+x0aw0E z-hJ0DrT68=o>fAR9%^Ea3D1fph6qGX`qxgG9$uK;9GAgL@NP>Mn?#)pP4e4nJj}h7N8qDUqKQV;v#XXV8>tn3aAyIkSB-Y}?FuUh)MP=9V8F4_iU9 z)2+1Wn8QlZSWYfmIGKV2-ACR*02 +GACATTGTGATGACCCAGACTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCAGCCTCCATCTCCTGCAGGTCTAGTCA +GAGCCTCTTGGATAGTGACGGGTACACCTGTTTGGACTGGTACCTGCAGAAGCCAGGCCAGTCTCCACAGCTCCTGATCT +ATGAGGTTTCCAACCGGGTCTCTGGAGTCCCTGACAGGTTCAGTGGCAGTGGGTCAGNCACTGATTTCACACTGAAAATC +AGCCGGGTGGAAGCTGAGGATGTTGGGGTGTATTACTGTATGCAAAGTATAGAGTTTCCTCC diff --git a/test_vquest/data/test_vquest/TestVquestFastq/config.yml b/test_vquest/data/test_vquest/TestVquestFastq/config.yml new file mode 100644 index 0000000..3eaf7c4 --- /dev/null +++ b/test_vquest/data/test_vquest/TestVquestFastq/config.yml @@ -0,0 +1,2 @@ +species: rhesus-monkey +receptorOrLocusType: IG diff --git a/test_vquest/data/test_vquest/TestVquestFastq/config_inline.yml b/test_vquest/data/test_vquest/TestVquestFastq/config_inline.yml new file mode 100644 index 0000000..9f625d1 --- /dev/null +++ b/test_vquest/data/test_vquest/TestVquestFastq/config_inline.yml @@ -0,0 +1,10 @@ +species: rhesus-monkey +receptorOrLocusType: IG +resultType: excel +xv_outputtype: 3 +sequences: | + >IGKV2-ACR*02 + GACATTGTGATGACCCAGACTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCAGCCTCCATCTCCTGCAGGTCTAGTCA + GAGCCTCTTGGATAGTGACGGGTACACCTGTTTGGACTGGTACCTGCAGAAGCCAGGCCAGTCTCCACAGCTCCTGATCT + ATGAGGTTTCCAACCGGGTCTCTGGAGTCCCTGACAGGTTCAGTGGCAGTGGGTCAGNCACTGATTTCACACTGAAAATC + AGCCGGGTGGAAGCTGAGGATGTTGGGGTGTATTACTGTATGCAAAGTATAGAGTTTCCTCC diff --git a/test_vquest/data/test_vquest/TestVquestFastq/expected/Parameters.txt b/test_vquest/data/test_vquest/TestVquestFastq/expected/Parameters.txt new file mode 100644 index 0000000..2df2969 --- /dev/null +++ b/test_vquest/data/test_vquest/TestVquestFastq/expected/Parameters.txt @@ -0,0 +1,12 @@ +Date Tue Dec 01 22:08:11 CET 2020 +IMGT/V-QUEST program version 3.5.21 +IMGT/V-QUEST reference directory release 202049-2 +Species Macaca mulatta +Receptor type or locus IG +IMGT/V-QUEST reference directory set F+ORF+ in-frame P +Search for insertions and deletions no +Nb of nucleotides to add (or exclude) in 3' of the V-REGION for the evaluation of the alignment score 0 +Nb of nucleotides to exclude in 5' of the V-REGION for the evaluation of the nb of mutations 0 +Analysis of scFv no +Number of submitted sequences 1 + diff --git a/test_vquest/data/test_vquest/TestVquestFastq/expected/vquest_airr.tsv b/test_vquest/data/test_vquest/TestVquestFastq/expected/vquest_airr.tsv new file mode 100644 index 0000000..48c3345 --- /dev/null +++ b/test_vquest/data/test_vquest/TestVquestFastq/expected/vquest_airr.tsv @@ -0,0 +1,2 @@ +sequence_id sequence sequence_aa rev_comp productive complete_vdj vj_in_frame stop_codon locus v_call d_call j_call c_call sequence_alignment sequence_alignment_aa germline_alignment germline_alignment_aa junction junction_aa np1 np1_aa np2 np2_aa cdr1 cdr1_aa cdr2 cdr2_aa cdr3 cdr3_aa fwr1 fwr1_aa fwr2 fwr2_aa fwr3 fwr3_aa fwr4 fwr4_aa v_score v_identity v_support v_cigar d_score d_identity d_support d_cigar j_score j_identity j_support j_cigar c_score c_identity c_support c_cigar v_sequence_start v_sequence_end v_germline_start v_germline_end v_alignment_start v_alignment_end d_sequence_start d_sequence_end d_germline_start d_germline_end d_alignment_start d_alignment_end j_sequence_start j_sequence_end j_germline_start j_germline_end j_alignment_start j_alignment_end cdr1_start cdr1_end cdr2_start cdr2_end cdr3_start cdr3_end fwr1_start fwr1_end fwr2_start fwr2_end fwr3_start fwr3_end fwr4_start fwr4_end v_sequence_alignment v_sequence_alignment_aa d_sequence_alignment d_sequence_alignment_aa j_sequence_alignment j_sequence_alignment_aa c_sequence_alignment c_sequence_alignment_aa v_germline_alignment v_germline_alignment_aa d_germline_alignment d_germline_alignment_aa j_germline_alignment j_germline_alignment_aa c_germline_alignment c_germline_alignment_aa junction_length junction_aa_length np1_length np2_length n1_length n2_length p3v_length p5d_length p3d_length p5j_length consensus_count duplicate_count cell_id clone_id rearrangement_id repertoire_id rearrangement_set_id sequence_analysis_category d_number 5prime_trimmed_n_nb 3prime_trimmed_n_nb insertions deletions junction_decryption +IGKV2-ACR*02 gacattgtgatgacccagactccactctccctgcccgtcacccctggagagccagcctccatctcctgcaggtctagtcagagcctcttggatagtgacgggtacacctgtttggactggtacctgcagaagccaggccagtctccacagctcctgatctatgaggtttccaaccgggtctctggagtccctgacaggttcagtggcagtgggtcagncactgatttcacactgaaaatcagccgggtggaagctgaggatgttggggtgtattactgtatgcaaagtatagagtttcctcc F F IGK Macmul IGKV2S20*01 F gacattgtgatgacccagactccactctccctgcccgtcacccctggagagccagcctccatctcctgcaggtctagtcagagcctcttggatagt...gacgggtacacctgtttggactggtacctgcagaagccaggccagtctccacagctcctgatctatgaggtt.....................tccaaccgggtctctggagtccct...gacaggttcagtggcagtggg......tcagncactgatttcacactgaaaatcagccgggtggaagctgaggatgttggggtgtattactgtatgcaaagtatagagtttcctcc DIVMTQTPLSLPVTPGEPASISCRSSQSLLDS.DGYTCLDWYLQKPGQSPQLLIYEV.......SNRVSGVP.DRFSGSG..SXTDFTLKISRVEAEDVGVYYCMQSIEFP gatattgtgatgacccagactccactctccctgccagtcacccctggagagccggcctccatctcctgcaggtctagtcagagcctcttggatagtgaggatggaaacacctatttggaatggtacctgcagaagccaggccagtctccacagcccttgatttatgaggtt.....................tccaaccgggcctctggagtccca...gacaggttcagtggcagtggg......tcagacactgatttcacactgaaaatcagcagagtggaggctgaggatgttggggtttattactgcatgcaaggtatagagtatcctcc DIVMTQTPLSLPVTPGEPASISCRSSQSLLDSEDGNTYLEWYLQKPGQSPQPLIYEV.......SNRASGVP.DRFSGSG..SDTDFTLKISRVEAEDVGVYYCMQGIEYP cagagcctcttggatagtgacgggtacacctgt QSLLDSDGYTC gaggtttcc EVS atgcaaagtatagagtttcctcc MQSIEFP gacattgtgatgacccagactccactctccctgcccgtcacccctggagagccagcctccatctcctgcaggtctagt DIVMTQTPLSLPVTPGEPASISCRSS ttggactggtacctgcagaagccaggccagtctccacagctcctgatctat LDWYLQKPGQSPQLLIY aaccgggtctctggagtccctgacaggttcagtggcagtgggtcagncactgatttcacactgaaaatcagccgggtggaagctgaggatgttggggtgtattactgt NRVSGVPDRFSGSGSXTDFTLKISRVEAEDVGVYYC 1294 93.20 2=1X32=1X17=1X42=3D2=1X2=2X6=1X6=1X34=1X1=1X4=1X19=1X12=1X25=1M25=1X1=1X5=1X17=1X8=1X6=1X9=1X6= 1 302 1 335 1 335 79 111 163 171 280 302 1 78 112 162 172 279 gacattgtgatgacccagactccactctccctgcccgtcacccctggagagccagcctccatctcctgcaggtctagtcagagcctcttggatagt...gacgggtacacctgtttggactggtacctgcagaagccaggccagtctccacagctcctgatctatgaggtt.....................tccaaccgggtctctggagtccct...gacaggttcagtggcagtggg......tcagncactgatttcacactgaaaatcagccgggtggaagctgaggatgttggggtgtattactgtatgcaaagtatagagtttcctcc DIVMTQTPLSLPVTPGEPASISCRSSQSLLDS.DGYTCLDWYLQKPGQSPQLLIYEV.......SNRVSGVP.DRFSGSG..SXTDFTLKISRVEAEDVGVYYCMQSIEFP gatattgtgatgacccagactccactctccctgccagtcacccctggagagccggcctccatctcctgcaggtctagtcagagcctcttggatagtgaggatggaaacacctatttggaatggtacctgcagaagccaggccagtctccacagcccttgatttatgaggtt.....................tccaaccgggcctctggagtccca...gacaggttcagtggcagtggg......tcagacactgatttcacactgaaaatcagcagagtggaggctgaggatgttggggtttattactgcatgcaaggtatagagtatcctcc DIVMTQTPLSLPVTPGEPASISCRSSQSLLDSEDGNTYLEWYLQKPGQSPQPLIYEV.......SNRASGVP.DRFSGSG..SDTDFTLKISRVEAEDVGVYYCMQGIEYP 0 0 0 0 0 0 1 (noindelsearch) 0 0 0 diff --git a/test_vquest/data/test_vquest/TestVquestFastq/response.dat b/test_vquest/data/test_vquest/TestVquestFastq/response.dat new file mode 100644 index 0000000000000000000000000000000000000000..c4ebadd8420acc99c35145edd0d495bf706e1ae2 GIT binary patch literal 1635 zcmZ|Pc{CJS90%|*w$aFlQP#;aL&6BY#!e_gMamOGX(GGE zG9$Z;#7N$7DrOj>ELk4!pO$mp_x^G3J?GxvAKyPdwifIhPyh%70&v#G+W~$G-~QS5 zGWK$S7tRYCg2YAOa}gD^7QdT2B!wW`PYx$|Hj&24K-{e2!49rCQD zM6k-iggCMs<2f4nbHzz3C{C(0dZ3DT)Pad${W}3A;ds0 zY7@5`IlG(HrBU_yd!%j>al*Z|;PAQm7peCXE>^57mWJ88b1 zIb%hZ#+u2ZWCb46Y5qGoH693EBMEq*bb^VK+e5vCuz7DyOqG*Pi(n8vbVg!Ti!i?M zK+MO+S{R(Sb7jqIc!jmsIj&R1Q-qOC*_In%5FKj3C>1TYGVlPb{!T}m-LxT@(3%vO zl-X@#smo?-!3~O{`2?L|0|5Ad`<4E0;gJ2p!-7M-LU5SNzE~_07ZSF3!R{Iz#UJx+ zH&u738kY>WolMd_PcSK;KLn!pI?UCzP8&(RMkG4y?F_!NHXyYw6@}R}jdH2NVpk{B z3R1X5S3X^WTEgY!GRCwJCAX>ctY=uK>`LTjQN@}hXfUM22s!|`Zw!67NQ_je$W<5P8lyB$74 zY>Xo2NcOVgqA<*KJ$|@mQ zc+rSq^y zJbBIH%BgB}KTD;(I|0UcoB5Z&r`i(gIFcWuu_WEBA8qdHd92*#dKwcraF>OuL=JZ` zC7bmHiPxDxtA4)cVC^LlGvuL)Hu0C4M?02ADqb(III28=SmF6^$}Mc%j!C(K%rA_1kuCWjb2HMoBbAuKfGH=eD; zwzs-O3vU_OFPE3*K-?2jP^Eb-BWfrlWwx`(5sJ%Msqk7WS zJSmg6LV__MPez;pEkUs(N*j;LXJmZ$mJxF>-Jr94uVuWNqhm@&MZR}J3|R)Wm@sqh z>!h2#3$H?3^RCXWYtt4hi*r}!qgER()f}@ES5jvfqg>&))~WbFb!!jOr6H3Wr~Qq)BF2>=^M$+x0aw0E z-hJ0DrT68=o>fAR9%^Ea3D1fph6qGX`qxgG9$uK;9GAgL@NP>Mn?#)pP4e4nJj}h7N8qDUqKQV;v#XXV8>tn3aAyIkSB-Y}?FuUh)MP=9V8F4_iU9 z)2+1Wn8QlZSWYfmIGKV2-ACR*02 +GACATTGTGATGACCCAGACTCCACTCTCCCTGCCCGTCACCCCTGGAGAGCCAGCCTCC +ATCTCCTGCAGGTCTAGTCAGAGCCTCTTGGATAGTGACGGGTACACCTGTTTGGACTGG +TACCTGCAGAAGCCAGGCCAGTCTCCACAGCTCCTGATCTATGAGGTTTCCAACCGGGTC +TCTGGAGTCCCTGACAGGTTCAGTGGCAGTGGGTCAGNCACTGATTTCACACTGAAAATC +AGCCGGGTGGAAGCTGAGGATGTTGGGGTGTATTACTGTATGCAAAGTATAGAGTTTCCT +CC +""" + self.assertEqual( + self.post.call_args.kwargs, + {"data": config_used}) + self.assertEqual( + list(result.keys()), + ["Parameters.txt", "vquest_airr.tsv"]) + with open(self.path / "expected/Parameters.txt") as f_in: + parameters = f_in.read() + with open(self.path / "expected/vquest_airr.tsv") as f_in: + vquest_airr = f_in.read() + self.assertEqual(parameters, result["Parameters.txt"]) + self.assertEqual(vquest_airr, result["vquest_airr.tsv"]) + + def test_vquest_no_collapse(self): + """test_vquest but with vquest(..., collapse=False).""" + # Also try with collapse=False, for raw output + result = vquest(self.config, collapse=False) + self.assertEqual(self.post.call_count, 1) + self.assertEqual(len(result), 1) + self.assertEqual( + list(result[0].keys()), + ["Parameters.txt", "vquest_airr.tsv"]) + + def test_vquest_main(self): + """Test that the command-line interface gives the expected response.""" + with tempfile.TemporaryDirectory() as tempdir: + os.chdir(tempdir) + with open(self.path / "config.yml") as f_in, open("config.yml", "wt") as f_out: + f_out.write(f_in.read()) + f_out.write(f"fileSequences: {self.input_path}\n") + main(["config.yml"]) + self.assertTrue(Path("vquest_airr.tsv").exists()) + self.assertTrue(Path("Parameters.txt").exists()) + + def test_vquest_main_no_collapse(self): + """Test command-line interface with --no-collapse.""" + with tempfile.TemporaryDirectory() as tempdir: + os.chdir(tempdir) + with open(self.path / "config.yml") as f_in, open("config.yml", "wt") as f_out: + f_out.write(f_in.read()) + f_out.write(f"fileSequences: {self.input_path}\n") + main(["--no-collapse", "config.yml"]) + self.assertTrue(Path("001/vquest_airr.tsv").exists()) + self.assertTrue(Path("001/Parameters.txt").exists()) + + def test_vquest_main_alignment(self): + """Try using the --align feature. + + In this case the regular output files should not be created and instead + FASTA text should be written to stdout. + """ + expected = """>IGKV2-ACR*02 +gacattgtgatgacccagactccactctccctgcccgtcacccctggagagccagcctccatctcctgcaggtctagtcagagcctcttggatagt...gacgggtacacctgtttggactggtacctgcagaagccaggccagtctccacagctcctgatctatgaggtt.....................tccaaccgggtctctggagtccct...gacaggttcagtggcagtggg......tcagncactgatttcacactgaaaatcagccgggtggaagctgaggatgttggggtgtattactgtatgcaaagtatagagtttcctcc +""" + out = StringIO() + err = StringIO() + with redirect_stdout(out), redirect_stderr(err): + with tempfile.TemporaryDirectory() as tempdir: + os.chdir(tempdir) + with open(self.path / "config.yml") as f_in, open("config.yml", "wt") as f_out: + f_out.write(f_in.read()) + f_out.write(f"fileSequences: {self.input_path}\n") + main(["config.yml", "--align"]) + self.assertFalse(Path("vquest_airr.tsv").exists()) + self.assertFalse(Path("Parameters.txt").exists()) + self.assertEqual(out.getvalue(), expected) + self.assertEqual(err.getvalue(), "") + + +class TestVquestFastq(TestVquestFasta): + """File-based input with FASTQ.""" + + def setUp(self): + super().setUp() + self.input_path = self.path/"seqs.fastq" + self.config["fileSequences"] = self.input_path + + class TestVquestCustom(TestVquestSimple): """Try changing one of the configuration options. From 8e62b037d2ad1c415d46d8d2e0a48f5ce9bf3b69 Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Tue, 11 Oct 2022 14:45:59 -0400 Subject: [PATCH 12/15] add fastq support --- vquest/request.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/vquest/request.py b/vquest/request.py index e5ab1c6..314ac59 100644 --- a/vquest/request.py +++ b/vquest/request.py @@ -5,6 +5,7 @@ import time import logging from io import StringIO +from pathlib import Path import requests from requests_html import HTML from Bio import SeqIO @@ -16,15 +17,34 @@ DELAY = 1 # for rate-limiting multiple requests CHUNK_SIZE = 50 # to stay within V-QUEST's limit on sequences in one go +EXTS = { + ".fasta": "fasta", + ".fa": "fasta", + ".fna": "fasta", + ".fastq": "fastq", + ".fq": "fastq"} + def _parse_records(config): """Extract Seq records for sequences given in config""" records = [] if "sequences" in config and config["sequences"]: + if config["sequences"].startswith("@"): + fmt = "fastq" + elif config["sequences"].startswith(">"): + fmt = "fasta" + else: + raise ValueError("Sequence format not recognized") with StringIO(config["sequences"]) as seqs_stream: - records.extend(list(SeqIO.parse(seqs_stream, "fasta"))) + records.extend(list(SeqIO.parse(seqs_stream, fmt))) if "fileSequences" in config and config["fileSequences"]: - with open(config["fileSequences"]) as f_in: - records.extend(list(SeqIO.parse(f_in, "fasta"))) + path = Path(config["fileSequences"]) + ext = path.suffix.lower() + try: + fmt = EXTS[ext] + except KeyError as err: + raise ValueError(f"File format not recognized for {path}") from err + with open(path) as f_in: + records.extend(list(SeqIO.parse(f_in, fmt))) return records def vquest(config, collapse=True): From c2ddb5c79bb7767f6b38b78b21ed8b6f5ef36ea4 Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Tue, 11 Oct 2022 15:08:10 -0400 Subject: [PATCH 13/15] For #37: changelog [skip ci] --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0740c00..1b41ee4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## dev +### Added + + * FASTQ support ([#37]) + ### Changed * Repository now at ([#36]) @@ -11,6 +15,7 @@ * Usage example now matches packaged structure ([#36]) * Requests to the IMGT server now use HTTPS ([#34]) +[#37]: https://github.com/ShawHahnLab/vquest/pull/37 [#36]: https://github.com/ShawHahnLab/vquest/pull/36 [#34]: https://github.com/ressy/vquest/pull/34 From 96aaeb21bc9bd7d617aa6cffd5ff9d1c65685a72 Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Tue, 11 Oct 2022 15:25:51 -0400 Subject: [PATCH 14/15] set up release 0.0.10 --- vquest/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vquest/version.py b/vquest/version.py index df89bd8..b37da1f 100644 --- a/vquest/version.py +++ b/vquest/version.py @@ -5,4 +5,4 @@ See https://www.python.org/dev/peps/pep-0396/ """ -__version__ = "0.0.9" +__version__ = "0.0.10" From 6891f88a65245f575fc9e660a9c5e48b13f80623 Mon Sep 17 00:00:00 2001 From: Jesse Connell Date: Tue, 11 Oct 2022 15:28:53 -0400 Subject: [PATCH 15/15] For #38: changelog [skip ci] --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b41ee4..56948d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## dev +## 0.0.10 - 2022-10-11 ### Added