Exemplo n.º 1
0
class BigBoolTestCase(unittest.TestCase):

    def setUp(self):
        self.policy = Policy()

    def tearDown(self):
        del self.policy

    def testBigBoolArray(self):
        biglen = 1000
        self.policy.isBool("true")
        for i in range(biglen):
            self.policy.add("true", True)

        v = self.policy.getArray("true")
        self.assertEqual(len(v), biglen, "wrong big number of values in array")
        for i in range(biglen):
            self.assertTrue(v[i], "big array with bad value")

        del v
        self.assertTrue(True, "Blew up True")

        fd = open("/dev/null", "w")
        print("look: %s" % True, file=fd)
        fd.close()
    def testFromPolicy(self):
        p = Policy()
        p.set("name", "visit")
        idf = id.IntegerIDFilter.fromPolicy(p)
        self.testNoConstraints(idf)

        idf = id.IDFilter.fromPolicy(p)
        self.assert_(not isinstance(idf, id.IntegerIDFilter))
        p.set("className", "Integer")
        idf = id.IDFilter.fromPolicy(p)
        self.testNoConstraints(idf)
        p.set("className", "IntegerIDFilter")
        idf = id.IDFilter.fromPolicy(p)
        self.testNoConstraints(idf)

        p.set("className", "lsst.ctrl.sched.joboffice.id.IntegerIDFilter")
        self.assertRaises(RuntimeError, id.IDFilter.fromPolicy, p)
        p.set("className", "Integer")
        
        p.set("min", 3)
        idf = id.IDFilter.fromPolicy(p)
        self.testMin(idf)
        p.set("min", 0)
        p.set("lim", 16)
        idf = id.IDFilter.fromPolicy(p)
        self.testRange(idf)
        p.set("value", 20)
        p.add("value", 25)
        idf = id.IDFilter.fromPolicy(p)
        self.testValues4(idf)
Exemplo n.º 3
0
    def generateDict(self, policy, dictionary, prefix=""):
        definitions = Policy()
        dictionary.set("definitions", definitions)
        names = policy.names(True)
        for name in names:
            values = policy.getArray(name)
            defin = Policy()
            definitions.set(name, defin)
            defin.set("type", policy.getTypeName(name))
            defin.set("minOccurs", 1)
            defin.set("maxOccurs", len(values))
            type = policy.getValueType(name)

            if type == Policy.POLICY:
                newPrefix = prefix + "." + name
                subdict = Policy()
                defin.set("dictionary", subdict)
                if len(values) > 1:
                    print("# Warning: only using first value of", newPrefix)
                self.generateDict(values[0], subdict, newPrefix)
            else:
                allowed = Policy()
                defin.set("allowed", allowed)
                orderable = type == Policy.INT or type == Policy.DOUBLE \
                    or type == Policy.STRING
                if orderable:
                    allowed.set("min", min(values))
                    allowed.set("max", max(values))
                for value in values:
                    defin.add("default", value)
                    allowed.add("value", value)
