----- Original Message -----
> On 12.11.2012 12:50, Lynn Root wrote:
> >
> >
> > Lynn Root
> > Associate Software Engineer
> > Red Hat
> >
> > ----- Original Message -----
> >> From: "Jan Cholasta" <jchol...@redhat.com>
> >> To: "Lynn Root" <lr...@redhat.com>
> >> Cc: freeipa-devel@redhat.com
> >> Sent: Friday, November 9, 2012 3:25:20 PM
> >> Subject: Re: [Freeipa-devel] [PATCH] Switch %r specifiers to %s in
> >> Public errors
> >>
> >> On 8.11.2012 17:22, Lynn Root wrote:
> >>> Hmm I hope I understand well enough this time around.
> >>>
> >>> However, when I run the tests, there's this one error message I
> >>> come across from `test_user[97]: user_add: Create u'tuser2'` - it
> >>> throws `DatabaseError: Type or value exists`.  I'm a bit lost on
> >>> how to track this down.
> >>>
> >>> Once again - thanks for your help!
> >>>
> >>> Lynn Root
> >>> Associate Software Engineer
> >>> Red Hat
> >>>
> >>> ----- Original Message -----
> >>> From: "Martin Kosek" <mko...@redhat.com>
> >>> To: "Jan Cholasta" <jchol...@redhat.com>
> >>> Cc: "Lynn Root" <lr...@redhat.com>, freeipa-devel@redhat.com
> >>> Sent: Thursday, November 8, 2012 8:46:42 AM
> >>> Subject: Re: [Freeipa-devel] [PATCH] Switch %r specifiers to %s
> >>> in
> >>> Public errors
> >>>
> >>> On 11/07/2012 06:46 PM, Jan Cholasta wrote:
> >>>> On 7.11.2012 16:08, Lynn Root wrote:
> >>>>> Third time is a charm?
> >>>>>
> >>>>> Lynn Root
> >>>>> Associate Software Engineer
> >>>>> Red Hat
> >>>>>
> >>>>> ----- Original Message -----
> >>>>> From: "Jan Cholasta" <jchol...@redhat.com>
> >>>>> To: "Lynn Root" <lr...@redhat.com>
> >>>>> Cc: freeipa-devel@redhat.com
> >>>>> Sent: Monday, November 5, 2012 10:25:32 AM
> >>>>> Subject: Re: [Freeipa-devel] [PATCH] Switch %r specifiers to %s
> >>>>> in Public errors
> >>>>>
> >>>>> On 5.11.2012 09:43, Lynn Root wrote:
> >>>>>> Here's try #2! Adjusted patch attached.  Let me know if
> >>>>>> there's
> >>>>>> anything
> >>>>>> else I've missed.
> >>>>>>
> >>>>>> Switched %r specifiers to '%s' in Public errors, and adjusted
> >>>>>> tests to
> >>>>>> expect no preceding 'u'.
> >>>>>>
> >>>>>> Tickets: https://fedorahosted.org/freeipa/ticket/3121 &
> >>>>>> https://fedorahosted.org/freeipa/ticket/2588
> >>>>>>
> >>>>>> Lynn Root
> >>>>>> Associate Software Engineer
> >>>>>> Red Hat
> >>>>>>
> >>>>>> ----- Original Message -----
> >>>>>> From: "Martin Kosek" <mko...@redhat.com>
> >>>>>> To: "Jan Cholasta" <jchol...@redhat.com>
> >>>>>> Cc: "Lynn Root" <lr...@redhat.com>, freeipa-devel@redhat.com
> >>>>>> Sent: Tuesday, October 30, 2012 9:08:33 AM
> >>>>>> Subject: Re: [Freeipa-devel] [PATCH] Switch %r specifiers to
> >>>>>> %s
> >>>>>> in Public
> >>>>>> errors
> >>>>>>
> >>>>>> On 10/30/2012 09:04 AM, Jan Cholasta wrote:
> >>>>>>> Hi,
> >>>>>>>
> >>>>>>> On 29.10.2012 19:54, Lynn Root wrote:
> >>>>>>>> Hi all!
> >>>>>>>>
> >>>>>>>> This switch drops the preceding 'u' from strings in public
> >>>>>>>> error messages.
> >>>>>>>>
> >>>>>>>> Ticket: https://fedorahosted.org/freeipa/ticket/3121
> >>>>>>>>
> >>>>>>>> This patch also addresses the unfriendly 'u' from re-raising
> >>>>>>>> errors from the
> >>>>>>>> external call to netaddr.IPAddress by passing a bytestring
> >>>>>>>> to
> >>>>>>>> the function.
> >>>>>>>>
> >>>>>>>> Ticket: https://fedorahosted.org/freeipa/ticket/2588
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> My first patch (and freeipa dev list email) ever! Let me
> >>>>>>>> know
> >>>>>>>> where there's
> >>>>>>>> room to improve.
> >>>>>>>>
> >>>>>>>> Lynn Root
> >>>>>>>> Associate Software Engineer
> >>>>>>>> Red Hat
> >>>>>>>>
> >>>>>>>
> >>>>>>> I think it would be nice if you kept the quotes around the
> >>>>>>> values, as that is
> >>>>>>> probably the reason "%r" was used in the first place - i.e.
> >>>>>>> use
> >>>>>>> "'%s'" instead
> >>>>>>> of plain "%s".
> >>>>>>
> >>>>>> +1
> >>>>>>
> >>>>>> With current patch, I assume that a lot of unit tests will
> >>>>>> fail
> >>>>>> as they check
> >>>>>> exact error message wording. I'd recommend running the whole
> >>>>>> test suite with
> >>>>>> your second patch revision. There is a short walkthrough how
> >>>>>> to
> >>>>>> set it up:
> >>>>>>
> >>>>>> http://freeipa.org/page/Testing
> >>>>>>
> >>>>>> Martin
> >>>>>>
> >>>>>
> >>>>> You missed a few:
> >>>>>
> >>>>> $ git grep -En '%(\(.*?\))?r'
> >>>>>
> >>>>> Honza
> >>>>>
> >>>>
> >>>> I think you have gone too far this time :-) It is not necessary
> >>>> (or wise) to
> >>>> get rid of %r *everywhere* in the code.
> >>>
> >>> Thanks Honza for pointing that out. It seems I missed that in
> >>> yesterday's
> >>> review. Now, when I look at it, it indeed is not right.
> >>>
> >>>>
> >>>> A few rules to keep in mind:
> >>>>
> >>>>     * If it is not an error message, do not touch it (log
> >>>>     messages
> >>>>     are not error
> >>>> messages BTW).
> >>>>
> >>>>     * If it is an error message for an exception that does not
> >>>>     inherit from
> >>>> errors.PublicError, do not touch it (there might be a few
> >>>> exceptions, though).
> >>>
> >>> Right. But for example, your netaddr str conversions should be
> >>> fine
> >>> since the
> >>> netaddr error is propagated up to the ValidationError.
> >>>
> >>> Martin
> >>>
> >>>>
> >>>>     * Use '%s' (%s with ticks) only for arguments whose value
> >>>>     can
> >>>>     be only str or
> >>>> unicode.
> >>>>
> >>>> Honza
> >>>>
> >>>
> >>
> >> This is better, thanks.
> >>
> >> In OverlapError.format, remove the ticks around %s, as we expect a
> >> list
> >> here (I think we could make it look prettier, similar to what
> >> Martin
> >> did
> >> in
> >> <https://fedorahosted.org/freeipa/changeset/988ea368272822f2153563ad34554240e3377d60/>,
> >> but I'm not sure if we want to do it in this ticket/patch).
> >>
> >
> > Fixed, ty.
> >
> >> I'm not sure what to do about the ValidationError at
> >> ipalib/parameters.py:882 and ipalib/parameters.py:1171. I think it
> >> should be "TypeError(TYPE_ERROR % (self.name, self.type, value,
> >> type(value)))" instead, as by the time parameters are validated
> >> they
> >> are
> >> the right type.
> >
> > Done - with adjusted tests.
> 
> Thanks, but please refer to me as jchol...@redhat.com in the commit
> message, so that people don't have to look me up.
> 

