Skip to content

/ Zope / gocept svn checkins / Archive / 2008 / 2008-11 / SVN: r7100 - in gocept.infrastructure/feature_systemupgrade/util/fixes: . lib lib/tests lib/tests/db lib/tests/db_empty

[ << ] [ >> ]

[ SVN: r7099 - in gocept.infrastructure/testing: . ... ] [ SVN: r7106 - pycountry/trunk/src/pycountry / ... ]

SVN: r7100 - in gocept.infrastructure/feature_systemupgrade/util/fixes: . lib lib/tests lib/tests/db lib/tests/db_empty
Christian Kauhaus <kc(at)gocept.com>
2008-11-28 13:16:10 [ FULL ]
Author: ckauhaus
Date: Fri Nov 28 13:16:08 2008
New Revision: 7100

Log:
Basic list functionality; infer fix name from file name.


Added:
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/one.py
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db_empty/
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/test_fix.py
  (contents, props changed)
      - copied, changed from r7097,
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/test_fix.py
Removed:
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/test_fix.py
Modified:
   gocept.infrastructure/feature_systemupgrade/util/fixes/fix
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py

Modified: gocept.infrastructure/feature_systemupgrade/util/fixes/fix
==============================================================================
--- gocept.infrastructure/feature_systemupgrade/util/fixes/fix	(original)
+++ gocept.infrastructure/feature_systemupgrade/util/fixes/fix	Fri Nov 28
13:16:08 2008
(at)(at) -1,5 +1,4 (at)(at)
-#!/usr/bin/env python
+#!/bin/env python
 # Copyright (c) 2008 gocept gmbh & co. kg
 # See also LICENSE.txt
 
-print "fertig"

Modified: gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py
==============================================================================
---
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py	(original)
+++ gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py	Fri Nov
28 13:16:08 2008
(at)(at) -1,11 +1,28 (at)(at)
 # Copyright (c) 2008 gocept gmbh & co. kg
 # See also LICENSE.txt
 
+import os
+import glob
+
+
+DEFAULT_DBDIR = os.path.join(os.path.dirname(__file__), '..', 'db')
+
+
 class Fixer(object):
     """Fixer allows to list pending fixes and to apply them."""
 
+    def __init__(self, dir=DEFAULT_DBDIR):
+        self.dir = dir
+        self.fixes = {}
+        for file in glob.glob(os.path.join(self.dir, '*.py')):
+            locals = {}
+            execfile(file, {}, locals)
+            assert 'Fix' in locals
+            fixname = os.path.splitext(os.path.basename(file))[0]
+            self.fixes[fixname] = locals['Fix']
+
     def list(self):
-        pass
+        return self.fixes.keys()
 
     def apply(self):
         pass

Added:
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/one.py
==============================================================================
--- (empty file)
+++
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/one.py	Fri
Nov 28 13:16:08 2008
(at)(at) -0,0 +1,6 (at)(at)
+# Copyright (c) 2008 gocept gmbh & co. kg
+# See also LICENSE.txt
+
+class Fix(object):
+
+    pass

Copied:
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/test_fix.py
(from r7097,
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/test_fix.py)
==============================================================================
---
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/test_fix.py	(original)
+++
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/test_fix.py	Fri
Nov 28 13:16:08 2008
(at)(at) -1,6 +1,7 (at)(at)
 # Copyright (c) 2008 gocept gmbh & co. kg
 # See also LICENSE.txt
 
+import os.path
 import unittest
 
 import fix
(at)(at) -8,9 +9,15 (at)(at)
 
 class TestFixer(unittest.TestCase):
 
-    def test_list(self):
-        fixer = fix.Fixer()
-        self.assertEquals(None, fixer.list())
+    base = os.path.dirname(__file__)
+
+    def test_list_empty_db(self):
+        fixer = fix.Fixer(os.path.join(self.base, 'db_empty'))
+        self.assertEquals([], fixer.list())
+
+    def test_list_db(self):
+        fixer = fix.Fixer(os.path.join(self.base, 'db'))
+        self.assertEquals(['one'], fixer.list())
 
 
 unittest.main()

