Claudiu Popa | ec09cc7 | 2016-07-23 00:22:28 +0300 | [diff] [blame] | 1 | # Copyright (c) 2006-2008, 2010, 2013 LOGILAB S.A. (Paris, FRANCE) <contact@logilab.fr> |
Claudiu Popa | 9ff44de | 2017-12-15 12:24:15 +0100 | [diff] [blame] | 2 | # Copyright (c) 2012 FELD Boris <lothiraldan@gmail.com> |
hippo91 | 1f7c29c | 2020-08-20 18:40:19 +0200 | [diff] [blame] | 3 | # Copyright (c) 2014-2018, 2020 Claudiu Popa <pcmanticore@gmail.com> |
Claudiu Popa | 9ff44de | 2017-12-15 12:24:15 +0100 | [diff] [blame] | 4 | # Copyright (c) 2014 Google, Inc. |
| 5 | # Copyright (c) 2015 Ionel Cristian Maries <contact@ionelmc.ro> |
| 6 | # Copyright (c) 2016 Derek Gustafson <degustaf@gmail.com> |
Claudiu Popa | 3a8635a | 2018-07-15 11:36:36 +0200 | [diff] [blame] | 7 | # Copyright (c) 2018 Reverb C <reverbc@users.noreply.github.com> |
Pierre Sassoulas | ac85223 | 2021-02-21 15:13:06 +0100 | [diff] [blame] | 8 | # Copyright (c) 2019-2021 Pierre Sassoulas <pierre.sassoulas@gmail.com> |
Claudiu Popa | 369d952 | 2020-04-27 11:04:14 +0200 | [diff] [blame] | 9 | # Copyright (c) 2019 Ashley Whetter <ashley@awhetter.co.uk> |
Pierre Sassoulas | ac85223 | 2021-02-21 15:13:06 +0100 | [diff] [blame] | 10 | # Copyright (c) 2020 hippo91 <guillaume.peillex@gmail.com> |
hippo91 | 1f7c29c | 2020-08-20 18:40:19 +0200 | [diff] [blame] | 11 | # Copyright (c) 2020 Damien Baty <damien.baty@polyconseil.fr> |
Claudiu Popa | 369d952 | 2020-04-27 11:04:14 +0200 | [diff] [blame] | 12 | # Copyright (c) 2020 Frank Harrison <frank@doublethefish.com> |
Pierre Sassoulas | 0f08e2e | 2021-06-17 10:21:08 +0200 | [diff] [blame] | 13 | # Copyright (c) 2021 Marc Mueller <30130371+cdce8p@users.noreply.github.com> |
Pierre Sassoulas | 13dae7c | 2021-03-29 20:59:59 +0200 | [diff] [blame] | 14 | # Copyright (c) 2021 Andrew Howe <howeaj@users.noreply.github.com> |
Claudiu Popa | ec09cc7 | 2016-07-23 00:22:28 +0300 | [diff] [blame] | 15 | |
Claudiu Popa | 8322781 | 2016-06-01 16:11:29 +0100 | [diff] [blame] | 16 | # Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
Marc Mueller | 2129086 | 2021-07-01 12:47:58 +0200 | [diff] [blame] | 17 | # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE |
Pierre Sassoulas | ec2957f | 2020-05-01 13:53:10 +0200 | [diff] [blame] | 18 | # pylint: disable=redefined-outer-name |
Claudiu Popa | 8322781 | 2016-06-01 16:11:29 +0100 | [diff] [blame] | 19 | |
root | 4becf6f | 2006-04-26 10:48:09 +0000 | [diff] [blame] | 20 | import os |
Pierre Sassoulas | 5f7ce97 | 2021-03-30 23:02:16 +0200 | [diff] [blame] | 21 | import shutil |
root | 4becf6f | 2006-04-26 10:48:09 +0000 | [diff] [blame] | 22 | from os.path import exists |
root | 4becf6f | 2006-04-26 10:48:09 +0000 | [diff] [blame] | 23 | |
Derek Gustafson | 197555a | 2016-12-08 04:15:21 +0000 | [diff] [blame] | 24 | import pytest |
Torsten Marek | 0ed61a7 | 2014-11-09 10:33:29 +0100 | [diff] [blame] | 25 | |
Damien Baty | 89f1a6f | 2020-07-06 00:01:50 +0200 | [diff] [blame] | 26 | from pylint import testutils |
Pierre Sassoulas | 5ab140a | 2019-03-09 11:22:36 +0100 | [diff] [blame] | 27 | from pylint.checkers import imports, initialize |
| 28 | from pylint.lint import PyLinter |
root | 4becf6f | 2006-04-26 10:48:09 +0000 | [diff] [blame] | 29 | |
Derek Gustafson | 4faacf2 | 2016-12-06 15:42:53 +0000 | [diff] [blame] | 30 | |
Derek Gustafson | 197555a | 2016-12-08 04:15:21 +0000 | [diff] [blame] | 31 | @pytest.fixture |
Andrew Howe | a37c643 | 2021-03-29 09:00:18 +0100 | [diff] [blame] | 32 | def dest(request): |
| 33 | dest = request.param |
Derek Gustafson | 197555a | 2016-12-08 04:15:21 +0000 | [diff] [blame] | 34 | yield dest |
Frank Harrison | 23c4ae8 | 2020-04-07 17:52:16 +0100 | [diff] [blame] | 35 | try: |
| 36 | os.remove(dest) |
| 37 | except FileNotFoundError: |
| 38 | # file may not have been created if tests inside fixture skipped |
| 39 | pass |
Derek Gustafson | 4faacf2 | 2016-12-06 15:42:53 +0000 | [diff] [blame] | 40 | |
Sylvain Thénault | ede82d7 | 2010-04-19 11:22:40 +0200 | [diff] [blame] | 41 | |
Andrew Howe | a37c643 | 2021-03-29 09:00:18 +0100 | [diff] [blame] | 42 | POSSIBLE_DOT_FILENAMES = ["foo.dot", "foo.gv", "tests/regrtest_data/foo.dot"] |
| 43 | |
| 44 | |
| 45 | @pytest.mark.parametrize("dest", POSSIBLE_DOT_FILENAMES, indirect=True) |
Derek Gustafson | 197555a | 2016-12-08 04:15:21 +0000 | [diff] [blame] | 46 | def test_dependencies_graph(dest): |
Andrew Howe | a37c643 | 2021-03-29 09:00:18 +0100 | [diff] [blame] | 47 | """DOC files are correctly generated, and the graphname is the basename""" |
Claudiu Popa | 3f28424 | 2018-09-16 17:33:50 +0200 | [diff] [blame] | 48 | imports._dependencies_graph(dest, {"labas": ["hoho", "yep"], "hoho": ["yep"]}) |
Derek Gustafson | 197555a | 2016-12-08 04:15:21 +0000 | [diff] [blame] | 49 | with open(dest) as stream: |
Claudiu Popa | 3f28424 | 2018-09-16 17:33:50 +0200 | [diff] [blame] | 50 | assert ( |
| 51 | stream.read().strip() |
| 52 | == """ |
Andrew Howe | a37c643 | 2021-03-29 09:00:18 +0100 | [diff] [blame] | 53 | digraph "foo" { |
Emile Anclin | be37bb3 | 2008-09-10 10:19:26 +0200 | [diff] [blame] | 54 | rankdir=LR |
| 55 | charset="utf-8" |
Emile Anclin | 176bbe5 | 2008-09-15 12:21:13 +0200 | [diff] [blame] | 56 | URL="." node[shape="box"] |
Emile Anclin | be37bb3 | 2008-09-10 10:19:26 +0200 | [diff] [blame] | 57 | "hoho" []; |
| 58 | "yep" []; |
| 59 | "labas" []; |
Sylvain Thénault | bd7048c | 2008-12-16 17:15:59 +0100 | [diff] [blame] | 60 | "yep" -> "hoho" []; |
| 61 | "hoho" -> "labas" []; |
| 62 | "yep" -> "labas" []; |
root | 4becf6f | 2006-04-26 10:48:09 +0000 | [diff] [blame] | 63 | } |
Claudiu Popa | 3f28424 | 2018-09-16 17:33:50 +0200 | [diff] [blame] | 64 | """.strip() |
| 65 | ) |
Sylvain Thénault | ede82d7 | 2010-04-19 11:22:40 +0200 | [diff] [blame] | 66 | |
Derek Gustafson | 4faacf2 | 2016-12-06 15:42:53 +0000 | [diff] [blame] | 67 | |
Andrew Howe | a37c643 | 2021-03-29 09:00:18 +0100 | [diff] [blame] | 68 | @pytest.mark.parametrize("filename", ["graph.png", "graph"]) |
Pierre Sassoulas | 5f7ce97 | 2021-03-30 23:02:16 +0200 | [diff] [blame] | 69 | @pytest.mark.skipif( |
Marc Mueller | 5cd19d2 | 2021-06-01 20:54:10 +0200 | [diff] [blame] | 70 | any(shutil.which(x) for x in ("dot", "gv")), reason="dot or gv is installed" |
Pierre Sassoulas | 5f7ce97 | 2021-03-30 23:02:16 +0200 | [diff] [blame] | 71 | ) |
Andrew Howe | a37c643 | 2021-03-29 09:00:18 +0100 | [diff] [blame] | 72 | def test_missing_graphviz(filename): |
| 73 | """Raises if graphviz is not installed, and defaults to png if no extension given""" |
| 74 | with pytest.raises(RuntimeError, match=r"Cannot generate `graph\.png`.*"): |
| 75 | imports._dependencies_graph(filename, {"a": ["b", "c"], "b": ["c"]}) |
| 76 | |
| 77 | |
Derek Gustafson | 197555a | 2016-12-08 04:15:21 +0000 | [diff] [blame] | 78 | @pytest.fixture |
| 79 | def linter(): |
Pierre Sassoulas | 3aa5045 | 2021-02-07 14:15:05 +0100 | [diff] [blame] | 80 | pylinter = PyLinter(reporter=testutils.GenericTestReporter()) |
| 81 | initialize(pylinter) |
| 82 | return pylinter |
Sylvain Thénault | ede82d7 | 2010-04-19 11:22:40 +0200 | [diff] [blame] | 83 | |
Derek Gustafson | 197555a | 2016-12-08 04:15:21 +0000 | [diff] [blame] | 84 | |
| 85 | @pytest.fixture |
| 86 | def remove_files(): |
| 87 | yield |
Claudiu Popa | 3f28424 | 2018-09-16 17:33:50 +0200 | [diff] [blame] | 88 | for fname in ("import.dot", "ext_import.dot", "int_import.dot"): |
root | 4becf6f | 2006-04-26 10:48:09 +0000 | [diff] [blame] | 89 | try: |
Derek Gustafson | 197555a | 2016-12-08 04:15:21 +0000 | [diff] [blame] | 90 | os.remove(fname) |
Pierre Sassoulas | 5613da5 | 2020-04-20 16:38:10 +0200 | [diff] [blame] | 91 | except FileNotFoundError: |
Derek Gustafson | 197555a | 2016-12-08 04:15:21 +0000 | [diff] [blame] | 92 | pass |
| 93 | |
| 94 | |
Reverb C | 5cbb8c9 | 2018-03-01 16:55:05 +0800 | [diff] [blame] | 95 | @pytest.mark.usefixtures("remove_files") |
Derek Gustafson | 197555a | 2016-12-08 04:15:21 +0000 | [diff] [blame] | 96 | def test_checker_dep_graphs(linter): |
Pierre Sassoulas | 3aa5045 | 2021-02-07 14:15:05 +0100 | [diff] [blame] | 97 | linter.global_set_option("persistent", False) |
| 98 | linter.global_set_option("reports", True) |
| 99 | linter.global_set_option("enable", "imports") |
| 100 | linter.global_set_option("import-graph", "import.dot") |
| 101 | linter.global_set_option("ext-import-graph", "ext_import.dot") |
| 102 | linter.global_set_option("int-import-graph", "int_import.dot") |
| 103 | linter.global_set_option("int-import-graph", "int_import.dot") |
Derek Gustafson | 197555a | 2016-12-08 04:15:21 +0000 | [diff] [blame] | 104 | # ignore this file causing spurious MemoryError w/ some python version (>=2.3?) |
Pierre Sassoulas | 3aa5045 | 2021-02-07 14:15:05 +0100 | [diff] [blame] | 105 | linter.global_set_option("ignore", ("func_unknown_encoding.py",)) |
| 106 | linter.check("input") |
| 107 | linter.generate_reports() |
Claudiu Popa | 3f28424 | 2018-09-16 17:33:50 +0200 | [diff] [blame] | 108 | assert exists("import.dot") |
| 109 | assert exists("ext_import.dot") |
| 110 | assert exists("int_import.dot") |