Exemplo n.º 4
0
    def testFromPolicy(self):
        p = Policy()
        p.set("name", "visit")
        idf = id.IntegerIDFilter.fromPolicy(p)
        self.testNoConstraints(idf)

        idf = id.IDFilter.fromPolicy(p)
        self.assert_(isinstance(idf, id.StringIDFilter))
        p.set("className", "String")
        idf = id.IDFilter.fromPolicy(p)
        self.assert_(isinstance(idf, id.StringIDFilter))
        self.testNoConstraints(idf)
        p.set("className", "StringIDFilter")
        idf = id.IDFilter.fromPolicy(p)
        self.assert_(isinstance(idf, id.StringIDFilter))
        self.testNoConstraints(idf)

        p.set("className", "lsst.ctrl.sched.joboffice.id.StringIDFilter")
        self.assertRaises(RuntimeError, id.IDFilter.fromPolicy, p)
        p.set("className", "String")

        p.set("value", "-8")
        p.add("value", "r")
        p.add("value", "6,0")
        idf = id.IDFilter.fromPolicy(p)
        self.assert_(isinstance(idf, id.StringIDFilter))
        self.testValues2(idf)
    def testFromPolicy(self):
        p = Policy()
        p.set("name", "visit")
        idf = id.IntegerIDFilter.fromPolicy(p)
        self.testNoConstraints(idf)

        idf = id.IDFilter.fromPolicy(p)
        self.assert_(isinstance(idf, id.StringIDFilter))
        p.set("className", "String")
        idf = id.IDFilter.fromPolicy(p)
        self.assert_(isinstance(idf, id.StringIDFilter))
        self.testNoConstraints(idf)
        p.set("className", "StringIDFilter")
        idf = id.IDFilter.fromPolicy(p)
        self.assert_(isinstance(idf, id.StringIDFilter))
        self.testNoConstraints(idf)

        p.set("className", "lsst.ctrl.sched.joboffice.id.StringIDFilter")
        self.assertRaises(RuntimeError, id.IDFilter.fromPolicy, p)
        p.set("className", "String")
        
        p.set("value", "-8")
        p.add("value", "r")
        p.add("value", "6,0")
        idf = id.IDFilter.fromPolicy(p)
        self.assert_(isinstance(idf, id.StringIDFilter))
        self.testValues2(idf)
    def generateDict(self, policy, dictionary, prefix=""):
        definitions = Policy()
        dictionary.set("definitions", definitions)
        names = policy.names(True)
        for name in names:
            values = policy.getArray(name)
            defin = Policy()
            definitions.set(name, defin)
            defin.set("type", policy.getTypeName(name))
            defin.set("minOccurs", 1)
            defin.set("maxOccurs", len(values))
            type = policy.getValueType(name)

            if type == Policy.POLICY:
                newPrefix = prefix + "." + name
                subdict = Policy()
                defin.set("dictionary", subdict)
                if len(values) > 1:
                    print("# Warning: only using first value of", newPrefix)
                self.generateDict(values[0], subdict, newPrefix)
            else:
                allowed = Policy()
                defin.set("allowed", allowed)
                orderable = type == Policy.INT or type == Policy.DOUBLE \
                    or type == Policy.STRING
                if orderable:
                    allowed.set("min", min(values))
                    allowed.set("max", max(values))
                for value in values:
                    defin.add("default", value)
                    allowed.add("value", value)
Exemplo n.º 7
0
    def testFromPolicy(self):
        p = Policy()
        p.set("name", "visit")
        idf = id.IntegerIDFilter.fromPolicy(p)
        self.testNoConstraints(idf)

        idf = id.IDFilter.fromPolicy(p)
        self.assert_(not isinstance(idf, id.IntegerIDFilter))
        p.set("className", "Integer")
        idf = id.IDFilter.fromPolicy(p)
        self.testNoConstraints(idf)
        p.set("className", "IntegerIDFilter")
        idf = id.IDFilter.fromPolicy(p)
        self.testNoConstraints(idf)

        p.set("className", "lsst.ctrl.sched.joboffice.id.IntegerIDFilter")
        self.assertRaises(RuntimeError, id.IDFilter.fromPolicy, p)
        p.set("className", "Integer")

        p.set("min", 3)
        idf = id.IDFilter.fromPolicy(p)
        self.testMin(idf)
        p.set("min", 0)
        p.set("lim", 16)
        idf = id.IDFilter.fromPolicy(p)
        self.testRange(idf)
        p.set("value", 20)
        p.add("value", 25)
        idf = id.IDFilter.fromPolicy(p)
        self.testValues4(idf)
 def setUp(self):
     p = Policy()
     p.set("foo", "bar")
     p.set("count", 3)
     p.set("files", "goob")
     p.add("files", "gurn")
     impl = bb.PolicyBlackboardItem()
     impl._props = p
     self.bbi = bb.ImplBlackboardItem(impl)
         
     self.initCount = 3
    def setUp(self):
        p = Policy()
        p.set("foo", "bar")
        p.set("count", 3)
        p.set("files", "goob")
        p.add("files", "gurn")
        impl = bb.PolicyBlackboardItem()
        impl._props = p
        self.bbi = bb.ImplBlackboardItem(impl)

        self.initCount = 3
    def setUp(self):
        if not os.path.exists(self.propfile):
            p = Policy()
            p.set("foo", "bar")
            p.set("count", 3)
            p.set("files", "goob")
            p.add("files", "gurn")
            w = PAFWriter(self.propfile)
            w.write(p, True)
            w.close()
        
        self.bbi = bb.PolicyBlackboardItem(self.propfile)

        self.initCount = 3