SVN: r7101 - in gocept.infrastructure/feature_systemupgrade/util/fixes/lib: . tests tests/db tests/db_broken
Christian Kauhaus <kc(at)gocept.com>
2008-11-28 13:58:03 [ FULL ]
Author: ckauhaus
Date: Fri Nov 28 13:58:01 2008
New Revision: 7101

Log:
Multiple fixes per file; added test with defective database containing empty
files.


Added:
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fixapi.py
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/two.py
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db_broken/
  
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db_broken/empty.py
Modified:
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/one.py
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/test_fix.py

Modified: gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py
==============================================================================
---
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py	(original)
+++ gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py	Fri Nov
28 13:58:01 2008
(at)(at) -1,8 +1,11 (at)(at)
 # Copyright (c) 2008 gocept gmbh & co. kg
 # See also LICENSE.txt
 
-import os
 import glob
+import inspect
+import os
+
+import fixapi
 
 
 DEFAULT_DBDIR = os.path.join(os.path.dirname(__file__), '..', 'db')
(at)(at) -13,16 +16,28 (at)(at)
 
     def __init__(self, dir=DEFAULT_DBDIR):
         self.dir = dir
+        self.load_fixes()
+
+    def load_fixes(self):
         self.fixes = {}
         for file in glob.glob(os.path.join(self.dir, '*.py')):
             locals = {}
             execfile(file, {}, locals)
-            assert 'Fix' in locals
-            fixname = os.path.splitext(os.path.basename(file))[0]
-            self.fixes[fixname] = locals['Fix']
+            for fixname, fix in locals.items():
+                if inspect.isclass(fix) and issubclass(fix, fixapi.Fix):
+                    locals[fixname] = fix()
+                else:
+                    del locals[fixname]
+            if not locals:
+                raise RuntimeError("no fix found in file '%s'" % file)
+            filename = os.path.splitext(os.path.basename(file))[0]
+            for fixname, fix in locals.items():
+                if not fix.is_pending():
+                    continue
+                self.fixes['%s.%s' % (filename, fixname)] = fix
 
     def list(self):
-        return self.fixes.keys()
+        return sorted(self.fixes.keys())
 
     def apply(self):
         pass

Added: gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fixapi.py
==============================================================================
--- (empty file)
+++ gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fixapi.py	Fri
Nov 28 13:58:01 2008
(at)(at) -0,0 +1,5 (at)(at)
+# Copyright (c) 2008 gocept gmbh & co. kg
+# See also LICENSE.txt
+
+class Fix(object):
+    """Abstract base class of all fixes."""

Modified:
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/one.py
==============================================================================
---
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/one.py	(original)
+++
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/one.py	Fri
Nov 28 13:58:01 2008
(at)(at) -1,6 +1,10 (at)(at)
 # Copyright (c) 2008 gocept gmbh & co. kg
 # See also LICENSE.txt
 
-class Fix(object):
+import fixapi
 
-    pass
+
+class One(fixapi.Fix):
+
+    def is_pending(self):
+        return True

Added:
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/two.py
==============================================================================
--- (empty file)
+++
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/two.py	Fri
Nov 28 13:58:01 2008
(at)(at) -0,0 +1,16 (at)(at)
+# Copyright (c) 2008 gocept gmbh & co. kg
+# See also LICENSE.txt
+
+import fixapi
+
+
+class Two_ignored(fixapi.Fix):
+
+    def is_pending(self):
+        return False
+
+
+class Two(fixapi.Fix):
+
+    def is_pending(self):
+        return True

Added:
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db_broken/empty.py
==============================================================================
--- (empty file)
+++
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db_broken/empty.py	Fri
Nov 28 13:58:01 2008
(at)(at) -0,0 +1,6 (at)(at)
+# Copyright (c) 2008 gocept gmbh & co. kg
+# See also LICENSE.txt
+
+import fixapi
+
+# intentionally left blank

Modified:
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/test_fix.py
==============================================================================
---
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/test_fix.py	(original)
+++
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/test_fix.py	Fri
Nov 28 13:58:01 2008
(at)(at) -7,17 +7,22 (at)(at)
 import fix
 
 
