72 lines
1.9 KiB
Python
72 lines
1.9 KiB
Python
|
import inspect
|
||
|
import importlib
|
||
|
import os.path
|
||
|
from urlparse import urlunsplit
|
||
|
|
||
|
# FIXME: better way to handle this?
|
||
|
_app = None
|
||
|
def setup(app):
|
||
|
global _app
|
||
|
_app = app
|
||
|
app.add_config_value('github_user', None, 'env')
|
||
|
app.add_config_value('github_project', None, 'env')
|
||
|
|
||
|
def linkcode_resolve(domain, info):
|
||
|
# TODO: js?
|
||
|
if domain != 'py':
|
||
|
return None
|
||
|
|
||
|
module, fullname = info['module'], info['fullname']
|
||
|
# TODO: attributes/properties don't have modules, maybe try to look them
|
||
|
# up based on their cached host object?
|
||
|
if not module:
|
||
|
return None
|
||
|
|
||
|
obj = importlib.import_module(module)
|
||
|
for item in fullname.split('.'):
|
||
|
obj = getattr(obj, item, None)
|
||
|
|
||
|
if obj is None:
|
||
|
return None
|
||
|
|
||
|
# get original from decorated methods
|
||
|
try: obj = getattr(obj, '_orig')
|
||
|
except AttributeError: pass
|
||
|
|
||
|
try:
|
||
|
obj_source_path = inspect.getsourcefile(obj)
|
||
|
_, line = inspect.getsourcelines(obj)
|
||
|
except (TypeError, IOError):
|
||
|
# obj doesn't have a module, or something
|
||
|
return None
|
||
|
|
||
|
import openerp
|
||
|
project_root = os.path.join(os.path.dirname(openerp.__file__), '..')
|
||
|
return make_github_link(
|
||
|
os.path.relpath(obj_source_path, project_root),
|
||
|
line)
|
||
|
|
||
|
def make_github_link(path, line=None, mode="blob"):
|
||
|
config = _app.config
|
||
|
if not (config.github_user and config.github_project):
|
||
|
return None
|
||
|
|
||
|
urlpath = "/{user}/{project}/{mode}/{branch}/{path}".format(
|
||
|
user=config.github_user,
|
||
|
project=config.github_project,
|
||
|
branch=config.version or 'master',
|
||
|
path=path,
|
||
|
mode=mode,
|
||
|
)
|
||
|
return urlunsplit((
|
||
|
'https',
|
||
|
'github.com',
|
||
|
urlpath,
|
||
|
'',
|
||
|
'' if line is None else 'L%d' % line
|
||
|
))
|
||
|
|
||
|
def github_doc_link(pagename, mode='blob'):
|
||
|
return make_github_link(
|
||
|
'doc/%s%s' % (pagename, _app.config.source_suffix), mode=mode)
|