Merge "Fix parsing multiline ini files"
This commit is contained in:
commit
e38334ffb0
@ -21,6 +21,7 @@ except ImportError:
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import StringIO
|
||||
|
||||
class Config:
|
||||
|
||||
@ -65,7 +66,7 @@ class Config:
|
||||
EXPORT = re.compile(r"^\s*export\s+([^=^#^\s]+)\s*=\s*([^#^\n]*)\s*$",
|
||||
re.MULTILINE)
|
||||
|
||||
INI = re.compile(r"^\s*([^=#\s]+)\s*=[\t]*([^#\n]*)\s*$")
|
||||
INI = re.compile(r"^\s*([^=#\s]+)\s*=[\t]*([^#\n]*)\s*$", re.MULTILINE)
|
||||
|
||||
def osrc_parse(lines):
|
||||
"""
|
||||
@ -76,7 +77,27 @@ def osrc_parse(lines):
|
||||
return find_all(EXPORT, lines)
|
||||
|
||||
def ini_parse(lines):
|
||||
return find_all(INI, lines)
|
||||
"""
|
||||
:param lines:
|
||||
:type lines: str
|
||||
:return:
|
||||
"""
|
||||
try:
|
||||
fd = StringIO.StringIO(lines)
|
||||
parser = configparser.ConfigParser()
|
||||
parser.readfp(fd)
|
||||
return dict(parser.items('default'))
|
||||
except Exception as e:
|
||||
try:
|
||||
# TODO: Remove the parsing of ini-like file via regex
|
||||
conf = find_all(INI, lines)
|
||||
logging.warning("Using non-INI files for database configuration"
|
||||
"file is deprecated. Falling back to Regex.")
|
||||
logging.warning("INI parser error was: {}".format(str(e)))
|
||||
return conf
|
||||
except Exception:
|
||||
logging.warning("Couldn't parse non-INI config file using Regex")
|
||||
raise
|
||||
|
||||
def find_all(regex, lines):
|
||||
return dict([(k.strip(), utils.dequote(v.strip())) for k, v in
|
||||
|
@ -16,9 +16,10 @@ import unittest
|
||||
|
||||
from freezer import config
|
||||
|
||||
|
||||
class TestConfig(unittest.TestCase):
|
||||
def test_export(self):
|
||||
str = """unset OS_DOMAIN_NAME
|
||||
string = """unset OS_DOMAIN_NAME
|
||||
export OS_AUTH_URL="http://abracadabra/v3"
|
||||
export OS_PROJECT_NAME=abracadabra_project
|
||||
export OS_USERNAME=abracadabra_username
|
||||
@ -29,5 +30,43 @@ class TestConfig(unittest.TestCase):
|
||||
export OS_AUTH_VERSION=3
|
||||
export OS_CACERT=/etc/ssl/certs/ca-certificates.crt
|
||||
export OS_ENDPOINT_TYPE=internalURL"""
|
||||
res = config.osrc_parse(str)
|
||||
|
||||
res = config.osrc_parse(string)
|
||||
self.assertEqual("http://abracadabra/v3", res["OS_AUTH_URL"])
|
||||
|
||||
def test_ini_like(self):
|
||||
string = """# This is a comment line
|
||||
#
|
||||
host = 127.0.0.1
|
||||
port = 3306
|
||||
user = openstack
|
||||
password = 'aNiceQuotedPassword'
|
||||
password2 = "aNiceQuotedPassword"
|
||||
spaced = value"""
|
||||
|
||||
res = config.ini_parse(string)
|
||||
self.assertEqual('127.0.0.1', res['host'])
|
||||
self.assertEqual('openstack', res['user'])
|
||||
self.assertEqual('3306', res['port'])
|
||||
self.assertEqual('aNiceQuotedPassword', res['password'])
|
||||
self.assertEqual('aNiceQuotedPassword', res['password2'])
|
||||
self.assertEqual('value', res['spaced'])
|
||||
|
||||
def test_ini(self):
|
||||
string = """[default]
|
||||
# This is a comment line
|
||||
#
|
||||
host = 127.0.0.1
|
||||
port = 3306
|
||||
user = openstack
|
||||
password = 'aNiceQuotedPassword'
|
||||
password2 = "aNiceQuotedPassword"
|
||||
spaced = value"""
|
||||
|
||||
res = config.ini_parse(string)
|
||||
self.assertEqual('127.0.0.1', res['host'])
|
||||
self.assertEqual('openstack', res['user'])
|
||||
self.assertEqual('3306', res['port'])
|
||||
self.assertEqual('aNiceQuotedPassword', res['password'])
|
||||
self.assertEqual('aNiceQuotedPassword', res['password2'])
|
||||
self.assertEqual('value', res['spaced'])
|
||||
|
Loading…
x
Reference in New Issue
Block a user