def test_with_observer(self):
        sys.path = [self.tdir] + sys.path
        pdf = ProjDirFactory(self.tdir)
        try:
            expected = ['mydrv.MyDrv', 'mydrv.MyDrv2', 'mycomp.MyComp']
            types = dict(pdf.get_available_types())
            typenames = types.keys()
            self.assertEqual(set(typenames), set(expected))
            self.assertEqual(set(types['mydrv.MyDrv']['ifaces']),
                             set(['IContainer', 'IComponent', 'IDriver', 'IHasEvents']))
            self.assertEqual(set(types['mycomp.MyComp']['ifaces']),
                             set(['IContainer', 'IComponent']))
            self.assertTrue('mydrv.MyDrv' in pdf._classes)
            self.assertTrue('mydrv.MyDrv2' in pdf._classes)
            self.assertTrue('mycomp.MyComp' in pdf._classes)

            # now try creating a MyDrv
            mydrv = pdf.create('mydrv.MyDrv')
            self.assertEqual(type(mydrv).__name__, 'MyDrv')
            self.assertEqual(type(mydrv).mro()[1].__name__, 'Driver')

            # now create a new file
            with open(os.path.join(self.tdir, 'mycomp2.py'), 'w') as f:
                f.write("""
from openmdao.main.api import Component
class MyComp2(Component):
    pass
                """)

            time.sleep(2.0)
            types = dict(pdf.get_available_types())
            typenames = types.keys()
            self.assertEqual(set(typenames), set(expected + ['mycomp2.MyComp2']))
            self.assertEqual(set(types['mycomp2.MyComp2']['ifaces']),
                             set(['IContainer', 'IComponent']))
            self.assertTrue('mycomp2.MyComp2' in pdf._classes)

            # now test removal
            os.remove(os.path.join(self.tdir, 'mycomp2.py'))
            time.sleep(2.0)
            types = dict(pdf.get_available_types())
            typenames = types.keys()
            self.assertEqual(set(typenames), set(expected))
            self.assertTrue('mycomp2.MyComp2' not in pdf._classes)

            # now try modifying an existing file
            with open(os.path.join(self.tdir, 'mydrv.py'), 'w') as f:
                time.sleep(6)
                f.write("""
from openmdao.main.api import Component
class MyDrv(Component):  #old MyDrv was a Driver, new one is just a Component
    pass

class Foo(Component):
    pass
                """)
                time.sleep(3)
            time.sleep(2.0)
            expected = ['mydrv.MyDrv', 'mydrv.Foo', 'mycomp.MyComp']
            types = dict(pdf.get_available_types())
            typenames = types.keys()
            self.assertEqual(set(typenames), set(expected))
            self.assertEqual(set(types['mycomp.MyComp']['ifaces']), set(['IContainer', 'IComponent']))
            self.assertEqual(set(types['mydrv.MyDrv']['ifaces']), set(['IContainer', 'IComponent']))
            self.assertEqual(set(types['mydrv.Foo']['ifaces']), set(['IContainer', 'IComponent']))

            # now try creating a MyDrv Component
            mydrv = pdf.create('mydrv.MyDrv')
            self.assertNotEqual(type(mydrv).mro()[1].__name__, 'Driver')
            self.assertTrue(isinstance(mydrv, Component))

        finally:
            pdf.cleanup()
    def test_manual(self):
        try:
            sys.path = [self.tdir]+sys.path

            pdf = ProjDirFactory(self.tdir, use_observer=False)
            expected = ['mydrv.MyDrv', 'mydrv.MyDrv2', 'mycomp.MyComp']
            types = pdf.get_available_types()
            typenames = [n for n, mdata in types]
            self.assertEqual(set(typenames), set(expected))

            # now try creating a MyDrv
            mydrv = pdf.create('mydrv.MyDrv')
            self.assertTrue(isinstance(mydrv, Driver))

            # now create a new file
            fpath = os.path.join(self.tdir, 'mycomp2.py')
            with open(fpath, 'w') as f:
                f.write("""
from openmdao.main.api import Component
class MyComp2(Component):
    pass
                """)
            added_set = set()
            changed_set = set()
            deleted_set = set()
            pdf.on_modified(fpath, added_set, changed_set, deleted_set)  # manual notification
            types = pdf.get_available_types()
            typenames = [n for n, mdata in types]
            self.assertEqual(set(typenames), set(expected + ['mycomp2.MyComp2']))
            self.assertEqual(set(['mycomp2.MyComp2']), added_set)
            self.assertEqual(set(), changed_set)
            self.assertEqual(set(), deleted_set)

            # now test removal
            os.remove(fpath)
            deleted_set = set()
            pdf.on_deleted(fpath, deleted_set)  # manual notification
            types = pdf.get_available_types()
            typenames = [n for n, mdata in types]
            self.assertEqual(set(typenames), set(expected))
            self.assertEqual(set(['mycomp2.MyComp2']), deleted_set)

            # now try modifying an existing file
            time.sleep(2)  # Windows timestamp granularity is one second.
            fpath = os.path.join(self.tdir, 'mydrv.py')
            with open(fpath, 'w') as f:
                f.write("""
from openmdao.main.api import Component
class MyDrv(Component):  #old MyDrv was a Driver, new one is just a Component
    pass

class Foo(Component):
    pass
                """)
            added_set = set()
            changed_set = set()
            deleted_set = set()
            pdf.on_modified(fpath, added_set, changed_set, deleted_set)  # manual notification
            expected = ['mydrv.MyDrv', 'mydrv.Foo', 'mycomp.MyComp']
            types = pdf.get_available_types()
            typenames = [n for n, mdata in types]
            self.assertEqual(set(typenames), set(expected))
            self.assertEqual(set(['mydrv.Foo']), added_set)
            self.assertEqual(set(['mydrv.MyDrv']), changed_set)
            self.assertEqual(set(['mydrv.MyDrv2']), deleted_set)
        finally:
            sys.path = sys.path[1:]