Exemplo n.º 11
0
    def setUp(self):
        if not os.path.exists(self.propfile):
            p = Policy()
            p.set("foo", "bar")
            p.set("count", 3)
            p.set("files", "goob")
            p.add("files", "gurn")
            w = PAFWriter(self.propfile)
            w.write(p, True)
            w.close()

        self.bbi = bb.PolicyBlackboardItem(self.propfile)

        self.initCount = 3
Exemplo n.º 12
0
 def testPostprocess(self):
     print "Events in Postprocess..."
     pol = Policy()
     pol.add("RunMode", "postprocess")
     pol.add("keysToPublish", "loose=change")
     pol.add("keysToPublish", "planned=obselesence")
     self._runStageWithPolicy(pol)
Exemplo n.º 13
0
    def testFromPolicy(self):
        p = Policy()
        p.set("datasetType", self.type)
        trig = SimpleTrigger.fromPolicy(p)
        self.testDatasetType(trig)

        trig = Trigger.fromPolicy(p)
        self.testDatasetType(trig)
        p.set("className", "Simple")
        trig = Trigger.fromPolicy(p)
        self.testDatasetType(trig)
        p.set("className", "SimpleTrigger")
        trig = Trigger.fromPolicy(p)
        self.testDatasetType(trig)

        p.set("className", "lsst.ctrl.sched.joboffice.goober.SimpleTrigger")
        self.assertRaises(ImportError, Trigger.fromPolicy, p)
        p.set("className", "Simple")

        idp = Policy()
        idp.set("name", "visit")
        idp.set("value", 88)
        p.add("id", idp)
        idp = Policy()
        idp.set("name", "ccd")
        idp.set("lim", 9)
        p.add("id", idp)
        idp = Policy()
        idp.set("name", "amp")
        idp.set("min", 0)
        idp.set("lim", 16)
        p.add("id", idp)

        trig = SimpleTrigger.fromPolicy(p)
        # pdb.set_trace()
        self.testIds(trig)
Exemplo n.º 14
0
 def testDefRunMode(self):
     print "Events in Default RunMode..."
     pol = Policy()
     pol.add("keysToPublish", "loose=change")
     pol.add("keysToPublish", "planned=obselesence")
     self._runStageWithPolicy(pol)
Exemplo n.º 15
0
        # non-throwing validation
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        ve = ValidationError("Dictionary_1.py", 1, "testMergeDefaults")
        p.mergeDefaults(pd, False, ve)
        self.assert_(ve.getErrors("required") == ValidationError.MISSING_REQUIRED)
        self.assert_(ve.getParamCount() == 1)

        # non-retention
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        p.set("required", "foo")
        p.mergeDefaults(pd, False)
        # make sure validate() fails gracefully when no dictionary present
        self.assertRaisesEx(DictionaryError, "No dictionary",
                            p.validate, "No dictionary assigned")
        p.add("unknown", 0) # would be rejected if dictionary was kept

        # deep merge from a Policy that's not a Dictionary
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        p.mergeDefaults(Policy(self.getTestDictionary("defaults_policy_most.paf")))
        self.assert_(p.nameCount() == 3)
        self.assert_(p.getBool("bool_set_count") == True)
        self.assert_(p.getString("indirect.string_type") == "bar")

        # propagation of a Dictionary from one Policy to another via mergeDefaults
        d = Dictionary(self.getTestDictionary("defaults_dictionary_complete.paf"))
        d.loadPolicyFiles(self.getTestDictionary())
        pEmpty = Policy()
        pEmpty.mergeDefaults(d)
        self.assert_(pEmpty.canValidate())
        pPartial = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
