Source code for champollion.parser

# :coding: utf-8

"""Parser to fetch_environment all information from a :term:`Javascript` API in order
to document each element from a simple identifier.
"""

import os

from .js_module import fetch_environment as fetch_module_environment
from .js_file import fetch_environment as fetch_file_environment


[docs]def fetch_environment(path): """Return :term:`Javascript` environment dictionary from *path* structure. Raises :exc:`OSError` if the directory is incorrect. The environment is in the form of:: { "module": { "module.id": { "id": "module.id", "name": "module_name", "file_id": "file/id/index.js" "description": "A module." ... }, ... }, "file": { "file/id/index.js": { "id": "file/id/index.js", "module_id": "module_id", "content": "...", ... }, ... }, "class": { "class_id": { "id": "class_id", "module_id": "module_id" "description": "A class." ... }, ... }, "method": { "method_id": { "id": "method_id", "class_id": "class_id", "module_id": "module_id", "description": "A method." ... }, ... }, "attribute": { "attribute_id": { "id": "attribute_id", "class_id": "class_id", "module_id": "module_id", "description": "An attribute." ... }, ... }, "function": { "function_id": { "id": "function_id", "module_id": "module_id", "description": "A function." ... }, ... }, "data": { "data_id": { "id": "data_id", "module_id": "module_id", "description": "A variable." ... }, ... } } """ if not os.path.isdir(path) or not os.access(path, os.R_OK): raise OSError( "The javascript package directory is incorrect: {0}".format(path) ) environment = { "module": {}, "class": {}, "method": {}, "attribute": {}, "function": {}, "data": {}, "file": {} } repository_name = os.path.basename(path) extensions = [".js", ".jsx"] for root, dirs, files in os.walk(path): root_folders = ( [repository_name] + root.split(path)[-1].split(os.sep)[1:] ) files[:] = [ f for f in files if os.path.splitext(f)[1] in extensions and not f.startswith(".") ] dirs[:] = [ d for d in dirs if not d.startswith(".") ] for _file in files: file_id = "/".join(root_folders + [_file]) file_path = os.path.join(root, _file) # Fetch module environment _module_environment = fetch_module_environment( file_id, files, module_names=[ _module["name"] for _module in environment["module"].values() ] ) module_id = _module_environment["id"] environment["module"][module_id] = _module_environment # Fetch file environment _file_environment = fetch_file_environment( file_path, file_id, _module_environment["id"] ) file_id = _file_environment["id"] method_environment = {} attribute_environment = {} # Extract methods and attributes from class environment to set it # in the top level environment. for _class in _file_environment["class"].values(): method_environment.update(_class["method"].copy()) attribute_environment.update(_class["attribute"].copy()) environment["file"][file_id] = _file_environment environment["function"].update(_file_environment["function"]) environment["data"].update(_file_environment["data"]) environment["class"].update(_file_environment["class"]) environment["method"].update(method_environment) environment["attribute"].update(attribute_environment) return environment