-class TestFixer(unittest.TestCase):
+class FixerTest(unittest.TestCase):
 
     base = os.path.dirname(__file__)
 
+    def test_list_db(self):
+        fixer = fix.Fixer(os.path.join(self.base, 'db'))
+        self.assertEquals(['one.One', 'two.Two'], fixer.list())
+
     def test_list_empty_db(self):
         fixer = fix.Fixer(os.path.join(self.base, 'db_empty'))
         self.assertEquals([], fixer.list())
 
-    def test_list_db(self):
-        fixer = fix.Fixer(os.path.join(self.base, 'db'))
-        self.assertEquals(['one'], fixer.list())
+    def test_list_broken_db(self):
+        self.assertRaises(
+            RuntimeError,
+            lambda: fix.Fixer(os.path.join(self.base, 'db_broken')))
 
 
 unittest.main()

SVN: r7104 - in gocept.infrastructure/feature_systemupgrade/util/fixes: . db lib lib/tests lib/tests/db lib/tests/db_failing lib/tests/db_non_converging
Christian Kauhaus <kc(at)gocept.com>
2008-11-28 14:59:55 [ FULL ]
Author: ckauhaus
Date: Fri Nov 28 14:59:53 2008
New Revision: 7104

Log:
Apply fixes. apply() re-runs until there are no pending fixes left or no
progress is being made.


Added:
   gocept.infrastructure/feature_systemupgrade/util/fixes/check   (contents,
props changed)
   gocept.infrastructure/feature_systemupgrade/util/fixes/db/
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db_failing/
  
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db_failing/fix.py
  
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db_non_converging/
  
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db_non_converging/fix.py
Modified:
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/one.py
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/two.py
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/test_fix.py

Added: gocept.infrastructure/feature_systemupgrade/util/fixes/check
==============================================================================
--- (empty file)
+++ gocept.infrastructure/feature_systemupgrade/util/fixes/check	Fri Nov 28
14:59:53 2008
(at)(at) -0,0 +1,20 (at)(at)
+#!/bin/env python
+# Copyright (c) 2008 gocept gmbh & co. kg
+# See also LICENSE.txt
+
+import sys
+import os.path
+
+base = os.path.dirname(__file__)
+sys.path.append(os.path.join(base, 'lib'))
+import fix
+
+
+fixer = fix.Fixer(os.path.join(base, 'db'))
+fixes = fixer.list()
+
+for fix in fixes:
+    print fix
+
+if fixes:
+    sys.exit(2)

Modified: gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py
==============================================================================
---
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py	(original)
+++ gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py	Fri Nov
28 14:59:53 2008
(at)(at) -8,18 +8,29 (at)(at)
 import fixapi
 
 
-DEFAULT_DBDIR = os.path.join(os.path.dirname(__file__), '..', 'db')
-
-
 class Fixer(object):
     """Fixer allows to list pending fixes and to apply them."""
 
-    def __init__(self, dir=DEFAULT_DBDIR):
-        self.dir = dir
-        self.load_fixes()
+    def __init__(self, dbdir):
+        self.dir = dbdir
+        self._load_fixes()
 
-    def load_fixes(self):
-        self.fixes = {}
+    def list(self):
+        return sorted(fix.__name__ for fix in self._list_pending())
+
+    def apply(self):
+        pending = self._list_pending()
+        while pending:
+            for fix in pending:
+                fix.apply()
+            new_pending = self._list_pending()
+            if new_pending == pending:
+                # no progress
+                break
+            pending = new_pending
+
+    def _load_fixes(self):
+        self.fixes = set()
         for file in glob.glob(os.path.join(self.dir, '*.py')):
             locals = {}
             execfile(file, {}, locals)
(at)(at) -32,12 +43,8 (at)(at)
                 raise RuntimeError("no fix found in file '%s'" % file)
             filename = os.path.splitext(os.path.basename(file))[0]
             for fixname, fix in locals.items():
-                if not fix.is_pending():
-                    continue
-                self.fixes['%s.%s' % (filename, fixname)] = fix
-
-    def list(self):
-        return sorted(self.fixes.keys())
+                fix.__name__ = '%s.%s' % (filename, fixname)
+                self.fixes.add(fix)
 
