<pre style='margin:0'>
Mohamed Akram (mohd-akram) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/5fae7f76d43a5ef97ba4c9bb89cf7b77dd864f28">https://github.com/macports/macports-ports/commit/5fae7f76d43a5ef97ba4c9bb89cf7b77dd864f28</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 5fae7f76d43 mapnik: update to 4.0.4
</span>5fae7f76d43 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 5fae7f76d43a5ef97ba4c9bb89cf7b77dd864f28
</span>Author: Mohamed Akram <makr@macports.org>
AuthorDate: Sat Dec 7 14:16:43 2024 +0400

<span style='display:block; white-space:pre;color:#404040;'>    mapnik: update to 4.0.4
</span>---
 gis/mapnik/Portfile                             |  30 ++++---
 gis/mapnik/files/patch-scons-action.py.diff     |  19 -----
 gis/mapnik/files/patch-scons-default.diff       |  11 ---
 gis/mapnik/files/patch-scons-tool-javac.py.diff |  19 -----
 gis/mapnik/files/patch-scons-util.py.diff       | 102 ------------------------
 5 files changed, 14 insertions(+), 167 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/gis/mapnik/Portfile b/gis/mapnik/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 99004a80bdf..8bc825f6131 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/gis/mapnik/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/gis/mapnik/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5,8 +5,8 @@ PortGroup           conflicts_build 1.0
</span> PortGroup           boost 1.0
 
 name                mapnik
