def get_configurable_nbextensions( nbextension_dirs, exclude_dirs=('mathjax',), as_dict=False, log=None): """Build a list of configurable nbextensions based on YAML descriptor files. descriptor files must: - be located under one of nbextension_dirs - have the file extension '.yaml' or '.yml' - contain (at minimum) the following keys: - Type: must be 'IPython Notebook Extension' or 'Jupyter Notebook Extension' - Main: relative url of the nbextension's main javascript file """ extension_dict = {} # Traverse through nbextension subdirectories to find all yaml files # However, don't check directories twice. See # github.com/Jupyter-contrib/jupyter_nbextensions_configurator/issues/25 already_checked = set() for root_nbext_dir in nbextension_dirs: if root_nbext_dir in already_checked: continue else: already_checked.add(root_nbext_dir) if log: log.debug( 'Looking for nbextension yaml descriptor files in {}'.format( root_nbext_dir)) for direct, dirs, files in os.walk(root_nbext_dir, followlinks=True): # filter to exclude directories dirs[:] = [d for d in dirs if d not in exclude_dirs] for filename in files: if os.path.splitext(filename)[1] not in ['.yml', '.yaml']: continue yaml_path = os.path.join(direct, filename) yaml_relpath = os.path.relpath(yaml_path, root_nbext_dir) with io.open(yaml_path, 'r', encoding='utf-8') as stream: try: extension = yaml.load(stream, Loader=SafeLoader) except yaml.YAMLError: if log: log.warning( 'Failed to load yaml file {}'.format( yaml_relpath)) continue extension = _process_nbextension_spec( extension, relative_url_base=path2url(os.path.dirname(yaml_relpath))) if not isinstance(extension, dict): continue require = extension['require'] if log: if require in extension_dict: msg = 'nbextension {!r} has duplicate listings'.format( extension['require']) msg += ' in both {!r} and {!r}'.format( yaml_path, extension_dict[require]['yaml_path']) log.warning(msg) extension['duplicate'] = True else: log.debug('Found nbextension {!r} in {}'.format( extension['Name'], yaml_relpath)) extension_dict[require] = { 'yaml_path': yaml_path, 'extension': extension} if as_dict: return extension_dict return [val['extension'] for val in extension_dict.values()]
def get_configurable_nbextensions( nbextension_dirs=None, exclude_dirs=['mathjax'], log=None): """Build a list of configurable nbextensions based on YAML descriptor files descriptor files must: - be located under one of nbextension_dirs - have the extension '.yaml' - containing (at minimum) the following keys: - Type: must be 'IPython Notebook Extension' or 'Jupyter Notebook Extension' - Main: url of the nbextension's main javascript file, relative to yaml """ if nbextension_dirs is None: nbextension_dirs = get_nbextensions_path() extension_list = [] required_keys = {'Type', 'Main'} valid_types = {'IPython Notebook Extension', 'Jupyter Notebook Extension'} do_log = (log is not None) # Traverse through nbextension subdirectories to find all yaml files for root_nbext_dir in nbextension_dirs: if do_log: log.debug( 'Looking for nbextension yaml descriptor files in {}'.format( root_nbext_dir)) for direct, dirs, files in os.walk(root_nbext_dir, followlinks=True): # filter to exclude directories dirs[:] = [d for d in dirs if d not in exclude_dirs] for filename in files: if not filename.endswith('.yaml'): continue yaml_path = os.path.join(direct, filename) yaml_relpath = os.path.relpath(yaml_path, root_nbext_dir) with open(yaml_path, 'r') as stream: try: extension = yaml.load(stream, Loader=SafeLoader) except ScannerError: if do_log: log.warning( 'Failed to load yaml file {}'.format( yaml_relpath)) continue if not isinstance(extension, dict): continue if any(key not in extension for key in required_keys): continue if extension['Type'].strip() not in valid_types: continue extension.setdefault('Compatibility', '?.x') extension.setdefault('Section', 'notebook') # generate relative URLs within the nbextensions namespace, # from urls relative to the yaml file yaml_dir_url = path2url(os.path.dirname(yaml_relpath)) key_map = [ ('Link', 'readme'), ('Icon', 'icon'), ('Main', 'require'), ] for from_key, to_key in key_map: # str needed in python 3, otherwise it ends up bytes from_val = str(extension.get(from_key, '')) if not from_val: continue if absolute_url_re.match(from_val): extension[to_key] = from_val else: extension[to_key] = posixpath.normpath( ujoin(yaml_dir_url, from_val)) # strip .js extension in require path extension['require'] = os.path.splitext( extension['require'])[0] if do_log: log.debug( 'Found nbextension {!r} in {}'.format( extension.setdefault('Name', extension['require']), yaml_relpath, ) ) extension_list.append(extension) return extension_list
def get_configurable_nbextensions(nbextension_dirs, exclude_dirs=('mathjax', ), as_dict=False, log=None): """Build a list of configurable nbextensions based on YAML descriptor files. descriptor files must: - be located under one of nbextension_dirs - have the file extension '.yaml' or '.yml' - contain (at minimum) the following keys: - Type: must be 'IPython Notebook Extension' or 'Jupyter Notebook Extension' - Main: relative url of the nbextension's main javascript file """ extension_dict = {} required_keys = {'Type', 'Main'} valid_types = {'IPython Notebook Extension', 'Jupyter Notebook Extension'} # Traverse through nbextension subdirectories to find all yaml files for root_nbext_dir in nbextension_dirs: if log: log.debug( 'Looking for nbextension yaml descriptor files in {}'.format( root_nbext_dir)) for direct, dirs, files in os.walk(root_nbext_dir, followlinks=True): # filter to exclude directories dirs[:] = [d for d in dirs if d not in exclude_dirs] for filename in files: if os.path.splitext(filename)[1] not in ['.yml', '.yaml']: continue yaml_path = os.path.join(direct, filename) yaml_relpath = os.path.relpath(yaml_path, root_nbext_dir) with open(yaml_path, 'r') as stream: try: extension = yaml.load(stream, Loader=SafeLoader) except yaml.YAMLError: if log: log.warning('Failed to load yaml file {}'.format( yaml_relpath)) continue if not isinstance(extension, dict): continue if any(key not in extension for key in required_keys): continue if extension['Type'].strip() not in valid_types: continue extension.setdefault('Compatibility', '?.x') extension.setdefault('Section', 'notebook') # generate relative URLs within the nbextensions namespace, # from urls relative to the yaml file yaml_dir_url = path2url(os.path.dirname(yaml_relpath)) key_map = [ ('Link', 'readme'), ('Icon', 'icon'), ('Main', 'require'), ] for from_key, to_key in key_map: # str needed in python 3, otherwise it ends up bytes from_val = str(extension.get(from_key, '')) if not from_val: continue if absolute_url_re.match(from_val): extension[to_key] = from_val else: extension[to_key] = posixpath.normpath( ujoin(yaml_dir_url, from_val)) # strip .js file extension in require path require = extension['require'] = os.path.splitext( extension['require'])[0] extension.setdefault('Name', extension['require']) if log: if require in extension_dict: msg = 'nbextension {!r} has duplicate listings'.format( extension['require']) msg += ' in both {!r} and {!r}'.format( yaml_path, extension_dict[require]['yaml_path']) log.warning(msg) extension['duplicate'] = True else: log.debug('Found nbextension {!r} in {}'.format( extension['Name'], yaml_relpath)) extension_dict[require] = { 'yaml_path': yaml_path, 'extension': extension } if as_dict: return extension_dict return [val['extension'] for val in extension_dict.values()]
def get_configurable_nbextensions( nbextension_dirs, exclude_dirs=('mathjax',), as_dict=False, log=None): """Build a list of configurable nbextensions based on YAML descriptor files. descriptor files must: - be located under one of nbextension_dirs - have the extension '.yaml' - containing (at minimum) the following keys: - Type: must be 'IPython Notebook Extension' or 'Jupyter Notebook Extension' - Main: relative url of the nbextension's main javascript file """ extension_dict = {} required_keys = {'Type', 'Main'} valid_types = {'IPython Notebook Extension', 'Jupyter Notebook Extension'} # Traverse through nbextension subdirectories to find all yaml files for root_nbext_dir in nbextension_dirs: if log: log.debug( 'Looking for nbextension yaml descriptor files in {}'.format( root_nbext_dir)) for direct, dirs, files in os.walk(root_nbext_dir, followlinks=True): # filter to exclude directories dirs[:] = [d for d in dirs if d not in exclude_dirs] for filename in files: if os.path.splitext(filename)[1] not in ['.yml', '.yaml']: continue yaml_path = os.path.join(direct, filename) yaml_relpath = os.path.relpath(yaml_path, root_nbext_dir) with open(yaml_path, 'r') as stream: try: extension = yaml.load(stream, Loader=SafeLoader) except yaml.YAMLError: if log: log.warning( 'Failed to load yaml file {}'.format( yaml_relpath)) continue if not isinstance(extension, dict): continue if any(key not in extension for key in required_keys): continue if extension['Type'].strip() not in valid_types: continue extension.setdefault('Compatibility', '?.x') extension.setdefault('Section', 'notebook') # generate relative URLs within the nbextensions namespace, # from urls relative to the yaml file yaml_dir_url = path2url(os.path.dirname(yaml_relpath)) key_map = [ ('Link', 'readme'), ('Icon', 'icon'), ('Main', 'require'), ] for from_key, to_key in key_map: # str needed in python 3, otherwise it ends up bytes from_val = str(extension.get(from_key, '')) if not from_val: continue if absolute_url_re.match(from_val): extension[to_key] = from_val else: extension[to_key] = posixpath.normpath( ujoin(yaml_dir_url, from_val)) # strip .js extension in require path require = extension['require'] = os.path.splitext( extension['require'])[0] extension.setdefault('Name', extension['require']) if log: if require in extension_dict: msg = 'nbextension {!r} has duplicate listings'.format( extension['require']) msg += ' in both {!r} and {!r}'.format( yaml_path, extension_dict[require]['yaml_path']) log.warning(msg) extension['duplicate'] = True else: log.debug('Found nbextension {!r} in {}'.format( extension['Name'], yaml_relpath)) extension_dict[require] = { 'yaml_path': yaml_path, 'extension': extension} if as_dict: return extension_dict return [val['extension'] for val in extension_dict.values()]
def get_configurable_nbextensions(nbextension_dirs=None, exclude_dirs=['mathjax'], log=None): """Build a list of configurable nbextensions based on YAML descriptor files descriptor files must: - be located under one of nbextension_dirs - have the extension '.yaml' - containing (at minimum) the following keys: - Type: must be 'IPython Notebook Extension' or 'Jupyter Notebook Extension' - Main: url of the nbextension's main javascript file, relative to yaml """ if nbextension_dirs is None: nbextension_dirs = get_nbextensions_path() extension_list = [] required_keys = {'Type', 'Main'} valid_types = {'IPython Notebook Extension', 'Jupyter Notebook Extension'} do_log = (log is not None) # Traverse through nbextension subdirectories to find all yaml files for root_nbext_dir in nbextension_dirs: if do_log: log.debug( 'Looking for nbextension yaml descriptor files in {}'.format( root_nbext_dir)) for direct, dirs, files in os.walk(root_nbext_dir, followlinks=True): # filter to exclude directories dirs[:] = [d for d in dirs if d not in exclude_dirs] for filename in files: if not filename.endswith('.yaml'): continue yaml_path = os.path.join(direct, filename) yaml_relpath = os.path.relpath(yaml_path, root_nbext_dir) with open(yaml_path, 'r') as stream: try: extension = yaml.load(stream, Loader=SafeLoader) except ScannerError: if do_log: log.warning('Failed to load yaml file {}'.format( yaml_relpath)) continue if not isinstance(extension, dict): continue if any(key not in extension for key in required_keys): continue if extension['Type'].strip() not in valid_types: continue extension.setdefault('Compatibility', '?.x') extension.setdefault('Section', 'notebook') # generate relative URLs within the nbextensions namespace, # from urls relative to the yaml file yaml_dir_url = path2url(os.path.dirname(yaml_relpath)) key_map = [ ('Link', 'readme'), ('Icon', 'icon'), ('Main', 'require'), ] for from_key, to_key in key_map: # str needed in python 3, otherwise it ends up bytes from_val = str(extension.get(from_key, '')) if not from_val: continue if absolute_url_re.match(from_val): extension[to_key] = from_val else: extension[to_key] = posixpath.normpath( ujoin(yaml_dir_url, from_val)) # strip .js extension in require path extension['require'] = os.path.splitext( extension['require'])[0] if do_log: log.debug('Found nbextension {!r} in {}'.format( extension.setdefault('Name', extension['require']), yaml_relpath, )) extension_list.append(extension) return extension_list