Example #1
0
    def _get_typed_arg_value(self, given_value, param_def, strict):
        """Returns a service operation argument value, based on a given value and param schema definition.
        """
        param_type = param_def["type"]
        if isinstance(given_value, unicode):
            # Convert all unicode to str in UTF-8
            given_value = given_value.encode(
                "utf8")  # Make all unicode into str

        if isinstance(given_value, IonObjectBase) and (
                given_value._get_type() == param_type
                or param_type in given_value._get_extends()):
            return given_value
        elif is_ion_object_dict(given_value) and (
                param_type == "NoneType" or hasattr(objects, param_type)):
            return self.create_ion_object(given_value)
        elif param_type in ("str", "bool", "int", "float", "list", "dict",
                            "NoneType"):
            arg_val = get_typed_value(given_value,
                                      targettype=param_type,
                                      strict=strict)
            return arg_val
        else:
            raise BadRequest("Cannot convert param value to type %s" %
                             param_type)
Example #2
0
 def _resource_assign_org(self, cfg, res_id):
     """
     Shares the resource in the given orgs. Supports bulk.
     """
     org_ids = cfg.get(KEY_ORGS, None)
     if org_ids:
         org_ids = get_typed_value(org_ids, targettype="simplelist")
         for org_id in org_ids:
             org_res_id = self.resource_ids[org_id]
             svc_client = self._get_service_client("org_management")
             svc_client.share_resource(org_res_id, res_id, headers=self._get_system_actor_headers())
Example #3
0
    def _get_typed_arg_value(self, given_value, param_def, strict):
        """Returns a service operation argument value, based on a given value and param schema definition.
        """
        param_type = param_def["type"]
        if isinstance(given_value, unicode):
            # Convert all unicode to str in UTF-8
            given_value = given_value.encode("utf8")  # Make all unicode into str

        if isinstance(given_value, IonObjectBase) and (given_value._get_type() == param_type or
                                                       param_type in given_value._get_extends()):
            return given_value
        elif is_ion_object_dict(given_value) and (param_type == "NoneType" or hasattr(objects, param_type)):
            return self.create_ion_object(given_value)
        elif param_type in ("str", "bool", "int", "float", "list", "dict", "NoneType"):
            arg_val = get_typed_value(given_value, targettype=param_type, strict=strict)
            return arg_val
        else:
            raise BadRequest("Cannot convert param value to type %s" % param_type)
Example #4
0
 def _resource_assign_org(self, cfg, res_id):
     """
     Shares the resource in the given orgs. Supports bulk.
     """
     org_ids = cfg.get(KEY_ORGS, None)
     if org_ids:
         org_ids = get_typed_value(org_ids, targettype="simplelist")
         for org_id in org_ids:
             org_res_id = self.resource_ids[org_id]
             if self.bulk and res_id in self.bulk_resources:
                 # Note: org_id is alias, res_id is internal ID
                 org_obj = self._get_resource_obj(org_id)
                 res_obj = self._get_resource_obj(res_id)
                 # Create association to given Org
                 assoc_obj = self._create_association(org_obj, PRED.hasResource, res_obj, support_bulk=True)
             else:
                 svc_client = self._get_service_client("org_management")
                 svc_client.share_resource(org_res_id, res_id, headers=self._get_system_actor_headers())
Example #5
0
 def _resource_assign_org(self, cfg, res_id):
     """
     Shares the resource in the given orgs. Supports bulk.
     """
     org_ids = cfg.get(KEY_ORGS, None)
     if org_ids:
         org_ids = get_typed_value(org_ids, targettype="simplelist")
         for org_id in org_ids:
             org_res_id = self.resource_ids[org_id]
             if self.bulk and res_id in self.bulk_resources:
                 # Note: org_id is alias, res_id is internal ID
                 org_obj = self._get_resource_obj(org_id)
                 res_obj = self._get_resource_obj(res_id)
                 # Create association to given Org
                 assoc_obj = self._create_association(org_obj, PRED.hasResource, res_obj, support_bulk=True)
             else:
                 svc_client = self._get_service_client("org_management")
                 svc_client.share_resource(org_res_id, res_id, headers=self._get_system_actor_headers())