Fixed.

> >
> >>
> >> Also there is one %r you missed in ipalib/parameters.py:1554.
> >
> > The tests seem to be expecting a unicode character - are you sure
> > this is right?
> 
> Currently the message the error produces has two ticks on each side
> of
> the value, which is ugly. So, replace the "\'%(char)r\'" with either
> "\'%(char)s\'" or "%(char)r".

Ah now I see - fixed.

> 
> >
> > If not - attached is the new patch (correctly formatted).
> >
> > Thanks again!
> >
> >>
> >> Honza
> >>
> >> --
> >> Jan Cholasta
> >>
> 
> Honza
> 
> --
> Jan Cholasta
> 


Lynn Root
Associate Software Engineer
Red Hat
From 0a36085bf8978d078561bef27e6382ae1a4c8fa7 Mon Sep 17 00:00:00 2001
From: Lynn Root <lr...@redhat.com>
Date: Thu, 8 Nov 2012 10:06:35 -0500
Subject: [PATCH] Switch %r specifiers to '%s' in Public errors

This switch drops the preceding 'u' from strings within Public error messages.

This patch also addresses the related unfriendly 'u' from re-raising errors from netaddr.IPAddress by passing a bytestring through the function.

Also switched ValidationError to TypeError in validate_scalar per jchola...@redhat.com.

