From 5352edffdb77bc4cba0be3db2196db3ba3c577d8 Mon Sep 17 00:00:00 2001 From: David Doty Date: Thu, 2 Jul 2020 20:51:21 -0700 Subject: [PATCH 1/3] update explanation of semantic versioning in README, and test linking to raw design image in the hopes it renders properly on PyPI --- README.md | 54 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 1eb4ac31..9855303b 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,9 @@ If you find scadnano useful in a scientific project, please cite its associated This module is used to write Python scripts outputting `.dna` files readable by [scadnano](https://scadnano.org), a web application useful for displaying and manually editing these structures. The purpose of this module is to help automate some of the task of creating DNA designs, as well as making large-scale changes to them that are easier to describe programmatically than to do by hand in scadnano. -Early versions of this project didn't have well-defined versions. However, we will try to announce breaking changes (and possibly new features) under the [GitHub releases page](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/releases). The version numbers in this Python library repo and the [web interface repo](https://github.com/UC-Davis-molecular-computing/scadnano/releases) won't always advance at the same time. However, when a breaking change is made, this will increment the minor or major version numbers in both libraries (version numbers are major.minor.patch, i.e., version 0.9.2 has minor version number 9). +Early versions of this project didn't have well-defined versions. However, we will try to announce breaking changes (and possibly new features) under the [GitHub releases page](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/releases). The version numbers in this Python library repo and the [web interface repo](https://github.com/UC-Davis-molecular-computing/scadnano/releases) won't always advance at the same time. + +Following [semantic versioning](https://semver.org/), version numbers are major.minor.patch, i.e., version 0.9.2 has minor version number 9. Prior to version 1.0.0, when a breaking change is made, this will increment the minor version (for example, going from 0.9.4 to 0.10.0). After version 1.0.0, breaking changes will increment the major version. @@ -40,7 +42,7 @@ The scadnano Python package requires Python version 3.7 or later. If you do not Once Python is installed, there are two ways you can install the scadnano Python package: -1. pip +1. pip (recommended) Use [pip](https://pypi.org/project/pip/) to install the package by executing the following at the command line: ```console @@ -56,7 +58,7 @@ Once Python is installed, there are two ways you can install the scadnano Python 2. download - As a simple alternative, you can download and place the following files (located in the [scadnano/](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/tree/master/scadnano) subfolder) + As a simple alternative (in case you run into trouble using pip), you can download and place the following files (located in the [scadnano/](https://github.com/UC-Davis-molecular-computing/scadnano-python-package/tree/master/scadnano) subfolder) in your PYTHONPATH (e.g., in the same directory as the scripts you are running): * *required*: [scadnano.py](https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano-python-package/master/scadnano/scadnano.py) @@ -76,7 +78,7 @@ Once Python is installed, there are two ways you can install the scadnano Python Consider the following design: -![](https://github.com/UC-Davis-molecular-computing/scadnano/blob/master/doc-images/screenshot-initial.png) +![](https://raw.githubusercontent.com/UC-Davis-molecular-computing/scadnano/master/doc-images/screenshot-initial.png) The following Python script produces this design. @@ -130,28 +132,48 @@ Running the code above produces the `.dna` JSON file shown in the [web interface ## abbreviated syntax with chained methods -Instead of explicitly creating variables and objects representing each domain in each strand, there is a shorter syntax using chained method calls. Instead of the above, create only the helices first, then create the DNADesign. Then strands can be added using a shorter syntax, to describe how to draw the strand starting at the 5' end and moving to the 3' end. +Instead of explicitly creating variables and objects representing each domain in each strand, there is a shorter syntax using chained method calls. Instead of the above, create only the helices first, then create the DNADesign. Then strands can be added using a shorter syntax, to describe how to draw the strand starting at the 5' end and moving to the 3' end. The following is a modified version of the above script using these chained methods ```python -# helices -helices = [sc.Helix(max_offset=48), sc.Helix(max_offset=48)] +import scadnano as sc +import modifications as mod + + +def main(): + # helices + helices = [sc.Helix(max_offset=48), sc.Helix(max_offset=48)] + + # whole design + design = sc.DNADesign(helices=helices, strands=[], grid=sc.square) + + # left staple + design.strand(1, 8).to(24).cross(0).to(8) + + # right staple + design.strand(0, 40).to(24).cross(1).to(40).with_modification_5p(mod.biotin_5p) -# whole design -design = sc.DNADesign(helices=helices, strands=[], grid=sc.square) + # scaffold + design.strand(1, 24).to(8).cross(0).to(40).loopout(1, 3).to(24).as_scaffold() + + # deletions and insertions added to design are added to both strands on a helix + design.add_deletion(helix=1, offset=20) + design.add_insertion(helix=0, offset=14, length=1) + design.add_insertion(helix=0, offset=26, length=2) + + # also assigns complement to strands other than scaf bound to it + design.assign_dna(scaf, 'AACGT' * 18) -# left staple -design.strand(1, 8).to(24).cross(0).to(8) + return design -# right staple -design.strand(0, 40).to(24).cross(1).to(40).with_modification_5p(mod.biotin_5p) -# scaffold -design.strand(1, 24).to(8).cross(0).to(40).loopout(1, 3).to(24).as_scaffold() +if __name__ == '__main__': + design = main() + design.write_scadnano_file(directory='output_designs') ``` Documentation is available in the [API docs](https://scadnano-python-package.readthedocs.io/en/latest/#scadnano.DNADesign.strand). -The code for adding insertions, deletions, and assigning DNA would be the same as in the original script. + From 3740a0dda6ab14385f4992474a88dbd248c8d6bf Mon Sep 17 00:00:00 2001 From: David Doty Date: Fri, 3 Jul 2020 08:24:06 -0700 Subject: [PATCH 2/3] created requirements.txt to try to silence "dependabot" errors See https://github.com/UC-Davis-molecular-computing/scadnano-python-package/pull/18 and https://github.com/UC-Davis-molecular-computing/scadnano-python-package/pull/17 --- doc/requirements.txt | 217 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 doc/requirements.txt diff --git a/doc/requirements.txt b/doc/requirements.txt new file mode 100644 index 00000000..bdffac16 --- /dev/null +++ b/doc/requirements.txt @@ -0,0 +1,217 @@ +alabaster==0.7.12 +anaconda-client==1.7.2 +anaconda-navigator==1.9.7 +anaconda-project==0.8.3 +asn1crypto==0.24.0 +astroid==2.2.5 +astropy==3.2.1 +atomicwrites==1.3.0 +attrs==19.1.0 +Babel==2.7.0 +backcall==0.1.0 +backports.functools-lru-cache==1.5 +backports.os==0.1.1 +backports.shutil-get-terminal-size==1.0.0 +backports.tempfile==1.0 +backports.weakref==1.0.post1 +beautifulsoup4==4.7.1 +bitarray==0.9.3 +bkcharts==0.2 +bleach==3.1.0 +bokeh==1.2.0 +boto==2.49.0 +Bottleneck==1.2.1 +certifi==2019.6.16 +cffi==1.12.3 +chardet==3.0.4 +Click==7.0 +cloudpickle==1.2.1 +clyent==1.2.2 +colorama==0.4.1 +comtypes==1.1.7 +conda==4.7.5 +conda-build==3.18.7 +conda-package-handling==1.3.11 +conda-verify==3.4.2 +contextlib2==0.5.5 +cryptography==2.7 +cycler==0.10.0 +Cython==0.29.12 +cytoolz==0.9.0.1 +dask==2.1.0 +decorator==4.4.0 +defusedxml==0.6.0 +distributed==2.1.0 +docutils==0.14 +entrypoints==0.3 +et-xmlfile==1.0.1 +fastcache==1.1.0 +filelock==3.0.12 +Flask==1.0.3 +future==0.17.1 +gevent==1.4.0 +glob2==0.7 +greenlet==0.4.15 +h5py==2.9.0 +heapdict==1.0.0 +html5lib==1.0.1 +idna==2.8 +imageio==2.5.0 +imagesize==1.1.0 +importlib-metadata==0.17 +ipykernel==5.1.1 +ipython==7.6.1 +ipython-genutils==0.2.0 +ipywidgets==7.5.0 +isort==4.3.21 +itsdangerous==1.1.0 +jdcal==1.4.1 +jedi==0.13.3 +Jinja2==2.10.1 +joblib==0.13.2 +jsonschema==3.0.1 +jupyter==1.0.0 +jupyter-client==5.3.1 +jupyter-console==6.0.0 +jupyter-core==4.5.0 +jupyterlab==0.35.4 +jupyterlab-server==0.2.0 +keyring==18.0.0 +kiwisolver==1.1.0 +lazy-object-proxy==1.4.1 +libarchive-c==2.8 +llvmlite==0.29.0 +locket==0.2.0 +lxml==4.3.4 +MarkupSafe==1.1.1 +matplotlib==3.1.0 +mccabe==0.6.1 +menuinst==1.4.16 +mistune==0.8.4 +mkl-fft==1.0.12 +mkl-random==1.0.2 +mkl-service==2.0.2 +mock==3.0.5 +more-itertools==7.0.0 +mpmath==1.1.0 +msgpack==0.6.1 +multipledispatch==0.6.0 +navigator-updater==0.2.1 +nbconvert==5.5.0 +nbformat==4.4.0 +networkx==2.3 +nltk==3.4.5 +nose==1.3.7 +notebook==5.7.8 +numba==0.44.1 +numexpr==2.6.9 +numpy==1.16.4 +numpydoc==0.9.1 +olefile==0.46 +openpyxl==2.6.2 +packaging==19.0 +pandas==0.24.2 +pandocfilters==1.4.2 +parso==0.5.0 +partd==1.0.0 +path.py==12.0.1 +pathlib2==2.3.4 +patsy==0.5.1 +pep8==1.7.1 +pickleshare==0.7.5 +Pillow==6.2.0 +pkginfo==1.5.0.1 +pluggy==0.12.0 +ply==3.11 +prometheus-client==0.7.1 +prompt-toolkit==2.0.9 +psutil==5.6.3 +py==1.8.0 +pycodestyle==2.5.0 +pycosat==0.6.3 +pycparser==2.19 +pycrypto==2.6.1 +pycurl==7.43.0.3 +pyflakes==2.1.1 +Pygments==2.4.2 +pylint==2.3.1 +pyodbc==4.0.26 +pyOpenSSL==19.0.0 +pyparsing==2.4.0 +pyreadline==2.1 +pyrsistent==0.14.11 +PySocks==1.7.0 +pytest==5.0.1 +pytest-arraydiff==0.3 +pytest-astropy==0.5.0 +pytest-doctestplus==0.3.0 +pytest-openfiles==0.3.2 +pytest-remotedata==0.3.1 +python-dateutil==2.8.0 +pytz==2019.1 +PyWavelets==1.0.3 +pywin32==223 +pywinpty==0.5.5 +PyYAML==5.1.1 +pyzmq==18.0.0 +QtAwesome==0.5.7 +qtconsole==4.5.1 +QtPy==1.8.0 +readme-renderer==24.0 +requests==2.22.0 +requests-toolbelt==0.9.1 +rope==0.14.0 +ruamel-yaml==0.15.46 +scadnano==0.1.0 +scikit-image==0.15.0 +scikit-learn==0.21.2 +scipy==1.2.1 +seaborn==0.9.0 +Send2Trash==1.5.0 +simplegeneric==0.8.1 +singledispatch==3.4.0.3 +six==1.12.0 +snowballstemmer==1.9.0 +sortedcollections==1.1.2 +sortedcontainers==2.1.0 +soupsieve==1.8 +Sphinx==2.1.2 +sphinx-rtd-theme==0.4.3 +sphinxcontrib-applehelp==1.0.1 +sphinxcontrib-devhelp==1.0.1 +sphinxcontrib-htmlhelp==1.0.2 +sphinxcontrib-jsmath==1.0.1 +sphinxcontrib-qthelp==1.0.2 +sphinxcontrib-serializinghtml==1.1.3 +sphinxcontrib-websupport==1.1.2 +spyder==3.3.6 +spyder-kernels==0.5.1 +SQLAlchemy==1.3.5 +statsmodels==0.10.0 +sympy==1.4 +tables==3.5.2 +tblib==1.4.0 +terminado==0.8.2 +testpath==0.4.2 +toolz==0.10.0 +tornado==6.0.3 +tqdm==4.32.1 +traitlets==4.3.2 +twine==3.1.1 +unicodecsv==0.14.1 +urllib3==1.24.2 +wcwidth==0.1.7 +webencodings==0.5.1 +Werkzeug==0.15.4 +widgetsnbextension==3.5.0 +win-inet-pton==1.1.0 +win-unicode-console==0.5 +wincertstore==0.2 +wrapt==1.11.2 +wxPython==4.0.6 +xlrd==1.2.0 +XlsxWriter==1.1.8 +xlwings==0.15.8 +xlwt==1.3.0 +zict==1.0.0 +zipp==0.5.1 From 386f4cb566ec3775b0ed250e91821f52a6fdd47c Mon Sep 17 00:00:00 2001 From: David Doty Date: Fri, 3 Jul 2020 08:27:16 -0700 Subject: [PATCH 3/3] bumped version --- scadnano/_version.py | 2 +- scadnano/scadnano.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scadnano/_version.py b/scadnano/_version.py index 01d87103..2a992dd4 100644 --- a/scadnano/_version.py +++ b/scadnano/_version.py @@ -3,4 +3,4 @@ # The following line *must* be the last in the module, exactly as formatted: # XXX: REMEMBER TO CHANGE VERSION IN scadnano.py also, for users who do not install from PyPI -__version__ = "0.9.4" +__version__ = "0.9.5" diff --git a/scadnano/scadnano.py b/scadnano/scadnano.py index 5f072e79..24d03fa0 100644 --- a/scadnano/scadnano.py +++ b/scadnano/scadnano.py @@ -63,7 +63,7 @@ from ._version import __version__ except ImportError: # this is so scadnano.py file works without _version.py being present, in case user downloads it - __version__ = "0.9.4" + __version__ = "0.9.5" StrandLabel = TypeVar('StrandLabel') DomainLabel = TypeVar('DomainLabel')