2014-09-21 45 views
2

我试图使用sphinx-doc:automodule:结合模拟出模块按照this的答案。具体来说,我使用Mock来获取ReadTheDocs上不可用的PyQt5模块导入。Sphinx-doc:automodule:with Mock imports

奇怪的是,我发现任何继承自Mock-ed模块类的类都不包含在结果文档中。似乎狮身人面像不能看到他们由于某种原因。

我稍微定制模拟如下:

from mock import Mock as MagicMock 


class Mock(MagicMock): 
    __all__ = ['QApplication','pyqtSignal','pyqtSlot','QObject','QAbstractItemModel','QModelIndex','QTabWidget', 
     'QWebPage','QTableView','QWebView','QAbstractTableModel','Qt','QWidget','QPushButton','QDoubleSpinBox', 
     'QListWidget','QDialog','QSize','QTableWidget','QMainWindow','QTreeWidget', 
     'QAbstractItemDelegate','QColor','QGraphicsItemGroup','QGraphicsItem','QGraphicsPathItem', 
     'QGraphicsTextItem','QGraphicsRectItem','QGraphicsScene','QGraphicsView',] 

    def __init__(self, *args, **kwargs): 
     super(Mock, self).__init__() 


    @classmethod 
    def __getattr__(cls, name): 
     if name in ('__file__', '__path__'): 
      return os.devnull 
     else: 
      return Mock 

    @classmethod 
    def __setattr__(*args, **kwargs): 
     pass 

    def __setitem__(self, *args, **kwargs): 
     return 

    def __getitem__(self, *args, **kwargs): 
     return Mock 

__all__需要允许from x import *风格进口的PyQt5类。

我可以确认,将超类更改为object会导致正确记录类,正如删除Mock(本地生成)一样。使用:autoclass:强制使用文档的结果只有一行,表示该类继承自Mock

回答

1

我解决了这个问题,最终没有使用Mock作为Qt对象。在我的应用程序中有一个qt.py包装文件,它处理PyQt4PyQt5之间的差异,并允许它们随后导入以供使用(同时忽略Qt名称空间重新排列)。

在这个文件中,我在ReadTheDocs的一个测试中包装了实际的导入代码,然后如果检测到返回了一系列直接从object继承的虚拟类。对象具有属性时需要添加,但在代码库中仅使用一次。它需要保持最新,但它解决了这个问题。

# ReadTheDocs 
ON_RTD = os.environ.get('READTHEDOCS', None) == 'True' 
if not ON_RTD: 

    #... do the normal import here ... 

else: 

    class QMockObject(object): 
     def __init__(self, *args, **kwargs): 
      super(QMockObject, self).__init__() 

     def __call__(self, *args, **kwargs): 
      return None 

    class QApplication(QMockObject): 
     pass 

    class pyqtSignal(QMockObject): 
     pass 

    class pyqtSlot(QMockObject): 
     pass 

    class QObject(QMockObject): 
     pass 

    class QAbstractItemModel(QMockObject): 
     pass 

    class QModelIndex(QMockObject): 
     pass 

    class QTabWidget(QMockObject): 
     pass 

    class QWebPage(QMockObject): 
     pass 

    class QTableView(QMockObject): 
     pass 

    class QWebView(QMockObject): 
     pass 

    class QAbstractTableModel(QMockObject): 
     pass 

    class Qt(QMockObject): 
     DisplayRole = None 

    class QWidget(QMockObject): 
     pass 

    class QPushButton(QMockObject): 
     pass 

    class QDoubleSpinBox(QMockObject): 
     pass 

    class QListWidget(QMockObject): 
     pass 

    class QDialog(QMockObject): 
     pass 

    class QSize(QMockObject): 
     pass 

    class QTableWidget(QMockObject): 
     pass 

    class QMainWindow(QMockObject): 
     pass 

    class QTreeWidget(QMockObject): 
     pass 

    class QAbstractItemDelegate(QMockObject): 
     pass 

    class QColor(QMockObject): 
     pass 

    class QGraphicsItemGroup(QMockObject): 
     pass 

    class QGraphicsItem(QMockObject): 
     pass 

    class QGraphicsPathItem(QMockObject): 
     pass 

    class QGraphicsTextItem(QMockObject): 
     pass 

    class QGraphicsRectItem(QMockObject): 
     pass 

    class QGraphicsScene(QMockObject): 
     pass 

    class QGraphicsView(QMockObject): 
     pass 

    app = None