Ticket: https://fedorahosted.org/freeipa/ticket/3121
Ticket: https://fedorahosted.org/freeipa/ticket/2588
---
 ipalib/constants.py                  |  2 +-
 ipalib/errors.py                     | 36 ++++++++++++++++++------------------
 ipalib/parameters.py                 | 16 ++++++----------
 ipalib/plugins/dns.py                |  6 +++---
 ipalib/util.py                       |  2 +-
 ipapython/ipautil.py                 |  6 +++---
 tests/test_ipalib/test_parameters.py | 18 +++++++++---------
 tests/test_xmlrpc/test_dns_plugin.py |  4 ++--
 8 files changed, 43 insertions(+), 47 deletions(-)

diff --git a/ipalib/constants.py b/ipalib/constants.py
index 81db020..7970994 100644
--- a/ipalib/constants.py
+++ b/ipalib/constants.py
@@ -39,7 +39,7 @@ NULLS = (None, '', u'', tuple(), [])
 NAME_REGEX = r'^[a-z][_a-z0-9]*[a-z0-9]$|^[a-z]$'
 
 # Format for ValueError raised when name does not match above regex:
-NAME_ERROR = 'name must match %r; got %r'
+NAME_ERROR = "name must match '%s'; got '%s'"
 
 # Standard format for TypeError message:
 TYPE_ERROR = '%s: need a %r; got %r (a %r)'
diff --git a/ipalib/errors.py b/ipalib/errors.py
index a6c8e76..a391ada 100644
--- a/ipalib/errors.py
+++ b/ipalib/errors.py
@@ -166,7 +166,7 @@ class PluginSubclassError(PrivateError):
 
     """
 
-    format  = '%(plugin)r not subclass of any base in %(bases)r'
+    format = '%(plugin)r not subclass of any base in %(bases)r'
 
 
 class PluginDuplicateError(PrivateError):
@@ -311,7 +311,7 @@ class VersionError(PublicError):
     """
 
     errno = 901
-    format = _('%(cver)s client incompatible with %(sver)s server at %(server)r')
+    format = _("%(cver)s client incompatible with %(sver)s server at '%(server)s'")
 
 
 class UnknownError(PublicError):
@@ -367,7 +367,7 @@ class ServerInternalError(PublicError):
     """
 
     errno = 904
-    format = _('an internal error has occurred on server at %(server)r')
+    format = _("an internal error has occurred on server at '%(server)s'")
 
 
 class CommandError(PublicError):
@@ -383,7 +383,7 @@ class CommandError(PublicError):
     """
 
     errno = 905
-    format = _('unknown command %(name)r')
+    format = _("unknown command '%(name)s'")
 
 
 class ServerCommandError(PublicError):
@@ -400,7 +400,7 @@ class ServerCommandError(PublicError):
     """
 
     errno = 906
-    format = _('error on server %(server)r: %(error)s')
+    format = _("error on server '%(server)s': %(error)s")
 
 
 class NetworkError(PublicError):
@@ -416,7 +416,7 @@ class NetworkError(PublicError):
     """
 
     errno = 907