Exemplo n.º 16
0
class PolicyBlackboardItem(BlackboardItem):
    """
    An implementation of a BlackboardItem that stores properities via a
    policy
    """
    def __init__(self, policyfile=None):
        """
        create an item with the given properties.
        @param policyfile    A policy
        """
        # the properties attached to this items
        self._props = None
        if policyfile:
            self._props = Policy.createPolicy(policyfile)
        else:
            self._props = Policy()

    def getProperty(self, name, default=None):
        """
        return the value for a property
        @param name      the property name
        @parma default   the default value to return if the name is not set
        """
        if not self._props.exists(name):
            return default
        elif self._props.isArray(name):
            return self._props.getArray(name)
        else:
            return self._props.get(name)

    def hasProperty(self, name):
        """
        return True if the property with the given name is available
        """
        return self._props.exists(name)

    def __getitem__(self, name):
        if not self._props.exists(name):
            raise KeyError(name)
        return BlackboardItem.__getitem__(self, name)

    def _setProperty(self, name, val):
        # set a property value
        if isinstance(val, list):
            self._props.set(name, val.pop(0))
            for v in val:
                self._props.add(name, v)
        else:
            self._props.set(name, val)

    def getPropertyNames(self):
        """
        return the property names that make up this item
        """
        return self._props.names()

    def _copyFrom(self, item):
        for name in item.getPropertyNames():
            self._setProperty(name, item.getProperty(name))

    @staticmethod
    def createFormatter():
        return PolicyBlackboardItem._Fmtr()

    class _Fmtr(object):
        def write(self, filename, item):
            pol = None
            if isinstance(item, PolicyBlackboardItem):
                pol = item._props
            else:
                delegate = PolicyBlackboardItem()
                delegate._copyFrom(item)
                pol = delegate._props

            writer = PAFWriter(filename)
            try:
                writer.write(pol, True)
            finally:
                writer.close()

        def openItem(self, filename):
            out = PolicyBlackboardItem()
            out._props = Policy.createPolicy(filename)
            return out

        def filenameExt(self):
            """
            return the recommended extension for the format this writes out
            """
            return "paf"
Exemplo n.º 17
0
    def testMergeDefaults(self):
        # from a non-trivial dictionary
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        p.set("required", "foo")
        d = Dictionary(self.getTestDictionary("defaults_dictionary_good.paf"))
        d.loadPolicyFiles(self.getTestDictionary(), True)
        self.assert_(p.nameCount() == 2)
        p.mergeDefaults(d)
        self.assert_(p.valueCount("int_range_count") == 3)
        self.assert_(p.nameCount() == 7)

        # from a policy that's really a dictionary
        p = Policy()
        pd = Policy(self.getTestDictionary("defaults_dictionary_indirect.paf"))
        p.mergeDefaults(pd)
        self.assert_(p.getString("string_type") == "foo")
        self.assert_(p.getDictionary().isDictionary())
        
        # from a policy that's really a non-trivial dictionary
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        p.set("required", "foo")
        pd = Policy(self.getTestDictionary("defaults_dictionary_policy.paf"))
        pd.loadPolicyFiles(self.getTestDictionary(), True)
        self.assert_(p.nameCount() == 2)
        p.mergeDefaults(pd)
        self.assert_(p.valueCount("int_range_count") == 3)
        self.assert_(p.nameCount() == 5)

        # ensure post-load validation
        p.set("int_range_count", -5)
        self.assertValidationError(ValidationError.UNKNOWN_NAME,
                                   p.add, "unknown", 0)

        # test throwing validation
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        try:
            p.mergeDefaults(pd)
        except ValidationError as ve:
            self.assert_(ve.getErrors("required")
                         == ValidationError.MISSING_REQUIRED)

        # non-throwing validation
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        ve = ValidationError("Dictionary_1.py", 1, "testMergeDefaults")
        p.mergeDefaults(pd, False, ve.cpp)
        self.assert_(ve.getErrors("required") == ValidationError.MISSING_REQUIRED)
        self.assert_(ve.getParamCount() == 1)

        # non-retention
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        p.set("required", "foo")
        p.mergeDefaults(pd, False)
        # make sure validate() fails gracefully when no dictionary present
        self.assertRaiseLCE(DictionaryError, "No dictionary",
                            p.validate, "No dictionary assigned")
        p.add("unknown", 0) # would be rejected if dictionary was kept

        # deep merge from a Policy that's not a Dictionary
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        p.mergeDefaults(Policy(self.getTestDictionary("defaults_policy_most.paf")))
        self.assert_(p.nameCount() == 3)
        self.assert_(p.getBool("bool_set_count") == True)
        self.assert_(p.getString("indirect.string_type") == "bar")

        # propagation of a Dictionary from one Policy to another via mergeDefaults
        d = Dictionary(self.getTestDictionary("defaults_dictionary_complete.paf"))
        d.loadPolicyFiles(self.getTestDictionary())
        pEmpty = Policy()
        pEmpty.mergeDefaults(d)
        self.assert_(pEmpty.canValidate())
        pPartial = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        pPartial.mergeDefaults(pEmpty)
        self.assert_(pPartial.canValidate(), "Dictionary handed off via mergeDefaults.")
