114 lines
3 KiB
Python
114 lines
3 KiB
Python
##############################################################################
|
|
#
|
|
# Copyright (c) 2002 Zope Foundation and Contributors.
|
|
#
|
|
# This software is subject to the provisions of the Zope Public License,
|
|
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
|
|
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
|
|
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
|
|
# FOR A PARTICULAR PURPOSE
|
|
#
|
|
##############################################################################
|
|
|
|
import math
|
|
import random
|
|
import string
|
|
|
|
|
|
utility_builtins = {}
|
|
|
|
|
|
class _AttributeDelegator:
|
|
def __init__(self, mod, *excludes):
|
|
"""delegate attribute lookups outside *excludes* to module *mod*."""
|
|
self.__mod = mod
|
|
self.__excludes = excludes
|
|
|
|
def __getattr__(self, attr):
|
|
if attr in self.__excludes:
|
|
raise NotImplementedError(
|
|
f"{self.__mod.__name__}.{attr} is not safe")
|
|
try:
|
|
return getattr(self.__mod, attr)
|
|
except AttributeError as e:
|
|
e.obj = self
|
|
raise
|
|
|
|
|
|
utility_builtins['string'] = _AttributeDelegator(string, "Formatter")
|
|
utility_builtins['math'] = math
|
|
utility_builtins['random'] = random
|
|
utility_builtins['whrandom'] = random
|
|
utility_builtins['set'] = set
|
|
utility_builtins['frozenset'] = frozenset
|
|
|
|
try:
|
|
import DateTime
|
|
utility_builtins['DateTime'] = DateTime.DateTime
|
|
except ImportError:
|
|
pass
|
|
|
|
|
|
def same_type(arg1, *args):
|
|
"""Compares the class or type of two or more objects."""
|
|
t = getattr(arg1, '__class__', type(arg1))
|
|
for arg in args:
|
|
if getattr(arg, '__class__', type(arg)) is not t:
|
|
return False
|
|
return True
|
|
|
|
|
|
utility_builtins['same_type'] = same_type
|
|
|
|
|
|
def test(*args):
|
|
length = len(args)
|
|
for i in range(1, length, 2):
|
|
if args[i - 1]:
|
|
return args[i]
|
|
|
|
if length % 2:
|
|
return args[-1]
|
|
|
|
|
|
utility_builtins['test'] = test
|
|
|
|
|
|
def reorder(s, with_=None, without=()):
|
|
# s, with_, and without are sequences treated as sets.
|
|
# The result is subtract(intersect(s, with_), without),
|
|
# unless with_ is None, in which case it is subtract(s, without).
|
|
if with_ is None:
|
|
with_ = s
|
|
orig = {}
|
|
for item in s:
|
|
if isinstance(item, tuple) and len(item) == 2:
|
|
key, value = item
|
|
else:
|
|
key = value = item
|
|
orig[key] = value
|
|
|
|
result = []
|
|
|
|
for item in without:
|
|
if isinstance(item, tuple) and len(item) == 2:
|
|
key, ignored = item
|
|
else:
|
|
key = item
|
|
if key in orig:
|
|
del orig[key]
|
|
|
|
for item in with_:
|
|
if isinstance(item, tuple) and len(item) == 2:
|
|
key, ignored = item
|
|
else:
|
|
key = item
|
|
if key in orig:
|
|
result.append((key, orig[key]))
|
|
del orig[key]
|
|
|
|
return result
|
|
|
|
|
|
utility_builtins['reorder'] = reorder
|