2012-05-01 4 views
1

私は、Pythonアプリケーションで自動的に設定を設定する方法について考えてきました。gitブランチに基づいてPythonアプリケーションを設定する

は、私は通常のアプローチの次のタイプを使用します。私はこのような作業が好き

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 

:通常

'''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]"] 

を、私はのような何かを行うことができ、さまざまな方法でアプリケーションを実行しているときしかし、それは意味があるので、私はどうにか私はgitのワークフローにもこれを統合することができますかと思います。

私のアプリケーションの多くは、別々のスクリプト、または単独で実行できるモジュールを持っています。したがって、いくつかのルートの場所から構成を継承するモノリシックなアプリケーションは必ずしもありません。

これらのスクリプトと別々のモジュールの多くは、同じを共有するconfig.pyでクラスを探すことにより、例えば、現在チェックアウトし、それに基づいて自分のデフォルト設定の決定を行うれているもののブランチをチェックすることができればそれはクールになりますnameは現在チェックアウトされているブランチの名前です。

これは可能なのですか、それを達成する最もクリーンな方法は何ですか?

いいですか悪い考えですか?

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):

+0

すべてのブランチで異なるconfig.pyを使用してみませんか?そうすれば、コード内の設定を単純にインポートし、VCS(この場合はgit)に設定ファイル内の相違を処理させることができます。 – spinlok

答えて

1

私はspinlokの方法を好むだろう、しかし、はい、あなたは、あなたの__init__で例えばあなたが望むほとんど何でも行うことができます。 check_outputは、gitがシンボリックリファレンスを取得できない場合に例外が発生することに注意してください。これは作業ディレクトリにも依存します。もちろん、他のsubprocess関数を使用することもできます(例えば、別のcwdを提供するため)。

関連する問題