Настройка Python-приложения на основе ветки git

1

Я думал о способах автоматической настройки конфигурации в моих приложениях Python.

Обычно я использую следующий подход:

'''config.py'''
class Config(object):
    MAGIC_NUMBER = 44
    DEBUG = True

class Development(Config):
    LOG_LEVEL = 'DEBUG'

class Production(Config):
    DEBUG = False
    REPORT_EMAIL_TO = ["[email protected]", "[email protected]"]

Как правило, когда я запускаю приложение по-разному, я мог бы сделать что-то вроде:

from config import Development, Production

do_something():
    if self.conf.DEBUG:
       pass

def __init__(self, config='Development'):
    if config == "production":
        self.conf = Production
    else:
        self.conf = Development

Мне нравится работать так, потому что это имеет смысл, однако мне интересно, могу ли я как-то интегрировать это в свой рабочий поток git.

У многих моих приложений есть отдельные сценарии или модули, которые можно запускать самостоятельно, поэтому не всегда есть монолитное приложение для наследования конфигураций из некоторого корневого местоположения.

Было бы здорово, если бы многие из этих скриптов и отдельных модулей могли проверять, какая ветка в данный момент проверена, и принимать решения по умолчанию на основе этого, например, путем поиска класса в config.py который имеет то же имя, что и имя текущей проверенной ветки.

Возможно ли это, и какой самый чистый способ достичь этого?

Это хорошая/плохая идея?

  • 0
    Почему бы не иметь разные config.py в каждой ветке? Таким образом, вы просто импортируете конфигурацию в свой код и позволяете VCS (в данном случае git) позаботиться о любых расхождениях в файле конфигурации.
Теги:
configuration

1 ответ

1
Лучший ответ

Я бы предпочел метод spinlok, но да, вы можете сделать почти все, что захотите, в своем __init__, например:

import inspect, subprocess, sys

def __init__(self, config='via_git'):
    if config == 'via_git':
        gitsays = subprocess.check_output(['git', 'symbolic-ref', 'HEAD'])
        cbranch = gitsays.rstrip('\n').replace('refs/heads/', '', 1)
        # now you know which branch you're on...
        tbranch = cbranch.title() # foo -> Foo, for class name conventions
        classes = dict(inspect.getmembers(sys.modules[__name__], inspect.isclass)
        if tbranch in classes:
            print 'automatically using', tbranch
            self.conf = classes[tbranch]
        else:
            print 'on branch', cbranch, 'so falling back to Production'
            self.conf = Production
    elif config == 'production':
        self.conf = Production
    else:
        self.conf = Development

Это, гм, "слегка протестировано" (python 2.7). Обратите внимание, что check_output исключение, если git не может получить символический ref, и это также зависит от вашего рабочего каталога. Разумеется, вы можете использовать другие функции subprocess (например, для создания другого cwd).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню