revseq 1.0.0__tar.gz → 1.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,26 +1,26 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.1
2
2
  Name: revseq
3
- Version: 1.0.0
3
+ Version: 1.2.0
4
4
  Summary: reverse and/or complement dna sequence
5
- Project-URL: homepage, https://github.com/milescsmith/revseq
6
- Project-URL: repository, https://github.com/milescsmith/revseq
7
- Project-URL: changelog, https://github.com/milescsmith/revseq/releases
8
- Author-email: Miles Smith <mileschristiansmith@gmail.com>
9
- License-Expression: GPL-3.0
10
- License-File: LICENSE
5
+ Home-page: https://github.com/milescsmith/revseq
6
+ Author-Email: Miles Smith <mileschristiansmith@gmail.com>
7
+ License: GPL-3.0
8
+ Classifier: Programming Language :: Python :: Implementation :: CPython
9
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
11
10
  Classifier: Development Status :: 5 - Production/Stable
12
11
  Classifier: Environment :: Console
13
12
  Classifier: Intended Audience :: Science/Research
14
13
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
15
- Classifier: Programming Language :: Python :: Implementation :: CPython
16
- Classifier: Programming Language :: Python :: Implementation :: PyPy
17
14
  Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
18
15
  Classifier: Typing :: Typed
16
+ Project-URL: Homepage, https://github.com/milescsmith/revseq
17
+ Project-URL: Repository, https://github.com/milescsmith/revseq
18
+ Project-URL: Changelog, https://github.com/milescsmith/revseq/releases
19
19
  Requires-Python: >=3.10
20
+ Requires-Dist: typer>=0.11.0
20
21
  Requires-Dist: icontract>=2.6.6
21
22
  Requires-Dist: rich>=13.7.1
22
23
  Requires-Dist: typeguard>=4.2.1
23
- Requires-Dist: typer>=0.11.0
24
24
  Description-Content-Type: text/x-rst
25
25
 
26
26
  revseq
@@ -45,8 +45,8 @@ A simple script to generate the (reverse) (complement) of a sequence
45
45
  .. |License| image:: https://img.shields.io/pypi/l/revseq
46
46
  :target: https://opensource.org/licenses/GPL-3.0
47
47
  :alt: License
48
- .. |Tests| image:: https://github.com/milescsmith/revseq/workflows/Tests/badge.svg
49
- :target: https://github.com/milescsmith/revseq/actions?workflow=Tests
48
+ .. |Tests| image:: https://github.com/milescsmith/revseq/actions/workflows/python-package.yml/badge.svg
49
+ :target: https://github.com/milescsmith/revseq/actions?workflow=python-package
50
50
  :alt: Tests
51
51
  .. |Codecov| image:: https://codecov.io/gh/milescsmith/revseq/branch/main/graph/badge.svg
52
52
  :target: https://codecov.io/gh/milescsmith/revseq
@@ -136,4 +136,4 @@ Credits
136
136
  .. _file an issue: https://github.com/milescsmith/revseq/issues
137
137
  .. _pip: https://pip.pypa.io/
138
138
  .. github-only
139
- .. _Contributor Guide: CONTRIBUTING.rst
139
+ .. _Contributor Guide: CONTRIBUTING.rst
@@ -20,8 +20,8 @@ A simple script to generate the (reverse) (complement) of a sequence
20
20
  .. |License| image:: https://img.shields.io/pypi/l/revseq
21
21
  :target: https://opensource.org/licenses/GPL-3.0
22
22
  :alt: License
23
- .. |Tests| image:: https://github.com/milescsmith/revseq/workflows/Tests/badge.svg
24
- :target: https://github.com/milescsmith/revseq/actions?workflow=Tests
23
+ .. |Tests| image:: https://github.com/milescsmith/revseq/actions/workflows/python-package.yml/badge.svg
24
+ :target: https://github.com/milescsmith/revseq/actions?workflow=python-package
25
25
  :alt: Tests
26
26
  .. |Codecov| image:: https://codecov.io/gh/milescsmith/revseq/branch/main/graph/badge.svg
27
27
  :target: https://codecov.io/gh/milescsmith/revseq
@@ -111,4 +111,4 @@ Credits
111
111
  .. _file an issue: https://github.com/milescsmith/revseq/issues
112
112
  .. _pip: https://pip.pypa.io/
113
113
  .. github-only
114
- .. _Contributor Guide: CONTRIBUTING.rst
114
+ .. _Contributor Guide: CONTRIBUTING.rst
@@ -1,17 +1,18 @@
1
1
  [build-system]
2
- requires = ["hatchling"]
3
- build-backend = "hatchling.build"
2
+ requires = [
3
+ "pdm-backend",
4
+ ]
5
+ build-backend = "pdm.backend"
4
6
 
5
7
  [project]
6
8
  name = "revseq"