Exemplo n.º 18
0
    def testMergeDefaults(self):
        # from a non-trivial dictionary
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        p.set("required", "foo")
        d = Dictionary(self.getTestDictionary("defaults_dictionary_good.paf"))
        d.loadPolicyFiles(self.getTestDictionary(), True)
        self.assertEqual(p.nameCount(), 2)
        p.mergeDefaults(d)
        self.assertEqual(p.valueCount("int_range_count"), 3)
        self.assertEqual(p.nameCount(), 7)

        # from a policy that's really a dictionary
        p = Policy()
        pd = Policy(self.getTestDictionary("defaults_dictionary_indirect.paf"))
        p.mergeDefaults(pd)
        self.assertEqual(p.getString("string_type"), "foo")
        self.assertTrue(p.getDictionary().isDictionary())

        # from a policy that's really a non-trivial dictionary
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        p.set("required", "foo")
        pd = Policy(self.getTestDictionary("defaults_dictionary_policy.paf"))
        pd.loadPolicyFiles(self.getTestDictionary(), True)
        self.assertEqual(p.nameCount(), 2)
        p.mergeDefaults(pd)
        self.assertEqual(p.valueCount("int_range_count"), 3)
        self.assertEqual(p.nameCount(), 5)

        # ensure post-load validation
        p.set("int_range_count", -5)
        self.assertValidationError(ValidationError.UNKNOWN_NAME,
                                   p.add, "unknown", 0)

        # test throwing validation
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        try:
            p.mergeDefaults(pd)
        except ValidationError as ve:
            self.assertEqual(ve.getErrors("required"),
                             ValidationError.MISSING_REQUIRED)

        # non-throwing validation
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        ve = ValidationError("Dictionary_1.py", 1, "testMergeDefaults")
        p.mergeDefaults(pd, False, ve.cpp)
        self.assertEqual(ve.getErrors("required"), ValidationError.MISSING_REQUIRED)
        self.assertEqual(ve.getParamCount(), 1)

        # non-retention
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        p.set("required", "foo")
        p.mergeDefaults(pd, False)
        # make sure validate() fails gracefully when no dictionary present
        self.assertRaiseLCE(DictionaryError, "No dictionary",
                            p.validate, "No dictionary assigned")
        p.add("unknown", 0)  # would be rejected if dictionary was kept

        # deep merge from a Policy that's not a Dictionary
        p = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        p.mergeDefaults(Policy(self.getTestDictionary("defaults_policy_most.paf")))
        self.assertEqual(p.nameCount(), 3)
        self.assertIs(p.getBool("bool_set_count"), True)
        self.assertEqual(p.getString("indirect.string_type"), "bar")

        # propagation of a Dictionary from one Policy to another via mergeDefaults
        d = Dictionary(self.getTestDictionary("defaults_dictionary_complete.paf"))
        d.loadPolicyFiles(self.getTestDictionary())
        pEmpty = Policy()
        pEmpty.mergeDefaults(d)
        self.assertTrue(pEmpty.canValidate())
        pPartial = Policy(self.getTestDictionary("defaults_policy_partial.paf"))
        pPartial.mergeDefaults(pEmpty)
        self.assertTrue(pPartial.canValidate(), "Dictionary handed off via mergeDefaults.")
