
    c                         d Z ddlZddlmZ ddlZddlmZ ddlm	Z	 ddl
mZmZ d Zd Z G d d	      Zed
k(  r/ej"                  dd \  ZZZ eee      Zej-                  ed       yy)a  Sphinx utils

ModuleGenerator: Generate a file that lists all the modules of a list of
packages in order to pull all the docstring.
This should not be used in a makefile to systematically generate sphinx
documentation!

Typical usage:

>>> from logilab.common.sphinxutils import ModuleGenerator
>>> mgen = ModuleGenerator('logilab common', '/home/adim/src/logilab/common')
>>> mgen.generate('api_logilab_common.rst', exclude_dirs=('test',))
    N)STD_BLACKLIST)globfind)load_module_from_filemodpath_from_filec                     g }t        j                  |       D ]3  \  }}t        |dd       | j                  k(  s!|j	                  ||f       5 t        |      S )N
__module__)inspect
getmembersgetattr__name__appendsorted)modulemembersnamevalues       </usr/lib/python3/dist-packages/logilab/common/sphinxutils.pymodule_membersr   )   sV    G))&1 *e5,-@NND%=)* '?    c                 X    t        t        |       D cg c]  }|dvr|
 c}      S c c}w )N)__doc__r   __dict____weakref__)r   vars)klassr   s     r   class_membersr   1   s9     U	
OO 	
 	
s   'c                   4    e Zd ZdZdZdZd ZefdZd Z	d Z
y)	ModuleGeneratorz.. -*- coding: utf-8 -*-

%s
z9
:mod:`%s`
=======%s

.. automodule:: %s
   :members: %s
z%

.. autoclass:: %s
   :members: %s

c                 F    || _         t        j                  |      | _        y )N)titleospabspathcode_dir)selfproject_titler#   s      r   __init__zModuleGenerator.__init__K   s    "
H-r   c                 4   t        |d      | _        t        | j                        dz   }d|z  d| j                  z  z   d|z  z   }| j                  j	                  | j
                  |z         | j                  |       | j                  j                          y)zmake the module filew   =z	
 %s API
)exclude_dirsN)openfnlenr    writefile_headergen_modulesclose)r$   	dest_filer+   numr    s        r   generatezModuleGenerator.generateO   s{    y#&$**o!c	MDJJ66sBd&&./l3r   c           
         | j                  |      D ]  }|j                  }g }g }t        |      D ]J  \  }}t        j                  |      rt        |      }|j                  ||f       :|j                  |       L | j                  j                  | j                  |dt        |      z  |dj                  |      fz         |D ]>  \  }	}
| j                  j                  | j                  |	dj                  |
      fz         @  y)zgenerate all modulesr*   z, N)find_modulesr   r   r	   isclassr   r   r-   r/   
module_defr.   join	class_def)r$   r+   r   modnameclasses
modmembersobjnameobjclassmembersr   r   s              r   r1   zModuleGenerator.gen_modulesX   s    ''5 	LFooGGJ .v 6 /??3'#0#5LNNG\#:;%%g./ GGMM7C#g,,>S]I^"__ #* Lwdnntyy7I/JJKL	Lr   c              #     K   t        j                  | j                        }t        j                  |      t         j                  z   }|t
        j                  vr t
        j                  j                  d|       t        | j                  d|      D ]*  }t        j                  |      dv r	 t        |      }| , y # t        $ r* t        |      }t        dj                  |      di       }Y 9w xY ww)N   z*.py)zsetup.pyz__pkginfo__.py. )r!   dirnamer#   basenamesepsyspathinsertr   r   	Exceptionr   typer:   )r$   r+   basepathbasedirfilepathr   dotted_paths          r   r7   zModuleGenerator.find_modulesj   s     ;;t}}-,,x(3772#(("HHOOAw' E 	H||H%)GG=.x8 L	
  =/9chh{3R<=s*   B*C5-B?8C5?0C2/C51C22C5N)r   r   __qualname__r0   r9   r;   r&   r   r5   r1   r7   rE   r   r   r   r   ;   s/    8KJI. 0= L$r   r   __main__rC   )testtestsexamplesdatadocz.hg	migration)r   rI   os.pathrJ   r!   r	   logilab.commonr   logilab.common.shellutilsr   logilab.common.modutilsr   r   r   r   r   r   argvr    r#   outfile	generatorr5   rE   r   r   <module>ra      su   $    ( . L< <~ z"xx|E8Wx0Iw `a r   