Skip to content
This repository was archived by the owner on Nov 19, 2018. It is now read-only.

Commit 61ff345

Browse files
committed
Added tests and cleaned find_executables
1 parent 3b3efb1 commit 61ff345

File tree

2 files changed

+82
-20
lines changed

2 files changed

+82
-20
lines changed

pydot_ng/__init__.py

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -417,40 +417,47 @@ def __find_executables(path):
417417
"""
418418

419419
success = False
420-
progs = {'dot': '', 'twopi': '', 'neato': '', 'circo': '', 'fdp': '',
421-
'sfdp': ''}
420+
progs = {
421+
"dot": "",
422+
"twopi": "",
423+
"neato": "",
424+
"circo": "",
425+
"fdp": "",
426+
"sfdp": "",
427+
}
422428

423429
was_quoted = False
424430
path = path.strip()
425431
if path.startswith('"') and path.endswith('"'):
426432
path = path[1:-1]
427433
was_quoted = True
428434

429-
if os.path.isdir(path):
430-
for prg in progs.keys():
431-
if progs[prg]:
432-
continue
435+
if not os.path.isdir(path):
436+
return None
433437

434-
if os.path.exists(os.path.join(path, prg)):
435-
if was_quoted:
436-
progs[prg] = '"' + os.path.join(path, prg) + '"'
437-
else:
438-
progs[prg] = os.path.join(path, prg)
438+
for prg in progs:
439+
if progs[prg]:
440+
continue
439441

440-
success = True
442+
prg_path = os.path.join(path, prg)
443+
prg_exe_path = prg_path + ".exe"
441444

442-
elif os.path.exists(os.path.join(path, prg + '.exe')):
443-
if was_quoted:
444-
progs[prg] = '"' + os.path.join(path, prg + '.exe') + '"'
445-
else:
446-
progs[prg] = os.path.join(path, prg + '.exe')
445+
if os.path.exists(prg_path):
446+
if was_quoted:
447+
prg_path = "\"{}\"".format(prg_path)
448+
progs[prg] = prg_path
449+
success = True
447450

448-
success = True
451+
elif os.path.exists(prg_exe_path):
452+
if was_quoted:
453+
prg_exe_path = "\"{}\"".format(prg_exe_path)
454+
progs[prg] = prg_exe_path
455+
success = True
449456

450457
if success:
451458
return progs
452-
else:
453-
return None
459+
460+
return None
454461

455462

456463
# The multi-platform version of this 'find_graphviz' function was

test/test_pydot.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,3 +278,58 @@ def test_dotparser_import_warning():
278278
del sys.modules["pydot_ng"]
279279
warnings.simplefilter("always")
280280
import pydot_ng # noqa: F401
281+
282+
283+
def test_find_executables_fake_path():
284+
assert pydot.__find_executables("/fake/path/") is None
285+
286+
287+
def test_find_executables_real_path_no_programs(tmpdir):
288+
assert pydot.__find_executables(str(tmpdir)) is None
289+
290+
291+
def test_find_executables_path_needs_strip(tmpdir):
292+
path = tmpdir.mkdir("subdir")
293+
prog_path = str(path.join("dot"))
294+
295+
path_with_spaces = " {} ".format(path)
296+
297+
with open(prog_path, "w"):
298+
progs = pydot.__find_executables(path_with_spaces)
299+
assert progs["dot"] == prog_path
300+
assert sorted(
301+
("dot", "twopi", "neato", "circo", "fdp", "sfdp")
302+
) == sorted(progs)
303+
304+
305+
def test_find_executables_unix_and_exe_exists(tmpdir):
306+
path = str(tmpdir)
307+
prog_unix_path = str(tmpdir.join("dot"))
308+
prog_exe_path = str(tmpdir.join("dot.exe"))
309+
310+
with open(prog_unix_path, "w"):
311+
with open(prog_exe_path, "w"):
312+
progs = pydot.__find_executables(path)
313+
assert progs["dot"] == prog_unix_path
314+
assert progs["dot"] != prog_exe_path
315+
316+
317+
@pytest.mark.parametrize("quoted", (True, False), ids=("quoted", "unqoted"))
318+
@pytest.mark.parametrize("extension", ("", ".exe"))
319+
@pytest.mark.parametrize(
320+
"program", ("dot", "twopi", "neato", "circo", "fdp", "sfdp")
321+
)
322+
def test_find_executables(tmpdir, program, extension, quoted):
323+
path = tmpdir.mkdir("PYDOT is_da best!")
324+
prog_path = str(path.join(program + extension))
325+
326+
with open(prog_path, "w"):
327+
if quoted:
328+
path = "\"{}\"".format(path)
329+
prog_path = "\"{}\"".format(prog_path)
330+
331+
progs = pydot.__find_executables(str(path))
332+
assert progs[program] == prog_path
333+
assert sorted(
334+
("dot", "twopi", "neato", "circo", "fdp", "sfdp")
335+
) == sorted(progs)

0 commit comments

Comments
 (0)