Example #6
0
    def test_get_typed_value(self):
        # TEST: Integers
        ret_val = get_typed_value(999, targettype="int", strict=True)
        self.assertEqual(ret_val, 999)
        with self.assertRaises(BadRequest):
            get_typed_value("999", targettype="int", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value("999.9", targettype="int", strict=False)
        with self.assertRaises(BadRequest):
            get_typed_value(None, targettype="int", strict=False)
        with self.assertRaises(BadRequest):
            get_typed_value("", targettype="int", strict=False)
        ret_val = get_typed_value("999", targettype="int", strict=False)
        self.assertEqual(ret_val, 999)
        long_val = 9999999999999999999
        self.assertEqual(type(long_val), long)
        ret_val = get_typed_value(long_val, targettype="int", strict=True)
        self.assertEqual(ret_val, long_val)

        schema_entry = dict(type="int")
        ret_val = get_typed_value(999, schema_entry=schema_entry, strict=True)
        self.assertEqual(ret_val, 999)

        # TEST: Float
        ret_val = get_typed_value(999.9, targettype="float", strict=True)
        self.assertEqual(ret_val, 999.9)
        with self.assertRaises(BadRequest):
            get_typed_value("999.9", targettype="float", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value(None, targettype="float", strict=False)
        with self.assertRaises(BadRequest):
            get_typed_value("", targettype="float", strict=False)
        ret_val = get_typed_value("999.9", targettype="float", strict=False)
        self.assertEqual(ret_val, 999.9)
        ret_val = get_typed_value("999", targettype="float", strict=False)
        self.assertEqual(ret_val, 999.0)

        # TEST: String
        ret_val = get_typed_value("foo", targettype="str", strict=True)
        self.assertEqual(ret_val, "foo")
        with self.assertRaises(BadRequest):
            get_typed_value(999, targettype="str", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value(None, targettype="str", strict=True)
        ret_val = get_typed_value(999, targettype="str", strict=False)
        self.assertEqual(ret_val, "999")
        ret_val = get_typed_value(True, targettype="str", strict=False)
        self.assertEqual(ret_val, "True")
        unicode_val = u'foo \u20ac foo'
        ret_val = get_typed_value(unicode_val, targettype="str", strict=True)
        self.assertEqual(type(ret_val), str)
        self.assertEqual(ret_val, "foo \xe2\x82\xac foo")

        # TEST: Bool
        ret_val = get_typed_value(True, targettype="bool", strict=True)
        self.assertEqual(ret_val, True)
        ret_val = get_typed_value(False, targettype="bool", strict=True)
        self.assertEqual(ret_val, False)
        with self.assertRaises(BadRequest):
            get_typed_value("True", targettype="bool", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value(None, targettype="bool", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value("", targettype="bool", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value(123, targettype="bool", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value(0, targettype="bool", strict=True)
        ret_val = get_typed_value("True", targettype="bool", strict=False)
        self.assertEqual(ret_val, True)
        ret_val = get_typed_value("true", targettype="bool", strict=False)
        self.assertEqual(ret_val, True)
        ret_val = get_typed_value("TRUE", targettype="bool", strict=False)
        self.assertEqual(ret_val, True)
        ret_val = get_typed_value("1", targettype="bool", strict=False)
        self.assertEqual(ret_val, True)
        ret_val = get_typed_value(1, targettype="bool", strict=False)
        self.assertEqual(ret_val, True)
        ret_val = get_typed_value("False", targettype="bool", strict=False)
        self.assertEqual(ret_val, False)
        ret_val = get_typed_value("FALSE", targettype="bool", strict=False)
        self.assertEqual(ret_val, False)
        ret_val = get_typed_value("false", targettype="bool", strict=False)
        self.assertEqual(ret_val, False)
        ret_val = get_typed_value("0", targettype="bool", strict=False)
        self.assertEqual(ret_val, False)
        ret_val = get_typed_value("", targettype="bool", strict=False)
        self.assertEqual(ret_val, False)
        ret_val = get_typed_value(None, targettype="bool", strict=False)
        self.assertEqual(ret_val, False)
        with self.assertRaises(BadRequest):
            get_typed_value("F", targettype="bool", strict=False)
        with self.assertRaises(BadRequest):
            get_typed_value("Falsy", targettype="bool", strict=False)
        with self.assertRaises(BadRequest):
            get_typed_value("Truey", targettype="bool", strict=False)
        with self.assertRaises(BadRequest):
            get_typed_value(" True", targettype="bool", strict=False)

        # TEST: List
        list_val = [1, True, "foo"]
        ret_val = get_typed_value(list_val, targettype="list", strict=True)
        self.assertEqual(ret_val, list_val)
        ret_val = get_typed_value([], targettype="list", strict=True)
        self.assertEqual(ret_val, [])
        with self.assertRaises(BadRequest):
            get_typed_value(None, targettype="list", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value("[]", targettype="list", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value("", targettype="list", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value(tuple(), targettype="list", strict=True)

        ret_val = get_typed_value(1, targettype="list", strict=False)
        self.assertEqual(ret_val, [1])
        ret_val = get_typed_value(tuple(list_val),
                                  targettype="list",
                                  strict=False)
        self.assertEqual(ret_val, list_val)
        ret_val = get_typed_value(set(list_val),
                                  targettype="list",
                                  strict=False)
        self.assertEqual(type(ret_val), list)
        self.assertEqual(set(ret_val), set(list_val))
        ret_val = get_typed_value("1", targettype="list", strict=False)
        self.assertEqual(ret_val, ["1"])
        ret_val = get_typed_value("a,b,c", targettype="list", strict=False)
        self.assertEqual(ret_val, ["a", "b", "c"])
        ret_val = get_typed_value("[a,b,c]", targettype="list", strict=False)
        self.assertEqual(ret_val, ["a", "b", "c"])
        ret_val = get_typed_value("['a','b',3]",
                                  targettype="list",
                                  strict=False)
        self.assertEqual(ret_val, ["a", "b", 3])
        ret_val = get_typed_value("[]", targettype="list", strict=False)
        self.assertEqual(ret_val, [])
        ret_val = get_typed_value(None, targettype="list", strict=False)
        self.assertEqual(ret_val, [None])
        ret_val = get_typed_value(True, targettype="list", strict=False)
        self.assertEqual(ret_val, [True])

        # TEST: Simplelist
        ret_val = get_typed_value("a,b,c", targettype="simplelist")
        self.assertEqual(ret_val, ["a", "b", "c"])

        # TEST: Dict
        dict_val = {'a': 1, 'b': True}
        ret_val = get_typed_value(dict_val, targettype="dict", strict=True)
        self.assertEqual(ret_val, dict_val)
        ret_val = get_typed_value({}, targettype="dict", strict=True)
        self.assertEqual(ret_val, {})
        with self.assertRaises(BadRequest):
            get_typed_value(None, targettype="dict", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value("{}", targettype="dict", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value("", targettype="dict", strict=True)

        ret_val = get_typed_value("{}", targettype="dict", strict=False)
        self.assertEqual(ret_val, {})
        ret_val = get_typed_value("{'a': 1, 'b': True}",
                                  targettype="dict",
                                  strict=False)
        self.assertEqual(ret_val, dict_val)
        ret_val = get_typed_value("a: 1, b: c, c: True",
                                  targettype="dict",
                                  strict=False)
        self.assertEqual(ret_val, {'a': 1, 'b': 'c', 'c': True})
        ret_val = get_typed_value("a.x: 1, a.y: 2.2, b: false",
                                  targettype="dict",
                                  strict=False)
        self.assertEqual(ret_val, {'a': {'x': 1, 'y': 2.2}, 'b': 'false'})

        # TEST: None
        ret_val = get_typed_value(None, targettype="NoneType", strict=True)
        self.assertEqual(ret_val, None)
        ret_val = get_typed_value(1, targettype="NoneType", strict=True)
        self.assertEqual(ret_val, 1)
        ret_val = get_typed_value(True, targettype="NoneType", strict=True)
        self.assertEqual(ret_val, True)
        ret_val = get_typed_value("foo", targettype="NoneType", strict=True)
        self.assertEqual(ret_val, "foo")
        ret_val = get_typed_value("None", targettype="NoneType", strict=True)
        self.assertEqual(ret_val, "None")

        ret_val = get_typed_value("None", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, None)
        ret_val = get_typed_value("NONE", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, None)
        ret_val = get_typed_value("none", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, None)
        ret_val = get_typed_value("Null", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, None)
        ret_val = get_typed_value("NULL", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, None)
        ret_val = get_typed_value("null", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, None)
        ret_val = get_typed_value("", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, None)

        ret_val = get_typed_value(1, targettype="NoneType", strict=False)
        self.assertEqual(ret_val, 1)
        ret_val = get_typed_value("1", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, 1)
        ret_val = get_typed_value(1.1, targettype="NoneType", strict=False)
        self.assertEqual(ret_val, 1.1)
        ret_val = get_typed_value("1.1", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, 1.1)

        # TEST: Enum
        from interface.objects import SampleEnum
        schema_entry = dict(type="int", enum_type="SampleEnum")
        ret_val = get_typed_value(SampleEnum.MONDAY,
                                  schema_entry=schema_entry,
                                  strict=True)
        self.assertEqual(ret_val, SampleEnum.MONDAY)
        ret_val = get_typed_value("MONDAY",
                                  schema_entry=schema_entry,
                                  strict=True)
        self.assertEqual(ret_val, SampleEnum.MONDAY)
        with self.assertRaises(BadRequest):
            get_typed_value("Monday", schema_entry=schema_entry, strict=True)

        ret_val = get_typed_value("MONDAY",
                                  schema_entry=schema_entry,
                                  strict=False)
        self.assertEqual(ret_val, SampleEnum.MONDAY)
        ret_val = get_typed_value("Monday",
                                  schema_entry=schema_entry,
                                  strict=False)
        self.assertEqual(ret_val, SampleEnum.MONDAY)
        with self.assertRaises(BadRequest):
            get_typed_value("HOLIDAY", schema_entry=schema_entry)

        # TEST: Error conditions
        with self.assertRaises(BadRequest):
            get_typed_value(1)
        with self.assertRaises(BadRequest):
            get_typed_value(1, targettype="FOO")
Example #7
0
    def create_object_from_cfg(self, cfg, objtype, key="resource", prefix="", existing_obj=None):
        """
        Construct an IonObject of a determined type from given config dict with attributes.
        Convert all attributes according to their schema target type. Supports nested objects.
        Supports edit of objects of same type.
        """
        log.trace("Create object type=%s, prefix=%s", objtype, prefix)
        if objtype == "dict":
            schema = None
        else:
            schema = self._get_object_class(objtype)._schema
        obj_fields = {}         # Attributes for IonObject creation as dict
        nested_done = set()      # Names of attributes with nested objects already created
        obj_cfg = get_safe(cfg, key)
        for subkey, value in obj_cfg.iteritems():
            if subkey.startswith(prefix):
                attr = subkey[len(prefix):]
                if '.' in attr:     # We are a parent entry
                    # TODO: Make sure to not create nested object multiple times
                    slidx = attr.find('.')
                    nested_obj_field = attr[:slidx]
                    parent_field = attr[:slidx+1]
                    nested_prefix = prefix + parent_field    # prefix plus nested object name
                    if '[' in nested_obj_field and nested_obj_field[-1] == ']':
                        sqidx = nested_obj_field.find('[')
                        nested_obj_type = nested_obj_field[sqidx+1:-1]
                        nested_obj_field = nested_obj_field[:sqidx]
                    elif objtype == "dict":
                        nested_obj_type = "dict"
                    else:
                        nested_obj_type = schema[nested_obj_field]['type']

                    # Make sure to not create the same nested object twice
                    if parent_field in nested_done:
                        continue

                    # Support direct indexing in a list
                    list_idx = -1
                    if nested_obj_type.startswith("list/"):
                        _, list_idx, nested_obj_type = nested_obj_type.split("/")
                        list_idx = int(list_idx)

                    log.trace("Get nested object field=%s type=%s, prefix=%s", nested_obj_field, nested_obj_type, prefix)
                    nested_obj = self.create_object_from_cfg(cfg, nested_obj_type, key, nested_prefix)

                    if list_idx >= 0:
                        my_list = obj_fields.setdefault(nested_obj_field, [])
                        if list_idx >= len(my_list):
                            my_list[len(my_list):list_idx] = [None]*(list_idx-len(my_list)+1)
                        my_list[list_idx] = nested_obj
                    else:
                        obj_fields[nested_obj_field] = nested_obj

                    nested_done.add(parent_field)

                elif objtype == "dict":
                    # TODO: What about type?
                    obj_fields[attr] = value

                elif attr in schema:    # We are the leaf attribute
                    try:
                        if value:
                            fieldvalue = get_typed_value(value, schema[attr])
                            obj_fields[attr] = fieldvalue
                    except Exception:
                        log.warn("Object type=%s, prefix=%s, field=%s cannot be converted to type=%s. Value=%s",
                            objtype, prefix, attr, schema[attr]['type'], value, exc_info=True)
                        #fieldvalue = str(fieldvalue)
                else:
                    # warn about unknown fields just once -- not on each row
                    log.warn("Skipping unknown field in %s: %s%s", objtype, prefix, attr)

        if objtype == "dict":
            obj = obj_fields
        else:
            if existing_obj:
                # Edit attributes
                if existing_obj.type_ != objtype:
                    raise Inconsistent("Cannot edit resource. Type mismatch old=%s, new=%s" % (existing_obj.type_, objtype))
                # TODO: Don't edit empty nested attributes
                for attr in list(obj_fields.keys()):
                    if not obj_fields[attr]:
                        del obj_fields[attr]
                for attr in ('alt_ids','_id','_rev','type_'):
                    if attr in obj_fields:
                        del obj_fields[attr]
                existing_obj.__dict__.update(obj_fields)
                log.trace("Update object type %s using field names %s", objtype, obj_fields.keys())
                obj = existing_obj
            else:
                if cfg.get(KEY_ID, None) and 'alt_ids' in schema:
                    if 'alt_ids' in obj_fields:
                        obj_fields['alt_ids'].append("PRE:"+cfg[KEY_ID])
                    else:
                        obj_fields['alt_ids'] = ["PRE:"+cfg[KEY_ID]]

                log.trace("Create object type %s from field names %s", objtype, obj_fields.keys())
                obj = IonObject(objtype, **obj_fields)
        return obj
Example #8
0
    def create_object_from_cfg(self, cfg, objtype, key="resource", prefix="", existing_obj=None):
        """
        Construct an IonObject of a determined type from given config dict with attributes.
        Convert all attributes according to their schema target type. Supports nested objects.
        Supports edit of objects of same type.
        """
        log.trace("Create object type=%s, prefix=%s", objtype, prefix)
        if objtype == "dict":
            schema = None
        else:
            schema = self._get_object_class(objtype)._schema
        obj_fields = {}         # Attributes for IonObject creation as dict
        nested_done = set()      # Names of attributes with nested objects already created
        obj_cfg = get_safe(cfg, key)
        for subkey, value in obj_cfg.iteritems():
            if subkey.startswith(prefix):
                attr = subkey[len(prefix):]
                if '.' in attr:     # We are a parent entry
                    # TODO: Make sure to not create nested object multiple times
                    slidx = attr.find('.')
                    nested_obj_field = attr[:slidx]
                    parent_field = attr[:slidx+1]
                    nested_prefix = prefix + parent_field    # prefix plus nested object name
                    if '[' in nested_obj_field and nested_obj_field[-1] == ']':
                        sqidx = nested_obj_field.find('[')
                        nested_obj_type = nested_obj_field[sqidx+1:-1]
                        nested_obj_field = nested_obj_field[:sqidx]
                    elif objtype == "dict":
                        nested_obj_type = "dict"
                    else:
                        nested_obj_type = schema[nested_obj_field]['type']

                    # Make sure to not create the same nested object twice
                    if parent_field in nested_done:
                        continue

                    # Support direct indexing in a list
                    list_idx = -1
                    if nested_obj_type.startswith("list/"):
                        _, list_idx, nested_obj_type = nested_obj_type.split("/")
                        list_idx = int(list_idx)

                    log.trace("Get nested object field=%s type=%s, prefix=%s", nested_obj_field, nested_obj_type, prefix)
                    nested_obj = self.create_object_from_cfg(cfg, nested_obj_type, key, nested_prefix)

                    if list_idx >= 0:
                        my_list = obj_fields.setdefault(nested_obj_field, [])
                        if list_idx >= len(my_list):
                            my_list[len(my_list):list_idx] = [None]*(list_idx-len(my_list)+1)
                        my_list[list_idx] = nested_obj
                    else:
                        obj_fields[nested_obj_field] = nested_obj

                    nested_done.add(parent_field)

                elif objtype == "dict":
                    # TODO: What about type?
                    obj_fields[attr] = value

                elif attr in schema:    # We are the leaf attribute
                    try:
                        if value:
                            fieldvalue = get_typed_value(value, schema[attr])
                            obj_fields[attr] = fieldvalue
                    except Exception:
                        log.warn("Object type=%s, prefix=%s, field=%s cannot be converted to type=%s. Value=%s",
                            objtype, prefix, attr, schema[attr]['type'], value, exc_info=True)
                        #fieldvalue = str(fieldvalue)
                else:
                    # warn about unknown fields just once -- not on each row
                    log.warn("Skipping unknown field in %s: %s%s", objtype, prefix, attr)

        if objtype == "dict":
            obj = obj_fields
        else:
            if existing_obj:
                # Edit attributes
                if existing_obj.type_ != objtype:
                    raise Inconsistent("Cannot edit resource. Type mismatch old=%s, new=%s" % (existing_obj.type_, objtype))
                # TODO: Don't edit empty nested attributes
                for attr in list(obj_fields.keys()):
                    if not obj_fields[attr]:
                        del obj_fields[attr]
                for attr in ('alt_ids','_id','_rev','type_'):
                    if attr in obj_fields:
                        del obj_fields[attr]
                existing_obj.__dict__.update(obj_fields)
                log.trace("Update object type %s using field names %s", objtype, obj_fields.keys())
                obj = existing_obj
            else:
                if cfg.get(KEY_ID, None) and 'alt_ids' in schema:
                    if 'alt_ids' in obj_fields:
                        obj_fields['alt_ids'].append("PRE:"+cfg[KEY_ID])
                    else:
                        obj_fields['alt_ids'] = ["PRE:"+cfg[KEY_ID]]

                log.trace("Create object type %s from field names %s", objtype, obj_fields.keys())
                obj = IonObject(objtype, **obj_fields)
        return obj
Example #9
0
    def test_get_typed_value(self):
        # TEST: Integers
        ret_val = get_typed_value(999, targettype="int", strict=True)
        self.assertEqual(ret_val, 999)
        with self.assertRaises(BadRequest):
            get_typed_value("999", targettype="int", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value("999.9", targettype="int", strict=False)
        with self.assertRaises(BadRequest):
            get_typed_value(None, targettype="int", strict=False)
        with self.assertRaises(BadRequest):
            get_typed_value("", targettype="int", strict=False)
        ret_val = get_typed_value("999", targettype="int", strict=False)
        self.assertEqual(ret_val, 999)
        long_val = 9999999999999999999
        self.assertEqual(type(long_val), long)
        ret_val = get_typed_value(long_val, targettype="int", strict=True)
        self.assertEqual(ret_val, long_val)

        schema_entry = dict(type="int")
        ret_val = get_typed_value(999, schema_entry=schema_entry, strict=True)
        self.assertEqual(ret_val, 999)

        # TEST: Float
        ret_val = get_typed_value(999.9, targettype="float", strict=True)
        self.assertEqual(ret_val, 999.9)
        with self.assertRaises(BadRequest):
            get_typed_value("999.9", targettype="float", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value(None, targettype="float", strict=False)
        with self.assertRaises(BadRequest):
            get_typed_value("", targettype="float", strict=False)
        ret_val = get_typed_value("999.9", targettype="float", strict=False)
        self.assertEqual(ret_val, 999.9)

        # TEST: String
        ret_val = get_typed_value("foo", targettype="str", strict=True)
        self.assertEqual(ret_val, "foo")
        with self.assertRaises(BadRequest):
            get_typed_value(999, targettype="str", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value(None, targettype="str", strict=True)
        ret_val = get_typed_value(999, targettype="str", strict=False)
        self.assertEqual(ret_val, "999")
        ret_val = get_typed_value(True, targettype="str", strict=False)
        self.assertEqual(ret_val, "True")
        unicode_val = u'foo \u20ac foo'
        ret_val = get_typed_value(unicode_val, targettype="str", strict=True)
        self.assertEqual(type(ret_val), str)
        self.assertEqual(ret_val, "foo \xe2\x82\xac foo")

        # TEST: Bool
        ret_val = get_typed_value(True, targettype="bool", strict=True)
        self.assertEqual(ret_val, True)
        ret_val = get_typed_value(False, targettype="bool", strict=True)
        self.assertEqual(ret_val, False)
        with self.assertRaises(BadRequest):
            get_typed_value("True", targettype="bool", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value(None, targettype="bool", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value("", targettype="bool", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value(123, targettype="bool", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value(0, targettype="bool", strict=True)
        ret_val = get_typed_value("True", targettype="bool", strict=False)
        self.assertEqual(ret_val, True)
        ret_val = get_typed_value("true", targettype="bool", strict=False)
        self.assertEqual(ret_val, True)
        ret_val = get_typed_value("TRUE", targettype="bool", strict=False)
        self.assertEqual(ret_val, True)
        ret_val = get_typed_value("1", targettype="bool", strict=False)
        self.assertEqual(ret_val, True)
        ret_val = get_typed_value(1, targettype="bool", strict=False)
        self.assertEqual(ret_val, True)
        ret_val = get_typed_value("False", targettype="bool", strict=False)
        self.assertEqual(ret_val, False)
        ret_val = get_typed_value("FALSE", targettype="bool", strict=False)
        self.assertEqual(ret_val, False)
        ret_val = get_typed_value("false", targettype="bool", strict=False)
        self.assertEqual(ret_val, False)
        ret_val = get_typed_value("0", targettype="bool", strict=False)
        self.assertEqual(ret_val, False)
        ret_val = get_typed_value("", targettype="bool", strict=False)
        self.assertEqual(ret_val, False)
        ret_val = get_typed_value(None, targettype="bool", strict=False)
        self.assertEqual(ret_val, False)
        with self.assertRaises(BadRequest):
            get_typed_value("F", targettype="bool", strict=False)
        with self.assertRaises(BadRequest):
            get_typed_value("Falsy", targettype="bool", strict=False)
        with self.assertRaises(BadRequest):
            get_typed_value("Truey", targettype="bool", strict=False)
        with self.assertRaises(BadRequest):
            get_typed_value(" True", targettype="bool", strict=False)

        # TEST: List
        list_val = [1, True, "foo"]
        ret_val = get_typed_value(list_val, targettype="list", strict=True)
        self.assertEqual(ret_val, list_val)
        ret_val = get_typed_value([], targettype="list", strict=True)
        self.assertEqual(ret_val, [])
        with self.assertRaises(BadRequest):
            get_typed_value(None, targettype="list", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value("[]", targettype="list", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value("", targettype="list", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value(tuple(), targettype="list", strict=True)

        ret_val = get_typed_value(1, targettype="list", strict=False)
        self.assertEqual(ret_val, [1])
        ret_val = get_typed_value(tuple(list_val), targettype="list", strict=False)
        self.assertEqual(ret_val, list_val)
        ret_val = get_typed_value(set(list_val), targettype="list", strict=False)
        self.assertEqual(type(ret_val), list)
        self.assertEqual(set(ret_val), set(list_val))
        ret_val = get_typed_value("1", targettype="list", strict=False)
        self.assertEqual(ret_val, ["1"])
        ret_val = get_typed_value("a,b,c", targettype="list", strict=False)
        self.assertEqual(ret_val, ["a", "b", "c"])
        ret_val = get_typed_value("[a,b,c]", targettype="list", strict=False)
        self.assertEqual(ret_val, ["a", "b", "c"])
        ret_val = get_typed_value("['a','b',3]", targettype="list", strict=False)
        self.assertEqual(ret_val, ["a", "b", 3])
        ret_val = get_typed_value("[]", targettype="list", strict=False)
        self.assertEqual(ret_val, [])
        ret_val = get_typed_value(None, targettype="list", strict=False)
        self.assertEqual(ret_val, [None])
        ret_val = get_typed_value(True, targettype="list", strict=False)
        self.assertEqual(ret_val, [True])

        # TEST: Simplelist
        ret_val = get_typed_value("a,b,c", targettype="simplelist")
        self.assertEqual(ret_val, ["a", "b", "c"])

        # TEST: Dict
        dict_val = {'a': 1, 'b': True}
        ret_val = get_typed_value(dict_val, targettype="dict", strict=True)
        self.assertEqual(ret_val, dict_val)
        ret_val = get_typed_value({}, targettype="dict", strict=True)
        self.assertEqual(ret_val, {})
        with self.assertRaises(BadRequest):
            get_typed_value(None, targettype="dict", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value("{}", targettype="dict", strict=True)
        with self.assertRaises(BadRequest):
            get_typed_value("", targettype="dict", strict=True)

        ret_val = get_typed_value("{}", targettype="dict", strict=False)
        self.assertEqual(ret_val, {})
        ret_val = get_typed_value("{'a': 1, 'b': True}", targettype="dict", strict=False)
        self.assertEqual(ret_val, dict_val)
        ret_val = get_typed_value("a: 1, b: c, c: True", targettype="dict", strict=False)
        self.assertEqual(ret_val, {'a': 1, 'b': 'c', 'c': True})
        ret_val = get_typed_value("a.x: 1, a.y: 2.2, b: false", targettype="dict", strict=False)
        self.assertEqual(ret_val, {'a': {'x': 1, 'y': 2.2}, 'b': 'false'})

        # TEST: None
        ret_val = get_typed_value(None, targettype="NoneType", strict=True)
        self.assertEqual(ret_val, None)
        ret_val = get_typed_value(1, targettype="NoneType", strict=True)
        self.assertEqual(ret_val, 1)
        ret_val = get_typed_value(True, targettype="NoneType", strict=True)
        self.assertEqual(ret_val, True)
        ret_val = get_typed_value("foo", targettype="NoneType", strict=True)
        self.assertEqual(ret_val, "foo")
        ret_val = get_typed_value("None", targettype="NoneType", strict=True)
        self.assertEqual(ret_val, "None")

        ret_val = get_typed_value("None", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, None)
        ret_val = get_typed_value("NONE", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, None)
        ret_val = get_typed_value("none", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, None)
        ret_val = get_typed_value("Null", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, None)
        ret_val = get_typed_value("NULL", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, None)
        ret_val = get_typed_value("null", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, None)
        ret_val = get_typed_value("", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, None)

        ret_val = get_typed_value(1, targettype="NoneType", strict=False)
        self.assertEqual(ret_val, 1)
        ret_val = get_typed_value("1", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, 1)
        ret_val = get_typed_value(1.1, targettype="NoneType", strict=False)
        self.assertEqual(ret_val, 1.1)
        ret_val = get_typed_value("1.1", targettype="NoneType", strict=False)
        self.assertEqual(ret_val, 1.1)

        # TEST: Enum
        from interface.objects import SampleEnum
        schema_entry = dict(type="int", enum_type="SampleEnum")
        ret_val = get_typed_value(SampleEnum.MONDAY, schema_entry=schema_entry, strict=True)
        self.assertEqual(ret_val, SampleEnum.MONDAY)
        ret_val = get_typed_value("MONDAY", schema_entry=schema_entry, strict=True)
        self.assertEqual(ret_val, SampleEnum.MONDAY)
        with self.assertRaises(BadRequest):
            get_typed_value("Monday", schema_entry=schema_entry, strict=True)

        ret_val = get_typed_value("MONDAY", schema_entry=schema_entry, strict=False)
        self.assertEqual(ret_val, SampleEnum.MONDAY)
        ret_val = get_typed_value("Monday", schema_entry=schema_entry, strict=False)
        self.assertEqual(ret_val, SampleEnum.MONDAY)
        with self.assertRaises(BadRequest):
            get_typed_value("HOLIDAY", schema_entry=schema_entry)

        # TEST: Error conditions
        with self.assertRaises(BadRequest):
            get_typed_value(1)
        with self.assertRaises(BadRequest):
            get_typed_value(1, targettype="FOO")