Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Unbundle external libraries #191

Merged
merged 6 commits into from

5 participants

@tomspur

This pull request contains an update to a new argparse and the unbundling of the libraries and nothing else anymore ( as requested )...

I read something on the mailing list about "git commit --amend" and to add the # of this pull request, so github will automatically close this.

Are there some notes how exactly that should look like? Or what exactly should I add there with --amend?

@ellisonbg
Owner

I ran the test suite and looked through the code. I like this approach and the changes are clean, I think this is ready to go. But I know Fernando had been following this one closely, so I want him to at least look over this.

@fperez
Owner

I also re-ran the test suite both in normal and in installed mode, and it worked fine, so it's pretty much ready to go in. I was about to push though, when I saw that pexpect was left behind without being unbundled. Any particular reason for this? I figured you'd want to unbundle all of externals if possible, no? I'll hold off on the merge/push until you have a chance to let us know why pexpect was separate, or make one more commit that takes care of it.

Once the pexpect question is settled, it's good to go. Thanks!

@tomspur

I did the unbundling before pexpat was introduced, so I simply missed it.... ;-)

Thanks, for the notice.

@fperez
Owner

Tom, I'm afraid there are errors left. Once I try to merge your branch into trunk and run the test suite, I get:

Ran 9 test groups in 54.978s

Status:
ERROR - 2 out of 9 test groups failed.
----------------------------------------
Runner failed: IPython.core
You may wish to rerun this one individually, with:
/usr/bin/python /home/fperez/usr/lib/python2.6/site-packages/IPython/testing/iptest.py IPython.core

----------------------------------------
Runner failed: IPython.lib
You may wish to rerun this one individually, with:
/usr/bin/python /home/fperez/usr/lib/python2.6/site-packages/IPython/testing/iptest.py IPython.lib

Here's the full tracebacks:

iptest IPython.core:
...

======================================================================
ERROR: IPython.core.tests.test_formatters.test_pretty
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/pymodules/python2.6/nose/case.py", line 183, in runTest
    self.test(*self.arg)
  File "/home/fperez/usr/lib/python2.6/site-packages/IPython/core/tests/test_formatters.py", line 21, in test_pretty
    f.for_type(A, foo_printer)
  File "/home/fperez/usr/lib/python2.6/site-packages/IPython/core/formatters.py", line 126, in for_type
    oldfunc = self.type_pprinters.get(typ, None)
  File "/home/fperez/usr/lib/python2.6/site-packages/IPython/utils/traitlets.py", line 283, in __get__
    value = self.dynamic_initializer(obj)
  File "/home/fperez/usr/lib/python2.6/site-packages/IPython/core/formatters.py", line 90, in _type_pprinters_default
    return pretty._type_pprinters.copy()
AttributeError: 'module' object has no attribute '_type_pprinters'

----------------------------------------------------------------------
Ran 267 tests in 1.844s

FAILED (SKIP=1, errors=1)

and

dreamweaver[junk]> iptest IPython.lib
======================================================================
FAIL: Test the IPython runner.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/fperez/usr/lib/python2.6/site-packages/IPython/lib/tests/test_irunner.py", line 122, in testIPython
    self._test_runner(runner,source,output)
  File "/home/fperez/usr/lib/python2.6/site-packages/IPython/lib/tests/test_irunner.py", line 36, in _test_runner
    self.fail('mismatch in number of lines')
AssertionError: mismatch in number of lines
    """Fail immediately, with the given message."""
>>  raise self.failureException, 'mismatch in number of lines'
    

----------------------------------------------------------------------
Ran 6 tests in 1.200s

FAILED (failures=1)

Once the tests pass, I'll be happy to merge it, but you should always make sure that the test suite passes not only with your branch alone, but once merged, since that's what the reviewers will be testing. Passing on your branch alone isn't sufficient, because what goes into the project ultimately is the merge of your branch into trunk, so that's what must pass the test suite before we can accept it.

@tomspur

