Mercurial > public > mercurial-scm > hg
comparison contrib/byteify-strings.py @ 42683:bbb002b378f3
byteify-strings: add cli argument to handle `attr*()` when they are methods
Certain code bases have useful utils that wrap the builtin functions, and are
called like `util.setattr`.
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Fri, 02 Aug 2019 16:17:02 +0200 |
parents | 5e296f618920 |
children | 26a31c88e1a5 |
comparison
equal
deleted
inserted
replaced
42679:5e296f618920 | 42683:bbb002b378f3 |
---|---|
206 # This looks like a function call. | 206 # This looks like a function call. |
207 if t.type == token.NAME and _isop(i + 1, '('): | 207 if t.type == token.NAME and _isop(i + 1, '('): |
208 fn = t.string | 208 fn = t.string |
209 | 209 |
210 # *attr() builtins don't accept byte strings to 2nd argument. | 210 # *attr() builtins don't accept byte strings to 2nd argument. |
211 if (fn in ('getattr', 'setattr', 'hasattr', 'safehasattr') and | 211 if fn in ( |
212 not _isop(i - 1, '.')): | 212 'getattr', 'setattr', 'hasattr', 'safehasattr', 'wrapfunction', |
213 'wrapclass', 'addattr' | |
214 ) and (opts['allow-attr-methods'] or not _isop(i - 1, '.')): | |
213 arg1idx = _findargnofcall(1) | 215 arg1idx = _findargnofcall(1) |
214 if arg1idx is not None: | 216 if arg1idx is not None: |
215 _ensuresysstr(arg1idx) | 217 _ensuresysstr(arg1idx) |
216 | 218 |
217 # .encode() and .decode() on str/bytes/unicode don't accept | 219 # .encode() and .decode() on str/bytes/unicode don't accept |
274 ap = argparse.ArgumentParser() | 276 ap = argparse.ArgumentParser() |
275 ap.add_argument('-i', '--inplace', action='store_true', default=False, | 277 ap.add_argument('-i', '--inplace', action='store_true', default=False, |
276 help='edit files in place') | 278 help='edit files in place') |
277 ap.add_argument('--dictiter', action='store_true', default=False, | 279 ap.add_argument('--dictiter', action='store_true', default=False, |
278 help='rewrite iteritems() and itervalues()'), | 280 help='rewrite iteritems() and itervalues()'), |
281 ap.add_argument('--allow-attr-methods', action='store_true', | |
282 default=False, | |
283 help='also handle attr*() when they are methods'), | |
279 ap.add_argument('--treat-as-kwargs', nargs="+", default=[], | 284 ap.add_argument('--treat-as-kwargs', nargs="+", default=[], |
280 help="ignore kwargs-like objects"), | 285 help="ignore kwargs-like objects"), |
281 ap.add_argument('files', metavar='FILE', nargs='+', help='source file') | 286 ap.add_argument('files', metavar='FILE', nargs='+', help='source file') |
282 args = ap.parse_args() | 287 args = ap.parse_args() |
283 opts = { | 288 opts = { |
284 'dictiter': args.dictiter, | 289 'dictiter': args.dictiter, |
285 'treat-as-kwargs': set(args.treat_as_kwargs), | 290 'treat-as-kwargs': set(args.treat_as_kwargs), |
291 'allow-attr-methods': args.allow_attr_methods, | |
286 } | 292 } |
287 for fname in args.files: | 293 for fname in args.files: |
288 if args.inplace: | 294 if args.inplace: |
289 with editinplace(fname) as fout: | 295 with editinplace(fname) as fout: |
290 with open(fname, 'rb') as fin: | 296 with open(fname, 'rb') as fin: |