libutils.py 3.86 KB
Newer Older
1 2 3 4 5
"""A few useful functions for using rope as a library"""
import os.path

import rope.base.project
import rope.base.pycore
6 7
from rope.base import pyobjectsdef
from rope.base import utils
8 9 10 11 12 13 14 15 16 17 18 19 20 21
from rope.base import taskhandle


def path_to_resource(project, path, type=None):
    """Get the resource at path

    You only need to specify `type` if `path` does not exist.  It can
    be either 'file' or 'folder'.  If the type is `None` it is assumed
    that the resource already exists.

    Note that this function uses `Project.get_resource()`,
    `Project.get_file()`, and `Project.get_folder()` methods.

    """
22
    project_path = path_relative_to_project_root(project, path)
23 24
    if project_path is None:
        project_path = rope.base.project._realpath(path)
25 26 27 28 29 30 31 32 33
        project = rope.base.project.get_no_project()
    if type is None:
        return project.get_resource(project_path)
    if type == 'file':
        return project.get_file(project_path)
    if type == 'folder':
        return project.get_folder(project_path)
    return None

34

35 36 37 38
def path_relative_to_project_root(project, path):
    return relative(project.address, path)

@utils.deprecated()
39 40 41 42
def relative(root, path):
    root = rope.base.project._realpath(root).replace(os.path.sep, '/')
    path = rope.base.project._realpath(path).replace(os.path.sep, '/')
    if path == root:
43
        return ''
44
    if path.startswith(root + '/'):
45 46
        return path[len(root) + 1:]

47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

def report_change(project, path, old_content):
    """Report that the contents of file at `path` was changed

    The new contents of file is retrieved by reading the file.

    """
    resource = path_to_resource(project, path)
    if resource is None:
        return
    for observer in list(project.observers):
        observer.resource_changed(resource)
    if project.pycore.automatic_soa:
        rope.base.pycore.perform_soa_on_changed_scopes(project, resource,
                                                       old_content)

63

64 65 66 67 68 69 70 71
def analyze_module(project, resource):
    """Perform static object analysis on a python file in the project

    Note that this might be really time consuming.
    """
    project.pycore.analyze_module(resource)


72 73 74 75 76
def analyze_modules(project, task_handle=taskhandle.NullTaskHandle()):
    """Perform static object analysis on all python files in the project

    Note that this might be really time consuming.
    """
77
    resources = project.get_python_files()
78 79 80
    job_set = task_handle.create_jobset('Analyzing Modules', len(resources))
    for resource in resources:
        job_set.started_job(resource.path)
81
        analyze_module(project, resource)
82
        job_set.finished_job()
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122


def get_string_module(project, code, resource=None, force_errors=False):
    """Returns a `PyObject` object for the given code

    If `force_errors` is `True`, `exceptions.ModuleSyntaxError` is
    raised if module has syntax errors.  This overrides
    ``ignore_syntax_errors`` project config.

    """
    return pyobjectsdef.PyModule(project.pycore, code, resource,
                                 force_errors=force_errors)


def get_string_scope(project, code, resource=None):
    """Returns a `Scope` object for the given code"""
    return get_string_module(project, code, resource).get_scope()


def is_python_file(project, resource):
    return project.pycore.is_python_file(resource)


def modname(resource):
    if resource.is_folder():
        module_name = resource.name
        source_folder = resource.parent
    elif resource.name == '__init__.py':
        module_name = resource.parent.name
        source_folder = resource.parent.parent
    else:
        module_name = resource.name[:-3]
        source_folder = resource.parent

    while source_folder != source_folder.parent and \
            source_folder.has_child('__init__.py'):
        module_name = source_folder.name + '.' + module_name
        source_folder = source_folder.parent

    return module_name