|
@@
-60,62
+60,78
b' New features'
|
|
60
|
major Achilles heel (the lack of proper test coverage made it effectively
|
|
60
|
major Achilles heel (the lack of proper test coverage made it effectively
|
|
61
|
impossible to do large-scale refactoring).
|
|
61
|
impossible to do large-scale refactoring).
|
|
62
|
|
|
62
|
|
|
63
|
* The notion of a task has been completely reworked. An `ITask` interface has
|
|
63
|
* The notion of a task has been completely reworked. An `ITask` interface has
|
|
64
|
been created. This interface defines the methods that tasks need to implement.
|
|
64
|
been created. This interface defines the methods that tasks need to implement.
|
|
65
|
These methods are now responsible for things like submitting tasks and processing
|
|
65
|
These methods are now responsible for things like submitting tasks and processing
|
|
66
|
results. There are two basic task types: :class:`IPython.kernel.task.StringTask`
|
|
66
|
results. There are two basic task types: :class:`IPython.kernel.task.StringTask`
|
|
67
|
(this is the old `Task` object, but renamed) and the new
|
|
67
|
(this is the old `Task` object, but renamed) and the new
|
|
68
|
:class:`IPython.kernel.task.MapTask`, which is based on a function.
|
|
68
|
:class:`IPython.kernel.task.MapTask`, which is based on a function.
|
|
69
|
* A new interface, :class:`IPython.kernel.mapper.IMapper` has been defined to
|
|
69
|
|
|
70
|
standardize the idea of a `map` method. This interface has a single
|
|
70
|
* A new interface, :class:`IPython.kernel.mapper.IMapper` has been defined to
|
|
71
|
`map` method that has the same syntax as the built-in `map`. We have also defined
|
|
71
|
standardize the idea of a `map` method. This interface has a single
|
|
72
|
a `mapper` factory interface that creates objects that implement
|
|
72
|
`map` method that has the same syntax as the built-in `map`. We have also defined
|
|
73
|
:class:`IPython.kernel.mapper.IMapper` for different controllers. Both
|
|
73
|
a `mapper` factory interface that creates objects that implement
|
|
74
|
the multiengine and task controller now have mapping capabilties.
|
|
74
|
:class:`IPython.kernel.mapper.IMapper` for different controllers. Both
|
|
75
|
* The parallel function capabilities have been reworks. The major changes are that
|
|
75
|
the multiengine and task controller now have mapping capabilties.
|
|
76
|
i) there is now an `@parallel` magic that creates parallel functions, ii)
|
|
76
|
|
|
77
|
the syntax for mulitple variable follows that of `map`, iii) both the
|
|
77
|
* The parallel function capabilities have been reworks. The major changes are that
|
|
78
|
multiengine and task controller now have a parallel function implementation.
|
|
78
|
i) there is now an `@parallel` magic that creates parallel functions, ii)
|
|
79
|
* All of the parallel computing capabilities from `ipython1-dev` have been merged into
|
|
79
|
the syntax for mulitple variable follows that of `map`, iii) both the
|
|
80
|
IPython proper. This resulted in the following new subpackages:
|
|
80
|
multiengine and task controller now have a parallel function implementation.
|
|
81
|
:mod:`IPython.kernel`, :mod:`IPython.kernel.core`, :mod:`IPython.config`,
|
|
81
|
|
|
82
|
:mod:`IPython.tools` and :mod:`IPython.testing`.
|
|
82
|
* All of the parallel computing capabilities from `ipython1-dev` have been merged into
|
|
83
|
* As part of merging in the `ipython1-dev` stuff, the `setup.py` script and friends
|
|
83
|
IPython proper. This resulted in the following new subpackages:
|
|
84
|
have been completely refactored. Now we are checking for dependencies using
|
|
84
|
:mod:`IPython.kernel`, :mod:`IPython.kernel.core`, :mod:`IPython.config`,
|
|
85
|
the approach that matplotlib uses.
|
|
85
|
:mod:`IPython.tools` and :mod:`IPython.testing`.
|
|
86
|
* The documentation has been completely reorganized to accept the documentation
|
|
86
|
|
|
87
|
from `ipython1-dev`.
|
|
87
|
* As part of merging in the `ipython1-dev` stuff, the `setup.py` script and friends
|
|
88
|
* We have switched to using Foolscap for all of our network protocols in
|
|
88
|
have been completely refactored. Now we are checking for dependencies using
|
|
89
|
:mod:`IPython.kernel`. This gives us secure connections that are both encrypted
|
|
89
|
the approach that matplotlib uses.
|
|
90
|
and authenticated.
|
|
90
|
|
|
91
|
* We have a brand new `COPYING.txt` files that describes the IPython license
|
|
91
|
* The documentation has been completely reorganized to accept the documentation
|
|
92
|
and copyright. The biggest change is that we are putting "The IPython
|
|
92
|
from `ipython1-dev`.
|
|
93
|
Development Team" as the copyright holder. We give more details about exactly
|
|
93
|
|
|
94
|
what this means in this file. All developer should read this and use the new
|
|
94
|
* We have switched to using Foolscap for all of our network protocols in
|
|
95
|
banner in all IPython source code files.
|
|
95
|
:mod:`IPython.kernel`. This gives us secure connections that are both encrypted
|
|
96
|
* sh profile: ./foo runs foo as system command, no need to do !./foo anymore
|
|
96
|
and authenticated.
|
|
97
|
* String lists now support 'sort(field, nums = True)' method (to easily
|
|
97
|
|
|
98
|
sort system command output). Try it with 'a = !ls -l ; a.sort(1, nums=1)'
|
|
98
|
* We have a brand new `COPYING.txt` files that describes the IPython license
|
|
99
|
* '%cpaste foo' now assigns the pasted block as string list, instead of string
|
|
99
|
and copyright. The biggest change is that we are putting "The IPython
|
|
100
|
* The ipcluster script now run by default with no security. This is done because
|
|
100
|
Development Team" as the copyright holder. We give more details about exactly
|
|
101
|
the main usage of the script is for starting things on localhost. Eventually
|
|
101
|
what this means in this file. All developer should read this and use the new
|
|
102
|
when ipcluster is able to start things on other hosts, we will put security
|
|
102
|
banner in all IPython source code files.
|
|
103
|
back.
|
|
103
|
|
|
104
|
* 'cd --foo' searches directory history for string foo, and jumps to that dir.
|
|
104
|
* sh profile: ./foo runs foo as system command, no need to do !./foo anymore
|
|
105
|
Last part of dir name is checked first. If no matches for that are found,
|
|
105
|
|
|
106
|
look at the whole path.
|
|
106
|
* String lists now support 'sort(field, nums = True)' method (to easily
|
|
|
|
|
107
|
sort system command output). Try it with 'a = !ls -l ; a.sort(1, nums=1)'
|
|
|
|
|
108
|
|
|
|
|
|
109
|
* '%cpaste foo' now assigns the pasted block as string list, instead of string
|
|
|
|
|
110
|
|
|
|
|
|
111
|
* The ipcluster script now run by default with no security. This is done because
|
|
|
|
|
112
|
the main usage of the script is for starting things on localhost. Eventually
|
|
|
|
|
113
|
when ipcluster is able to start things on other hosts, we will put security
|
|
|
|
|
114
|
back.
|
|
|
|
|
115
|
|
|
|
|
|
116
|
* 'cd --foo' searches directory history for string foo, and jumps to that dir.
|
|
|
|
|
117
|
Last part of dir name is checked first. If no matches for that are found,
|
|
|
|
|
118
|
look at the whole path.
|
|
107
|
|
|
119
|
|
|
108
|
Bug fixes
|
|
120
|
Bug fixes
|
|
109
|
---------
|
|
121
|
---------
|
|
110
|
|
|
122
|
|
|
111
|
* The colors escapes in the multiengine client are now turned off on win32 as they
|
|
123
|
* The colors escapes in the multiengine client are now turned off on win32 as they
|
|
112
|
don't print correctly.
|
|
124
|
don't print correctly.
|
|
113
|
* The :mod:`IPython.kernel.scripts.ipengine` script was exec'ing mpi_import_statement
|
|
125
|
|
|
114
|
incorrectly, which was leading the engine to crash when mpi was enabled.
|
|
126
|
* The :mod:`IPython.kernel.scripts.ipengine` script was exec'ing mpi_import_statement
|
|
115
|
* A few subpackages has missing `__init__.py` files.
|
|
127
|
incorrectly, which was leading the engine to crash when mpi was enabled.
|
|
116
|
* The documentation is only created is Sphinx is found. Previously, the `setup.py`
|
|
128
|
|
|
117
|
script would fail if it was missing.
|
|
129
|
* A few subpackages has missing `__init__.py` files.
|
|
118
|
* Greedy 'cd' completion has been disabled again (it was enabled in 0.8.4)
|
|
130
|
|
|
|
|
|
131
|
* The documentation is only created is Sphinx is found. Previously, the `setup.py`
|
|
|
|
|
132
|
script would fail if it was missing.
|
|
|
|
|
133
|
|
|
|
|
|
134
|
* Greedy 'cd' completion has been disabled again (it was enabled in 0.8.4)
|
|
119
|
|
|
135
|
|
|
120
|
|
|
136
|
|
|
121
|
Backwards incompatible changes
|
|
137
|
Backwards incompatible changes
|
|
@@
-125,28
+141,35
b' Backwards incompatible changes'
|
|
125
|
:func:`make_user_namespaces`, to support dict subclasses in namespace
|
|
141
|
:func:`make_user_namespaces`, to support dict subclasses in namespace
|
|
126
|
creation.
|
|
142
|
creation.
|
|
127
|
|
|
143
|
|
|
128
|
* :class:`IPython.kernel.client.Task` has been renamed
|
|
144
|
* :class:`IPython.kernel.client.Task` has been renamed
|
|
129
|
:class:`IPython.kernel.client.StringTask` to make way for new task types.
|
|
145
|
:class:`IPython.kernel.client.StringTask` to make way for new task types.
|
|
130
|
* The keyword argument `style` has been renamed `dist` in `scatter`, `gather`
|
|
146
|
|
|
131
|
and `map`.
|
|
147
|
* The keyword argument `style` has been renamed `dist` in `scatter`, `gather`
|
|
132
|
* Renamed the values that the rename `dist` keyword argument can have from
|
|
148
|
and `map`.
|
|
133
|
`'basic'` to `'b'`.
|
|
149
|
|
|
134
|
* IPython has a larger set of dependencies if you want all of its capabilities.
|
|
150
|
* Renamed the values that the rename `dist` keyword argument can have from
|
|
135
|
See the `setup.py` script for details.
|
|
151
|
`'basic'` to `'b'`.
|
|
136
|
* The constructors for :class:`IPython.kernel.client.MultiEngineClient` and
|
|
152
|
|
|
137
|
:class:`IPython.kernel.client.TaskClient` no longer take the (ip,port) tuple.
|
|
153
|
* IPython has a larger set of dependencies if you want all of its capabilities.
|
|
138
|
Instead they take the filename of a file that contains the FURL for that
|
|
154
|
See the `setup.py` script for details.
|
|
139
|
client. If the FURL file is in your IPYTHONDIR, it will be found automatically
|
|
155
|
|
|
140
|
and the constructor can be left empty.
|
|
156
|
* The constructors for :class:`IPython.kernel.client.MultiEngineClient` and
|
|
141
|
* The asynchronous clients in :mod:`IPython.kernel.asyncclient` are now created
|
|
157
|
:class:`IPython.kernel.client.TaskClient` no longer take the (ip,port) tuple.
|
|
142
|
using the factory functions :func:`get_multiengine_client` and
|
|
158
|
Instead they take the filename of a file that contains the FURL for that
|
|
143
|
:func:`get_task_client`. These return a `Deferred` to the actual client.
|
|
159
|
client. If the FURL file is in your IPYTHONDIR, it will be found automatically
|
|
144
|
* The command line options to `ipcontroller` and `ipengine` have changed to
|
|
160
|
and the constructor can be left empty.
|
|
145
|
reflect the new Foolscap network protocol and the FURL files. Please see the
|
|
161
|
|
|
146
|
help for these scripts for details.
|
|
162
|
* The asynchronous clients in :mod:`IPython.kernel.asyncclient` are now created
|
|
147
|
* The configuration files for the kernel have changed because of the Foolscap stuff.
|
|
163
|
using the factory functions :func:`get_multiengine_client` and
|
|
148
|
If you were using custom config files before, you should delete them and regenerate
|
|
164
|
:func:`get_task_client`. These return a `Deferred` to the actual client.
|
|
149
|
new ones.
|
|
165
|
|
|
|
|
|
166
|
* The command line options to `ipcontroller` and `ipengine` have changed to
|
|
|
|
|
167
|
reflect the new Foolscap network protocol and the FURL files. Please see the
|
|
|
|
|
168
|
help for these scripts for details.
|
|
|
|
|
169
|
|
|
|
|
|
170
|
* The configuration files for the kernel have changed because of the Foolscap stuff.
|
|
|
|
|
171
|
If you were using custom config files before, you should delete them and regenerate
|
|
|
|
|
172
|
new ones.
|
|
150
|
|
|
173
|
|
|
151
|
Changes merged in from IPython1
|
|
174
|
Changes merged in from IPython1
|
|
152
|
-------------------------------
|
|
175
|
-------------------------------
|
|
@@
-154,76
+177,97
b' Changes merged in from IPython1'
|
|
154
|
New features
|
|
177
|
New features
|
|
155
|
............
|
|
178
|
............
|
|
156
|
|
|
179
|
|
|
157
|
* Much improved ``setup.py`` and ``setupegg.py`` scripts. Because Twisted
|
|
180
|
* Much improved ``setup.py`` and ``setupegg.py`` scripts. Because Twisted
|
|
158
|
and zope.interface are now easy installable, we can declare them as dependencies
|
|
181
|
and zope.interface are now easy installable, we can declare them as dependencies
|
|
159
|
in our setupegg.py script.
|
|
182
|
in our setupegg.py script.
|
|
160
|
* IPython is now compatible with Twisted 2.5.0 and 8.x.
|
|
183
|
|
|
161
|
* Added a new example of how to use :mod:`ipython1.kernel.asynclient`.
|
|
184
|
* IPython is now compatible with Twisted 2.5.0 and 8.x.
|
|
162
|
* Initial draft of a process daemon in :mod:`ipython1.daemon`. This has not
|
|
185
|
|
|
163
|
been merged into IPython and is still in `ipython1-dev`.
|
|
186
|
* Added a new example of how to use :mod:`ipython1.kernel.asynclient`.
|
|
164
|
* The ``TaskController`` now has methods for getting the queue status.
|
|
187
|
|
|
165
|
* The ``TaskResult`` objects not have information about how long the task
|
|
188
|
* Initial draft of a process daemon in :mod:`ipython1.daemon`. This has not
|
|
166
|
took to run.
|
|
189
|
been merged into IPython and is still in `ipython1-dev`.
|
|
167
|
* We are attaching additional attributes to exceptions ``(_ipython_*)`` that
|
|
190
|
|
|
168
|
we use to carry additional info around.
|
|
191
|
* The ``TaskController`` now has methods for getting the queue status.
|
|
169
|
* New top-level module :mod:`asyncclient` that has asynchronous versions (that
|
|
192
|
|
|
170
|
return deferreds) of the client classes. This is designed to users who want
|
|
193
|
* The ``TaskResult`` objects not have information about how long the task
|
|
171
|
to run their own Twisted reactor
|
|
194
|
took to run.
|
|
172
|
* All the clients in :mod:`client` are now based on Twisted. This is done by
|
|
195
|
|
|
173
|
running the Twisted reactor in a separate thread and using the
|
|
196
|
* We are attaching additional attributes to exceptions ``(_ipython_*)`` that
|
|
174
|
:func:`blockingCallFromThread` function that is in recent versions of Twisted.
|
|
197
|
we use to carry additional info around.
|
|
175
|
* Functions can now be pushed/pulled to/from engines using
|
|
198
|
|
|
176
|
:meth:`MultiEngineClient.push_function` and :meth:`MultiEngineClient.pull_function`.
|
|
199
|
* New top-level module :mod:`asyncclient` that has asynchronous versions (that
|
|
177
|
* Gather/scatter are now implemented in the client to reduce the work load
|
|
200
|
return deferreds) of the client classes. This is designed to users who want
|
|
178
|
of the controller and improve performance.
|
|
201
|
to run their own Twisted reactor.
|
|
179
|
* Complete rewrite of the IPython docuementation. All of the documentation
|
|
202
|
|
|
180
|
from the IPython website has been moved into docs/source as restructured
|
|
203
|
* All the clients in :mod:`client` are now based on Twisted. This is done by
|
|
181
|
text documents. PDF and HTML documentation are being generated using
|
|
204
|
running the Twisted reactor in a separate thread and using the
|
|
182
|
Sphinx.
|
|
205
|
:func:`blockingCallFromThread` function that is in recent versions of Twisted.
|
|
183
|
* New developer oriented documentation: development guidelines and roadmap.
|
|
206
|
|
|
184
|
* Traditional ``ChangeLog`` has been changed to a more useful ``changes.txt`` file
|
|
207
|
* Functions can now be pushed/pulled to/from engines using
|
|
185
|
that is organized by release and is meant to provide something more relevant
|
|
208
|
:meth:`MultiEngineClient.push_function` and :meth:`MultiEngineClient.pull_function`.
|
|
186
|
for users.
|
|
209
|
|
|
|
|
|
210
|
* Gather/scatter are now implemented in the client to reduce the work load
|
|
|
|
|
211
|
of the controller and improve performance.
|
|
|
|
|
212
|
|
|
|
|
|
213
|
* Complete rewrite of the IPython docuementation. All of the documentation
|
|
|
|
|
214
|
from the IPython website has been moved into docs/source as restructured
|
|
|
|
|
215
|
text documents. PDF and HTML documentation are being generated using
|
|
|
|
|
216
|
Sphinx.
|
|
|
|
|
217
|
|
|
|
|
|
218
|
* New developer oriented documentation: development guidelines and roadmap.
|
|
|
|
|
219
|
|
|
|
|
|
220
|
* Traditional ``ChangeLog`` has been changed to a more useful ``changes.txt`` file
|
|
|
|
|
221
|
that is organized by release and is meant to provide something more relevant
|
|
|
|
|
222
|
for users.
|
|
187
|
|
|
223
|
|
|
188
|
Bug fixes
|
|
224
|
Bug fixes
|
|
189
|
.........
|
|
225
|
.........
|
|
190
|
|
|
226
|
|
|
191
|
* Created a proper ``MANIFEST.in`` file to create source distributions.
|
|
227
|
* Created a proper ``MANIFEST.in`` file to create source distributions.
|
|
192
|
* Fixed a bug in the ``MultiEngine`` interface. Previously, multi-engine
|
|
228
|
|
|
193
|
actions were being collected with a :class:`DeferredList` with
|
|
229
|
* Fixed a bug in the ``MultiEngine`` interface. Previously, multi-engine
|
|
194
|
``fireononeerrback=1``. This meant that methods were returning
|
|
230
|
actions were being collected with a :class:`DeferredList` with
|
|
195
|
before all engines had given their results. This was causing extremely odd
|
|
231
|
``fireononeerrback=1``. This meant that methods were returning
|
|
196
|
bugs in certain cases. To fix this problem, we have 1) set
|
|
232
|
before all engines had given their results. This was causing extremely odd
|
|
197
|
``fireononeerrback=0`` to make sure all results (or exceptions) are in
|
|
233
|
bugs in certain cases. To fix this problem, we have 1) set
|
|
198
|
before returning and 2) introduced a :exc:`CompositeError` exception
|
|
234
|
``fireononeerrback=0`` to make sure all results (or exceptions) are in
|
|
199
|
that wraps all of the engine exceptions. This is a huge change as it means
|
|
235
|
before returning and 2) introduced a :exc:`CompositeError` exception
|
|
200
|
that users will have to catch :exc:`CompositeError` rather than the actual
|
|
236
|
that wraps all of the engine exceptions. This is a huge change as it means
|
|
201
|
exception.
|
|
237
|
that users will have to catch :exc:`CompositeError` rather than the actual
|
|
|
|
|
238
|
exception.
|
|
202
|
|
|
239
|
|
|
203
|
Backwards incompatible changes
|
|
240
|
Backwards incompatible changes
|
|
204
|
..............................
|
|
241
|
..............................
|
|
205
|
|
|
242
|
|
|
206
|
* All names have been renamed to conform to the lowercase_with_underscore
|
|
243
|
* All names have been renamed to conform to the lowercase_with_underscore
|
|
207
|
convention. This will require users to change references to all names like
|
|
244
|
convention. This will require users to change references to all names like
|
|
208
|
``queueStatus`` to ``queue_status``.
|
|
245
|
``queueStatus`` to ``queue_status``.
|
|
209
|
* Previously, methods like :meth:`MultiEngineClient.push` and
|
|
246
|
|
|
210
|
:meth:`MultiEngineClient.push` used ``*args`` and ``**kwargs``. This was
|
|
247
|
* Previously, methods like :meth:`MultiEngineClient.push` and
|
|
211
|
becoming a problem as we weren't able to introduce new keyword arguments into
|
|
248
|
:meth:`MultiEngineClient.push` used ``*args`` and ``**kwargs``. This was
|
|
212
|
the API. Now these methods simple take a dict or sequence. This has also allowed
|
|
249
|
becoming a problem as we weren't able to introduce new keyword arguments into
|
|
213
|
us to get rid of the ``*All`` methods like :meth:`pushAll` and :meth:`pullAll`.
|
|
250
|
the API. Now these methods simple take a dict or sequence. This has also allowed
|
|
214
|
These things are now handled with the ``targets`` keyword argument that defaults
|
|
251
|
us to get rid of the ``*All`` methods like :meth:`pushAll` and :meth:`pullAll`.
|
|
215
|
to ``'all'``.
|
|
252
|
These things are now handled with the ``targets`` keyword argument that defaults
|
|
216
|
* The :attr:`MultiEngineClient.magicTargets` has been renamed to
|
|
253
|
to ``'all'``.
|
|
217
|
:attr:`MultiEngineClient.targets`.
|
|
254
|
|
|
218
|
* All methods in the MultiEngine interface now accept the optional keyword argument
|
|
255
|
* The :attr:`MultiEngineClient.magicTargets` has been renamed to
|
|
219
|
``block``.
|
|
256
|
:attr:`MultiEngineClient.targets`.
|
|
220
|
* Renamed :class:`RemoteController` to :class:`MultiEngineClient` and
|
|
257
|
|
|
221
|
:class:`TaskController` to :class:`TaskClient`.
|
|
258
|
* All methods in the MultiEngine interface now accept the optional keyword argument
|
|
222
|
* Renamed the top-level module from :mod:`api` to :mod:`client`.
|
|
259
|
``block``.
|
|
223
|
* Most methods in the multiengine interface now raise a :exc:`CompositeError` exception
|
|
260
|
|
|
224
|
that wraps the user's exceptions, rather than just raising the raw user's exception.
|
|
261
|
* Renamed :class:`RemoteController` to :class:`MultiEngineClient` and
|
|
225
|
* Changed the ``setupNS`` and ``resultNames`` in the ``Task`` class to ``push``
|
|
262
|
:class:`TaskController` to :class:`TaskClient`.
|
|
226
|
and ``pull``.
|
|
263
|
|
|
|
|
|
264
|
* Renamed the top-level module from :mod:`api` to :mod:`client`.
|
|
|
|
|
265
|
|
|
|
|
|
266
|
* Most methods in the multiengine interface now raise a :exc:`CompositeError` exception
|
|
|
|
|
267
|
that wraps the user's exceptions, rather than just raising the raw user's exception.
|
|
|
|
|
268
|
|
|
|
|
|
269
|
* Changed the ``setupNS`` and ``resultNames`` in the ``Task`` class to ``push``
|
|
|
|
|
270
|
and ``pull``.
|
|
227
|
|
|
271
|
|
|
228
|
Release 0.8.4
|
|
272
|
Release 0.8.4
|
|
229
|
=============
|
|
273
|
=============
|