Repository: Azure/msrest-for-python

Issue:
Improve msrest exception message
msrest.exceptions : Parameter 'tags' must be of type '{str}'

Discussion:
codecov-io: # [Codecov](https://codecov.io/gh/Azure/msrest-for-python/pull/188?src=pr&el=h1) Report
> Merging [#188](https://codecov.io/gh/Azure/msrest-for-python/pull/188?src=pr&el=desc) into [master](https://codecov.io/gh/Azure/msrest-for-python/commit/4a0a44ae6d1a0d8a196a7809d54f2a52c2c27479?src=pr&el=desc) will **increase** coverage by `0.06%`.
> The diff coverage is `100%`.

[![Impacted file tree graph](https://codecov.io/gh/Azure/msrest-for-python/pull/188/graphs/tree.svg?width=650&token=Lny6ZO1MUF&height=150&src=pr)](https://codecov.io/gh/Azure/msrest-for-python/pull/188?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master     #188      +/-   ##
==========================================
+ Coverage   87.89%   87.95%   +0.06%     
==========================================
  Files          25       25              
  Lines        2593     2598       +5     
==========================================
+ Hits         2279     2285       +6     
+ Misses        314      313       -1
```


| [Impacted Files](https://codecov.io/gh/Azure/msrest-for-python/pull/188?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [msrest/exceptions.py](https://codecov.io/gh/Azure/msrest-for-python/pull/188/diff?src=pr&el=tree#diff-bXNyZXN0L2V4Y2VwdGlvbnMucHk=) | `98.73% <100%> (+0.08%)` | :arrow_up: |
| [msrest/serialization.py](https://codecov.io/gh/Azure/msrest-for-python/pull/188/diff?src=pr&el=tree#diff-bXNyZXN0L3NlcmlhbGl6YXRpb24ucHk=) | `91.22% <0%> (+0.1%)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/Azure/msrest-for-python/pull/188?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/Azure/msrest-for-python/pull/188?src=pr&el=footer). Last update [4a0a44a...3832c06](https://codecov.io/gh/Azure/msrest-for-python/pull/188?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).


Patch:
diff --git a/msrest/exceptions.py b/msrest/exceptions.py
index 31bedf0..dcd14d2 100644
--- a/msrest/exceptions.py
+++ b/msrest/exceptions.py
@@ -107,6 +107,13 @@ class ValidationError(ClientException):
         "type": "must be of type {!r}"
     }
 
+    @staticmethod
+    def _format_message(rule, reason, value):
+        if rule == "type" and value.startswith(r"{"):
+            internal_type = value.strip(r"{}")
+            value = "dict[str, {}]".format(internal_type)
+        return reason.format(value)
+
     def __init__(self, rule, target, value, *args, **kwargs):
         # type: (str, str, str, str, str) -> None
         self.rule = rule
@@ -114,7 +121,7 @@ class ValidationError(ClientException):
         message = "Parameter {!r} ".format(target)
         reason = self._messages.get(
             rule, "failed to meet validation requirement.")
-        message += reason.format(value)
+        message += self._format_message(rule, reason, value)
         super(ValidationError, self).__init__(message, *args, **kwargs)
 
 


Test patch:
diff --git a/tests/test_serialization.py b/tests/test_serialization.py
index 399d963..00d253c 100644
--- a/tests/test_serialization.py
+++ b/tests/test_serialization.py
@@ -709,6 +709,10 @@ class TestRuntimeSerialized(unittest.TestCase):
         with self.assertRaises(SerializationError):
             self.s._serialize(test_obj)
 
+        with pytest.raises(ValidationError) as err:
+            test_obj.validate()
+        assert "Parameter 'attr_e' must be of type 'dict[str, float]'" in str(err.value)
+
         test_obj.attr_e = {"value": "NotAFloat"}
 
         with self.assertRaises(SerializationError):
@@ -1290,7 +1294,7 @@ class TestRuntimeSerialized(unittest.TestCase):
             long_type = long
         except NameError:
             long_type = int
- 
+
 
         class TestModel(Model):
             _attribute_map = {'data': {'key': 'data', 'type': 'object'}}