Browse Source

Fix configuration via file and module

sh4nks 8 years ago
parent
commit
cff2ba3ecb
2 changed files with 22 additions and 10 deletions
  1. 2 5
      flaskbb/app.py
  2. 20 5
      flaskbb/cli/commands.py

+ 2 - 5
flaskbb/app.py

@@ -18,7 +18,6 @@ from sqlalchemy.engine import Engine
 from flask import Flask, request
 from flask_login import current_user
 
-from flaskbb._compat import string_types
 # views
 from flaskbb.user.views import user
 from flaskbb.message.views import message
@@ -65,10 +64,8 @@ def create_app(config=None):
     # Use the default config and override it afterwards
     app.config.from_object('flaskbb.configs.default.DefaultConfig')
 
-    if isinstance(config, string_types):
-        # config has to be of type string (str, unicode) in order
-        # to be recognized as file
-        app.config.from_pyfile(config)
+    if config is not None and os.path.exists(os.path.abspath(config)):
+        app.config.from_pyfile(os.path.abspath(config))
     else:
         # try to update the config from the object
         app.config.from_object(config)

+ 20 - 5
flaskbb/cli/commands.py

@@ -22,7 +22,7 @@ import shutil
 import requests
 
 import click
-from werkzeug.utils import import_string
+from werkzeug.utils import import_string, ImportStringError
 from flask import current_app, __version__ as flask_version
 from flask.cli import FlaskGroup, ScriptInfo, with_appcontext
 from sqlalchemy.exc import IntegrityError
@@ -144,10 +144,25 @@ def get_version(ctx, param, value):
     ctx.exit()
 
 
-def createapp(script_info):
-    config_file = getattr(script_info, 'config_file')
+def make_app(script_info):
+    config_file = getattr(script_info, "config_file")
     if config_file is not None:
-        click.secho('[+] Using config: {}'.format(config_file), fg="cyan")
+        # check if config file exists
+        if os.path.exists(os.path.abspath(config_file)):
+            click.secho("[+] Using config from: {}".format(
+                        os.path.abspath(config_file)), fg="cyan")
+        # config file doesn't exist, maybe it's a module
+        else:
+            try:
+                import_string(config_file)
+                click.secho("[+] Using config from: {}".format(config_file),
+                            fg="cyan")
+            except ImportStringError:
+                click.secho("[~] Config '{}' doesn't exist. "
+                            "Using default config.".format(config_file),
+                            fg="red")
+                config_file = None
+
     return create_app(config_file)
 
 
@@ -156,7 +171,7 @@ def set_config(ctx, param, value):
     ctx.ensure_object(ScriptInfo).config_file = value
 
 
-@click.group(cls=FlaskGroup, create_app=createapp)
+@click.group(cls=FlaskGroup, create_app=make_app)
 @click.option("--version", expose_value=False, callback=get_version,
               is_flag=True, is_eager=True, help="Show the FlaskBB version.")
 @click.option("--config", expose_value=False, callback=set_config,