<span style='display:block; white-space:pre;background:#ffe0e0;'>-version             3.1.0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-revision            11
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+version             4.0.4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision            0
</span> categories          gis devel
 license             LGPL-2.1
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -24,30 +24,26 @@ long_description    Mapnik is a Free Toolkit for developing mapping \
</span>                     graphics library, which offers world-class anti-aliasing \
                     rendering with subpixel accuracy for geographic data.
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-homepage            http://mapnik.org
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+homepage            https://mapnik.org
</span> master_sites        https://github.com/mapnik/mapnik/releases/download/v${version}/
 
 distname            mapnik-v${version}
 
 use_bzip2           yes
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-checksums           rmd160  ddd58a419aa6f7cf537e40ae10d369be423f18b2 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sha256  43d76182d2a975212b4ad11524c74e577576c11039fdab5286b828397d8e6261 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    size    10110740
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums           rmd160  7e5c2cb48662879ce1b8572ef84ac6153fd51c19 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    sha256  e4f564f9475088dd1d814b20b2500ab0ab073f657add56449ddb634f0f086ca7 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    size    13020826
</span> 
 # When changing `boost.version`, please update the `mod_tile` port
 # correspondingly with the same version of Boost.  Also increase the
 # `mod_tile` `revision` attribute.
 boost.version       1.76
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-set python_branch       3.11
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set python_branch       3.12
</span> set python_version      [string map {. {}} ${python_branch}]
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-patchfiles          patch-scons-action.py.diff \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    patch-scons-tool-javac.py.diff \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    patch-scons-util.py.diff \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    patch-scons-default.diff \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    patch-sconstruct.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles          patch-sconstruct.diff
</span> 
 depends_build-append \
                     port:pkgconfig \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -80,9 +76,9 @@ variant gdal description {Build GDAL/OGR plugin} {
</span> }
 
 variant postgis description {Build PostGIS plugin} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    depends_lib-append      path:lib/libpq.dylib:postgresql15
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    depends_lib-append      path:lib/libpq.dylib:postgresql17
</span>     if {![file exists ${prefix}/lib/libpq.dylib]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        configure.args-append   PG_CONFIG=${prefix}/lib/postgresql15/bin/pg_config
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.args-append   PG_CONFIG=${prefix}/lib/postgresql17/bin/pg_config
</span>     }
     lappend input_plugins postgis
 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -100,7 +96,7 @@ variant libxml2 description {Enable libxml2 support for includes and entities} {
</span> 
 default_variants +postgis
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-compiler.cxx_standard  2014
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+compiler.cxx_standard  2017
</span> 
 universal_variant   no
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -128,6 +124,8 @@ configure.args      CXX="\$CXX" \
</span>                     BOOST_INCLUDES=[boost::include_dir] \
                     BOOST_LIBS=[boost::lib_dir]
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+configure.pkg_config_path   ${prefix}/lib/proj7/lib/pkgconfig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> configure.cppflags-append \
                     -DACCEPT_USE_OF_DEPRECATED_PROJ_API_H=1
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -157,5 +155,5 @@ post-destroot {
</span> }
 
 livecheck.type      regex
<span style='display:block; white-space:pre;background:#ffe0e0;'>-livecheck.url       http://mapnik.org/pages/downloads.html
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+livecheck.url       https://mapnik.org/pages/downloads.html
</span> livecheck.regex     {mapnik-v(\d+(?:\.\d+)*)[.tz]}
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/gis/mapnik/files/patch-scons-action.py.diff b/gis/mapnik/files/patch-scons-action.py.diff
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index a0b1ededcc8..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/gis/mapnik/files/patch-scons-action.py.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,19 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- scons/scons-local-3.0.1/SCons/Action.py.orig   2023-11-15 16:08:13.000000000 +0000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ scons/scons-local-3.0.1/SCons/Action.py        2023-11-15 16:09:58.000000000 +0000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -107,6 +107,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- import subprocess
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- import itertools
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- import inspect
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+from collections import OrderedDict
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- import SCons.Debug
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- from SCons.Debug import logInstanceCreation
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1289,7 +1290,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         return result
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     def get_varlist(self, target, source, env, executor=None):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        result = SCons.Util.OrderedDict()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        result = OrderedDict()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         for act in self.list:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             for var in act.get_varlist(target, source, env, executor):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 result[var] = True
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/gis/mapnik/files/patch-scons-default.diff b/gis/mapnik/files/patch-scons-default.diff
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index b2aef79cb02..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/gis/mapnik/files/patch-scons-default.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,11 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- scons/scons-local-3.0.1/SCons/Defaults.py.orig
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ scons/scons-local-3.0.1/SCons/Defaults.py
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -210,7 +210,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 raise SyntaxError("Could not find +, - or =")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             operation_list = operation.split(operator)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            if len(operation_list) is not 2:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            if len(operation_list) != 2:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 raise SyntaxError("More than one operator found")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             user = operation_list[0].strip().replace("a", "ugo")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             permission = operation_list[1].strip()
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/gis/mapnik/files/patch-scons-tool-javac.py.diff b/gis/mapnik/files/patch-scons-tool-javac.py.diff
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 14701ac6b84..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/gis/mapnik/files/patch-scons-tool-javac.py.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,19 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- scons/scons-local-3.0.1/SCons/Tool/javac.py.orig       2023-11-15 16:08:31.000000000 +0000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ scons/scons-local-3.0.1/SCons/Tool/javac.py    2023-11-15 16:10:14.000000000 +0000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -34,6 +34,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- import os
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- import os.path
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+from collections import OrderedDict
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- import SCons.Action
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- import SCons.Builder
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -70,7 +71,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         if isinstance(entry, SCons.Node.FS.File):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             slist.append(entry)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         elif isinstance(entry, SCons.Node.FS.Dir):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            result = SCons.Util.OrderedDict()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            result = OrderedDict()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             dirnode = entry.rdir()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             def find_java_files(arg, dirpath, filenames):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 java_files = sorted([n for n in filenames
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/gis/mapnik/files/patch-scons-util.py.diff b/gis/mapnik/files/patch-scons-util.py.diff
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index f959b5b7f49..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/gis/mapnik/files/patch-scons-util.py.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,102 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- scons/scons-local-3.0.1/SCons/Util.py.orig     2023-11-15 16:08:41.000000000 +0000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ scons/scons-local-3.0.1/SCons/Util.py  2023-11-15 16:10:05.000000000 +0000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -37,21 +37,18 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- PY3 = sys.version_info[0] == 3
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    from collections import UserDict, UserList, UserString
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+except ImportError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     from UserDict import UserDict
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--except ImportError as e:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    from collections import UserDict
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     from UserList import UserList
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--except ImportError as e:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    from collections import UserList
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--from collections import Iterable
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    from UserString import UserString
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    from UserString import UserString
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--except ImportError as e:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    from collections import UserString
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    from collections.abc import Iterable
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+except ImportError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    from collections import Iterable
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+from collections import OrderedDict
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Don't "from types import ..." these because we need to get at the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # types module later to look for UnicodeType.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -63,7 +60,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- FunctionType    = types.FunctionType
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    unicode
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    _ = type(unicode)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- except NameError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     UnicodeType = str
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1034,60 +1031,6 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     def __str__(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         return ' '.join(self.data)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# A dictionary that preserves the order in which items are added.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# Submitted by David Benjamin to ActiveState's Python Cookbook web site:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#     http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# Including fixes/enhancements from the follow-on discussions.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--class OrderedDict(UserDict):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    def __init__(self, dict = None):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        self._keys = []
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        UserDict.__init__(self, dict)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    def __delitem__(self, key):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        UserDict.__delitem__(self, key)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        self._keys.remove(key)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    def __setitem__(self, key, item):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        UserDict.__setitem__(self, key, item)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        if key not in self._keys: self._keys.append(key)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    def clear(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        UserDict.clear(self)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        self._keys = []
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    def copy(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        dict = OrderedDict()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        dict.update(self)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        return dict
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    def items(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        return list(zip(self._keys, list(self.values())))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    def keys(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        return self._keys[:]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    def popitem(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            key = self._keys[-1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        except IndexError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            raise KeyError('dictionary is empty')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        val = self[key]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        del self[key]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        return (key, val)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    def setdefault(self, key, failobj = None):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        UserDict.setdefault(self, key, failobj)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        if key not in self._keys: self._keys.append(key)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    def update(self, dict):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        for (key, val) in dict.items():
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            self.__setitem__(key, val)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    def values(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        return list(map(self.get, self._keys))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- class Selector(OrderedDict):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     """A callable ordered dictionary that maps file suffixes to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     dictionary values.  We preserve the order in which items are added
</span></pre><pre style='margin:0'>

</pre>