|
|
|
|
|
from __future__ import with_statement |
|
|
import logging |
|
|
import os |
|
|
import os.path |
|
|
import sys |
|
|
from discover_python import expose_options |
|
|
from discover_python import log_discovered |
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
EXPOSE_NAMES = ('location', 'version') |
|
|
|
|
|
|
|
|
FIND_SOURCE = ''' |
|
|
import os |
|
|
import os.path |
|
|
import sys |
|
|
try: |
|
|
from pkg_resources import get_distribution |
|
|
except ImportError: |
|
|
sys.stderr.write('pkg_resources is not found' + os.linesep) |
|
|
try: |
|
|
import lxml |
|
|
except ImportError: |
|
|
sys.stderr.write('lxml is not found' + os.linesep) |
|
|
raise SystemExit(1) |
|
|
else: |
|
|
print(os.path.dirname(lxml.__path__[0])) |
|
|
print('') |
|
|
raise SystemExit(0) |
|
|
|
|
|
try: |
|
|
dist = get_distribution('lxml') |
|
|
except Exception: |
|
|
e = sys.exc_info()[1] |
|
|
sys.stderr.write(repr(e)) |
|
|
sys.stderr.write(os.linesep) |
|
|
raise SystemExit(1) |
|
|
else: |
|
|
print(dist.location) |
|
|
print(dist.version) |
|
|
''' |
|
|
|
|
|
|
|
|
def discover_lxml(executable): |
|
|
import tempfile |
|
|
fd, path = tempfile.mkstemp() |
|
|
try: |
|
|
with os.fdopen(fd, 'w') as f: |
|
|
f.write(FIND_SOURCE) |
|
|
|
|
|
from subprocess import Popen |
|
|
from subprocess import PIPE |
|
|
args = [executable, path] |
|
|
env = dict(os.environ) |
|
|
for k in ('PYTHONPATH', 'PYTHONHOME'): |
|
|
if k in env: |
|
|
del env[k] |
|
|
try: |
|
|
p = Popen(args, stdout=PIPE, env=env) |
|
|
except Exception: |
|
|
e = sys.exc_info()[1] |
|
|
logger.exception(e) |
|
|
return |
|
|
else: |
|
|
try: |
|
|
lines = list(p.stdout) |
|
|
finally: |
|
|
p.wait() |
|
|
finally: |
|
|
os.unlink(path) |
|
|
|
|
|
if p.returncode == 0: |
|
|
location = lines[0].strip() |
|
|
version = lines[1].strip() |
|
|
yield dict(location=location, |
|
|
version=version) |
|
|
|
|
|
|
|
|
class DiscoverRecipe(object): |
|
|
''' Discover lxml and provide its location. |
|
|
''' |
|
|
|
|
|
def __init__(self, buildout, name, options): |
|
|
self.__logger = logger = logging.getLogger(name) |
|
|
for k, v in options.items(): |
|
|
logger.info('%s: %r', k, v) |
|
|
|
|
|
self.__recipe = options['recipe'] |
|
|
|
|
|
not_found = options.get('not-found', 'not-found') |
|
|
executable = options.get('python', 'python').strip() |
|
|
|
|
|
|
|
|
founds = discover_lxml(executable=executable) |
|
|
founds = log_discovered('matching', founds, EXPOSE_NAMES, |
|
|
log=logger.info) |
|
|
founds = list(founds) |
|
|
|
|
|
|
|
|
if founds: |
|
|
found = founds[0] |
|
|
logger.info('the first-found one will be used:') |
|
|
expose_options(options, EXPOSE_NAMES, found, |
|
|
not_found=not_found, logger=logger) |
|
|
return |
|
|
|
|
|
|
|
|
expose_options(options, ['location'], dict(), not_found=not_found, |
|
|
logger=logger) |
|
|
logger.warning('lxml not found') |
|
|
return |
|
|
|
|
|
def install(self): |
|
|
return [] |
|
|
|
|
|
update = install |
|
|
|