-    def apply(self):
-        pass
+    def _list_pending(self):
+        return set(fix for fix in self.fixes if fix.is_pending())

Modified:
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/one.py
==============================================================================
---
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/one.py	(original)
+++
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/one.py	Fri
Nov 28 14:59:53 2008
(at)(at) -4,7 +4,12 (at)(at)
 import fixapi
 
 
-class One(fixapi.Fix):
+class RunTwice(fixapi.Fix):
+
+    counter = 2
 
     def is_pending(self):
-        return True
+        return bool(self.counter)
+
+    def apply(self):
+        self.counter -= 1

Modified:
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/two.py
==============================================================================
---
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/two.py	(original)
+++
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/two.py	Fri
Nov 28 14:59:53 2008
(at)(at) -4,13 +4,18 (at)(at)
 import fixapi
 
 
-class Two_ignored(fixapi.Fix):
+class IgnoreMe(fixapi.Fix):
 
     def is_pending(self):
         return False
 
 
-class Two(fixapi.Fix):
+class RunOnce(fixapi.Fix):
+
+    pending = True
 
     def is_pending(self):
-        return True
+        return self.pending
+
+    def apply(self):
+        self.pending = False

Added:
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db_failing/fix.py
==============================================================================
--- (empty file)
+++
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db_failing/fix.py	Fri
Nov 28 14:59:53 2008
(at)(at) -0,0 +1,13 (at)(at)
+# Copyright (c) 2008 gocept gmbh & co. kg
+# See also LICENSE.txt
+
+import fixapi
+
+
+class Failing(fixapi.Fix):
+
+    def is_pending(self):
+        return True
+
+    def apply(self):
+        raise RuntimeError('cannot apply failing fix')

Added:
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db_non_converging/fix.py
==============================================================================
--- (empty file)
+++
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db_non_converging/fix.py	Fri
Nov 28 14:59:53 2008
(at)(at) -0,0 +1,13 (at)(at)
+# Copyright (c) 2008 gocept gmbh & co. kg
+# See also LICENSE.txt
+
+import fixapi
+
+
+class NonConverging(fixapi.Fix):
+
+    def is_pending(self):
+        return True
+
+    def apply(self):
+        pass

Modified:
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/test_fix.py
==============================================================================
---
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/test_fix.py	(original)
+++
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/test_fix.py	Fri
Nov 28 14:59:53 2008
(at)(at) -13,7 +13,7 (at)(at)
 
     def test_list_db(self):
         fixer = fix.Fixer(os.path.join(self.base, 'db'))
-        self.assertEquals(['one.One', 'two.Two'], fixer.list())
+        self.assertEquals(['one.RunTwice', 'two.RunOnce'], fixer.list())
 
     def test_list_empty_db(self):
         fixer = fix.Fixer(os.path.join(self.base, 'db_empty'))
(at)(at) -24,5 +24,22 (at)(at)
             RuntimeError,
             lambda: fix.Fixer(os.path.join(self.base, 'db_broken')))
 
+    def test_apply_converges(self):
+        fixer = fix.Fixer(os.path.join(self.base, 'db'))
+        fixer.apply()
+        self.assertEquals([], fixer.list())
+
+    def test_apply_failing(self):
+        fixer = fix.Fixer(os.path.join(self.base, 'db_failing'))
+        self.assertRaises(RuntimeError, fixer.apply)
+
+    def test_apply_not_converging(self):
+        fixer = fix.Fixer(os.path.join(self.base, 'db_non_converging'))
+        self.assertEquals(['fix.NonConverging'], fixer.list())
+        fixer.apply()
+        self.assertEquals(['fix.NonConverging'], fixer.list())
+        fixer.apply()
+        self.assertEquals(['fix.NonConverging'], fixer.list())
+
 
 unittest.main()

SVN: r7105 - in gocept.infrastructure/feature_systemupgrade/util/fixes: . lib lib/tests/db
Christian Kauhaus <kc(at)gocept.com>
2008-11-28 15:44:03 [ FULL ]
Author: ckauhaus
Date: Fri Nov 28 15:44:01 2008
New Revision: 7105

