diff --git a/spacy/compat.py b/spacy/compat.py index 27fce2dcf..21ccfcfad 100644 --- a/spacy/compat.py +++ b/spacy/compat.py @@ -5,6 +5,7 @@ import sys import ujson import itertools import locale +import os from thinc.neural.util import copy_array @@ -84,7 +85,7 @@ def getattr_(obj, name, *default): def symlink_to(orig, dest): - if is_python2 and is_windows: + if is_windows: import subprocess subprocess.call(["mklink", "/d", path2str(orig), path2str(dest)], shell=True) @@ -92,6 +93,15 @@ def symlink_to(orig, dest): orig.symlink_to(dest) +def symlink_remove(link): + # https://stackoverflow.com/q/26554135/6400719 + if os.path.isdir(path2str(link)) and is_windows: + # this should only be on Py2.7 and windows + os.rmdir(path2str(link)) + else: + os.unlink(path2str(link)) + + def is_config(python2=None, python3=None, windows=None, linux=None, osx=None): return ( python2 in (None, is_python2) diff --git a/spacy/tests/test_cli.py b/spacy/tests/test_cli.py new file mode 100644 index 000000000..e0067c088 --- /dev/null +++ b/spacy/tests/test_cli.py @@ -0,0 +1,38 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import pytest +import os +from pathlib import Path +from spacy.compat import symlink_to, symlink_remove, path2str + + +@pytest.fixture +def target_local_path(): + return Path("./foo-target") + + +@pytest.fixture +def link_local_path(): + return Path("./foo-symlink") + + +@pytest.fixture(scope="function") +def setup_target(request, target_local_path, link_local_path): + if not target_local_path.exists(): + os.mkdir(path2str(target_local_path)) + + # yield -- need to cleanup even if assertion fails + # https://github.com/pytest-dev/pytest/issues/2508#issuecomment-309934240 + def cleanup(): + symlink_remove(link_local_path) + os.rmdir(path2str(target_local_path)) + + request.addfinalizer(cleanup) + + +def test_create_symlink_windows(setup_target, target_local_path, link_local_path): + assert target_local_path.exists() + + symlink_to(link_local_path, target_local_path) + assert link_local_path.exists()