-    format = _('cannot connect to %(uri)r: %(error)s')
+    format = _("cannot connect to '%(uri)s': %(error)s")
 
 
 class ServerNetworkError(PublicError):
@@ -425,7 +425,7 @@ class ServerNetworkError(PublicError):
     """
 
     errno = 908
-    format = _('error on server %(server)r: %(error)s')
+    format = _("error on server '%(server)s': %(error)s")
 
 
 class JSONError(PublicError):
@@ -526,7 +526,7 @@ class ServiceError(KerberosError):
     """
 
     errno = 1102
-    format = _('Service %(service)r not found in Kerberos database')
+    format = _("Service '%(service)s' not found in Kerberos database")
 
 
 class NoCCacheError(KerberosError):
@@ -688,7 +688,7 @@ class ZeroArgumentError(InvocationError):
     """
 
     errno = 3003
-    format = _('command %(name)r takes no arguments')
+    format = _("command '%(name)s' takes no arguments")
 
 
 class MaxArgumentError(InvocationError):
@@ -708,8 +708,8 @@ class MaxArgumentError(InvocationError):
     def __init__(self, message=None, **kw):
         if message is None:
             format = ungettext(
-                'command %(name)r takes at most %(count)d argument',
-                'command %(name)r takes at most %(count)d arguments',
+                "command '%(name)s' takes at most %(count)d argument",
+                "command '%(name)s' takes at most %(count)d arguments",
                 kw['count']
             )
         else:
@@ -738,7 +738,7 @@ class OverlapError(InvocationError):
     """
 
     errno = 3006
-    format = _('overlapping arguments and options: %(names)r')
+    format = _("overlapping arguments and options: %(names)s")
 
 
 class RequirementError(InvocationError):
@@ -754,7 +754,7 @@ class RequirementError(InvocationError):
     """
 
     errno = 3007
-    format = _('%(name)r is required')
+    format = _("'%(name)s' is required")
 
 
 class ConversionError(InvocationError):
@@ -770,7 +770,7 @@ class ConversionError(InvocationError):
     """
 
     errno = 3008
-    format = _('invalid %(name)r: %(error)s')
+    format = _("invalid '%(name)s': %(error)s")
 
 
 class ValidationError(InvocationError):
@@ -786,7 +786,7 @@ class ValidationError(InvocationError):
     """
 
     errno = 3009
-    format = _('invalid %(name)r: %(error)s')
+    format = _("invalid '%(name)s': %(error)s")
 
 
 class NoSuchNamespaceError(InvocationError):
@@ -802,7 +802,7 @@ class NoSuchNamespaceError(InvocationError):
     """
 
     errno = 3010
-    format = _('api has no such namespace: %(name)r')
+    format = _("api has no such namespace: '%(name)s'")
 
 
 class PasswordMismatch(InvocationError):
@@ -978,7 +978,7 @@ class MalformedUserPrincipal(ExecutionError):
     """
 
     errno = 4008
-    format = _('Principal is not of the form user@REALM: %(principal)r')
+    format = _("Principal is not of the form user@REALM: '%(principal)s'")
 
 class AlreadyActive(ExecutionError):
     """
@@ -1357,7 +1357,7 @@ class HelpError(BuiltinError):
     """
 
     errno = 4101
-    format = _('no command nor help topic %(topic)r')
+    format = _("no command nor help topic '%(topic)s'")
 
 
 class LDAPError(ExecutionError):
diff --git a/ipalib/parameters.py b/ipalib/parameters.py
index b3a75f2..670e036 100644
--- a/ipalib/parameters.py
+++ b/ipalib/parameters.py
@@ -879,10 +879,8 @@ class Param(ReadOnly):
 
     def _validate_scalar(self, value, index=None):
         if type(value) is not self.type:
-            raise ValidationError(name=self.name,
-                error='need a %r; got %r (a %r)' % (
-                    self.type, value, type(value)
-                )
+            raise TypeError(
+                TYPE_ERROR % (self.name, self.type, value, type(value))
             )
         if index is not None and type(index) is not int:
             raise TypeError(
@@ -1167,11 +1165,9 @@ class Int(Number):
         the exception that it allows both int and long types. The
         min/max rules handle size enforcement.
         """