Exemplo n.º 19
0
    def testPolicySetget(self):
        p = Policy()
        self.assert_(not p.exists("foo"), "empty existence test failed")
        self.assertEqual(p.valueCount("foo.bar"), 0,
                         "empty valueCount test failed")

        self.assertRaises(NameNotFound, p.getTypeInfo, "foo")

        p.set("doall", "true")

        # non-existence tests on a non-empty policy
        self.failUnless(not p.exists("foo"),
                        "non-empty non-existence test failed")
        self.assertEqual(p.valueCount("foo.bar"), 0,
                         "empty valueCount test failed")
        self.failUnless(not p.isInt("foo"),
                        "non-empty non-existence type test failed")
        self.assertRaises(NameNotFound, p.getTypeInfo, "foo")

        # existence tests
        self.assert_(p.exists("doall"), "non-empty existence test failed")
        self.assertEquals(p.valueCount("doall"), 1,
                          "single valueCount test failed")

        self.assertRaises(Exception, p.getInt, "doall")
        self.assertRaises(Exception, p.getDoubleArray, "doall")

        self.assertEquals(p.get("doall"), "true",
                          "top-level getString failed")
        p.set("doall", "duh")
        self.assertEquals(p.get("doall"), "duh",
                          "top-level getString failed")
        
        # test array access
        ary = p.getArray("doall")
        self.assertEquals(len(ary), 1,
                          "scalar property has more than one value")


        self.assertEquals(ary[0], "duh", "scalar access via array failed")

        p.add("doall", "never")
        self.assertEquals(p.valueCount("doall"), 2,
                          "2-elem. valueCount test failed")
        self.assertEquals(p.get("doall"), "never", "top-level add failed")
        ary = p.getArray("doall")
        self.assertEquals(len(ary), 2,
                          "scalar property has wrong number of values")
        self.assertEquals(ary[0], "duh",
                          "scalar access via (2-el) array failed")
        self.assertEquals(ary[-1], "never",
                          "scalar access via (2-el) array failed")

        # test hierarchical access

        # list names

        # test types
        p.set("pint", 5)
        self.assertEquals(p.getInt("pint"), 5, "support for type int failed")
        self.assertEquals(type(p.get("pint")), type(5),
                          "auto-typing for int failed")
        p.set("pdbl", 5.1)
        self.assertAlmostEquals(p.getDouble("pdbl"), 5.1, 7, 
                                "support for type double failed")
        self.assertEquals(type(p.get("pdbl")), type(5.1),
                          "auto-typing for double failed")
        p.set("pbool", True)
        self.assert_(p.getBool("pbool"), "support for type bool failed")
        self.assertEquals(type(p.get("pbool")), type(True),
                          "auto-typing for bool failed")
        p.add("pbool", False)

        # test shallow & deep copies

        # test raise NameNotFound if not present
        try:
            p.get("nonexistent")
            self.fail() # should never reach here
        except Exception, e:
            self.assert_(isinstance(e, NameNotFound))