7
- version = "1.0.0"
9
+ version = "1.2.0"
8
10
  description = "reverse and/or complement dna sequence"
9
11
  authors = [
10
- { name = "Miles Smith", email = "mileschristiansmith@gmail.com" }
12
+ { name = "Miles Smith", email = "mileschristiansmith@gmail.com" },
11
13
  ]
12
- license = "GPL-3.0"
13
- readme = "README.rst"
14
14
  requires-python = ">= 3.10"
15
+ readme = "README.rst"
15
16
  dependencies = [
16
17
  "typer>=0.11.0",
17
18
  "icontract>=2.6.6",
@@ -29,6 +30,9 @@ classifiers = [
29
30
  "Typing :: Typed",
30
31
  ]
31
32
 
33
+ [project.license]
34
+ text = "GPL-3.0"
35
+
32
36
  [project.urls]
33
37
  homepage = "https://github.com/milescsmith/revseq"
34
38
  repository = "https://github.com/milescsmith/revseq"
@@ -38,44 +42,52 @@ changelog = "https://github.com/milescsmith/revseq/releases"
38
42
  revseq = "revseq.__main__:app"
39
43
 
40
44
  [tool.coverage.paths]
41
- source = ["src", "*/site-packages"]
45
+ source = [
46
+ "src",
47
+ "*/site-packages",
48
+ ]
42
49
 
43
50
  [tool.coverage.run]
44
51
  branch = true
45
- source = ["revseq"]
52
+ source = [
53
+ "revseq",
54
+ ]
46
55
 
47
56
  [tool.coverage.report]
48
57
  show_missing = true
49
58
  fail_under = 100
50
59
 
51
- [tool.rye]
52
- managed = true
53
- dev-dependencies = [
54
- "codecov>=2.1.13",
55
- "hypothesis>=6.99.13",
56
- "nox>=2024.3.2",
57
- "pytest>=8.1.1",
58
- "mypy>=1.9.0",
59
- "coverage>=7.4.4",
60
- "pytest-cov>=4.1.0",
61
- "ruff>=0.3.4",
62
- ]
63
-
64
- [tool.rye.scripts]
65
- lint = { chain = ["lint:ruff", "lint:black"] }
66
- "lint:black" = "black --check src"
67
- "lint:ruff" = "ruff --fix src"
60
+ [tool.pdm.scripts]
61
+ format = "ruff format src/"
62
+ lint = "ruff check --fix src/"
63
+ test = "nox"
68
64
 
69
- [tool.hatch.metadata]
70
- allow-direct-references = true
65
+ [tool.pdm.scripts.all]
66
+ composite = [
67
+ "format",
68
+ "lint",
69
+ "test",
70
+ ]
71
71
 
72
- [tool.mypy]
73
- strict = true
74
- warn_unreachable = true
75
- pretty = true
76
- show_column_numbers = true
77
- show_error_codes = true
78
- show_error_context = true
72
+ [tool.pdm.dev-dependencies]
73
+ dev = [
74
+ "nox>=2024.4.15",
75
+ "pytest>=8.3.2",
76
+ "mypy>=1.11.0",
77
+ "ruff>=0.5.5",
78
+ "pytest-cov>=5.0.0",
79
+ "coverage>=7.6.0",
80
+ "hypothesis>=6.108.4",
81
+ "codecov>=2.1.13",
82
+ "pre-commit>=3.7.1",
83
+ "safety>=3.2.4",
84
+ "pytest-random-order>=1.1.1",
85
+ "pytest-xdist[psutil]>=3.6.1",
86
+ ]
79
87
 
80
- [tool.hatch.build.targets.wheel]
81
- packages = ["src/revseq"]
88
+ [tool.pytest.ini_options]
89
+ pythonpath = "."
90
+ addopts = [
91
+ "--import-mode=importlib",
92
+ ]
93
+ typeguard-packages = "revseq"
@@ -25,21 +25,12 @@ app = typer.Typer(
25
25
  @app.command(no_args_is_help=True)
26
26
  @require(
27
27
  lambda seq: len(set(seq) - set("AGCTagct")) == 0,
28
- error=lambda seq: ValueError("{} has non-standard DNA bases."),
28
+ error=lambda seq: ValueError("{} has non-standard DNA bases."), # noqa: ARG005
29
29
  )
30
30
  def main(
31
- seq: Annotated[
32
- str,
33
- typer.Argument()
34
- ],
35
- rev: Annotated[
36
- bool,
37
- typer.Option("-r", "--reverse", help="reverse sequence")
38
- ] = True,
39
- comp: Annotated[
40
- bool,
41
- typer.Option("-c", "--complement", help="complement sequence")
42
- ] = True,
31
+ seq: Annotated[str, typer.Argument()],
32
+ rev: Annotated[bool, typer.Option("-r", "--reverse", help="reverse sequence")] = True,
33
+ comp: Annotated[bool, typer.Option("-c", "--complement", help="complement sequence")] = True,
43
34
  version: Annotated[
44
35
  Optional[bool],
45
36
  typer.Option(
@@ -48,16 +39,15 @@ def main(
48
39
  callback=version_callback,
49
40
  is_eager=True,
50
41
  help="Prints the version.",
51
- )
42
+ ),
52
43
  ] = None,
53
44
  ) -> None:
54
-
55
45
  print(revseq(seq, rev, comp))
56
46
 
57
47
 
58
48
  @require(
59
49
  lambda seq: len(seq) != 0,
60
- error=lambda seq: ValueError("Nothing to do with an empty sequence"),
50
+ error=lambda seq: ValueError("Nothing to do with an empty sequence"), # noqa: ARG005
61
51
  )
62
52
  @typechecked
63
53
  def revseq(
@@ -1,7 +1,6 @@
1
1
  import hypothesis.strategies as st
2
2
  import pytest
3
3
  from hypothesis import example, given, settings
4
-
5
4
  from revseq import revseq
6
5
 
7
6
 
@@ -1 +0,0 @@
1
- * text=auto eol=lf
@@ -1,47 +0,0 @@
1
- # This workflow will install Python dependencies, run tests and lint with a variety of Python versions
2
- # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
3
- # modeled after https://github.com/python-poetry/poetry/blob/master/.github/workflows/release.yml
4
- name: Python package
5
-
6
- on:
7
- push:
8
- branches: [ "main" ]
9
- pull_request:
10
- branches: [ "main" ]
11
-
12
- jobs:
13
- build:
14
- runs-on: ubuntu-latest
15
- strategy:
16
- fail-fast: false
17
- matrix:
18
- python-version: ["3.8", "3.9", "3.10"]
19
- steps:
20
- - name: checkout code
21
- uses: actions/checkout@v3
22
-
23
- - name: Set up Python ${{ matrix.python-version }}
24
- uses: actions/setup-python@v3
25
- with:
26
- python-version: ${{ matrix.python-version }}
27
-
28
- - name: Install Poetry
29
- uses: abatilo/actions-poetry@v2.1.6
30
-
31
- - name: Install dependencies
32
- run: |
33
- poetry config virtualenvs.create false
34
- poetry install
35
-
36
- - name: Run tests and collect coverage
37
- run: pytest --cov --cov-report=xml --cov-fail-under=50
38
-
39
- - name: Upload coverage reports to Codecov with GitHub Action
40
- uses: codecov/codecov-action@v3
41
- with:
42
- token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos
43
- files: ./coverage.xml
44
- flags: unittests # optional
45
- name: codecov-umbrella # optional
46
- fail_ci_if_error: true # optional (default = false)
47
- verbose: true # optional (default = false)
revseq-1.0.0/.gitignore DELETED
@@ -1,139 +0,0 @@
1
- # Byte-compiled / optimized / DLL files
2
- __pycache__/
3
- *.py[cod]
4
- *$py.class
5
-
6
- # C extensions*.so
7
-
8
- # Distribution / packaging
9
- .Python
10
- build/
11
- develop-eggs/
12
- dist/
13
- downloads/
14
- eggs/
15
- .eggs/
16
- lib/
17
- lib64/
18
- parts/
19
- sdist/
20
- var/
21
- wheels/
22
- share/python-wheels/
23
- *.egg-info/
24
- .installed.cfg
25
- *.egg
26
- MANIFEST
27
-
28
- # PyInstaller
29
- # Usually these files are written by a python script from a template
30
- # before PyInstaller builds the exe, so as to inject date/other infos into it.
31
- *.manifest
32
- *.spec
33
-
34
- # Installer logs
35
- pip-log.txt
36
- pip-delete-this-directory.txt
37
-
38
- # Unit test / coverage reports
39
- htmlcov/
40
- .tox/
41
- .nox/
42
- .coverage
43
- .coverage.*
44
- .cache
45
- nosetests.xml
46
- coverage.xml
47
- *.cover
48
- *.py,cover
49
- .hypothesis/
50
- .pytest_cache/
51
- cover/
52
-
53
- # Translations
54
- *.mo
55
- *.pot
56
-
57
- # Django stuff:
58
- *.log
59
- local_settings.py
60
- db.sqlite3
61
- db.sqlite3-journal
62
-
63
- # Flask stuff:
64
- instance/
65
- .webassets-cache
66
-
67
- # Scrapy stuff:
68
- .scrapy
69
-
70
- # Sphinx documentation
71
- docs/_build/
72
-
73
- # PyBuilder
74
- .pybuilder/
75
- target/
76
-
77
- # Jupyter Notebook
78
- .ipynb_checkpoints
79
-
80
- # IPython
81
- profile_default/
82
- ipython_config.py
83
-
84
- # pyenv
85
- # For a library or package, you might want to ignore these files since the code is
86
- # intended to run in multiple environments; otherwise, check them in:
87
- # .python-version
88
-
89
- # pipenv
90
- # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
91
- # However, in case of collaboration, if having platform-specific dependencies or dependencies
92
- # having no cross-platform support, pipenv may install dependencies that don't work, or not
93
- # install all needed dependencies.
94
- #Pipfile.lock
95
-
96
- # PEP 582; used by e.g. github.com/David-OConnor/pyflow
97
- __pypackages__/
98
-
99
- # Celery stuff
100
- celerybeat-schedule
101
- celerybeat.pid
102
-
103
- # SageMath parsed files
104
- *.sage.py
105
-
106
- # Environments
107
- .env
108
- .venv
109
- env/
110
- venv/
111
- ENV/
112
- env.bak/
113
- venv.bak/
114
-
115
- # Spyder project settings
116
- .spyderproject
117
- .spyproject
118
-
119
- # Rope project settings
120
- .ropeproject
121
-
122
- # mkdocs documentation
123
- /site
124
-
125
- # mypy
126
- .mypy_cache/
127
- .dmypy.json
128
- dmypy.json
129
-
130
- # Pyre type checker
131
- .pyre/
132
-
133
- # pytype static type analyzer
134
- .pytype/
135
-
136
- # Cython debug symbols
137
- cython_debug/
138
-
139
- debug.py
@@ -1,51 +0,0 @@
1
- repos:
2
- - repo: local
3
- hooks:
4
- # - id: black
5
- # name: black
6
- # entry: black
7
- # language: system
8
- # types: [python]
9
- # require_serial: true
10
- - id: check-added-large-files
11
- name: Check for added large files
12
- entry: check-added-large-files
13
- language: system
14
- - id: check-toml
15
- name: Check Toml
16
- entry: check-toml
17
- language: system
18
- types: [toml]
19
- - id: check-yaml
20
- name: Check Yaml
21
- entry: check-yaml
22
- language: system
23
- types: [yaml]
24
- # - id: end-of-file-fixer
25
- # name: Fix End of Files
26
- # entry: end-of-file-fixer
27
- # language: system
28
- # types: [text]
29
- # stages: [commit, push, manual]
30
- - id: flake8
31
- name: flake8
32
- entry: flake8
33
- language: system
34
- types: [python]
35
- require_serial: true
36
- # - id: reorder-python-imports
37
- # name: Reorder python imports
38
- # entry: reorder-python-imports
39
- # language: system
40
- # types: [python]
41
- # args: [--application-directories=src]
42
- - id: trailing-whitespace
43
- name: Trim Trailing Whitespace
44
- entry: trailing-whitespace-fixer
45
- language: system
46
- types: [text]
47
- stages: [commit, push, manual]
48
- # - repo: https://github.com/pre-commit/mirrors-prettier
49
- # rev: v2.4.1
50
- # hooks:
51
- # - id: prettier
@@ -1,20 +0,0 @@
1
- {
2
- // Use IntelliSense to learn about possible attributes.
3
- // Hover to view descriptions of existing attributes.
4
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5
- "version": "0.2.0",
6
- "configurations": [
7
- {
8
- "name": "this file",
9
- "type": "python",
10
- "request": "launch",
11
- "module": "pyplier.${fileBasenameNoExtension}",
12
- // "cwd": "${workspaceFolder}",
13
- // "console": "integratedTerminal",
14
- "justMyCode": true,
15
- "envFile": "${workspaceFolder}/.env",
16
- "env": {"PYDEVD_WARN_SLOW_RESOLVE_TIMEOUT": "2"}
17
- }
18
- ]
19
- }
20
-
@@ -1,3 +0,0 @@
1
- {
2
- "esbonio.sphinx.confDir": ""
3
- }
revseq-1.0.0/.zprofile DELETED
@@ -1 +0,0 @@
1
- source '/home/milo/.rye/env'
@@ -1,105 +0,0 @@
1
- Contributor Covenant Code of Conduct
2
- ====================================
3
-
4
- Our Pledge
5
- ----------
6
-
7
- We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
8
-
9
- We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
10
-
11
-
12
- Our Standards
13
- -------------
14
-
15
- Examples of behavior that contributes to a positive environment for our community include:
16
-
17
- - Demonstrating empathy and kindness toward other people
18
- - Being respectful of differing opinions, viewpoints, and experiences
19
- - Giving and gracefully accepting constructive feedback
20
- - Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
21
- - Focusing on what is best not just for us as individuals, but for the overall community
22
-
23
- Examples of unacceptable behavior include:
24
-
25
- - The use of sexualized language or imagery, and sexual attention or
26
- advances of any kind
27
- - Trolling, insulting or derogatory comments, and personal or political attacks
28
- - Public or private harassment
29
- - Publishing others' private information, such as a physical or email
30
- address, without their explicit permission
31
- - Other conduct which could reasonably be considered inappropriate in a
32
- professional setting
33
-
34
- Enforcement Responsibilities
35
- ----------------------------
36
-
37
- Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
38
-
39
- Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
40
-
41
-
42
- Scope
43
- -----
44
-
45
- This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
46
-
47
-
48
- Enforcement
49
- -----------
50
-
51
- Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at mileschristiansmith@gmail.com. All complaints will be reviewed and investigated promptly and fairly.
52
-
53
- All community leaders are obligated to respect the privacy and security of the reporter of any incident.
54
-
55
-
56
- Enforcement Guidelines
57
- ----------------------
58
-
59
- Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
60
-
61
-
62
- 1. Correction
63
- ~~~~~~~~~~~~~
64
-
65
- **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
66
-
67
- **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
68
-
69
-
70
- 2. Warning
71
- ~~~~~~~~~~
72
-
73
- **Community Impact**: A violation through a single incident or series of actions.
74
-
75
- **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
76
-
77
-
78
- 3. Temporary Ban
79
- ~~~~~~~~~~~~~~~~
80
-
81
- **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
82
-
83
- **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
84
-
85
-
86
- 4. Permanent Ban
87
- ~~~~~~~~~~~~~~~~
88
-
89
- **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
90
-
91
- **Consequence**: A permanent ban from any sort of public interaction within the community.
92
-
93
-
94
- Attribution
95
- -----------
96
-
97
- This Code of Conduct is adapted from the `Contributor Covenant <homepage_>`__, version 2.0,
98
- available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
99
-
100
- Community Impact Guidelines were inspired by `Mozilla’s code of conduct enforcement ladder <https://github.com/mozilla/diversity>`__.
101
-
102
- .. _homepage: https://www.contributor-covenant.org
103
-
104
- For answers to common questions about this code of conduct, see the FAQ at
105
- https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.
@@ -1,123 +0,0 @@
1
- Contributor Guide
2
- =================
3
-
4
- Thank you for your interest in improving this project.
5
- This project is open-source under the `GPL 3.0 license`_ and
6
- welcomes contributions in the form of bug reports, feature requests, and pull requests.
7
-
8
- Here is a list of important resources for contributors:
9
-
10
- - `Source Code`_
11
- - `Documentation`_
12
- - `Issue Tracker`_
13
- - `Code of Conduct`_
14
-
15
- .. _GPL 3.0 license: https://opensource.org/licenses/GPL-3.0
16
- .. _Source Code: https://github.com/mcsmith/revseq
17
- .. _Documentation: https://revseq.readthedocs.io/
18
- .. _Issue Tracker: https://github.com/mcsmith/revseq/issues
19
-
20
- How to report a bug
21
- -------------------
22
-
23
- Report bugs on the `Issue Tracker`_.
24
-
25
- When filing an issue, make sure to answer these questions:
26
-
27
- - Which operating system and Python version are you using?
28
- - Which version of this project are you using?
29
- - What did you do?
30
- - What did you expect to see?
31
- - What did you see instead?
32
-
33
- The best way to get your bug fixed is to provide a test case,
34
- and/or steps to reproduce the issue.
35
-
36
-
37
- How to request a feature
38
- ------------------------
39
-
40
- Request features on the `Issue Tracker`_.
41
-
42
-
43
- How to set up your development environment
44
- ------------------------------------------
45
-
46
- You need Python 3.7+ and the following tools:
47
-
48
- - Poetry_
49
- - Nox_
50
- - nox-poetry_
51
-
52
- Install the package with development requirements:
53
-
54
- .. code:: console
55
-
56
- $ poetry install
57
-
58
- You can now run an interactive Python session,
59
- or the command-line interface:
60
-
61
- .. code:: console
62
-
63
- $ poetry run python
64
- $ poetry run revseq
65
-
66
- .. _Poetry: https://python-poetry.org/
67
- .. _Nox: https://nox.thea.codes/
68
- .. _nox-poetry: https://nox-poetry.readthedocs.io/
69
-
70
-
71
- How to test the project
72
- -----------------------
73
-
74
- Run the full test suite:
75
-
76
- .. code:: console
77
-
78
- $ nox
79
-
80
- List the available Nox sessions:
81
-
82
- .. code:: console
83
-
84
- $ nox --list-sessions
85
-
86
- You can also run a specific Nox session.
87
- For example, invoke the unit test suite like this:
88
-
89
- .. code:: console
90
-
91
- $ nox --session=tests
92
-
93
- Unit tests are located in the ``tests`` directory,
94
- and are written using the pytest_ testing framework.
95
-
96
- .. _pytest: https://pytest.readthedocs.io/
97
-
98
-
99
- How to submit changes
100
- ---------------------
101
-
102
- Open a `pull request`_ to submit changes to this project.
103
-
104
- Your pull request needs to meet the following guidelines for acceptance:
105
-
106
- - The Nox test suite must pass without errors and warnings.
107
- - Include unit tests. This project maintains 100% code coverage.
108
- - If your changes add functionality, update the documentation accordingly.
109
-
110
- Feel free to submit early, though—we can always iterate on this.
111
-
112
- To run linting and code formatting checks before committing your change, you can install pre-commit as a Git hook by running the following command:
113
-
114
- .. code:: console
115
-
116
- $ nox --session=pre-commit -- install
117
-
118
- It is recommended to open an issue before starting work on anything.
119
- This will allow a chance to talk it over with the owners and validate your approach.
120
-
121
- .. _pull request: https://github.com/mcsmith/revseq/pulls
122
- .. github-only
123
- .. _Code of Conduct: CODE_OF_CONDUCT.rst
revseq-1.0.0/codecov.yml DELETED
@@ -1,9 +0,0 @@
1
- comment: false
2
- coverage:
3
- status:
4
- project:
5
- default:
6
- target: "80"
7
- patch:
8
- default:
9
- target: "80"
revseq-1.0.0/noxfile.py DELETED
@@ -1,221 +0,0 @@
1
- """Nox sessions."""
2
- import shutil
3
- import sys
4
- from pathlib import Path
5
- from textwrap import dedent
6
-
7
- import nox
8
-
9
- try:
10
- from nox_poetry import Session, session
11
- except ImportError:
12
- message = f"""\
13
- Nox failed to import the 'nox-poetry' package.
14
-
15
- Please install it using the following command:
16
-
17
- {sys.executable} -m pip install nox-poetry"""
18
- raise SystemExit(dedent(message)) from None
19
-
20
-
21
- package = "revseq"
22
- python_versions = ["3.10", "3.9", "3.8"]
23
- nox.needs_version = ">= 2021.6.6"
24
- nox.options.sessions = (
25
- "pre-commit",
26
- "safety",
27
- "mypy",
28
- "tests",
29
- "typeguard",
30
- "xdoctest",
31
- "docs-build",
32
- )
33
-
34
- locations = (
35
- "src",
36
- "tests",
37
- )
38
-
39
-
40
- @session(python=["3.10"])
41
- def isort(session: Session) -> None:
42
- """Run black code formatter."""
43
- args = session.posargs or locations
44
- session.install("isort")
45
- session.run("isort", *args)
46
-
47
-
48
- @session(python=["3.10"])
49
- def black(session: Session) -> None:
50
- """Run black code formatter."""
51
- args = session.posargs or locations
52
- session.install("black[jupyter]")
53
- session.run("black", *args)
54
-
55
-
56
- def activate_virtualenv_in_precommit_hooks(session: Session) -> None:
57
- """Activate virtualenv in hooks installed by pre-commit.
58
-
59
- This function patches git hooks installed by pre-commit to activate the
60
- session's virtual environment. This allows pre-commit to locate hooks in
61
- that environment when invoked from git.
62
-
63
- Args:
64
- session: The Session object.
65
- """
66
- assert session.bin is not None # noqa: S101
67
-
68
- virtualenv = session.env.get("VIRTUAL_ENV")
69
- if virtualenv is None:
70
- return
71
-
72
- hookdir = Path(".git") / "hooks"
73
- if not hookdir.is_dir():
74
- return
75
-
76
- for hook in hookdir.iterdir():
77
- if hook.name.endswith(".sample") or not hook.is_file():
78
- continue
79
-
80
- text = hook.read_text()
81
- bindir = repr(session.bin)[1:-1] # strip quotes
82
- if not (
83
- Path("A") == Path("a") and bindir.lower() in text.lower() or bindir in text
84
- ):
85
- continue
86
-
87
- lines = text.splitlines()
88
- if not (lines[0].startswith("#!") and "python" in lines[0].lower()):
89
- continue
90
-
91
- header = dedent(
92
- f"""\
93
- import os
94
- os.environ["VIRTUAL_ENV"] = {virtualenv!r}
95
- os.environ["PATH"] = os.pathsep.join((
96
- {session.bin!r},
97
- os.environ.get("PATH", ""),
98
- ))
99
- """
100
- )
101
-
102
- lines.insert(1, header)
103
- hook.write_text("\n".join(lines))
104
-
105
-
106
- @session(name="pre-commit", python="3.10")
107
- def precommit(session: Session) -> None:
108
- """Lint using pre-commit."""
109
- args = session.posargs or ["run", "--all-files", "--show-diff-on-failure"]
110
- session.install(
111
- "darglint",
112
- "flake8",
113
- "flake8-bandit",
114
- "flake8-bugbear",
115
- "flake8-docstrings",
116
- "flake8-rst-docstrings",
117
- "pep8-naming",
118
- "pre-commit",
119
- "pre-commit-hooks",
120
- "reorder-python-imports",
121
- )
122
- session.run("pre-commit", *args)
123
- if args and args[0] == "install":
124
- activate_virtualenv_in_precommit_hooks(session)
125
-
126
-
127
- @session(python="3.9")
128
- def safety(session: Session) -> None:
129
- """Scan dependencies for insecure packages."""
130
- requirements = session.poetry.export_requirements()
131
- session.install("safety")
132
- session.run("safety", "check", "--full-report", f"--file={requirements}")
133
-
134
-
135
- @session(python=python_versions)
136
- def mypy(session: Session) -> None:
137
- """Type-check using mypy."""
138
- args = session.posargs or locations
139
- session.install(".")
140
- session.install("mypy", "pytest")
141
- session.run("mypy", "--install-types", "--non-interactive", "out", *args)
142
- if not session.posargs:
143
- session.run(
144
- "mypy",
145
- "--install-types",
146
- "--non-interactive",
147
- f"--python-executable={sys.executable}",
148
- "noxfile.py",
149
- )
150
-
151
-
152
- @session(python=python_versions)
153
- def tests(session: Session) -> None:
154
- """Run the test suite."""
155
- session.install(".")
156
- session.install("coverage[toml]", "pytest", "pygments", "hypothesis")
157
- try:
158
- session.run("coverage", "run", "--parallel", "-m", "pytest", *session.posargs)
159
- finally:
160
- if session.interactive:
161
- session.notify("coverage", posargs=[])
162
-
163
-
164
- @session
165
- def coverage(session: Session) -> None:
166
- """Produce the coverage report."""
167
- # args = session.posargs or ["report"]
168
-
169
- session.install("coverage[toml]", "codecov")
170
-
171
- if not session.posargs and any(Path().glob(".coverage.*")):
172
- session.run("coverage", "combine")
173
-
174
- session.run("coverage", "xml", "--fail-under=0")
175
- session.run("codecov", *session.posargs)
176
- # session.run("coverage", *args)
177
-
178
-
179
- @session(python=python_versions)
180
- def typeguard(session: Session) -> None:
181
- """Runtime type checking using Typeguard."""
182
- session.install(".")
183
- session.install("pytest", "typeguard", "pygments", "hypothesis")
184
- session.run("pytest", f"--typeguard-packages={package}", *session.posargs)
185
-
186
-
187
- # @session(python=python_versions)
188
- # def xdoctest(session: Session) -> None:
189
- # """Run examples with xdoctest."""
190
- # args = session.posargs or ["all"]
191
- # session.install(".")
192
- # session.install("xdoctest[colors]")
193
- # session.run("python", "-m", "xdoctest", package, *args)
194
-
195
-
196
- # @session(name="docs-build", python="3.10")
197
- # def docs_build(session: Session) -> None:
198
- # """Build the documentation."""
199
- # args = session.posargs or ["docs", "docs/_build"]
200
- # session.install(".")
201
- # session.install("sphinx", "sphinx-click", "sphinx-rtd-theme")
202
-
203
- # build_dir = Path("docs", "_build")
204
- # if build_dir.exists():
205
- # shutil.rmtree(build_dir)
206
-
207
- # session.run("sphinx-build", *args)
208
-
209
-
210
- # @session(python="3.10")
211
- # def docs(session: Session) -> None:
212
- # """Build and serve the documentation with live reloading on file changes."""
213
- # args = session.posargs or ["--open-browser", "docs", "docs/_build"]
214
- # session.install(".")
215
- # session.install("sphinx", "sphinx-autobuild", "sphinx-click", "sphinx-rtd-theme")
216
-
217
- # build_dir = Path("docs", "_build")
218
- # if build_dir.exists():
219
- # shutil.rmtree(build_dir)
220
-
221
- # session.run("sphinx-autobuild", *args)
@@ -1,88 +0,0 @@
1
- # generated by rye
2
- # use `rye lock` or `rye sync` to update this lockfile
3
- #
4
- # last locked with the following flags:
5
- # pre: false
6
- # features: []
7
- # all-features: false
8
- # with-sources: false
9
-
10
- -e file:.
11
- argcomplete==3.1.1
12
- # via nox
13
- asttokens==2.2.1
14
- # via icontract
15
- attrs==23.1.0
16
- # via hypothesis
17
- certifi==2023.5.7
18
- # via requests
19
- charset-normalizer==3.2.0
20
- # via requests
21
- click==8.1.6
22
- # via typer
23
- codecov==2.1.13
24
- colorlog==6.7.0
25
- # via nox
26
- coverage==7.4.4
27
- # via codecov
28
- # via pytest-cov
29
- distlib==0.3.7
30
- # via virtualenv
31
- exceptiongroup==1.2.0
32
- # via hypothesis
33
- # via pytest
34
- filelock==3.12.2
35
- # via virtualenv
36
- hypothesis==6.99.13
37
- icontract==2.6.6
38
- # via revseq
39
- idna==3.4
40
- # via requests
41
- iniconfig==2.0.0
42
- # via pytest
43
- markdown-it-py==3.0.0
44
- # via rich
45
- mdurl==0.1.2
46
- # via markdown-it-py
47
- mypy==1.9.0
48
- mypy-extensions==1.0.0
49
- # via mypy
50
- nox==2024.3.2
51
- packaging==23.1
52
- # via nox
53
- # via pytest
54
- platformdirs==3.9.1
55
- # via virtualenv
56
- pluggy==1.4.0
57
- # via pytest
58
- pygments==2.15.1
59
- # via rich
60
- pytest==8.1.1
61
- # via pytest-cov
62
- pytest-cov==4.1.0
63
- requests==2.31.0
64
- # via codecov
65
- rich==13.7.1
66
- # via revseq
67
- ruff==0.3.4
68
- six==1.16.0
69
- # via asttokens
70
- sortedcontainers==2.4.0
71
- # via hypothesis
72
- tomli==2.0.1
73
- # via coverage
74
- # via mypy
75
- # via pytest
76
- typeguard==4.2.1
77
- # via revseq
78
- typer==0.11.0
79
- # via revseq
80
- typing-extensions==4.10.0
81
- # via icontract
82
- # via mypy
83
- # via typeguard
84
- # via typer
85
- urllib3==2.0.4
86
- # via requests
87
- virtualenv==20.24.0
88
- # via nox
@@ -1,34 +0,0 @@
1
- # generated by rye
2
- # use `rye lock` or `rye sync` to update this lockfile
3
- #
4
- # last locked with the following flags:
5
- # pre: false
6
- # features: []
7
- # all-features: false
8
- # with-sources: false
9
-
10
- -e file:.
11
- asttokens==2.2.1
12
- # via icontract
13
- click==8.1.6
14
- # via typer
15
- icontract==2.6.6
16
- # via revseq
17
- markdown-it-py==3.0.0
18
- # via rich
19
- mdurl==0.1.2
20
- # via markdown-it-py
21
- pygments==2.15.1
22
- # via rich
23
- rich==13.7.1
24
- # via revseq
25
- six==1.16.0
26
- # via asttokens
27
- typeguard==4.2.1
28
- # via revseq
29
- typer==0.11.0
30
- # via revseq
31
- typing-extensions==4.10.0
32
- # via icontract
33
- # via typeguard
34
- # via typer
revseq-1.0.0/ruff.toml DELETED
@@ -1,92 +0,0 @@
1
- line-length = 120
2
- target-version = "py310"
3
-
4
- [lint]
5
- select = [
6
- "A",
7
- "ARG",
8
- "B",
9
- "C",
10
- "DTZ",
11
- "E",
12
- "EM",
13
- "F",
14
- "FBT",
15
- "I",
16
- "I001",
17
- "ICN",
18
- "ISC",
19
- "N",
20
- "PLC",
21
- "PLE",
22
- "PLR",
23
- "PLW",
24
- "Q",
25
- "RUF",
26
- "S",
27
- "T",
28
- "TID",
29
- "UP",
30
- "W",
31
- "YTT",
32
- ]
33
- ignore = [
34
- "B027",
35
- "C901",
36
- "D100",
37
- "D103",
38
- "D205",
39
- "D212",
40
- "D415",
41
- "E203",
42
- "E501",
43
- "FBT001",
44
- "FBT002",
45
- "FBT003",
46
- "N802",
47
- "N803",
48
- "PLR0911",
49
- "PLR0912",
50
- "PLR0913",
51
- "PLR0915",
52
- "S105",
53
- "S106",
54
- "S107",
55
- "ARG001",
56
- "UP007",
57
- ]
58
- unfixable = [
59
- "F401",
60
- "UP007",
61
- ]
62
- exclude = [
63
- ".git",
64
- ".hg",
65
- "__pycache__",
66
- "_bin/*",
67
- "_build/*",
68
- "_ig_fbcode_wheel/*",
69
- "buck-out/*",
70
- "third-party-buck/*",
71
- "third-party2/*",
72
- "dist",
73
- ".venv",
74
- ".nox",
75
- ".mypy_cache",
76
- ".pytype",
77
- ".svn",
78
- "__pypackages__",
79
- ]
80
-
81
- [format]
82
- # Like Black, use double quotes for strings.
83
- quote-style = "double"
84
-
85
- # Like Black, indent with spaces, rather than tabs.
86
- indent-style = "space"
87
-
88
- # Like Black, respect magic trailing commas.
89
- skip-magic-trailing-comma = false
90
-
91
- # Like Black, automatically detect the appropriate line ending.
92
- line-ending = "auto"
File without changes
File without changes
File without changes