this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

✅ Add a lot of tests, track coverage

+401 -25
+2
.gitignore
··· 1 1 dist 2 2 issurge/__pycache__ 3 + .coverage 4 + coverage.xml
+2 -2
issurge/main.py
··· 20 20 from issurge.utils import debug 21 21 22 22 23 - def run(): 24 - opts = docopt(__doc__) 23 + def run(opts=None): 24 + opts = opts or docopt(__doc__) 25 25 os.environ["ISSURGE_DEBUG"] = "1" if opts["--debug"] else "" 26 26 os.environ["ISSURGE_DRY_RUN"] = "1" if opts["--dry-run"] else "" 27 27
+139
issurge/main_test.py
··· 1 + import os 2 + from urllib.parse import urlparse 3 + from ward import fixture, test 4 + from issurge.main import run 5 + from pathlib import Path 6 + from unittest.mock import Mock 7 + from issurge.parser import Issue, subprocess 8 + 9 + from issurge.utils import debugging, dry_running 10 + 11 + 12 + @fixture 13 + def setup(): 14 + Path("test_empty_issues").write_text("") 15 + Path("test_some_issues").write_text( 16 + """~common @common %common 17 + \tAn issue to submit 18 + Another ~issue to submit @me""" 19 + ) 20 + subprocess.run = Mock() 21 + Issue._get_remote_url = Mock( 22 + return_value=urlparse("https://github.com/ewen-lbh/gh-api-playground") 23 + ) 24 + yield 25 + Path("test_empty_issues").unlink() 26 + Path("test_some_issues").unlink() 27 + del os.environ["ISSURGE_DEBUG"] 28 + del os.environ["ISSURGE_DRY_RUN"] 29 + 30 + 31 + @fixture 32 + def default_opts(): 33 + yield { 34 + "<submitter-args>": [], 35 + "<file>": "test_empty_issues", 36 + "--dry-run": False, 37 + "--debug": False, 38 + } 39 + 40 + 41 + @test("dry run is set when --dry-run is passed") 42 + def _(_=setup, opts=default_opts): 43 + run(opts=opts | {"--dry-run": True}) 44 + assert dry_running() 45 + assert not debugging() 46 + 47 + 48 + @test("debug is set when --debug is passed") 49 + def _(_=setup, opts=default_opts): 50 + run(opts=opts | {"--debug": True}) 51 + assert debugging() 52 + assert not dry_running() 53 + 54 + 55 + @test("dry run and debug are not set by default") 56 + def _(_=setup, opts=default_opts): 57 + run(opts=opts) 58 + assert not dry_running() 59 + assert not debugging() 60 + 61 + 62 + @test("both dry run and debug are set when both are passed") 63 + def _(_=setup, opts=default_opts): 64 + run(opts=opts | {"--dry-run": True, "--debug": True}) 65 + assert dry_running() 66 + assert debugging() 67 + 68 + 69 + @test("issues are submitted when --dry-run is not passed, with github provider") 70 + def _(_=setup, opts=default_opts): 71 + run(opts=opts | {"<file>": "test_some_issues"}) 72 + assert [call.args[0] for call in subprocess.run.mock_calls] == [ 73 + [ 74 + "gh", 75 + "issue", 76 + "new", 77 + "-t", 78 + "An issue to submit", 79 + "-b", 80 + "", 81 + "-a", 82 + "common", 83 + "-l", 84 + "common", 85 + ], 86 + [ 87 + "gh", 88 + "issue", 89 + "new", 90 + "-t", 91 + "Another issue to submit", 92 + "-b", 93 + "", 94 + "-a", 95 + "@me", 96 + "-l", 97 + "issue", 98 + ], 99 + ] 100 + 101 + @test("issues are submitted when --dry-run is not passed, with gitlab provider") 102 + def _(_=setup, opts=default_opts): 103 + Issue._get_remote_url = Mock( 104 + return_value=urlparse("https://gitlab.com/ewen-lbh/gh-api-playground") 105 + ) 106 + run(opts=opts | {"<file>": "test_some_issues"}) 107 + assert [call.args[0] for call in subprocess.run.mock_calls] == [ 108 + [ 109 + "glab", 110 + "issue", 111 + "new", 112 + "-t", 113 + "An issue to submit", 114 + "-d", 115 + "", 116 + "-a", 117 + "common", 118 + "-l", 119 + "common", 120 + ], 121 + [ 122 + "glab", 123 + "issue", 124 + "new", 125 + "-t", 126 + "Another issue to submit", 127 + "-d", 128 + "", 129 + "-a", 130 + "@me", 131 + "-l", 132 + "issue", 133 + ], 134 + ] 135 + 136 + @test("issues are not submitted when --dry-run is passed") 137 + def _(_=setup, opts=default_opts): 138 + run(opts=opts | {"<file>": "test_some_issues", "--dry-run": True}) 139 + assert len(subprocess.run.mock_calls) == 0
+13 -7
issurge/parser.py
··· 42 42 43 43 @staticmethod 44 44 def to_dict(to_parse: str) -> dict[str, Any]: 45 + if not to_parse.strip(): 46 + return {} 45 47 root = Node("root") 46 48 root.add_children( 47 49 [Node(line) for line in to_parse.splitlines() if line.strip()] ··· 213 215 ) 214 216 215 217 218 + def tree_to_text(tree: dict[str, Any], recursion_depth=0) -> str: 219 + result = "" 220 + for line, children in tree.items(): 221 + result += TAB * recursion_depth + line.strip() + NEWLINE 222 + if children is not None: 223 + result += tree_to_text(children, recursion_depth + 1) 224 + return result 225 + 226 + 216 227 def parse_issue_fragment( 217 228 issue_fragment: str, 218 229 children: dict[str, Any], ··· 248 259 if expecting_description: 249 260 if children is None: 250 261 raise ValueError(f"Expected a description after {issue_fragment!r}") 251 - current_description = "" 252 - for line, v in children.items(): 253 - if v is not None: 254 - raise ValueError( 255 - "Description should not have indented lines at {line!r}" 256 - ) 257 - current_description += f"{line.strip()}\n" 262 + current_description = tree_to_text(children, 0) 258 263 259 264 current_issue = Issue( 260 265 title=current_title, ··· 289 294 290 295 def parse(raw: str) -> Iterable[Issue]: 291 296 for item in Node.to_dict(raw).items(): 297 + debug(f"Processing {item!r}") 292 298 for issue in parse_issue_fragment(*item, Issue("", "", set(), set(), "")): 293 299 yield issue
+98 -2
issurge/parser_test.py
··· 1 - from ward import test 2 - from .parser import Issue 1 + from ward import test, raises 2 + import os 3 + from .parser import Issue, parse 4 + import textwrap 3 5 4 6 for fragment, expected, description_expected in [ 5 7 ("", Issue(), False), ··· 36 38 actual, expecting_description = Issue.parse(fragment) 37 39 assert expecting_description == description_expected 38 40 assert actual == expected 41 + 42 + 43 + for lines, expected in [ 44 + ("", []), 45 + ("A simple issue", [Issue(title="A simple issue")]), 46 + ("~label @me", []), 47 + ( 48 + """ 49 + @me some ~labels to ~organize issues ~bug 50 + a %milestone to keep ~track of stuff 51 + """, 52 + [ 53 + Issue( 54 + title="some labels to organize issues", 55 + labels={"labels", "organize", "bug"}, 56 + assignees={"me"}, 57 + ), 58 + Issue( 59 + title="a milestone to keep track of stuff", 60 + labels={"track"}, 61 + milestone="milestone", 62 + ), 63 + ], 64 + ), 65 + ( 66 + """ 67 + some stuff 68 + \tinside: not processed 69 + """, 70 + [ 71 + Issue(title="some stuff"), 72 + ], 73 + ), 74 + ( 75 + """ 76 + ~common-tag @someone 77 + \tright there ~other-tag 78 + \t//A comment 79 + 80 + \t@someone-else right %here 81 + """, 82 + [ 83 + Issue( 84 + title="right there", 85 + labels={"common-tag", "other-tag"}, 86 + assignees={"someone"}, 87 + ), 88 + Issue( 89 + title="right", 90 + labels={"common-tag"}, 91 + assignees={"someone-else", "someone"}, 92 + milestone="here", 93 + ), 94 + ], 95 + ), 96 + ( 97 + """An ~issue with a description: 98 + \tThis is the %description of the issue: 99 + \t// This is *not* a comment 100 + \tIt has a 101 + \t- bullet list 102 + 103 + \tAnd 104 + \t\tIndentation 105 + """, 106 + [ 107 + Issue( 108 + title="An issue with a description", 109 + labels={"issue"}, 110 + description="""This is the %description of the issue: 111 + // This is *not* a comment 112 + It has a 113 + - bullet list 114 + And 115 + \tIndentation 116 + """, 117 + ) 118 + ], 119 + ), 120 + ]: 121 + 122 + @test(f"parse issues from {textwrap.dedent(lines)!r}") 123 + def _(lines=lines, expected=expected): 124 + assert list(parse(lines)) == expected 125 + 126 + 127 + @test("parse issue with missing description fails") 128 + def _(): 129 + with raises(ValueError) as exception: 130 + list(parse("An ~issue with a description:\nNo description here")) 131 + assert ( 132 + str(exception.raised) 133 + == f"Expected a description after 'An ~issue with a description:'" 134 + )
+38
issurge/utils_test.py
··· 1 + import os, io, sys 2 + from unittest.mock import Mock 3 + from ward import test 4 + from issurge.utils import debug, debugging, dry_running 5 + import issurge.utils 6 + 7 + 8 + @test("debugging is false by default") 9 + def _(): 10 + assert not debugging() 11 + 12 + 13 + @test("debugging is true when ISSURGE_DEBUG is set") 14 + def _(): 15 + os.environ["ISSURGE_DEBUG"] = "1" 16 + assert debugging() 17 + del os.environ["ISSURGE_DEBUG"] 18 + 19 + 20 + @test("dry_running is false by default") 21 + def _(): 22 + assert not dry_running() 23 + 24 + 25 + @test("dry_running is true when ISSURGE_DRY_RUN is set") 26 + def _(): 27 + os.environ["ISSURGE_DRY_RUN"] = "1" 28 + assert dry_running() 29 + del os.environ["ISSURGE_DRY_RUN"] 30 + 31 + 32 + @test("debug only prints when debugging is true") 33 + def _(): 34 + issurge.utils.print = Mock() 35 + os.environ["ISSURGE_DEBUG"] = "1" 36 + debug("debug") 37 + assert len(issurge.utils.print.mock_calls) == 1 38 + assert issurge.utils.print.mock_calls[0].args[0] == "debug"
+99 -14
poetry.lock
··· 4 4 name = "click" 5 5 version = "8.1.3" 6 6 description = "Composable command line interface toolkit" 7 - category = "dev" 7 + category = "main" 8 8 optional = false 9 9 python-versions = ">=3.7" 10 10 files = [ ··· 19 19 name = "click-completion" 20 20 version = "0.5.2" 21 21 description = "Fish, Bash, Zsh and PowerShell completion for Click" 22 - category = "dev" 22 + category = "main" 23 23 optional = false 24 24 python-versions = "*" 25 25 files = [ ··· 36 36 name = "click-default-group" 37 37 version = "1.2.2" 38 38 description = "Extends click.Group to invoke a command without explicit subcommand name" 39 - category = "dev" 39 + category = "main" 40 40 optional = false 41 41 python-versions = "*" 42 42 files = [ ··· 50 50 name = "colorama" 51 51 version = "0.4.6" 52 52 description = "Cross-platform colored terminal text." 53 - category = "dev" 53 + category = "main" 54 54 optional = false 55 55 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 56 56 files = [ ··· 59 59 ] 60 60 61 61 [[package]] 62 + name = "coverage" 63 + version = "7.2.2" 64 + description = "Code coverage measurement for Python" 65 + category = "main" 66 + optional = false 67 + python-versions = ">=3.7" 68 + files = [ 69 + {file = "coverage-7.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c90e73bdecb7b0d1cea65a08cb41e9d672ac6d7995603d6465ed4914b98b9ad7"}, 70 + {file = "coverage-7.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e2926b8abedf750c2ecf5035c07515770944acf02e1c46ab08f6348d24c5f94d"}, 71 + {file = "coverage-7.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57b77b9099f172804e695a40ebaa374f79e4fb8b92f3e167f66facbf92e8e7f5"}, 72 + {file = "coverage-7.2.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efe1c0adad110bf0ad7fb59f833880e489a61e39d699d37249bdf42f80590169"}, 73 + {file = "coverage-7.2.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2199988e0bc8325d941b209f4fd1c6fa007024b1442c5576f1a32ca2e48941e6"}, 74 + {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:81f63e0fb74effd5be736cfe07d710307cc0a3ccb8f4741f7f053c057615a137"}, 75 + {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:186e0fc9cf497365036d51d4d2ab76113fb74f729bd25da0975daab2e107fd90"}, 76 + {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:420f94a35e3e00a2b43ad5740f935358e24478354ce41c99407cddd283be00d2"}, 77 + {file = "coverage-7.2.2-cp310-cp310-win32.whl", hash = "sha256:38004671848b5745bb05d4d621526fca30cee164db42a1f185615f39dc997292"}, 78 + {file = "coverage-7.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:0ce383d5f56d0729d2dd40e53fe3afeb8f2237244b0975e1427bfb2cf0d32bab"}, 79 + {file = "coverage-7.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3eb55b7b26389dd4f8ae911ba9bc8c027411163839dea4c8b8be54c4ee9ae10b"}, 80 + {file = "coverage-7.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d2b96123a453a2d7f3995ddb9f28d01fd112319a7a4d5ca99796a7ff43f02af5"}, 81 + {file = "coverage-7.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:299bc75cb2a41e6741b5e470b8c9fb78d931edbd0cd009c58e5c84de57c06731"}, 82 + {file = "coverage-7.2.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e1df45c23d4230e3d56d04414f9057eba501f78db60d4eeecfcb940501b08fd"}, 83 + {file = "coverage-7.2.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:006ed5582e9cbc8115d2e22d6d2144a0725db542f654d9d4fda86793832f873d"}, 84 + {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d683d230b5774816e7d784d7ed8444f2a40e7a450e5720d58af593cb0b94a212"}, 85 + {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8efb48fa743d1c1a65ee8787b5b552681610f06c40a40b7ef94a5b517d885c54"}, 86 + {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4c752d5264053a7cf2fe81c9e14f8a4fb261370a7bb344c2a011836a96fb3f57"}, 87 + {file = "coverage-7.2.2-cp311-cp311-win32.whl", hash = "sha256:55272f33da9a5d7cccd3774aeca7a01e500a614eaea2a77091e9be000ecd401d"}, 88 + {file = "coverage-7.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:92ebc1619650409da324d001b3a36f14f63644c7f0a588e331f3b0f67491f512"}, 89 + {file = "coverage-7.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5afdad4cc4cc199fdf3e18088812edcf8f4c5a3c8e6cb69127513ad4cb7471a9"}, 90 + {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0484d9dd1e6f481b24070c87561c8d7151bdd8b044c93ac99faafd01f695c78e"}, 91 + {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d530191aa9c66ab4f190be8ac8cc7cfd8f4f3217da379606f3dd4e3d83feba69"}, 92 + {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac0f522c3b6109c4b764ffec71bf04ebc0523e926ca7cbe6c5ac88f84faced0"}, 93 + {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ba279aae162b20444881fc3ed4e4f934c1cf8620f3dab3b531480cf602c76b7f"}, 94 + {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:53d0fd4c17175aded9c633e319360d41a1f3c6e352ba94edcb0fa5167e2bad67"}, 95 + {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c99cb7c26a3039a8a4ee3ca1efdde471e61b4837108847fb7d5be7789ed8fd9"}, 96 + {file = "coverage-7.2.2-cp37-cp37m-win32.whl", hash = "sha256:5cc0783844c84af2522e3a99b9b761a979a3ef10fb87fc4048d1ee174e18a7d8"}, 97 + {file = "coverage-7.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:817295f06eacdc8623dc4df7d8b49cea65925030d4e1e2a7c7218380c0072c25"}, 98 + {file = "coverage-7.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6146910231ece63facfc5984234ad1b06a36cecc9fd0c028e59ac7c9b18c38c6"}, 99 + {file = "coverage-7.2.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:387fb46cb8e53ba7304d80aadca5dca84a2fbf6fe3faf6951d8cf2d46485d1e5"}, 100 + {file = "coverage-7.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:046936ab032a2810dcaafd39cc4ef6dd295df1a7cbead08fe996d4765fca9fe4"}, 101 + {file = "coverage-7.2.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e627dee428a176ffb13697a2c4318d3f60b2ccdde3acdc9b3f304206ec130ccd"}, 102 + {file = "coverage-7.2.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fa54fb483decc45f94011898727802309a109d89446a3c76387d016057d2c84"}, 103 + {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3668291b50b69a0c1ef9f462c7df2c235da3c4073f49543b01e7eb1dee7dd540"}, 104 + {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7c20b731211261dc9739bbe080c579a1835b0c2d9b274e5fcd903c3a7821cf88"}, 105 + {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5764e1f7471cb8f64b8cda0554f3d4c4085ae4b417bfeab236799863703e5de2"}, 106 + {file = "coverage-7.2.2-cp38-cp38-win32.whl", hash = "sha256:4f01911c010122f49a3e9bdc730eccc66f9b72bd410a3a9d3cb8448bb50d65d3"}, 107 + {file = "coverage-7.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:c448b5c9e3df5448a362208b8d4b9ed85305528313fca1b479f14f9fe0d873b8"}, 108 + {file = "coverage-7.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfe7085783cda55e53510482fa7b5efc761fad1abe4d653b32710eb548ebdd2d"}, 109 + {file = "coverage-7.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9d22e94e6dc86de981b1b684b342bec5e331401599ce652900ec59db52940005"}, 110 + {file = "coverage-7.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:507e4720791977934bba016101579b8c500fb21c5fa3cd4cf256477331ddd988"}, 111 + {file = "coverage-7.2.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc4803779f0e4b06a2361f666e76f5c2e3715e8e379889d02251ec911befd149"}, 112 + {file = "coverage-7.2.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db8c2c5ace167fd25ab5dd732714c51d4633f58bac21fb0ff63b0349f62755a8"}, 113 + {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f68ee32d7c4164f1e2c8797535a6d0a3733355f5861e0f667e37df2d4b07140"}, 114 + {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d52f0a114b6a58305b11a5cdecd42b2e7f1ec77eb20e2b33969d702feafdd016"}, 115 + {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:797aad79e7b6182cb49c08cc5d2f7aa7b2128133b0926060d0a8889ac43843be"}, 116 + {file = "coverage-7.2.2-cp39-cp39-win32.whl", hash = "sha256:db45eec1dfccdadb179b0f9ca616872c6f700d23945ecc8f21bb105d74b1c5fc"}, 117 + {file = "coverage-7.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:8dbe2647bf58d2c5a6c5bcc685f23b5f371909a5624e9f5cd51436d6a9f6c6ef"}, 118 + {file = "coverage-7.2.2-pp37.pp38.pp39-none-any.whl", hash = "sha256:872d6ce1f5be73f05bea4df498c140b9e7ee5418bfa2cc8204e7f9b817caa968"}, 119 + {file = "coverage-7.2.2.tar.gz", hash = "sha256:36dd42da34fe94ed98c39887b86db9d06777b1c8f860520e21126a75507024f2"}, 120 + ] 121 + 122 + [package.extras] 123 + toml = ["tomli"] 124 + 125 + [[package]] 62 126 name = "cucumber-tag-expressions" 63 127 version = "4.1.0" 64 128 description = "Provides tag-expression parser for cucumber/behave" 65 - category = "dev" 129 + category = "main" 66 130 optional = false 67 131 python-versions = ">=2.7" 68 132 files = [ ··· 87 151 name = "jinja2" 88 152 version = "3.1.2" 89 153 description = "A very fast and expressive template engine." 90 - category = "dev" 154 + category = "main" 91 155 optional = false 92 156 python-versions = ">=3.7" 93 157 files = [ ··· 130 194 name = "markupsafe" 131 195 version = "2.1.2" 132 196 description = "Safely add untrusted strings to HTML/XML markup." 133 - category = "dev" 197 + category = "main" 134 198 optional = false 135 199 python-versions = ">=3.7" 136 200 files = [ ··· 202 266 name = "pluggy" 203 267 version = "1.0.0" 204 268 description = "plugin and hook calling mechanisms for python" 205 - category = "dev" 269 + category = "main" 206 270 optional = false 207 271 python-versions = ">=3.6" 208 272 files = [ ··· 218 282 name = "pprintpp" 219 283 version = "0.4.0" 220 284 description = "A drop-in replacement for pprint that's actually pretty" 221 - category = "dev" 285 + category = "main" 222 286 optional = false 223 287 python-versions = "*" 224 288 files = [ ··· 264 328 name = "shellingham" 265 329 version = "1.5.0.post1" 266 330 description = "Tool to Detect Surrounding Shell" 267 - category = "dev" 331 + category = "main" 268 332 optional = false 269 333 python-versions = ">=3.7" 270 334 files = [ ··· 276 340 name = "six" 277 341 version = "1.16.0" 278 342 description = "Python 2 and 3 compatibility utilities" 279 - category = "dev" 343 + category = "main" 280 344 optional = false 281 345 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 282 346 files = [ ··· 288 352 name = "tomli" 289 353 version = "2.0.1" 290 354 description = "A lil' TOML parser" 291 - category = "dev" 355 + category = "main" 292 356 optional = false 293 357 python-versions = ">=3.7" 294 358 files = [ ··· 300 364 name = "ward" 301 365 version = "0.67.2b0" 302 366 description = "A modern Python testing framework" 303 - category = "dev" 367 + category = "main" 304 368 optional = false 305 369 python-versions = ">=3.7.8,<4.0.0" 306 370 files = [ ··· 318 382 rich = ">=12.2.0" 319 383 tomli = ">=1.0.0,<3.0.0" 320 384 385 + [[package]] 386 + name = "ward-coverage" 387 + version = "0.3.0" 388 + description = "A coverage plugin for Ward testing framework" 389 + category = "main" 390 + optional = false 391 + python-versions = "^3.7.8" 392 + files = [] 393 + develop = false 394 + 395 + [package.dependencies] 396 + coverage = ">=5.0" 397 + cucumber-tag-expressions = ">3" 398 + ward = "*" 399 + 400 + [package.source] 401 + type = "git" 402 + url = "https://github.com/petereon/ward-coverage.git" 403 + reference = "HEAD" 404 + resolved_reference = "e3ad5d74e2dfa74638de8984b0ceaebbb6ebf2cc" 405 + 321 406 [metadata] 322 407 lock-version = "2.0" 323 408 python-versions = "^3.10" 324 - content-hash = "60f31c4e79148be98bc29ad6db9a4f27090b21b0d58da04b479b188600c89cef" 409 + content-hash = "1bb8a66c87a4083cf60b6bfe99d07fd501e98f3c9e9fbd2f34b656cc7fa1297f"
+10
pyproject.toml
··· 11 11 python = "^3.10" 12 12 rich = "^13.3.3" 13 13 docopt = "^0.6.2" 14 + ward-coverage = {git = "https://github.com/petereon/ward-coverage.git"} 14 15 15 16 16 17 [tool.poetry.group.dev.dependencies] ··· 19 20 [build-system] 20 21 requires = ["poetry-core"] 21 22 build-backend = "poetry.core.masonry.api" 23 + 24 + [tool.ward] 25 + hook_module = ["ward_coverage"] 26 + 27 + [tool.ward.plugins.coverage] 28 + omit = ["*_test.py"] 29 + report_type = ["term", "xml"] 30 + report = { skip_empty = true } 31 + source = ["issurge"]