Exemplo n.º 20
0
    def testPolicySetget(self):
        p = Policy()
        self.assertFalse(p.exists("foo"), "empty existence test failed")
        self.assertEqual(p.valueCount("foo.bar"), 0,
                         "empty valueCount test failed")

        self.assertRaises(lsst.pex.exceptions.Exception, p.getTypeInfo, "foo")

        p.set("doall", "true")

        # non-existence tests on a non-empty policy
        self.assertFalse(p.exists("foo"),
                         "non-empty non-existence test failed")
        self.assertEqual(p.valueCount("foo.bar"), 0,
                         "empty valueCount test failed")
        self.assertFalse(p.isInt("foo"),
                         "non-empty non-existence type test failed")
        self.assertRaises(lsst.pex.exceptions.Exception, p.getTypeInfo, "foo")

        # existence tests
        self.assertTrue(p.exists("doall"), "non-empty existence test failed")
        self.assertEqual(p.valueCount("doall"), 1,
                         "single valueCount test failed")

        self.assertRaises(lsst.pex.exceptions.Exception, p.getInt, "doall")
        self.assertRaises(lsst.pex.exceptions.Exception, p.getDoubleArray,
                          "doall")

        self.assertEqual(p.get("doall"), "true", "top-level getString failed")
        p.set("doall", "duh")
        self.assertEqual(p.get("doall"), "duh", "top-level getString failed")

        # test array access
        ary = p.getArray("doall")
        self.assertEqual(len(ary), 1,
                         "scalar property has more than one value")

        self.assertEqual(ary[0], "duh", "scalar access via array failed")

        p.add("doall", "never")
        self.assertEqual(p.valueCount("doall"), 2,
                         "2-elem. valueCount test failed")
        self.assertEqual(p.get("doall"), "never", "top-level add failed")
        ary = p.getArray("doall")
        self.assertEqual(len(ary), 2,
                         "scalar property has wrong number of values")
        self.assertEqual(ary[0], "duh",
                         "scalar access via (2-el) array failed")
        self.assertEqual(ary[-1], "never",
                         "scalar access via (2-el) array failed")

        # test hierarchical access

        # list names

        # test types
        p.set("pint", 5)
        self.assertEqual(p.getInt("pint"), 5, "support for type int failed")
        self.assertIsInstance(p.get("pint"), int, "auto-typing for int failed")
        p.set("pdbl", 5.1)
        self.assertAlmostEqual(p.getDouble("pdbl"), 5.1, 7,
                               "support for type double failed")
        self.assertEqual(type(p.get("pdbl")), type(5.1),
                         "auto-typing for double failed")
        p.set("pbool", True)
        self.assertTrue(p.getBool("pbool"), "support for type bool failed")
        self.assertEqual(type(p.get("pbool")), type(True),
                         "auto-typing for bool failed")
        p.add("pbool", False)

        # test shallow & deep copies

        # test raise NameNotFound if not present
        self.assertRaises(NameNotFound, p.get, "nonexistent")
        self.assertRaises(NameNotFound, p.getArray, "nonexistent")
        self.assertRaises(NameNotFound, p.getDouble, "nonexistent")
Exemplo n.º 21
0
class PolicyBlackboardItem(BlackboardItem):
    """
    An implementation of a BlackboardItem that stores properities via a
    policy
    """

    def __init__(self, policyfile=None):
        """
        create an item with the given properties.
        @param policyfile    A policy
        """
        # the properties attached to this items
        self._props = None
        if policyfile:
            self._props = Policy.createPolicy(policyfile)
        else:
            self._props = Policy()

    def getProperty(self, name, default=None):
        """
        return the value for a property
        @param name      the property name
        @parma default   the default value to return if the name is not set
        """
        if not self._props.exists(name):
            return default
        elif self._props.isArray(name):
            return self._props.getArray(name)
        else:
            return self._props.get(name)

    def hasProperty(self, name):
        """
        return True if the property with the given name is available
        """
        return self._props.exists(name)

    def __getitem__(self, name):
        if not self._props.exists(name):
            raise KeyError(name)
        return BlackboardItem.__getitem__(self, name)

    def _setProperty(self, name, val):
        # set a property value
        if isinstance(val, list):
            self._props.set(name, val.pop(0))
            for v in val:
                self._props.add(name, v)
        else:
            self._props.set(name, val)

    def getPropertyNames(self):
        """
        return the property names that make up this item
        """
        return self._props.names()

    def _copyFrom(self, item):
        for name in item.getPropertyNames():
            self._setProperty(name, item.getProperty(name))

    @staticmethod
    def createFormatter():
        return PolicyBlackboardItem._Fmtr()

    class _Fmtr(object):
        def write(self, filename, item):
            pol = None
            if isinstance(item, PolicyBlackboardItem):
                pol = item._props
            else:
                delegate = PolicyBlackboardItem()
                delegate._copyFrom(item)
                pol = delegate._props

            writer = PAFWriter(filename)
            try:
                writer.write(pol, True)
            finally:
                writer.close()

        def openItem(self, filename):
            out = PolicyBlackboardItem()
            out._props = Policy.createPolicy(filename)
            return out

        def filenameExt(self):
            """
            return the recommended extension for the format this writes out
            """
            return "paf"