2017-03-16 16:01:51 +00:00
|
|
|
# coding: utf8
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
|
|
import pip
|
2017-03-18 11:59:21 +00:00
|
|
|
from pathlib import Path
|
2017-03-19 00:39:36 +00:00
|
|
|
import importlib
|
2017-03-18 14:14:48 +00:00
|
|
|
from .. import util
|
2017-03-16 16:01:51 +00:00
|
|
|
|
|
|
|
|
|
|
|
def link(origin, link_name, force=False):
|
|
|
|
if is_package(origin):
|
2017-03-18 11:59:21 +00:00
|
|
|
link_package(origin, link_name, force)
|
2017-03-16 16:01:51 +00:00
|
|
|
else:
|
|
|
|
symlink(origin, link_name, force)
|
|
|
|
|
|
|
|
|
2017-03-19 00:39:36 +00:00
|
|
|
def link_package(package_name, link_name, force=False):
|
|
|
|
# Here we're importing the module just to find it. This is worryingly
|
|
|
|
# indirect, but it's otherwise very difficult to find the package.
|
|
|
|
# Python's installation and import rules are very complicated.
|
|
|
|
pkg = importlib.import_module(package_name)
|
|
|
|
package_path = Path(pkg.__file__).parent.parent
|
|
|
|
|
|
|
|
meta = get_meta(package_path, package_name)
|
|
|
|
model_name = package_name + '-' + meta['version']
|
|
|
|
model_path = package_path / package_name / model_name
|
2017-03-17 20:35:51 +00:00
|
|
|
symlink(model_path, link_name, force)
|
|
|
|
|
|
|
|
|
2017-03-16 16:01:51 +00:00
|
|
|
def symlink(model_path, link_name, force):
|
2017-03-19 10:57:13 +00:00
|
|
|
model_path = Path(model_path)
|
2017-03-18 15:30:15 +00:00
|
|
|
if not Path(model_path).exists():
|
2017-03-16 16:08:58 +00:00
|
|
|
util.sys_exit(
|
|
|
|
"The data should be located in {p}".format(p=model_path),
|
|
|
|
title="Can't locate model data")
|
2017-03-16 16:01:51 +00:00
|
|
|
|
2017-03-18 17:57:31 +00:00
|
|
|
link_path = util.get_data_path() / link_name
|
2017-03-16 16:01:51 +00:00
|
|
|
|
2017-03-18 17:57:31 +00:00
|
|
|
if link_path.exists() and not force:
|
|
|
|
util.sys_exit(
|
|
|
|
"To overwrite an existing link, use the --force flag.",
|
|
|
|
title="Link {l} already exists".format(l=link_name))
|
|
|
|
elif link_path.exists():
|
|
|
|
link_path.unlink()
|
2017-03-18 11:59:21 +00:00
|
|
|
|
2017-03-18 17:57:31 +00:00
|
|
|
link_path.symlink_to(model_path)
|
2017-03-16 16:08:58 +00:00
|
|
|
util.print_msg(
|
2017-03-18 17:57:31 +00:00
|
|
|
"{a} --> {b}".format(a=model_path.as_posix(), b=link_path.as_posix()),
|
2017-03-16 16:08:58 +00:00
|
|
|
"You can now load the model via spacy.load('{l}').".format(l=link_name),
|
|
|
|
title="Linking successful")
|
|
|
|
|
2017-03-16 16:01:51 +00:00
|
|
|
|
|
|
|
def get_meta(package_path, package):
|
|
|
|
meta = util.parse_package_meta(package_path, package)
|
|
|
|
return meta
|
|
|
|
|
|
|
|
|
|
|
|
def is_package(origin):
|
|
|
|
packages = pip.get_installed_distributions()
|
|
|
|
for package in packages:
|
|
|
|
if package.project_name.replace('-', '_') == origin:
|
|
|
|
return True
|
|
|
|
return False
|