[issue25297] max_help_position is not works in argparse library

2015-10-03 Thread paul j3

paul j3 added the comment:

The unittest test_argparse.py has one related test

class TestAddSubparsers
   def test_alias_help

has a long enough subparser invocation (with aliases) to produce wrapping with 
the default 24 max position:


commands:
  COMMAND
1 (1alias1, 1alias2)
1 help
2   2 help

I don't see anything in the test file that tries to vary the max_help_position 
parameter.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue25297] max_help_position is not works in argparse library

2015-10-02 Thread Alexander

Alexander added the comment:

Problem also described on http://stackoverflow.com/questions/3215/

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue25297] max_help_position is not works in argparse library

2015-10-02 Thread Alexander

New submission from Alexander:

Hi colleagues I have the code (max_help_position is 2000):

formatter_class=lambda prog: argparse.HelpFormatter(prog, 
max_help_position=2000)
parser = argparse.ArgumentParser(formatter_class=formatter_class)


subparsers = parser.add_subparsers(title="Commands", metavar="")

cmd_parser = subparsers.add_parser('long_long_long_long_long_long_long',
   help='- jksljdalkjda',
   formatter_class=formatter_class)

args = parser.parse_args(['-h'])
print args

Result:

we have

optional arguments:
  -h, --help  show this help message and exit

Commands:
  
long_long_long_long_long_long_long
  - jksljdalkjda
small - descr

instead

optional arguments:
  -h, --help  show this help message and exit

Commands:
  
long_long_long_long_long_long_long - jksljdalkjda
small  - descr

The code:

class MyFormatter(argparse.HelpFormatter):
def __init__(self, prog):
super(MyFormatter, self).__init__(prog, max_help_position=2000, 
width=2000)
self._max_help_position = 2000
self._action_max_length += 4

got same result.

The strings like:

formatter_class = lambda prog: argparse.HelpFormatter(prog,
  max_help_position=2000, width=2000)

formatter_class = lambda prog: argparse.HelpFormatter(prog,
  max_help_position=1000, width=2000)

formatter_class = lambda prog: argparse.HelpFormatter(prog,
  max_help_position=2000, width=1000)

got same result: we always have new line after command.

--
components: Library (Lib)
messages: 252093
nosy: morden2k
priority: normal
severity: normal
status: open
title: max_help_position is not works in argparse library
versions: Python 2.7

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue25297] max_help_position is not works in argparse library

2015-10-02 Thread paul j3

Changes by paul j3 :


--
nosy: +paul.j3

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue25297] max_help_position is not works in argparse library

2015-10-02 Thread paul j3

paul j3 added the comment:

My testing shows that it's a problem with the subparsers listing.  When regular 
arguments are long, 'max_help_position' works (within limits allowed by 
'width').

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue25297] max_help_position is not works in argparse library

2015-10-02 Thread paul j3

paul j3 added the comment:

There's a bug in the HelpFormatter.add_argument method.  It does not take into 
account the extra indentation of subactions (sub parsers) when calculating 
self._action_max_length.

The corrected method and a test case is in the attached file.

class MyFormatter(argparse.HelpFormatter):
"""
Corrected _max_action_length for the indenting of subactions
"""
def add_argument(self, action):
if action.help is not argparse.SUPPRESS:

# find all invocations
get_invocation = self._format_action_invocation
invocations = [get_invocation(action)]
current_indent = self._current_indent
for subaction in self._iter_indented_subactions(action):
# compensate for the indent that will be added
indent_chg = self._current_indent - current_indent
added_indent = 'x'*indent_chg
invocations.append(added_indent + get_invocation( subaction) )
# print('inv', invocations)

# update the maximum item length
invocation_length = max([len(s) for s in invocations])
action_length = invocation_length + self._current_indent
self._action_max_length = max(self._action_max_length,
  action_length)

# add the item to the list
self._add_item(self._format_action, [action])

Without this correction self._action_max_length is off by 2 if a subparser has 
the longest invocation.  Normally that wouldn't be an issue since normally 
subparser names are short and easy to use.  But with the 'aliases' that newer 
argparse allows, the invocation could be longer, and possibly longer than 
regular arguments.

I haven't passed this correction through test_argparse.py.  It also would need 
a test case or two.  I don't think it need a documentation change.

I don't know if this correction will work with the subparser grouping proposed 
in http://bugs.python.org/issue9341.

--
Added file: http://bugs.python.org/file40661/issue25297.py

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com