Макет зависимости зависимости

Представьте себе следующий сценарий: у вас есть пакет Python с именем «foo», который зависит от «bar». Сам пакет 'bar' зависит от другого пакета Python, скажем, shapely, который зависит от библиотеки C, которая не может быть установлен на readthedocs.io. Таким образом, «бар» изящно издевается над

class Mock(MagicMock):
    @classmethod
    def __getattr__(cls, name):
            return MagicMock()

MOCK_MODULES = ['shapely', 'shapely.wkt', 'shapely.wkb', 'shapely.geometry', 'shapely.ops']
sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES)

в файле conf.py.

Теперь я хотел бы просто издеваться над зависимостью от «bar», но все же установить «bar» на RTD, чтобы позволить правильно построить документы «foo». Как я могу сказать readthedocs.io, чтобы он красиво смоделировал зависимость «bar»?


person gplssm    schedule 04.09.2017    source источник


Ответы (1)


Проверить для переменной окружения READTHEDOCS:

import os
if 'READTHEDOCS' in os.environ:
    class Mock(MagicMock):
        @classmethod
        def __getattr__(cls, name):
                return MagicMock()

    MOCK_MODULES = ['shapely', 'shapely.wkt', 'shapely.wkb', 'shapely.geometry', 'shapely.ops']
    sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES)
person phd    schedule 04.09.2017
comment
Спасибо за подсказку! Чтобы точнее понять. Вы бы порекомендовали добавить эту проверку для «бара» зависимостей в описанном выше сценарии? Следовательно, я бы не стал имитировать сам 'bar', но 'bar's conf.py имитирует красиво, верно? - person gplssm; 05.09.2017
comment
Это должно сработать. Вы можете проверить это локально, удалив скомпилированное расширение и передав переменную среды READTHEDOCS самостоятельно. - person phd; 05.09.2017
comment
На самом деле я не понимаю, как это проверить локально :(. Но я попытался использовать предложенный подход if 'READTHEDOCS' in os.environ: с RTD. К сожалению, это не дало никакого эффекта. Проблема по-прежнему в том, что я должен указать 'bar' как требуемую зависимость в rtd_requirements .txt, чтобы установить мой пакет на RTD. Затем «bar» запускает установку shapely, и весь процесс завершается сбоем. Я думаю, что моя проблема в том, что у меня недостаточно понимания того, как работает это издевательство. Влияет ли это на процесс установки на RTD? - person gplssm; 06.09.2017
comment
Переместите bar из requirements.txt в setup.py. Моделируйте Shapely в течение setup.py install, если обнаружено «READTHEDOCS». - person phd; 06.09.2017
comment
Спасибо за инструкции. Пока работает: на RTD не установлены 'bar' и Shapely. Но это поднимает другую проблему: теперь документы API не создаются, потому что импорт «bar» и Shapely не может быть импортирован в некоторые файлы. Поэтому я имитирую импорт, например здесь< /а>. Теперь я спрашиваю: есть ли более элегантный способ сделать это? Но это, наверное, вопрос для другой ветки... - person gplssm; 13.09.2017