Log:
Create wrapper script for fix command; solve global symbol problem for fix
scripts.


Added:
   gocept.infrastructure/feature_systemupgrade/util/fixes/check   (contents,
props changed)
   gocept.infrastructure/feature_systemupgrade/util/fixes/fix   (contents,
props changed)
      - copied, changed from r7104,
gocept.infrastructure/feature_systemupgrade/util/fixes/check
Modified:
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py
   gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/two.py

Added: gocept.infrastructure/feature_systemupgrade/util/fixes/check
==============================================================================
--- (empty file)
+++ gocept.infrastructure/feature_systemupgrade/util/fixes/check	Fri Nov 28
15:44:01 2008
(at)(at) -0,0 +1 (at)(at)
+link fix
\ No newline at end of file

Copied: gocept.infrastructure/feature_systemupgrade/util/fixes/fix (from r7104,
gocept.infrastructure/feature_systemupgrade/util/fixes/check)
==============================================================================
--- gocept.infrastructure/feature_systemupgrade/util/fixes/check	(original)
+++ gocept.infrastructure/feature_systemupgrade/util/fixes/fix	Fri Nov 28
15:44:01 2008
(at)(at) -11,10 +11,15 (at)(at)
 
 
 fixer = fix.Fixer(os.path.join(base, 'db'))
-fixes = fixer.list()
 
-for fix in fixes:
-    print fix
-
-if fixes:
-    sys.exit(2)
+command = os.path.basename(sys.argv[0])
+if command == 'check':
+    fixes = fixer.list()
+    for fix in fixes:
+        print fix
+    if fixes:
+        sys.exit(2)
+elif command == 'fix':
+    fixer.apply()
+else:
+    raise RuntimeError("%s: invalid command name '%s'" % (sys.argv[0],
command))

Modified: gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py
==============================================================================
---
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py	(original)
+++ gocept.infrastructure/feature_systemupgrade/util/fixes/lib/fix.py	Fri Nov
28 15:44:01 2008
(at)(at) -4,6 +4,7 (at)(at)
 import glob
 import inspect
 import os
+import types
 
 import fixapi
 
(at)(at) -32,19 +33,24 (at)(at)
     def _load_fixes(self):
         self.fixes = set()
         for file in glob.glob(os.path.join(self.dir, '*.py')):
-            locals = {}
-            execfile(file, {}, locals)
-            for fixname, fix in locals.items():
+            module = self._import(file)
+            module_fixes = {}
+            for fixname, fix in module.__dict__.items():
                 if inspect.isclass(fix) and issubclass(fix, fixapi.Fix):
-                    locals[fixname] = fix()
-                else:
-                    del locals[fixname]
-            if not locals:
+                    module_fixes[fixname] = fix()
+            if not module_fixes:
                 raise RuntimeError("no fix found in file '%s'" % file)
             filename = os.path.splitext(os.path.basename(file))[0]
-            for fixname, fix in locals.items():
+            for fixname, fix in module_fixes.items():
                 fix.__name__ = '%s.%s' % (filename, fixname)
                 self.fixes.add(fix)
 
+    def _import(self, file):
+        locals = {}
+        execfile(file, locals)
+        module = types.ModuleType(os.path.basename(file))
+        module.__dict__.update(locals)
+        return module
+
     def _list_pending(self):
         return set(fix for fix in self.fixes if fix.is_pending())

Modified:
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/two.py
==============================================================================
---
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/two.py	(original)
+++
gocept.infrastructure/feature_systemupgrade/util/fixes/lib/tests/db/two.py	Fri
Nov 28 15:44:01 2008
(at)(at) -1,6 +1,8 (at)(at)
 # Copyright (c) 2008 gocept gmbh & co. kg
 # See also LICENSE.txt
 
+import time
+
 import fixapi
 
 
(at)(at) -19,3 +21,10 (at)(at)
 
     def apply(self):
         self.pending = False
+
+
+class UsesImports(fixapi.Fix):
+
+    def is_pending(self):
+        time.time()
+        return False

MailBoxer