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:]