|
@@ -15,18 +15,19 @@ import platform
|
|
|
import shutil
|
|
|
|
|
|
here = os.path.dirname(os.path.abspath(__file__))
|
|
|
-node_root = os.path.join(here, 'jupyterlab')
|
|
|
+extension_root = os.path.join(here, 'jupyterlab')
|
|
|
is_repo = os.path.exists(os.path.join(here, '.git'))
|
|
|
|
|
|
-npm_path = os.pathsep.join([
|
|
|
- os.path.join(node_root, 'node_modules', '.bin'),
|
|
|
- os.environ.get('PATH', os.defpath),
|
|
|
-])
|
|
|
+def run(cmd, cwd=None):
|
|
|
+ """Run a command
|
|
|
+
|
|
|
+ >>> run('npm install', cwd='./subdir')
|
|
|
+ """
|
|
|
+ check_call(cmd.split(), cwd=cwd, stdout=sys.stdout, stderr=sys.stderr)
|
|
|
|
|
|
from distutils import log
|
|
|
log.set_verbosity(log.DEBUG)
|
|
|
log.info('setup.py entered')
|
|
|
-log.info('$PATH=%s' % os.environ['PATH'])
|
|
|
|
|
|
LONG_DESCRIPTION = 'This is a very early pre-alpha developer preview. It is not ready for general usage yet.'
|
|
|
|
|
@@ -53,14 +54,11 @@ def js_prerelease(command, strict=False):
|
|
|
log.warn('rebuilding js and css failed (not a problem)')
|
|
|
log.warn(str(e))
|
|
|
command.run(self)
|
|
|
- update_package_data(self.distribution)
|
|
|
return DecoratedCommand
|
|
|
|
|
|
def update_package_data(distribution):
|
|
|
- """update package_data to catch changes during setup"""
|
|
|
+ """update build_py options to get package_data changes"""
|
|
|
build_py = distribution.get_command_obj('build_py')
|
|
|
- # distribution.package_data = find_package_data()
|
|
|
- # re-init build_py options which load package_data
|
|
|
build_py.finalize_options()
|
|
|
|
|
|
|
|
@@ -69,7 +67,8 @@ class NPM(Command):
|
|
|
|
|
|
user_options = []
|
|
|
|
|
|
- node_modules = os.path.join(node_root, 'node_modules')
|
|
|
+ node_modules = os.path.join(here, 'node_modules')
|
|
|
+ jlab_node_modules = os.path.join(extension_root, 'node_modules')
|
|
|
|
|
|
targets = [
|
|
|
os.path.join(here, 'jupyterlab', 'build', 'bundle.js'),
|
|
@@ -83,37 +82,28 @@ class NPM(Command):
|
|
|
|
|
|
def has_npm(self):
|
|
|
try:
|
|
|
- check_call(['npm', '--version'])
|
|
|
+ run('npm --version')
|
|
|
return True
|
|
|
except:
|
|
|
return False
|
|
|
|
|
|
- def should_run_npm_install(self):
|
|
|
- package_json = os.path.join(node_root, 'package.json')
|
|
|
- node_modules_exists = os.path.exists(self.node_modules)
|
|
|
- return self.has_npm()
|
|
|
-
|
|
|
def run(self):
|
|
|
has_npm = self.has_npm()
|
|
|
if not has_npm:
|
|
|
log.error("`npm` unavailable. If you're running this command using sudo, make sure `npm` is available to sudo")
|
|
|
-
|
|
|
- env = os.environ.copy()
|
|
|
- env['PATH'] = npm_path
|
|
|
-
|
|
|
- if self.should_run_npm_install():
|
|
|
+ if not os.path.exists(self.node_modules):
|
|
|
log.info("Installing build dependencies with npm. This may take a while...")
|
|
|
- # remove just jupyterlab so that it is always updated
|
|
|
- shutil.rmtree(os.path.join(self.node_modules, 'jupyterlab'), ignore_errors=True)
|
|
|
- check_call(['npm', 'install'], cwd=node_root, stdout=sys.stdout, stderr=sys.stderr)
|
|
|
- check_call(['npm', 'run', 'build'], cwd=node_root, stdout=sys.stdout, stderr=sys.stderr)
|
|
|
- os.utime(self.node_modules, None)
|
|
|
+ run('npm install', cwd=here)
|
|
|
+ if not os.path.exists(self.jlab_node_modules):
|
|
|
+ log.info("Installing extension build dependencies with npm. This may take a while...")
|
|
|
+ run('npm install', cwd=extension_root)
|
|
|
+ run('npm run build:serverextension')
|
|
|
|
|
|
for t in self.targets:
|
|
|
if not os.path.exists(t):
|
|
|
msg = 'Missing file: %s' % t
|
|
|
if not has_npm:
|
|
|
- msg += '\nnpm is required to build a development version of widgetsnbextension'
|
|
|
+ msg += '\nnpm is required to build the development version'
|
|
|
raise ValueError(msg)
|
|
|
|
|
|
# update package data in case this created new files
|