coveralls: 
[![Coverage Status](https://coveralls.io/builds/33056812/badge)](https://coveralls.io/builds/33056812)

Coverage decreased (-0.2%) to 96.055% when pulling **6ee8cecdb106ebbae4eb9ce9059b549f4207d24d on olii:master** into **d279b669443df7ada063755f3dd3f89f308cab1b on chimpler:master**.

diff --git a/pyhocon/config_parser.py b/pyhocon/config_parser.py
index 98df3ff..7c80aa6 100644
--- a/pyhocon/config_parser.py
+++ b/pyhocon/config_parser.py
@@ -6,7 +6,9 @@ import logging
 import os
 import re
 import socket
+import sys
 from datetime import timedelta
+from glob import glob
 
 from pyparsing import (Forward, Group, Keyword, Literal, Optional,
                        ParserElement, ParseSyntaxException, QuotedString,
@@ -37,6 +39,14 @@ except NameError:  # pragma: no cover
     basestring = str
     unicode = str
 
+if sys.version_info < (3, 5):
+    def glob(pathname, recursive=False):
+        if recursive and '**' in pathname:
+            import warnings
+            warnings.warn('This version of python (%s) does not support recursive import' % sys.version)
+        from glob import glob as _glob
+        return _glob(pathname)
+
 logger = logging.getLogger(__name__)
 
 #
@@ -338,13 +348,45 @@ class ConfigParser(object):
                 )
             elif file is not None:
                 path = file if basedir is None else os.path.join(basedir, file)
-                logger.debug('Loading config from file %s', path)
-                obj = ConfigFactory.parse_file(
-                    path,
-                    resolve=False,
-                    required=required,
-                    unresolved_value=NO_SUBSTITUTION
-                )
+
+                def _make_prefix(path):
+                    return ('<root>' if path is None else '[%s]' % path).ljust(55).replace('\\', '/')
+                _prefix = _make_prefix(path)
+
+                def _load(path):
+                    _prefix = _make_prefix(path)
+                    logger.debug('%s Loading config from file %r', _prefix, path)
+                    obj = ConfigFactory.parse_file(
+                        path,
+                        resolve=False,
+                        required=required,
+                        unresolved_value=NO_SUBSTITUTION
+                    )
+                    logger.debug('%s Result: %s', _prefix, obj)
+                    return obj
+
+                if '*' in path or '?' in path:
+                    paths = glob(path, recursive=True)
+                    obj = None
+
+                    def _merge(a, b):
+                        if a is None or b is None:
+                            return a or b
+                        elif isinstance(a, ConfigTree) and isinstance(b, ConfigTree):
+                            return ConfigTree.merge_configs(a, b)
+                        elif isinstance(a, list) and isinstance(b, list):
+                            return a + b
+                        else:
+                            raise ConfigException('Unable to make such include (merging unexpected types: {a} and {b}', a=type(a), b=type(b))
+                    logger.debug('%s Loading following configs: %s', _prefix, paths)
+                    for p in paths:
+                        obj = _merge(obj, _load(p))
+                    logger.debug('%s Result: %s', _prefix, obj)
+
+                else:
+                    logger.debug('%s Loading single config: %s', _prefix, path)
+                    obj = _load(path)
+
             else:
                 raise ConfigException('No file or URL specified at: {loc}: {instring}', loc=loc, instring=instring)
 
@@ -371,10 +413,15 @@ class ConfigParser(object):
             comment_no_comma_eol = (comment | eol).suppress()
             number_expr = Regex(r'[+-]?(\d*\.\d+|\d+(\.\d+)?)([eE][+\-]?\d+)?(?=$|[ \t]*([\$\}\],#\n\r]|//))',
                                 re.DOTALL).setParseAction(convert_number)
-
-            period_types = itertools.chain.from_iterable(cls.get_supported_period_type_map().values())
-            period_expr = Regex(r'(?P<value>\d+)\s*(?P<unit>' + '|'.join(period_types) + ')$'
-                                ).setParseAction(convert_period)
+            # Must be sorted from longest to shortest otherwise 'weeks' will match 'w' and 'eeks'
+            # will be parsed as a general string.
+            period_types = sorted(
+                itertools.chain.from_iterable(cls.get_supported_period_type_map().values()),
+                key=lambda x: len(x), reverse=True)
+            period_expr = Regex(
+                r'(?P<value>\d+)\s*(?P<unit>' + '|'.join(period_types) + ')$',
+                flags=re.MULTILINE,
+            ).setParseAction(convert_period)
 
             # multi line string using """
             # Using fix described in http://pyparsing.wikispaces.com/share/view/3778969
diff --git a/pyhocon/converter.py b/pyhocon/converter.py
index 6675819..404c757 100644
--- a/pyhocon/converter.py
+++ b/pyhocon/converter.py
@@ -32,10 +32,18 @@ class HOCONConverter(object):
                 lines += '{\n'
                 bet_lines = []
                 for key, item in config.items():
+                    new_key = key.strip('"')  # for dotted keys enclosed with "" to not be interpreted as nested key
+                    if isinstance(new_key, unicode):
+                        new_key = new_key.encode('utf-8')
+
+                    new_value = cls.to_json(item, compact, indent, level + 1)
+                    if isinstance(new_value, unicode):
+                        new_value = new_value.encode('utf-8')
+
                     bet_lines.append('{indent}"{key}": {value}'.format(
                         indent=''.rjust((level + 1) * indent, ' '),
-                        key=key.strip('"'),  # for dotted keys enclosed with "" to not be interpreted as nested key
-                        value=cls.to_json(item, compact, indent, level + 1))
+                        key=new_key,
+                        value=new_value)
                     )
                 lines += ',\n'.join(bet_lines)
                 lines += '\n{indent}}}'.format(indent=''.rjust(level * indent, ' '))
@@ -53,7 +61,7 @@ class HOCONConverter(object):
                 lines += ',\n'.join(bet_lines)
                 lines += '\n{indent}]'.format(indent=''.rjust(level * indent, ' '))
         elif isinstance(config, basestring):
-            lines = json.dumps(config)
+            lines = json.dumps(config, ensure_ascii=False)
         elif config is None or isinstance(config, NoneValue):
             lines = 'null'
         elif config is True:
diff --git a/samples/all_animals.conf b/samples/all_animals.conf
new file mode 100644
index 0000000..a1200e4
--- /dev/null
+++ b/samples/all_animals.conf
@@ -0,0 +1,3 @@
+animals: {
+    include "animals.d/*.conf"
+}
\ No newline at end of file
diff --git a/samples/all_bars.conf b/samples/all_bars.conf
new file mode 100644
index 0000000..70f92e4
--- /dev/null
+++ b/samples/all_bars.conf
@@ -0,0 +1,4 @@
+bars:
+[
+    include "bars.d/*.conf"
+]
diff --git a/samples/animals.conf b/samples/animals.conf
index 4d548c8..618fafa 100644
--- a/samples/animals.conf
+++ b/samples/animals.conf
@@ -1,9 +1,9 @@
 {
   cat : {
-    include "cat.conf"
+    include "animals.d/cat.conf"
   }
 
   dog: {
-    include "dog.conf"
+    include "animals.d/dog.conf"
   }
 }
diff --git a/samples/cat.conf b/samples/animals.d/cat.conf
similarity index 100%
rename from samples/cat.conf
rename to samples/animals.d/cat.conf
diff --git a/samples/dog.conf b/samples/animals.d/dog.conf
similarity index 100%
rename from samples/dog.conf
rename to samples/animals.d/dog.conf
diff --git a/samples/bars.d/bar_night_city.conf b/samples/bars.d/bar_night_city.conf
new file mode 100644
index 0000000..a5d4840
--- /dev/null
+++ b/samples/bars.d/bar_night_city.conf
@@ -0,0 +1,5 @@
+[
+    { name: "Bloody Mary", type: "cocktail" }
+    { name: "Mohito", type: "cocktail" }
+    { name: "CyberBeer", type: "beer" }
+]
diff --git a/samples/bars.d/bar_springfield.conf b/samples/bars.d/bar_springfield.conf
new file mode 100644
index 0000000..df88d3b
--- /dev/null
+++ b/samples/bars.d/bar_springfield.conf
@@ -0,0 +1,5 @@
+[
+    { name: "Bud №5", type: "beer" }
+    { name: "Bud №7", type: "beer" }
+    { name: "Homer's favorite coffee", type: "coffee" }
+]
diff --git a/samples/bars.d/cafe.conf b/samples/bars.d/cafe.conf
new file mode 100644
index 0000000..31fc27e
--- /dev/null
+++ b/samples/bars.d/cafe.conf
@@ -0,0 +1,6 @@
+[
+    { name: "Cappuccino", type: "coffee" }
+    { name: "Caffè Americano", type: "coffee" }
+    { name: "Green Tea", type: "tea" }
+    { name: "Milk 3.5%", type: "milk" }
+]

Inconsistent parsing of periods
Parsing of a period value ('5 minutes') is inconsistent and does not always work, depending on the surrounding values.

Example:

This works as expected:
```python
conf = """
foo = bar
timeout = 5 minutes
"""
ConfigFactory.parse_string(conf).timeout
```
> `datetime.timedelta(seconds=300)`

But if we switch the lines, it does not:

```python
conf = """
timeout = 5 minutes
foo = bar
"""
ConfigFactory.parse_string(conf).timeout
```
> `'5 minutes'`


Tested with Python 3.7.4, pyhocon 0.3.51, pyparsing 2.4.2
diff --git a/tests/test_config_parser.py b/tests/test_config_parser.py
index 7abc615..e3d3caa 100644
--- a/tests/test_config_parser.py
+++ b/tests/test_config_parser.py
@@ -138,6 +138,16 @@ class TestConfigParser(object):
 
         assert config['a'] == data_set[1]
 
+    def test_parse_string_with_duration_with_long_unit_name(self):
+        config = ConfigFactory.parse_string(
+            """
+            a: foo
+            b: 10 weeks
+            c: bar
+            """
+        )
+        assert config['b'] == period(weeks=10)
+
     def test_parse_with_enclosing_square_bracket(self):
         config = ConfigFactory.parse_string("[1, 2, 3]")
         assert config == [1, 2, 3]
@@ -660,7 +670,7 @@ class TestConfigParser(object):
     def test_substitution_list_with_append(self):
         config = ConfigFactory.parse_string(
             """
-            application.foo = 128m
+            application.foo = 128mm
             application.large-jvm-opts = ["-XX:+UseParNewGC"] [-Xm16g, ${application.foo}]
             application.large-jvm-opts2 = [-Xm16g, ${application.foo}] ["-XX:+UseParNewGC"]
             """)
@@ -668,19 +678,19 @@ class TestConfigParser(object):
         assert config["application.large-jvm-opts"] == [
             '-XX:+UseParNewGC',
             '-Xm16g',
-            '128m'
+            '128mm'
         ]
 
         assert config["application.large-jvm-opts2"] == [
             '-Xm16g',
-            '128m',
+            '128mm',
             '-XX:+UseParNewGC',
         ]
 
     def test_substitution_list_with_append_substitution(self):
         config = ConfigFactory.parse_string(
             """
-            application.foo = 128m
+            application.foo = 128mm
             application.default-jvm-opts = ["-XX:+UseParNewGC"]
             application.large-jvm-opts = ${application.default-jvm-opts} [-Xm16g, ${application.foo}]
             application.large-jvm-opts2 = [-Xm16g, ${application.foo}] ${application.default-jvm-opts}
@@ -689,12 +699,12 @@ class TestConfigParser(object):
         assert config["application.large-jvm-opts"] == [
             '-XX:+UseParNewGC',
             '-Xm16g',
-            '128m'
+            '128mm'
         ]
 
         assert config["application.large-jvm-opts2"] == [
             '-Xm16g',
-            '128m',
+            '128mm',
             '-XX:+UseParNewGC'
         ]
 
@@ -1066,6 +1076,19 @@ class TestConfigParser(object):
         assert config.get('cat.garfield.say') == 'meow'
         assert config.get('dog.mutt.hates.garfield.say') == 'meow'
 
+    def test_include_glob_dict_from_samples(self):
+        config = ConfigFactory.parse_file("samples/all_animals.conf")
+        assert config.get('animals.garfield.say') == 'meow'
+        assert config.get('animals.mutt.hates.garfield.say') == 'meow'
+
+    def test_include_glob_list_from_samples(self):
+        config = ConfigFactory.parse_file("samples/all_bars.conf")
+        bars = config.get_list('bars')
+        assert len(bars) == 10
+        assert bars[0].get('name') == 'Bloody Mary'
+        assert bars[5].get('name') == 'Homer\'s favorite coffee'
+        assert bars[9].get('type') == 'milk'
+
     def test_list_of_dicts(self):
         config = ConfigFactory.parse_string(
             """
@@ -1203,7 +1226,7 @@ class TestConfigParser(object):
         config = ConfigFactory.parse_string(
             """
             a {
-                include required("samples/cat.conf")
+                include required("samples/animals.d/cat.conf")
                 t = 2
             }
             """
@@ -1221,7 +1244,7 @@ class TestConfigParser(object):
         config2 = ConfigFactory.parse_string(
             """
             a {
-                include required(file("samples/cat.conf"))
+                include required(file("samples/animals.d/cat.conf"))
                 t = 2
             }
             """

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest mock
apt-get update apt-get install -y gcc
3.7
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
aadict==0.2.3
asset==0.6.13
certifi @ file:///croot/certifi_1671487769961/work/certifi
exceptiongroup==1.2.2
globre==0.1.5
importlib-metadata==6.7.0
iniconfig==2.0.0
mock==5.2.0
packaging==24.0
pluggy==1.2.0
-e git+https://github.com/chimpler/pyhocon.git@d279b669443df7ada063755f3dd3f89f308cab1b#egg=pyhocon
pyparsing==3.1.4
pytest==7.4.4
six==1.17.0
tomli==2.0.1
typing_extensions==4.7.1
zipp==3.15.0

name: pyhocon
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - aadict==0.2.3
      - asset==0.6.13
      - exceptiongroup==1.2.2
      - globre==0.1.5
      - importlib-metadata==6.7.0
      - iniconfig==2.0.0
      - mock==5.2.0
      - packaging==24.0
      - pluggy==1.2.0
      - pyparsing==3.1.4
      - pytest==7.4.4
      - six==1.17.0
      - tomli==2.0.1
      - typing-extensions==4.7.1
      - zipp==3.15.0
prefix: /opt/conda/envs/pyhocon

tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration_with_long_unit_name tests/test_config_parser.py::TestConfigParser::test_include_glob_dict_from_samples tests/test_config_parser.py::TestConfigParser::test_include_required_file
tests/test_config_parser.py::TestConfigParser::test_include_glob_list_from_samples
tests/test_config_parser.py::TestConfigParser::test_parse_simple_value tests/test_config_parser.py::TestConfigParser::test_fail_parse_forbidden_characters[+] tests/test_config_parser.py::TestConfigParser::test_fail_parse_forbidden_characters[`] tests/test_config_parser.py::TestConfigParser::test_fail_parse_forbidden_characters[^] tests/test_config_parser.py::TestConfigParser::test_fail_parse_forbidden_characters[?] tests/test_config_parser.py::TestConfigParser::test_fail_parse_forbidden_characters[!] tests/test_config_parser.py::TestConfigParser::test_fail_parse_forbidden_characters[@] tests/test_config_parser.py::TestConfigParser::test_fail_parse_forbidden_characters[*] tests/test_config_parser.py::TestConfigParser::test_fail_parse_forbidden_characters[&] tests/test_config_parser.py::TestConfigParser::test_fail_parse_forbidden_characters_in_context[$] tests/test_config_parser.py::TestConfigParser::test_fail_parse_forbidden_characters_in_context["] tests/test_config_parser.py::TestConfigParser::test_parse_forbidden_characters_quoted[+] tests/test_config_parser.py::TestConfigParser::test_parse_forbidden_characters_quoted[`] tests/test_config_parser.py::TestConfigParser::test_parse_forbidden_characters_quoted[^] tests/test_config_parser.py::TestConfigParser::test_parse_forbidden_characters_quoted[?] tests/test_config_parser.py::TestConfigParser::test_parse_forbidden_characters_quoted[!] tests/test_config_parser.py::TestConfigParser::test_parse_forbidden_characters_quoted[@] tests/test_config_parser.py::TestConfigParser::test_parse_forbidden_characters_quoted[*] tests/test_config_parser.py::TestConfigParser::test_parse_forbidden_characters_quoted[&] tests/test_config_parser.py::TestConfigParser::test_parse_with_enclosing_brace tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set0] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set1] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set2] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set3] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set4] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set5] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set6] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set7] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set8] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set9] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set10] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set11] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set12] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set13] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set14] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set15] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set16] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set17] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set18] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set19] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set20] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set21] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set22] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set23] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set24] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set25] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set26] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set27] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set28] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set29] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set30] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set31] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set32] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set33] tests/test_config_parser.py::TestConfigParser::test_parse_string_with_duration[data_set34] tests/test_config_parser.py::TestConfigParser::test_parse_with_enclosing_square_bracket tests/test_config_parser.py::TestConfigParser::test_quoted_key_with_dots tests/test_config_parser.py::TestConfigParser::test_dotted_notation_merge tests/test_config_parser.py::TestConfigParser::test_comma_to_separate_expr tests/test_config_parser.py::TestConfigParser::test_dict_merge tests/test_config_parser.py::TestConfigParser::test_parse_with_comments tests/test_config_parser.py::TestConfigParser::test_missing_config tests/test_config_parser.py::TestConfigParser::test_parse_null tests/test_config_parser.py::TestConfigParser::test_parse_override tests/test_config_parser.py::TestConfigParser::test_concat_dict tests/test_config_parser.py::TestConfigParser::test_concat_string tests/test_config_parser.py::TestConfigParser::test_concat_list tests/test_config_parser.py::TestConfigParser::test_bad_concat tests/test_config_parser.py::TestConfigParser::test_string_substitutions tests/test_config_parser.py::TestConfigParser::test_string_substitutions_with_no_space tests/test_config_parser.py::TestConfigParser::test_int_substitutions tests/test_config_parser.py::TestConfigParser::test_cascade_string_substitutions tests/test_config_parser.py::TestConfigParser::test_multiple_substitutions tests/test_config_parser.py::TestConfigParser::test_dict_substitutions tests/test_config_parser.py::TestConfigParser::test_dos_chars_with_unquoted_string_noeol tests/test_config_parser.py::TestConfigParser::test_dos_chars_with_quoted_string_noeol tests/test_config_parser.py::TestConfigParser::test_dos_chars_with_triple_quoted_string_noeol tests/test_config_parser.py::TestConfigParser::test_dos_chars_with_int_noeol tests/test_config_parser.py::TestConfigParser::test_dos_chars_with_float_noeol tests/test_config_parser.py::TestConfigParser::test_list_substitutions tests/test_config_parser.py::TestConfigParser::test_list_element_substitution tests/test_config_parser.py::TestConfigParser::test_substitution_list_with_append tests/test_config_parser.py::TestConfigParser::test_substitution_list_with_append_substitution tests/test_config_parser.py::TestConfigParser::test_non_existent_substitution tests/test_config_parser.py::TestConfigParser::test_non_compatible_substitution tests/test_config_parser.py::TestConfigParser::test_self_ref_substitution_array tests/test_config_parser.py::TestConfigParser::test_self_append_array tests/test_config_parser.py::TestConfigParser::test_self_append_string tests/test_config_parser.py::TestConfigParser::test_self_append_non_existent_string tests/test_config_parser.py::TestConfigParser::test_self_append_nonexistent_array tests/test_config_parser.py::TestConfigParser::test_self_append_object tests/test_config_parser.py::TestConfigParser::test_self_append_nonexistent_object tests/test_config_parser.py::TestConfigParser::test_self_ref_substitution_array_to_dict tests/test_config_parser.py::TestConfigParser::test_self_ref_substitiotion_dict_in_array tests/test_config_parser.py::TestConfigParser::test_self_ref_substitution_dict_path tests/test_config_parser.py::TestConfigParser::test_self_ref_substitution_dict_path_hide tests/test_config_parser.py::TestConfigParser::test_self_ref_substitution_dict_recurse tests/test_config_parser.py::TestConfigParser::test_self_ref_substitution_dict_recurse2 tests/test_config_parser.py::TestConfigParser::test_self_ref_substitution_dict_merge tests/test_config_parser.py::TestConfigParser::test_self_ref_substitution_dict_otherfield tests/test_config_parser.py::TestConfigParser::test_self_ref_substitution_dict_otherfield_merged_in tests/test_config_parser.py::TestConfigParser::test_self_ref_substitution_dict_otherfield_merged_in_mutual tests/test_config_parser.py::TestConfigParser::test_self_ref_substitution_string_opt_concat tests/test_config_parser.py::TestConfigParser::test_self_ref_substitution_dict_recurse_part tests/test_config_parser.py::TestConfigParser::test_self_ref_substitution_object tests/test_config_parser.py::TestConfigParser::test_self_ref_child tests/test_config_parser.py::TestConfigParser::test_concat_multi_line_string tests/test_config_parser.py::TestConfigParser::test_concat_multi_line_list tests/test_config_parser.py::TestConfigParser::test_concat_multi_line_dict tests/test_config_parser.py::TestConfigParser::test_parse_URL_from_samples tests/test_config_parser.py::TestConfigParser::test_parse_URL_from_invalid tests/test_config_parser.py::TestConfigParser::test_include_dict_from_samples tests/test_config_parser.py::TestConfigParser::test_list_of_dicts tests/test_config_parser.py::TestConfigParser::test_list_of_lists tests/test_config_parser.py::TestConfigParser::test_list_of_dicts_with_merge tests/test_config_parser.py::TestConfigParser::test_list_of_lists_with_merge tests/test_config_parser.py::TestConfigParser::test_invalid_assignment tests/test_config_parser.py::TestConfigParser::test_invalid_dict tests/test_config_parser.py::TestConfigParser::test_include_file tests/test_config_parser.py::TestConfigParser::test_include_missing_file tests/test_config_parser.py::TestConfigParser::test_include_missing_required_file tests/test_config_parser.py::TestConfigParser::test_include_asset_file tests/test_config_parser.py::TestConfigParser::test_include_dict tests/test_config_parser.py::TestConfigParser::test_include_substitution tests/test_config_parser.py::TestConfigParser::test_var_with_include_keyword tests/test_config_parser.py::TestConfigParser::test_substitution_override tests/test_config_parser.py::TestConfigParser::test_substitution_flat_override tests/test_config_parser.py::TestConfigParser::test_substitution_nested_override tests/test_config_parser.py::TestConfigParser::test_optional_with_merge tests/test_config_parser.py::TestConfigParser::test_fallback_with_resolve tests/test_config_parser.py::TestConfigParser::test_optional_substitution tests/test_config_parser.py::TestConfigParser::test_cascade_optional_substitution tests/test_config_parser.py::TestConfigParser::test_substitution_cycle tests/test_config_parser.py::TestConfigParser::test_assign_number_with_eol tests/test_config_parser.py::TestConfigParser::test_assign_int tests/test_config_parser.py::TestConfigParser::test_assign_float tests/test_config_parser.py::TestConfigParser::test_sci_real tests/test_config_parser.py::TestConfigParser::test_assign_strings_with_eol tests/test_config_parser.py::TestConfigParser::test_assign_list_numbers_with_eol tests/test_config_parser.py::TestConfigParser::test_assign_list_strings_with_eol tests/test_config_parser.py::TestConfigParser::test_assign_dict_strings_with_equal_sign_with_eol tests/test_config_parser.py::TestConfigParser::test_assign_dict_strings_no_equal_sign_with_eol tests/test_config_parser.py::TestConfigParser::test_substitutions_overwrite tests/test_config_parser.py::TestConfigParser::test_fallback_substitutions_overwrite tests/test_config_parser.py::TestConfigParser::test_fallback_substitutions_overwrite_file tests/test_config_parser.py::TestConfigParser::test_fallback_self_ref_substitutions_append tests/test_config_parser.py::TestConfigParser::test_fallback_self_ref_substitutions_append_plus_equals tests/test_config_parser.py::TestConfigParser::test_self_merge_ref_substitutions_object tests/test_config_parser.py::TestConfigParser::test_self_merge_ref_substitutions_object2 tests/test_config_parser.py::TestConfigParser::test_self_merge_ref_substitutions_object3 tests/test_config_parser.py::TestConfigParser::test_fallback_self_ref_substitutions_merge tests/test_config_parser.py::TestConfigParser::test_fallback_self_ref_substitutions_concat_string tests/test_config_parser.py::TestConfigParser::test_fallback_non_root tests/test_config_parser.py::TestConfigParser::test_object_field_substitution tests/test_config_parser.py::TestConfigParser::test_one_line_quote_escape tests/test_config_parser.py::TestConfigParser::test_multi_line_escape tests/test_config_parser.py::TestConfigParser::test_multiline_with_backslash tests/test_config_parser.py::TestConfigParser::test_from_dict_with_dict tests/test_config_parser.py::TestConfigParser::test_from_dict_with_ordered_dict tests/test_config_parser.py::TestConfigParser::test_from_dict_with_nested_dict tests/test_config_parser.py::TestConfigParser::test_object_concat tests/test_config_parser.py::TestConfigParser::test_issue_75 tests/test_config_parser.py::TestConfigParser::test_plain_ordered_dict tests/test_config_parser.py::TestConfigParser::test_quoted_strings_with_ws tests/test_config_parser.py::TestConfigParser::test_unquoted_strings_with_ws tests/test_config_parser.py::TestConfigParser::test_quoted_unquoted_strings_with_ws tests/test_config_parser.py::TestConfigParser::test_quoted_unquoted_strings_with_ws_substitutions tests/test_config_parser.py::TestConfigParser::test_complex_substitutions tests/test_config_parser.py::TestConfigParser::test_assign_next_line tests/test_config_parser.py::TestConfigParser::test_string_from_environment tests/test_config_parser.py::TestConfigParser::test_string_from_environment_self_ref tests/test_config_parser.py::TestConfigParser::test_string_from_environment_self_ref_optional tests/test_config_parser.py::TestConfigParser::test_bool_from_environment tests/test_config_parser.py::TestConfigParser::test_int_from_environment tests/test_config_parser.py::TestConfigParser::test_unicode_dict_key tests/test_config_parser.py::TestConfigParser::test_with_comment_on_last_line tests/test_config_parser.py::TestConfigParser::test_triple_quotes_same_line tests/test_config_parser.py::TestConfigParser::test_pop tests/test_config_parser.py::TestConfigParser::test_merge_overriden tests/test_config_parser.py::TestConfigParser::test_attr_syntax tests/test_config_parser.py::TestConfigParser::test_escape_quote tests/test_config_parser.py::TestConfigParser::test_escape_quote_complex tests/test_config_parser.py::TestConfigParser::test_keys_with_slash tests/test_config_parser.py::TestConfigParser::test_mutation_values tests/test_config_parser.py::TestConfigParser::test_escape_sequences_json_equivalence
samples/dog.conf pyhocon/config_parser.py samples/all_bars.conf samples/bars.d/bar_night_city.conf samples/animals.conf samples/bars.d/bar_springfield.conf samples/cat.conf pyhocon/converter.py samples/all_animals.conf samples/bars.d/cafe.conf
samples/animals.d/dog.conf samples/animals.d/cat.conf pyhocon/config_parser.py samples/all_bars.conf samples/bars.d/bar_night_city.conf samples/animals.conf samples/bars.d/bar_springfield.conf pyhocon/converter.py samples/all_animals.conf samples/bars.d/cafe.conf