-        if type(value)  not in (int, long):
-            raise ValidationError(name=self.name,
-                error='need a %r; got %r (a %r)' % (
-                    self.type, value, type(value)
-                )
+        if type(value) not in (int, long):
+            raise TypeError(
+                TYPE_ERROR % (self.name, self.type, value, type(value))
             )
         if index is not None and type(index) is not int:
             raise TypeError(
@@ -1553,7 +1549,7 @@ class IA5Str(Str):
                 if ord(value[i]) > 127:
                     raise ConversionError(name=self.get_param_name(),
                         index=index,
-                        error=_('The character \'%(char)r\' is not allowed.') %
+                        error=_('The character %(char)r is not allowed.') %
                             dict(char=value[i],)
                     )
         return super(IA5Str, self)._convert_scalar(value, index)
diff --git a/ipalib/plugins/dns.py b/ipalib/plugins/dns.py
index febd4d1..626e27d 100644
--- a/ipalib/plugins/dns.py
+++ b/ipalib/plugins/dns.py
@@ -256,7 +256,7 @@ def _create_zone_serial():
 
 def _reverse_zone_name(netstr):
     try:
-        netaddr.IPAddress(netstr)
+        netaddr.IPAddress(str(netstr))
     except (netaddr.AddrFormatError, ValueError):
         pass
     else:
@@ -274,7 +274,7 @@ def _reverse_zone_name(netstr):
 
 def _validate_ipaddr(ugettext, ipaddr, ip_version=None):
     try:
-        ip = netaddr.IPAddress(ipaddr, flags=netaddr.INET_PTON)
+        ip = netaddr.IPAddress(str(ipaddr), flags=netaddr.INET_PTON)
 
         if ip_version is not None:
             if ip.version != ip_version:
@@ -441,7 +441,7 @@ def add_forward_record(zone, name, str_address):
         pass # the entry already exists and matches
 
 def get_reverse_zone(ipaddr, prefixlen=None):
-    ip = netaddr.IPAddress(ipaddr)
+    ip = netaddr.IPAddress(str(ipaddr))
     revdns = unicode(ip.reverse_dns)
 
     if prefixlen is None:
diff --git a/ipalib/util.py b/ipalib/util.py
index 3fe5c9f..16441a3 100644
--- a/ipalib/util.py
+++ b/ipalib/util.py
@@ -511,7 +511,7 @@ def zone_is_reverse(zone_name):
     return False
 
 def get_reverse_zone_default(ip_address):
-    ip = netaddr.IPAddress(ip_address)
+    ip = netaddr.IPAddress(str(ip_address))
     items = ip.reverse_dns.split('.')
 
     if ip.version == 4:
diff --git a/ipapython/ipautil.py b/ipapython/ipautil.py
index e76d87d..92f2522 100644
--- a/ipapython/ipautil.py
+++ b/ipapython/ipautil.py
@@ -103,7 +103,7 @@ class CheckedIPAddress(netaddr.IPAddress):
         else:
             try:
                 try:
-                    addr = netaddr.IPAddress(addr, flags=self.netaddr_ip_flags)
+                    addr = netaddr.IPAddress(str(addr), flags=self.netaddr_ip_flags)
                 except netaddr.AddrFormatError:
                     # netaddr.IPAddress doesn't handle zone indices in textual
                     # IPv6 addresses. Try removing zone index and parse the
@@ -113,11 +113,11 @@ class CheckedIPAddress(netaddr.IPAddress):
                     addr, sep, foo = addr.partition('%')
                     if sep != '%':
                         raise
-                    addr = netaddr.IPAddress(addr, flags=self.netaddr_ip_flags)
+                    addr = netaddr.IPAddress(str(addr), flags=self.netaddr_ip_flags)
                     if addr.version != 6:
                         raise
             except ValueError:
-                net = netaddr.IPNetwork(addr, flags=self.netaddr_ip_flags)
+                net = netaddr.IPNetwork(str(addr), flags=self.netaddr_ip_flags)
                 if not parse_netmask:
                     raise ValueError("netmask and prefix length not allowed here")
                 addr = net.ip
diff --git a/tests/test_ipalib/test_parameters.py b/tests/test_ipalib/test_parameters.py
index e6ac91d..b30ae5a 100644
--- a/tests/test_ipalib/test_parameters.py
+++ b/tests/test_ipalib/test_parameters.py
@@ -469,11 +469,11 @@ class test_Param(ClassChecker):
         assert str(e) == 'value: empty tuple must be converted to None'
 
         # Test with wrong (scalar) type:
-        e = raises(ValidationError, o.validate, (None, None, 42, None), 'cli')
-        assert str(e) == 'invalid %s' % (TYPE_ERROR % ('\'my_param\'', NoneType, 42, int))
+        e = raises(TypeError, o.validate, (None, None, 42, None), 'cli')
+        assert str(e) == TYPE_ERROR % ('my_param', NoneType, 42, int)
         o = self.cls('my_param')
-        e = raises(ValidationError, o.validate, 'Hello', 'cli')
-        assert str(e) == 'invalid %s' % (TYPE_ERROR % ('\'my_param\'', NoneType, 'Hello', str))
+        e = raises(TypeError, o.validate, 'Hello', 'cli')
+        assert str(e) == TYPE_ERROR % ('my_param', NoneType, 'Hello', str)
 
         class Example(self.cls):
             type = int
@@ -535,10 +535,10 @@ class test_Param(ClassChecker):
         o = MyParam('my_param', okay)
 
         # Test that TypeError is appropriately raised:
-        e = raises(ValidationError, o._validate_scalar, 0)
-        assert str(e) == 'invalid %s' % (TYPE_ERROR % ('\'my_param\'', bool, 0, int))
-        e = raises(ValidationError, o._validate_scalar, 'Hi', index=4)
-        assert str(e) == 'invalid %s' % (TYPE_ERROR % ('\'my_param\'', bool, 'Hi', str))
+        e = raises(TypeError, o._validate_scalar, 0)
+        assert str(e) == TYPE_ERROR % ('my_param', bool, 0, int)
+        e = raises(TypeError, o._validate_scalar, 'Hi', index=4)
+        assert str(e) == TYPE_ERROR % ('my_param', bool, 'Hi', str)
         e = raises(TypeError, o._validate_scalar, True, index=3.0)
         assert str(e) == TYPE_ERROR % ('index', int, 3.0, float)
 
@@ -1574,4 +1574,4 @@ class test_IA5Str(ClassChecker):
             e = raises(errors.ConversionError, mthd, value)
             assert e.name == 'my_str'
             assert e.index is None
-            assert_equal(e.error, "The character \''\\xc3'\' is not allowed.")
+            assert_equal(e.error, "The character '\\xc3' is not allowed.")
diff --git a/tests/test_xmlrpc/test_dns_plugin.py b/tests/test_xmlrpc/test_dns_plugin.py
index 3c2dc00..b5c33b0 100644
--- a/tests/test_xmlrpc/test_dns_plugin.py
+++ b/tests/test_xmlrpc/test_dns_plugin.py
@@ -1086,7 +1086,7 @@ class test_dns(Declarative):
             desc='Try to add invalid allow-query to zone %r' % dnszone1,
             command=('dnszone_mod', [dnszone1], {'idnsallowquery': u'foo'}),
             expected=errors.ValidationError(name='allow_query',
-                error=u"failed to detect a valid IP address from u'foo'"),
+                error=u"failed to detect a valid IP address from 'foo'"),
         ),
 
         dict(
@@ -1119,7 +1119,7 @@ class test_dns(Declarative):
             desc='Try to add invalid allow-transfer to zone %r' % dnszone1,
             command=('dnszone_mod', [dnszone1], {'idnsallowtransfer': u'10.'}),
             expected=errors.ValidationError(name='allow_transfer',
-                error=u"failed to detect a valid IP address from u'10.'"),
+                error=u"failed to detect a valid IP address from '10.'"),
         ),
 
         dict(
-- 
1.7.12

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to