Both are because pretty seems to have changed some functions, so updating could solve this (I'll have a look)...

But thanks for noticing. Right now running the testsuite everytime, won't help here to detect little errors like that, because I have to many failing tests right now (the old fedora problem, whyever...).
I hope to further look around in ipython, to get more knowledge, to finally fix them all, but not right now.... :-(

@tomspur

The problem is that the pretty.py from ipython differs too much from the upstream pretty.

Till upstream has the needed changes, it would be best, to not unbundle pretty, because it's not possible right now.
The not unbundling happens now in the commit above, but I have here:
FAILED (SKIP=1, failures=2) all from Ipython.core, seem to be the usual fedora failures...

@ellisonbg
Owner

What is the status of this pull request?

@tomspur

I need to wait for someone else to run the testsuite, because the fedora one is broken slightly, which is kind of expected (and I don't know why).

After this pull, everything except pretty is unbundled, and pretty can't be unbundled, because it differs to much from upstream...

At least anything else would be ok then.

@ellisonbg
Owner

If pretty is really our own version now, we should move it to the lib subpackage. That way everything in externals will have upstream versions available.

@tomspur

It differs too much, that it can be patched somehow, but I don't know if you maybe want to get the changes into upstream...

The biggest changes are in 428050f

I did the rename now and you can choose, which way to go :)

@takluyver takluyver commented on the diff
IPython/external/argparse/__init__.py
@@ -0,0 +1,12 @@
+try:
+ import argparse
+ # Workaround an argparse bug, FIXED in argparse 1.1.0
+ if 'RawTextHelpFormatterArgumentDefaultsHelpFormatter' in argparse.__all__:
+ import itertools
+ argparse.__all__ = list(itertools.chain( [i for i in argparse.__all__
+ if i != 'RawTextHelpFormatterArgumentDefaultsHelpFormatter'],
+ ['RawTextHelpFormatter', 'ArgumentDefaultsHelpFormatter']))
@takluyver Owner

Is it necessary to use itertools.chain here, rather than just [i for i in ...] + [a, b]?

@abadger
abadger added a note

I wrote the patch originally so tomspur asked me to comment.

AFAICT, there's no reason that the simpler method shouldn't work:

argparse.__all__ = ([i for i in argparse.__all__ 
        if i != 'RawTextHelpFormatterArgumentDefaultsHelpFormatter']
        +  ['RawTextHelpFormatter', 'ArgumentDefaultsHelpFormatter'])

itertools.chain seems like something I'd do while thinking things through and then fail to see that it was unnecessary when submitting the final patch.

@takluyver Owner

OK, smashing. It just stood out when I was scanning through. Thomas, since it's in your branch, do you want to tweak that? We'll run the tests again, and hopefully it's good to go (unless anyone else sees a reason why not - speak now or forever hold your peace, and all that).

@tomspur
tomspur added a note

I'd leave it like it is.
itertools is a std python lib, so it doesn't add any dependency, so it's ok to use it.
When argparse 1.1.0 is common in all main linux distros, we can simply delete the workaround again.
(And I guess it might be the time right now... Debian, Ubuntu and Fedora has the 1.1. in the repositories, if I see that right (can only be sure for Fedora))

@takluyver Owner

Ubuntu seems to have 1.1.1 as of Lucid (the release before the current one), which is the first time it packaged it at all. The same version is in Debian stable (they had a new release recently). It looks like macports has 1.1 as well. Assuming the version that's in the stdlib for Python 2.7 and Python 3.2 doesn't have the bug, I think it's safe to remove the workaround.

@abadger
abadger added a note

The EPEL repositories for RHEL 6 have argparse-1.0.1 so I wouldn't characterize it as "safe" to remove. OTOH, argparse-1.1.x looks API compatible so we might be able to upgrade the EPEL packages to a newer version where necessary to get a newer ipython. Definitely a judgement call.

@takluyver Owner

But is IPython 0.11 (not even released yet) likely to be put onto that platform? I wouldn't make the assumption in the 0.10 series, but I don't think it's unreasonable for the next version of IPython to depend on a version of a package that's been out for at least a year.

@abadger
abadger added a note

tomspur might have a more definite answer since he's involved with maintaining ipython in fedora (on which the EPEL packages are based) -- all I can say for sure is that there's not yet an ipython package for EPEL6 and because users like to get the most recent versions, we generally give them the most recent version at the time that someone steps up to branch and maintain the initial package for that release. Oh, and of course, if users are running RHEL as their workstation (as opposed to a server) they may want to install the latest versions of ipython themselves rather than using what the distro and EPEL provide so they might want to install ipython-0.11 on RHEL5 even.... like I say, though, that could be a case where the EPEL maintainers could be convinced to update argparse to a later version if necessary.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@fperez
Owner

Hey tomspur, sorry this has taken so long to get right... But right now it doesn't even apply on top of master:

(tomspur-ready_unbundle)amirbar[ipython]> git pull https://github.com/tomspur/ipython.git ready_unbundle 
remote: Counting objects: 69, done.
remote: Compressing objects: 100% (48/48), done.
remote: Total 62 (delta 22), reused 52 (delta 14)
Unpacking objects: 100% (62/62), done.
From https://github.com/tomspur/ipython
 * branch            ready_unbundle -> FETCH_HEAD
Auto-merging IPython/core/formatters.py
CONFLICT (content): Merge conflict in IPython/core/formatters.py
Automatic merge failed; fix conflicts and then commit the result.

If you can rebase it so it applies cleanly on top of master, we'll try to finish up any remaining questions with this branch and merge it before it goes stale again.

tomspur added some commits
@tomspur tomspur Unbundle of all external modules.
Move all libraries in external into subfolders and place a custom
__init__.py into each of them. This way the system installed ones are
tried first, before falling back to the bundled ones.

Now every distribution can properly depend on the upstream library.
(e.g. bundled libraries are not allowed in fedora)

Signed-off-by: Toshio Ernie Kuratomi <toshio@fedoraproject.org>
Signed-off-by: Thomas Spura <tomspur@fedoraproject.org>
261328d
@tomspur tomspur Update internal argparse to version 1.1
Signed-off-by: Thomas Spura <tomspur@fedoraproject.org>
994a729
@tomspur tomspur Also unbundle pexpect
Signed-off-by: Thomas Spura <tomspur@fedoraproject.org>
21647ae
@tomspur tomspur Don't use the system pretty...
... because upstream pretty does not (yet?) incorporate the changes to
the local _pretty.

Signed-off-by: Thomas Spura <tomspur@fedoraproject.org>
67f9fe7
@tomspur tomspur import from module and not from module.py
Thanks to Justin Riley for noticing.

Signed-off-by: Thomas Spura <tomspur@fedoraproject.org>
b390cc3
@tomspur tomspur Move pretty into lib, because it's heavily changed now.
664ecc2
@tomspur

Hi fperez,
it should work again.

You still need to decide, if you want to pull the last commit "Move pretty into lib" or if you want to push the changes to pretty back to upstream.

Greetings,
Tom

@fperez fperez merged commit 664ecc2 into from
@damianavila damianavila referenced this pull request from a commit
Commit has since been removed from the repository and is no longer available.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Mar 13, 2011
  1. @tomspur

    Unbundle of all external modules.

    tomspur authored
    Move all libraries in external into subfolders and place a custom
    __init__.py into each of them. This way the system installed ones are
    tried first, before falling back to the bundled ones.
    
    Now every distribution can properly depend on the upstream library.
    (e.g. bundled libraries are not allowed in fedora)
    
    Signed-off-by: Toshio Ernie Kuratomi <toshio@fedoraproject.org>
    Signed-off-by: Thomas Spura <tomspur@fedoraproject.org>
  2. @tomspur

    Update internal argparse to version 1.1

    tomspur authored
    Signed-off-by: Thomas Spura <tomspur@fedoraproject.org>
  3. @tomspur

    Also unbundle pexpect

    tomspur authored
    Signed-off-by: Thomas Spura <tomspur@fedoraproject.org>
  4. @tomspur

    Don't use the system pretty...

    tomspur authored
    ... because upstream pretty does not (yet?) incorporate the changes to
    the local _pretty.
    
    Signed-off-by: Thomas Spura <tomspur@fedoraproject.org>
  5. @tomspur

    import from module and not from module.py

    tomspur authored
    Thanks to Justin Riley for noticing.
    
    Signed-off-by: Thomas Spura <tomspur@fedoraproject.org>
  6. @tomspur
This page is out of date. Refresh to see the latest.
Showing with 135 additions and 79 deletions.
  1. +1 −1  IPython/core/formatters.py
  2. 0  IPython/external/{Itpl.py → Itpl/_Itpl.py}
  3. +4 −0 IPython/external/Itpl/__init__.py
  4. +12 −0 IPython/external/argparse/__init__.py
  5. +58 −76 IPython/external/{argparse.py → argparse/_argparse.py}
  6. +4 −0 IPython/external/configobj/__init__.py
  7. 0  IPython/external/{configobj.py → configobj/_configobj.py}
  8. +8 −0 IPython/external/decorator/__init__.py
  9. 0  IPython/external/{decorator.py → decorator/_decorator.py}
  10. +4 −0 IPython/external/decorators/__init__.py
  11. 0  IPython/external/{decorators.py → decorators/_decorators.py}
  12. 0  IPython/external/{ → decorators}/_numpy_testing_utils.py
  13. +4 −0 IPython/external/guid/__init__.py
  14. 0  IPython/external/{guid.py → guid/_guid.py}
  15. +4 −0 IPython/external/mglob/__init__.py
  16. +0 −2  IPython/external/{mglob.py → mglob/_mglob.py}
  17. +4 −0 IPython/external/path/__init__.py
  18. 0  IPython/external/{path.py → path/_path.py}
  19. +5 −0 IPython/external/pexpect/__init__.py
  20. 0  IPython/external/{pexpect.py → pexpect/_pexpect.py}
  21. +4 −0 IPython/external/pyparsing/__init__.py
  22. 0  IPython/external/{pyparsing.py → pyparsing/_pyparsing.py}
  23. +4 −0 IPython/external/simplegeneric/__init__.py
  24. 0  IPython/external/{simplegeneric.py → simplegeneric/_simplegeneric.py}
  25. +8 −0 IPython/external/validate/__init__.py
  26. 0  IPython/external/{validate.py → validate/_validate.py}
  27. 0  IPython/{external → lib}/pretty.py
  28. +11 −0 setupbase.py
View
2  IPython/core/formatters.py
@@ -27,7 +27,7 @@
# Our own imports
from IPython.config.configurable import Configurable
-from IPython.external import pretty
+from IPython.lib import pretty
from IPython.utils.traitlets import Bool, Dict, Int, Str, CStr
View
0  IPython/external/Itpl.py → IPython/external/Itpl/_Itpl.py
File renamed without changes
View
4 IPython/external/Itpl/__init__.py
@@ -0,0 +1,4 @@
+try:
+ from Itpl import *
+except ImportError:
+ from _Itpl import *
View
12 IPython/external/argparse/__init__.py
@@ -0,0 +1,12 @@
+try:
+ import argparse
+ # Workaround an argparse bug, FIXED in argparse 1.1.0
+ if 'RawTextHelpFormatterArgumentDefaultsHelpFormatter' in argparse.__all__:
+ import itertools
+ argparse.__all__ = list(itertools.chain( [i for i in argparse.__all__
+ if i != 'RawTextHelpFormatterArgumentDefaultsHelpFormatter'],
+ ['RawTextHelpFormatter', 'ArgumentDefaultsHelpFormatter']))
@takluyver Owner

Is it necessary to use itertools.chain here, rather than just [i for i in ...] + [a, b]?

@abadger
abadger added a note

I wrote the patch originally so tomspur asked me to comment.

AFAICT, there's no reason that the simpler method shouldn't work:

argparse.__all__ = ([i for i in argparse.__all__ 
        if i != 'RawTextHelpFormatterArgumentDefaultsHelpFormatter']
        +  ['RawTextHelpFormatter', 'ArgumentDefaultsHelpFormatter'])

itertools.chain seems like something I'd do while thinking things through and then fail to see that it was unnecessary when submitting the final patch.

@takluyver Owner

OK, smashing. It just stood out when I was scanning through. Thomas, since it's in your branch, do you want to tweak that? We'll run the tests again, and hopefully it's good to go (unless anyone else sees a reason why not - speak now or forever hold your peace, and all that).

@tomspur
tomspur added a note

I'd leave it like it is.
itertools is a std python lib, so it doesn't add any dependency, so it's ok to use it.
When argparse 1.1.0 is common in all main linux distros, we can simply delete the workaround again.
(And I guess it might be the time right now... Debian, Ubuntu and Fedora has the 1.1. in the repositories, if I see that right (can only be sure for Fedora))

@takluyver Owner

Ubuntu seems to have 1.1.1 as of Lucid (the release before the current one), which is the first time it packaged it at all. The same version is in Debian stable (they had a new release recently). It looks like macports has 1.1 as well. Assuming the version that's in the stdlib for Python 2.7 and Python 3.2 doesn't have the bug, I think it's safe to remove the workaround.

@abadger
abadger added a note

The EPEL repositories for RHEL 6 have argparse-1.0.1 so I wouldn't characterize it as "safe" to remove. OTOH, argparse-1.1.x looks API compatible so we might be able to upgrade the EPEL packages to a newer version where necessary to get a newer ipython. Definitely a judgement call.

@takluyver Owner

But is IPython 0.11 (not even released yet) likely to be put onto that platform? I wouldn't make the assumption in the 0.10 series, but I don't think it's unreasonable for the next version of IPython to depend on a version of a package that's been out for at least a year.

@abadger
abadger added a note

tomspur might have a more definite answer since he's involved with maintaining ipython in fedora (on which the EPEL packages are based) -- all I can say for sure is that there's not yet an ipython package for EPEL6 and because users like to get the most recent versions, we generally give them the most recent version at the time that someone steps up to branch and maintain the initial package for that release. Oh, and of course, if users are running RHEL as their workstation (as opposed to a server) they may want to install the latest versions of ipython themselves rather than using what the distro and EPEL provide so they might want to install ipython-0.11 on RHEL5 even.... like I say, though, that could be a case where the EPEL maintainers could be convinced to update argparse to a later version if necessary.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ argparse.__all__.append('SUPPRESS')
+ from argparse import *
+except ImportError:
+ from _argparse import *
View
134 IPython/external/argparse.py → IPython/external/argparse/_argparse.py
@@ -1,18 +1,4 @@
-# -*- coding: utf-8 -*-
-
-# Copyright © 2006-2009 Steven J. Bethard <steven.bethard@gmail.com>.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may not
-# use this file except in compliance with the License. You may obtain a copy
-# of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
+# Author: Steven J. Bethard <steven.bethard@gmail.com>.
"""Command-line parsing library
@@ -75,7 +61,7 @@
still considered an implementation detail.)
"""
-__version__ = '1.1a1'
+__version__ = '1.1'
__all__ = [
'ArgumentParser',
'ArgumentError',
@@ -97,40 +83,10 @@
from gettext import gettext as _
-try:
- _set = set
-except NameError:
- from sets import Set as _set
-
-try:
- _basestring = basestring
-except NameError:
- _basestring = str
-
-try:
- _sorted = sorted
-except NameError:
-
- def _sorted(iterable, reverse=False):
- result = list(iterable)
- result.sort()
- if reverse:
- result.reverse()
- return result
-
def _callable(obj):
return hasattr(obj, '__call__') or hasattr(obj, '__bases__')
-# silence Python 2.6 buggy warnings about Exception.message
-if _sys.version_info[:2] == (2, 6):
- import warnings
- warnings.filterwarnings(
- action='ignore',
- message='BaseException.message has been deprecated as of Python 2.6',
- category=DeprecationWarning,
- module='argparse')
-
SUPPRESS = '==SUPPRESS=='
@@ -163,7 +119,7 @@ def __repr__(self):
return '%s(%s)' % (type_name, ', '.join(arg_strings))
def _get_kwargs(self):
- return _sorted(self.__dict__.items())
+ return sorted(self.__dict__.items())
def _get_args(self):
return []
@@ -416,7 +372,7 @@ def get_lines(parts, indent, prefix=None):
def _format_actions_usage(self, actions, groups):
# find group indices and identify actions in groups
- group_actions = _set()
+ group_actions = set()
inserts = {}
for group in groups:
try:
@@ -486,7 +442,7 @@ def _format_actions_usage(self, actions, groups):
parts.append(part)
# insert things at the necessary indices
- for i in _sorted(inserts, reverse=True):
+ for i in sorted(inserts, reverse=True):
parts[i:i] = [inserts[i]]
# join all the action items with spaces
@@ -621,6 +577,9 @@ def _expand_help(self, action):
for name in list(params):
if params[name] is SUPPRESS:
del params[name]
+ for name in list(params):
+ if hasattr(params[name], '__name__'):
+ params[name] = params[name].__name__
if params.get('choices') is not None:
choices_str = ', '.join([str(c) for c in params['choices']])
params['choices'] = choices_str
@@ -1028,7 +987,7 @@ def __init__(self,
version=None,
dest=SUPPRESS,
default=SUPPRESS,
- help=None):
+ help="show program's version number and exit"):
super(_VersionAction, self).__init__(
option_strings=option_strings,
dest=dest,
@@ -1169,7 +1128,10 @@ class Namespace(_AttributeHolder):
"""
def __init__(self, **kwargs):
- self.__dict__.update(**kwargs)
+ for name in kwargs:
+ setattr(self, name, kwargs[name])
+
+ __hash__ = None
def __eq__(self, other):
return vars(self) == vars(other)
@@ -1296,6 +1258,12 @@ def add_argument(self, *args, **kwargs):
if not _callable(action_class):
raise ValueError('unknown action "%s"' % action_class)
action = action_class(**kwargs)
+
+ # raise an error if the action type is not callable
+ type_func = self._registry_get('type', action.type, action.type)
+ if not _callable(type_func):
+ raise ValueError('%r is not callable' % type_func)
+
return self._add_action(action)
def add_argument_group(self, *args, **kwargs):
@@ -1393,12 +1361,6 @@ def _get_optional_kwargs(self, *args, **kwargs):
option_strings = []
long_option_strings = []
for option_string in args:
- # error on one-or-fewer-character option strings
- if len(option_string) < 2:
- msg = _('invalid option string %r: '
- 'must be at least two characters long')
- raise ValueError(msg % option_string)
-
# error on strings that don't start with an appropriate prefix
if not option_string[0] in self.prefix_chars:
msg = _('invalid option string %r: '
@@ -1406,18 +1368,12 @@ def _get_optional_kwargs(self, *args, **kwargs):
tup = option_string, self.prefix_chars
raise ValueError(msg % tup)
- # error on strings that are all prefix characters
- if not (_set(option_string) - _set(self.prefix_chars)):
- msg = _('invalid option string %r: '
- 'must contain characters other than %r')
- tup = option_string, self.prefix_chars
- raise ValueError(msg % tup)
-
# strings starting with two prefix characters are long options
option_strings.append(option_string)
if option_string[0] in self.prefix_chars:
- if option_string[1] in self.prefix_chars:
- long_option_strings.append(option_string)
+ if len(option_string) > 1:
+ if option_string[1] in self.prefix_chars:
+ long_option_strings.append(option_string)
# infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x'
dest = kwargs.pop('dest', None)
@@ -1427,6 +1383,9 @@ def _get_optional_kwargs(self, *args, **kwargs):
else:
dest_option_string = option_strings[0]
dest = dest_option_string.lstrip(self.prefix_chars)
+ if not dest:
+ msg = _('dest= is required for options like %r')
+ raise ValueError(msg % option_string)
dest = dest.replace('-', '_')
# return the updated keyword arguments
@@ -1542,7 +1501,6 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
- usage -- A usage message (default: auto-generated from arguments)
- description -- A description of what the program does
- epilog -- Text following the argument descriptions
- - version -- Add a -v/--version option with the given version string
- parents -- Parsers whose arguments should be copied into this one
- formatter_class -- HelpFormatter class for printing help messages
- prefix_chars -- Characters that prefix optional arguments
@@ -1567,6 +1525,14 @@ def __init__(self,
conflict_handler='error',
add_help=True):
+ if version is not None:
+ import warnings
+ warnings.warn(
+ """The "version" argument to ArgumentParser is deprecated. """
+ """Please use """
+ """"add_argument(..., action='version', version="N", ...)" """
+ """instead""", DeprecationWarning)
+
superinit = super(ArgumentParser, self).__init__
superinit(description=description,
prefix_chars=prefix_chars,
@@ -1708,7 +1674,7 @@ def parse_known_args(self, args=None, namespace=None):
if not hasattr(namespace, action.dest):
if action.default is not SUPPRESS:
default = action.default
- if isinstance(action.default, _basestring):
+ if isinstance(action.default, basestring):
default = self._get_value(action, default)
setattr(namespace, action.dest, default)
@@ -1768,8 +1734,8 @@ def _parse_known_args(self, arg_strings, namespace):
arg_strings_pattern = ''.join(arg_string_pattern_parts)
# converts arg strings to the appropriate and then takes the action
- seen_actions = _set()
- seen_non_default_actions = _set()
+ seen_actions = set()
+ seen_non_default_actions = set()
def take_action(action, argument_strings, option_string=None):
seen_actions.add(action)
@@ -1973,7 +1939,10 @@ def _read_args_from_files(self, arg_strings):
try:
args_file = open(arg_string[1:])
try:
- arg_strings = args_file.read().splitlines()
+ arg_strings = []
+ for arg_line in args_file.read().splitlines():
+ for arg in self.convert_arg_line_to_args(arg_line):
+ arg_strings.append(arg)
arg_strings = self._read_args_from_files(arg_strings)
new_arg_strings.extend(arg_strings)
finally:
@@ -1985,6 +1954,9 @@ def _read_args_from_files(self, arg_strings):
# return the modified argument list
return new_arg_strings
+ def convert_arg_line_to_args(self, arg_line):
+ return [arg_line]
+
def _match_argument(self, action, arg_strings_pattern):
# match the pattern for this action to the arg strings
nargs_pattern = self._get_nargs_pattern(action)
@@ -2029,15 +2001,15 @@ def _parse_optional(self, arg_string):
if not arg_string[0] in self.prefix_chars:
return None
- # if it's just dashes, it was meant to be positional
- if not arg_string.strip('-'):
- return None
-
# if the option string is present in the parser, return the action
if arg_string in self._option_string_actions:
action = self._option_string_actions[arg_string]
return action, arg_string, None
+ # if it's just a single character, it was meant to be positional
+ if len(arg_string) == 1:
+ return None
+
# if the option string before the "=" is present, return the action
if '=' in arg_string:
option_string, explicit_arg = arg_string.split('=', 1)
@@ -2176,7 +2148,7 @@ def _get_values(self, action, arg_strings):
value = action.const
else:
value = action.default
- if isinstance(value, _basestring):
+ if isinstance(value, basestring):
value = self._get_value(action, value)
self._check_value(action, value)
@@ -2279,6 +2251,11 @@ def format_help(self):
return formatter.format_help()
def format_version(self):
+ import warnings
+ warnings.warn(
+ 'The format_version method is deprecated -- the "version" '
+ 'argument to ArgumentParser is no longer supported.',
+ DeprecationWarning)
formatter = self._get_formatter()
formatter.add_text(self.version)
return formatter.format_help()
@@ -2300,6 +2277,11 @@ def print_help(self, file=None):
self._print_message(self.format_help(), file)
def print_version(self, file=None):
+ import warnings
+ warnings.warn(
+ 'The print_version method is deprecated -- the "version" '
+ 'argument to ArgumentParser is no longer supported.',
+ DeprecationWarning)
self._print_message(self.format_version(), file)
def _print_message(self, message, file=None):
View
4 IPython/external/configobj/__init__.py
@@ -0,0 +1,4 @@
+try:
+ from configobj import *
+except ImportError:
+ from _configobj import *
View
0  IPython/external/configobj.py → IPython/external/configobj/_configobj.py
File renamed without changes
View
8 IPython/external/decorator/__init__.py
@@ -0,0 +1,8 @@
+try:
+ from decorator import *
+ from decorator import getinfo, new_wrapper
+ # the following funcion is deprecated so using the python own one
+ from functools import update_wrapper
+except ImportError:
+ from _decorator import *
+ from _decorator import getinfo, update_wrapper, new_wrapper
View
0  IPython/external/decorator.py → IPython/external/decorator/_decorator.py
File renamed without changes
View
4 IPython/external/decorators/__init__.py
@@ -0,0 +1,4 @@
+try:
+ from numpy.testing.decorators import *
+except ImportError:
+ from _decorators import *
View
0  IPython/external/decorators.py → IPython/external/decorators/_decorators.py
File renamed without changes
View
0  IPython/external/_numpy_testing_utils.py → IPython/external/decorators/_numpy_testing_utils.py
File renamed without changes
View
4 IPython/external/guid/__init__.py
@@ -0,0 +1,4 @@
+try:
+ from guid import *
+except ImportError:
+ from _guid import *
View
0  IPython/external/guid.py → IPython/external/guid/_guid.py
File renamed without changes
View
4 IPython/external/mglob/__init__.py
@@ -0,0 +1,4 @@
+try:
+ from mglob import *
+except ImportError:
+ from _mglob import *
View
2  IPython/external/mglob.py → IPython/external/mglob/_mglob.py 100755 → 100644
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-
r""" mglob - enhanced file list expansion module
Use as stand-alone utility (for xargs, `backticks` etc.),
View
4 IPython/external/path/__init__.py
@@ -0,0 +1,4 @@
+try:
+ from path import *
+except ImportError:
+ from _path import *
View
0  IPython/external/path.py → IPython/external/path/_path.py
File renamed without changes
View
5 IPython/external/pexpect/__init__.py
@@ -0,0 +1,5 @@
+try:
+ import pexpect
+ from pexpect import *
+except ImportError:
+ from _pexpect import *
View
0  IPython/external/pexpect.py → IPython/external/pexpect/_pexpect.py
File renamed without changes
View
4 IPython/external/pyparsing/__init__.py
@@ -0,0 +1,4 @@
+try:
+ from pyparsing import *
+except ImportError:
+ from _pyparsing import *
View
0  IPython/external/pyparsing.py → IPython/external/pyparsing/_pyparsing.py
File renamed without changes
View
4 IPython/external/simplegeneric/__init__.py
@@ -0,0 +1,4 @@
+try:
+ from simplegeneric import *
+except ImportError:
+ from _simplegeneric import *
View
0  IPython/external/simplegeneric.py → IPython/external/simplegeneric/_simplegeneric.py
File renamed without changes
View
8 IPython/external/validate/__init__.py
@@ -0,0 +1,8 @@
+try:
+ import validate
+ if '__docformat__' in validate.__all__ and validate.__version__.split('.') >= ['1', '0', '1']:
+ # __docformat__ was removed in 1.0.1 but
+ validate.__all__ = [i for i in validate.__all__ if i != '__docformat__']
+ from validate import *
+except ImportError:
+ from _validate import *
View
0  IPython/external/validate.py → IPython/external/validate/_validate.py
File renamed without changes
View
0  IPython/external/pretty.py → IPython/lib/pretty.py
File renamed without changes
View
11 setupbase.py
@@ -108,6 +108,17 @@ def find_packages():
add_package(packages, 'deathrow', tests=True)
add_package(packages, 'extensions')
add_package(packages, 'external')
+ add_package(packages, 'external.argparse')
+ add_package(packages, 'external.configobj')
+ add_package(packages, 'external.decorator')
+ add_package(packages, 'external.decorators')
+ add_package(packages, 'external.guid')
+ add_package(packages, 'external.Itpl')
+ add_package(packages, 'external.mglob')
+ add_package(packages, 'external.path')
+ add_package(packages, 'external.pyparsing')
+ add_package(packages, 'external.simplegeneric')
+ add_package(packages, 'external.validate')
add_package(packages, 'frontend')
add_package(packages, 'frontend.qt')
add_package(packages, 'frontend.qt.console', tests=True)
Something went wrong with that request. Please try again.