FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
ipython/IPython/core/magic_arguments.py at master · rcgray/ipython · GitHub
rcgray
/
ipython
Public
forked from
ipython/ipython
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Wiki
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Wiki
Security and quality
Insights
Expand file tree
Breadcrumbs
ipython
/
IPython
/
core
/
magic_arguments.py
Copy path
More file actions
More file actions
Latest commit
History
History
History
278 lines (214 loc) · 8.66 KB
Breadcrumbs
ipython
/
IPython
/
core
/
magic_arguments.py
Copy path
File metadata and controls
278 lines (214 loc) · 8.66 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
''' A decorator-based method of constructing IPython magics with `argparse`
option handling.
New magic functions can be defined like so::
from IPython.core.magic_arguments import (argument, magic_arguments,
parse_argstring)
@magic_arguments()
@argument('-o', '--option', help='An optional argument.')
@argument('arg', type=int, help='An integer positional argument.')
def magic_cool(self, arg):
""" A really cool magic command.
"""
args = parse_argstring(magic_cool, arg)
...
The `@magic_arguments` decorator marks the function as having argparse arguments.
The `@argument` decorator adds an argument using the same syntax as argparse's
`add_argument()` method. More sophisticated uses may also require the
`@argument_group` or `@kwds` decorator to customize the formatting and the
parsing.
Help text for the magic is automatically generated from the docstring and the
arguments::
In[1]: %cool?
%cool [-o OPTION] arg
A really cool magic command.
positional arguments:
arg An integer positional argument.
optional arguments:
-o OPTION, --option OPTION
An optional argument.
Inheritance diagram:
.. inheritance-diagram:: IPython.core.magic_arguments
:parts: 3
'''
#-----------------------------------------------------------------------------
# Copyright (C) 2010-2011, IPython Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
import
argparse
import
re
# Our own imports
from
IPython
.
core
.
error
import
UsageError
from
IPython
.
utils
.
decorators
import
undoc
from
IPython
.
utils
.
process
import
arg_split
from
IPython
.
utils
.
text
import
dedent
NAME_RE
=
re
.
compile
(
r"[a-zA-Z][a-zA-Z0-9_-]*$"
)
@
undoc
class
MagicHelpFormatter
(
argparse
.
RawDescriptionHelpFormatter
):
"""A HelpFormatter with a couple of changes to meet our needs.
"""
# Modified to dedent text.
def
_fill_text
(
self
,
text
,
width
,
indent
):
return
argparse
.
RawDescriptionHelpFormatter
.
_fill_text
(
self
,
dedent
(
text
),
width
,
indent
)
# Modified to wrap argument placeholders in <> where necessary.
def
_format_action_invocation
(
self
,
action
):
if
not
action
.
option_strings
:
metavar
,
=
self
.
_metavar_formatter
(
action
,
action
.
dest
)(
1
)
return
metavar
else
:
parts
=
[]
# if the Optional doesn't take a value, format is:
# -s, --long
if
action
.
nargs
==
0
:
parts
.
extend
(
action
.
option_strings
)
# if the Optional takes a value, format is:
# -s ARGS, --long ARGS
else
:
default
=
action
.
dest
.
upper
()
args_string
=
self
.
_format_args
(
action
,
default
)
# IPYTHON MODIFICATION: If args_string is not a plain name, wrap
# it in <> so it's valid RST.
if
not
NAME_RE
.
match
(
args_string
):
args_string
=
"<%s>"
%
args_string
for
option_string
in
action
.
option_strings
:
parts
.
append
(
'%s %s'
%
(
option_string
,
args_string
))
return
', '
.
join
(
parts
)
# Override the default prefix ('usage') to our % magic escape,
# in a code block.
def
add_usage
(
self
,
usage
,
actions
,
groups
,
prefix
=
"::
\n
\n
%"
):
super
(
MagicHelpFormatter
,
self
).
add_usage
(
usage
,
actions
,
groups
,
prefix
)
class
MagicArgumentParser
(
argparse
.
ArgumentParser
):
""" An ArgumentParser tweaked for use by IPython magics.
"""
def
__init__
(
self
,
prog
=
None
,
usage
=
None
,
description
=
None
,
epilog
=
None
,
parents
=
None
,
formatter_class
=
MagicHelpFormatter
,
prefix_chars
=
'-'
,
argument_default
=
None
,
conflict_handler
=
'error'
,
add_help
=
False
):
if
parents
is
None
:
parents
=
[]
super
(
MagicArgumentParser
,
self
).
__init__
(
prog
=
prog
,
usage
=
usage
,
description
=
description
,
epilog
=
epilog
,
parents
=
parents
,
formatter_class
=
formatter_class
,
prefix_chars
=
prefix_chars
,
argument_default
=
argument_default
,
conflict_handler
=
conflict_handler
,
add_help
=
add_help
)
def
error
(
self
,
message
):
""" Raise a catchable error instead of exiting.
"""
raise
UsageError
(
message
)
def
parse_argstring
(
self
,
argstring
):
""" Split a string into an argument list and parse that argument list.
"""
argv
=
arg_split
(
argstring
)
return
self
.
parse_args
(
argv
)
def
construct_parser
(
magic_func
):
""" Construct an argument parser using the function decorations.
"""
kwds
=
getattr
(
magic_func
,
'argcmd_kwds'
, {})
if
'description'
not
in
kwds
:
kwds
[
'description'
]
=
getattr
(
magic_func
,
'__doc__'
,
None
)
arg_name
=
real_name
(
magic_func
)
parser
=
MagicArgumentParser
(
arg_name
,
**
kwds
)
# Reverse the list of decorators in order to apply them in the
# order in which they appear in the source.
group
=
None
for
deco
in
magic_func
.
decorators
[::
-
1
]:
result
=
deco
.
add_to_parser
(
parser
,
group
)
if
result
is
not
None
:
group
=
result
# Replace the magic function's docstring with the full help text.
magic_func
.
__doc__
=
parser
.
format_help
()
return
parser
def
parse_argstring
(
magic_func
,
argstring
):
""" Parse the string of arguments for the given magic function.
"""
return
magic_func
.
parser
.
parse_argstring
(
argstring
)
def
real_name
(
magic_func
):
""" Find the real name of the magic.
"""
magic_name
=
magic_func
.
__name__
if
magic_name
.
startswith
(
'magic_'
):
magic_name
=
magic_name
[
len
(
'magic_'
):]
return
getattr
(
magic_func
,
'argcmd_name'
,
magic_name
)
class
ArgDecorator
(
object
):
""" Base class for decorators to add ArgumentParser information to a method.
"""
def
__call__
(
self
,
func
):
if
not
getattr
(
func
,
'has_arguments'
,
False
):
func
.
has_arguments
=
True
func
.
decorators
=
[]
func
.
decorators
.
append
(
self
)
return
func
def
add_to_parser
(
self
,
parser
,
group
):
""" Add this object's information to the parser, if necessary.
"""
pass
class
magic_arguments
(
ArgDecorator
):
""" Mark the magic as having argparse arguments and possibly adjust the
name.
"""
def
__init__
(
self
,
name
=
None
):
self
.
name
=
name
def
__call__
(
self
,
func
):
if
not
getattr
(
func
,
'has_arguments'
,
False
):
func
.
has_arguments
=
True
func
.
decorators
=
[]
if
self
.
name
is
not
None
:
func
.
argcmd_name
=
self
.
name
# This should be the first decorator in the list of decorators, thus the
# last to execute. Build the parser.
func
.
parser
=
construct_parser
(
func
)
return
func
class
ArgMethodWrapper
(
ArgDecorator
):
"""
Base class to define a wrapper for ArgumentParser method.
Child class must define either `_method_name` or `add_to_parser`.
"""
_method_name
=
None
def
__init__
(
self
,
*
args
,
**
kwds
):
self
.
args
=
args
self
.
kwds
=
kwds
def
add_to_parser
(
self
,
parser
,
group
):
""" Add this object's information to the parser.
"""
if
group
is
not
None
:
parser
=
group
getattr
(
parser
,
self
.
_method_name
)(
*
self
.
args
,
**
self
.
kwds
)
return
None
class
argument
(
ArgMethodWrapper
):
""" Store arguments and keywords to pass to add_argument().
Instances also serve to decorate command methods.
"""
_method_name
=
'add_argument'
class
defaults
(
ArgMethodWrapper
):
""" Store arguments and keywords to pass to set_defaults().
Instances also serve to decorate command methods.
"""
_method_name
=
'set_defaults'
class
argument_group
(
ArgMethodWrapper
):
""" Store arguments and keywords to pass to add_argument_group().
Instances also serve to decorate command methods.
"""
def
add_to_parser
(
self
,
parser
,
group
):
""" Add this object's information to the parser.
"""
return
parser
.
add_argument_group
(
*
self
.
args
,
**
self
.
kwds
)
class
kwds
(
ArgDecorator
):
""" Provide other keywords to the sub-parser constructor.
"""
def
__init__
(
self
,
**
kwds
):
self
.
kwds
=
kwds
def
__call__
(
self
,
func
):
func
=
super
(
kwds
,
self
).
__call__
(
func
)
func
.
argcmd_kwds
=
self
.
kwds
return
func
__all__
=
[
'magic_arguments'
,
'argument'
,
'argument_group'
,
'kwds'
,
'parse_argstring'
]
Back
|
FazBrowse Home
|
New Git URL