if completer get only one match back and the user press tab n time,
it fallbacks on showing a tooltip
n=2 , hard coded for know, and completer verbose on the command line
put "close" and "more..." button in upper right corner,
rename "more..." to "open in pager", add expand button.
tooltip don't have scroll bar an are 'small' until pressing "Expand"
they then change their height and add scrollbars.
Horizontal scrollbar behaviour seem to depend on the browser
>>> plot(<tab> and then click on "expand" :
Firefox : no horizontal scrollbar (wrap line ?)
Chrome : horizontal scrollbar
beware that don't limitting tooltip height or width through css will sometime give
tooltip that are too heigh and will overflow below the bottom of the screen
animation are broken with max-height and/or min-height
change order of completion element so that the ones ending with '='
will be at the beginning of the list. When you complete inside a
fonction call, you then have kwargs first add configuration in the left
pannel
add a section in the left pannel of the notebook to make the time before
triggering a tooltip when pressign "(" configurable. Negative values will
disable the tooltip (comparaison at each keypress for now, but can be
improved) The syle of the <input> field should be a little improve, why not
a slider with jquerry
As until now, when pressing tab and a white space was preceding the cursor
The completion was triggerd with the whole namespace in it. Now if a
whitespace or an opening bracket is just befor the cursor it will try to
display a tooltip. The logic to find what object_info_request is send have
been sightly changed to try to match the expression just before the last
unmached openig bracket before the cursor (without considering what is
after the cursor).
example (_|_ represent the cursor):
>>> his_|_<tab> # completion
>>> hist(_|_<tab> # tooltip on hist
>>> hist(rand(20),bins=range(_|_ <tab> #tooltip on range
>>> hist(rand(20),bins=range(10), _|_ <tab> # tooltip on hist (whitespace before cursor)
>>> hist(rand(20),bins=range(10),_|_ <tab> # completion
as we dont care of what is after the cursor:
>>> hist(rand(5000), bins=50, _|_orientaion='horizontal') # and tab, equivalent to
>>> hist(rand(5000), bins=50, _|_<tab> # onte the space again
>>> hist(_|_rand(5000), bins=50, orientaion='horizontal') # and tab, equivalent to
>>> hist(_|_
the 4 give tooltip on hist
note that you can get tooltip on things that aren't function by appending a
'(' like
>>> matplotlib(<tab>
Which is kinda weird... so we might want to bound another shortcut for
tooltip, but which matches without bracket...
additionnaly I have added a "Config" pannel in the left pannel with a checkbox
bind to wether or not activate this functionnality
Note, (rebase and edited commit, might not work perfetly xwithout the following ones)
When user press '(' and nothing for 1200ms, 'object_info_request' sent to
the kernel. Then tooltip with 'definition' and beggining of 'docstring'
shown to the user if non empty response.
Unlike Completion <select> , <div> is not focusable so event handled in main
cell event handeling function
Add some CSS3 that most browser with websocket should support.
ZMQStream is the right object to use for event-driven handling of messages, but instead we chose to rewrite half of it in KernelManager.
This removes most of the duplicate code, in favor of using ZMQStream.
also use the pyzmq install() function for using pyzmq with tornado, instead of manually pasting its contents in notebook app.
An error would previously be raised whenever iopub traffic arrived that
did not originate with the notebook (e.g. pylab welcome, or qtconsole output).
This error was not in a block that would actually cause problems, so actual
functionality was not affected.
Most int traits are now Integers
Integer differs from Long only in that small `long`s are cast to `int`, rather than
all `int`s being cast to `long`:
Integer(4L) => 4
Long(4) => 4L
closes gh-942, closes gh-996.
Rebased to avoid recursive merge for just one commit.
Websocket fixes:
1. alert client on failed and lost web socket connections
A long message is given if the connection fails within 1s, which assumes the connection did not succeed. Otherwise, it is a short 'connection closed unexpectedly'.
This also means that clients are notified on server termination (for better or worse).
2. remove superfluous ws-hostname parameter from notebook
This made the notebook server artificially and unnecessarily brittle against tunneling and explicit hostname resolution. Now, the ws_url is defined based on the Origin of the request for the url, so it always matches the http[s] url. This means that it will follow the same tunnel, and the hostname will be already resolved. Resolving the hostname twice makes no sense at all unless the websockets are going to a different server than the http requests.
Implemented as a property, so it should still be easy to change for future cases where it might behave differently (e.g. websockets on a different host, or at a non-root url).
A long message is given if the connection fails within 1s. Otherwise, it is a short 'connection closed unexpectedly'.
This also means that clients are notified on server termination.
This made the notebook server artificially and unnecessarily brittle to tunneling, and non-local hostname resolution. The ws_url is now defined based on the Origin of the request. This allows tunneled hosts and ports to preserve connections, as the ws_url always matches the one in use by the client.
Implemented as a property, to facilitate future cases where it might behave differently.
The notebook now supports a `--read-only` flag, which allows users to view all notebooks being served but not to edit them or execute any code. These actions are not allowed and the buttons, shortcuts, etc. are removed, but the requests will raise authentication errors if they manage to send the events anyway. Save/print functions remain available.
This flag can be used in two modes:
1. When running an unauthenticated server, one can run a *second* read-only server in the same directory on a public IP address. This will let users connect to the read-only view without having to worry about configuring passwords and certificates for the execution server.
2. When running a server configured with authentication (and hopefully an SSL certificate), starting it with `--read-only` allows unauthenticated users read-only access to notebooks. This means that the same server on a single port can be both used by authenticated users for execution and by the public for viewing the available notebooks.
Show invalid config message on TraitErrors during initialization.
implemented via `@catch_config` decorator
Now, the event that was triggered by invalid app config (see `--log-level 5`) is triggered by bad config at any point during initialization.
This *will* catch TraitError-raising bugs in IPython itself, but only during initialization.
Also, deregister crash handler on use to avoid it being triggered recursively/repeatedly.
If a user has Chrome set as their default browser (system-wide or via
the `BROWSER` environment variable), opening the notebook hangs
because the chrome call doesn't return immediately. This solves the
issue by opening the browser in a thread.
Note that there remains an issue where killing the notebook will kill
Chrome if the Chrome session was started by us. I haven't found a way
to work around that despite attempts by making the webbrowser.open()
call in a subprocess.
When using a password, read-only mode allows unauthenticated users
read-only access to notebooks. Editing, execution, etc. are not
allowed in read-only mode, but save/print functions are available.
No kernels are started until an authenticated user opens a notebook.
implemented via @catch_config decorator
Now, the event that was triggered by invalid app config (see `--log-level 5`) is triggered by bad config at any point during initialization.
This *will* catch TraitError bugs in IPython itself, but only during initialization.
closes gh-908
The History will always appear empty, so history magics, etc. don't do anything. Readline history for a single session works fine.
Test suite should now pass without sqlite
Adding clear_output to kernel and HTML notebook.
This enables the clearing of output during the execution of a cell. It can be used for simple forms of animation in the notebook.
All buttons, show/hide clickable areas, etc. should have some tooltip describing
what they do. There are jQuery plugins for enhanced tooltips, but this gets
the lightest version working.
closes#436
Various Notebook usability fixes:
- add kernel restart dialog confirmation (it destroys the user session)
- add missing keybindings
- change language from 'terminal mode' to 'in-place execution' which is more descriptive
- adjust spacing/padding and colors slightly for readability and better use of space in small screens.
- add line numbering toggle to code cells. Triggered with C-m-l.
- show keybindings in monospaced font.
- add QuickHelp button that is always visible and at the top.
- add missing keybindings for kernel interrupt/restart from the kbd.
Now multiple calls no longer show multiple instances of the shortcut dialog. Rather, clicking the quick help, or invoking `C-m h` will hide
the dialog if shown.
Update codemirror to 2.15 and make the code internally more version-agnostic.
Added our own README file with information about what changes we carry to upstream CodeMirror and what version we currently use.
This is separate from previous, because it is more likely to be rejected.
It requires the the Session objects in Handlers get a reference all the way back up to the IPython App that started the environment.
stdin requests are now directed to the frontend that made the execution
request that called raw_input.
allow_stdin flag added to execution_request to indicate whether stdin_requests are allowed.
StdInNotImplementedError exception class added to IPython.core.error, and is raised if raw_input is called from execute requests where allow_input is undefined.
closes gh-673
Simply call it 'codemirror', so we don't have explicit version numbers
inside a bunch of files.
A file called ipython-version-N.NN will be kept to easily let us know
which version we're shipping with IPython.
Several improvements to stdout/stderr handling and visual layout of cells.
Now stdout and stderr are kept contiguous (in a single div) if they are being written to continuously, and stderr is shown with a light red background to help distinguish from stdout.
Further, input cells now have a light gray background to help distinguish them from plain stdout areas.
* add think border around input area
* change background instead of foreground on stderr
* only stderr/stdout are output_stream, general text (including streams) is output_text
* reduce vertical padding on stream output, per @fperez
Consecutive messages to stdout or stderr will not be split
into separate divs, until a new message to different stream
arrives.
Appending will only occur when the latest output is the same
as the new one. Interleaving messages will still result in
multiple divs.
* test_for uses import_item, instead of __import__
* test_for now allows a callback, for processing the result of import_item prior to comparison with min_zmq
* callback is only called when min_zmq is defined
* callback's default is to just return mod.__version__
* use this to check tornado version, and zmq as a version tuple
* fix pexpect check to use external.pexpect
These messages are not returned to the browser, but are printed
to the server logs and will help the code readability.
I have also used a more specific code in some cases.
We were having problems with notebook renaming when using uuid5,
as there are many places in the code where we assume that the
notebook id is unique and unchanging as long as the notebook
server runs.
* It seems that our old setting of visible was causing scroll bars
to appear if font sizes change in Chrome.
* Also changed json -> xml in Download UI.
* I have added page-break-inside logic to div.input and
div.output_area.
* Fixed a bug in CodeCell that was putting the output_area class
on the wrong div.
I had removed a text area focus event earlier today and that
broke the . key. We are still having problems with CodeMirror
elements gaining focus, but this seems to fix the issue.
* Favicon.ico is served.
* Test suit now passes.
* Help links work for for me.
* Other changes made to address inline comments.
* The printing of long lines is an extremely subtle issue and I will open an issue for it.
* zmqws.py is completely gone so the naked print is not an issue.
* ipython-notebook removed from scripts.
* Updated copyright and authors of files.
* Fixed missing docstrings in IPython.nbformat.
IPDoctest replaces the normal doctest plugin. Previously we did this by
initializing the builtin plugins but skipping the doctest plugin.
However, if the user has a noserc file with 'with-doctest=1' or the
environment variable 'NOSE_WITH_DOCTEST', then nose will try and
initialize the doctest plugin when it isn't there, and barf. This
commit defers the removal of the doctest plugin to the configuration
stage, so doctest can be enabled before it is thrown away by us.
* Previously, when a kernel died due to an external cause, the
notebook/kernel mapping was not removed, so the kernel would
be resused even though it was dead.
* The heartbeat now properly removes the notebook/kernel mapping.
* Both the header and parent_header have a date field that cannot
be json serialized. This field is just removed for now, but
in the future, we will covert the date to a ISO8601 field.
* Better error handling around this code has also been added
to prevent the server from crashing due to malformed messages.
* Full kernel heartbeating is working.
* Connections between the notebook and server and now created
a new each time there is a WebSocket connection. Each channel is
also handled separately. This dramatically simplifies the
server code and makes for a more scalable system.
compact.
* Reduced padding between cells from 15px to 5px.
* Prompt width is now dynamic to grow/shrink as the prompt number
increases in width.
* Reduced padding between input and output from 15px to 5px.
* ipython_notebook_config.py is now created and staged.
* New certfile/keyfile config=True attributes for enabling SSL/TLS.
* Examples of usage added.
* New handling for --ip=*
* Aliases added.
* Old routers were not being shutdown and removed.
* We were incorrectly associating the new kernel with the notebook
(we were using the *old* kernel_id for this).
* General clean ups in the kernel manager.
* The .py notebook reader now uses that ast module to split
a plain python file into blocks. These blocks become cells in
the notebook.
* Proper mime types are used for xml (application/xml), json
(application/json) and python (application/x-python).
* Other fixes to file uploading.
In a notebook setting being able to delete and add cells makes it
virtually impossible to correctly guess what the next input
prompt number should be. We now follow the convention that our
prompts look like "In [ ]:" before execution.
In this mode, a new cell is not created after the current cell
is run. Once the cell is run, the current input is cleared, so
it acts just like the terminal.
* Extra enter on FF is fixed by hooking into CodeMirror's
onKeyEvent hook. We now have CodeMirror ignore shift-enter
completely as we handle it ourselves.
* The cell execution logic in notebook.js has been refactored and
the Run All/Selected buttons have been hooked up.
* The KernelManager now manages multiple kernels with a uniform
API.
* The SessionManager now manages the full set of channels+streams
and the IPython.zmq.session.Session object for a single kernel.
* Padding added to L/R of notebook div (40px).
* Margin added to T/B of cells (15px).
* Margin added to T of output div (15px).
* More elements using border-box layout mode.
* The logic in the server and javascript frontend is there for
a basic JSON notebook format with a .ipynb extension.
* To save a new notebook: "%notebook save filename.ipynb"
* To save a notebook that is already saved: "%notebook save"
* To load a notebook from the cwd: "notebook load filename.ipynb"
* Cleaned up the js code for creating the code cell.
* Added a div around the input text area to allow the text area
to have a width of 100%.
* Added CodeCell.toJSON.
Previously, each client (browser window) would open its own set
of ZMQ sockets to a kernel. Now one master set of connections
to the kernel is created and all clients share those connections.
In some ways, this simplifies the URL design.
I have also made kernel_ids server-side created.
* use index on msg_id in mongodb backend (_table prevented some methods from working outside the session)
* purge_request improved to use fewer db calls
* mongodb testcase split into its own file
* Fix equality testing, NULL handling, in SQLiteDB backend
Before, calling figure() would produce a big blank area. This ensures
output is only returned if the figure has content.
Also added basic testing for pylabtools, for which we had none.
ported from numpy.testing.noseclasses, with the equivalent code
extracted into _numpy_testing_noseclasses in case numpy is not
installed.
removed some unused imports throughout
This will give us an easy way for users to report platform details,
without trying to cram lots of data into the version string.
Now, the version information in release.py is simple and doesn't
attempt to read version control data at runtime. We expose sys_info()
as a top-level function so it's very easy to remember/direct for new
users.
Minor doc/copyright notices updates in the same files.
* Renamed CachedOutput to displayhook.DisplayHook.
* Added methods that DisplayHook.__call__ uses to do its work.
These methods can now be overridden for the ZMQ kernel.
* Removed all hooks (result_display and generate_output_prompt)
that the outputcache was using. We need to add these back in
once we figure out what to do about hooks in general.
Fernando's branch introduced the ability to run the test suite
from a top-level iptest.py script. This allowed IPython to be tested
without installation. The implementation was fragile and we also
decided that we *want* people to install IPython as part of testing
it, so we removed this feature.
* :mod:`IPython.testing.globalipapp` now directly creates a
:class:`~IPython.core.iplib.InteractiveShell` instance by passing it a
configuration object, rather than creating an IPython application.
* Updated everything in :mod:`IPython.frontend` and :mod:`IPython.gui` to use
raw :class:`~IPython.core.iplib.InteractiveShell directly rather than
creating an IPython application.
* Updated the IPython sphinx extension to use raw
:class:`~IPython.core.iplib.InteractiveShell directly rather than creating
an IPython application.
* Removed code from :mod:`IPython.extensions.pretty` that called
:func:`get_ipython` (r1271).
* Addressed comment on (r1284) about holding refs to deferreds in
:mod:`IPython.kernel.ipclusterapp`.
* Removed :mod:`IPython.kernel` from list of modules tested by nose in
:mod:`IPython.testing.iptest`. (r1318)
* Added comment about Magic(object) (r1224)
* Moved InteractiveTB.set_mode from IPythonApp -> InteractiveShell (r1229)
* Moved pylabtools.py to IPython/lib (r1229)
* Cleaned up comments and copyrights in testing (r1233)
* Added comment about ip.shell._ofind (r1237)
* Removed "Bye." from quitter (r1240).
* Refactored and removed :mod:`IPython.utils.genutils` and
:mod:`IPython.utils.platutils`. These modules have been replaced by topical
focused modules in :mod:`IPython.utils`.
* Refactored tests in :mod:`IPython.utils.tests`.
* Moved :func:`IPython.testing.tools.temp_pyfile` to :mod:`IPython.utils.io`.
* Moved :func:`IPython.testing.tools.cmd2argv` to
:func:`IPython.testing.tools.pycmd2argv` and documented the fact that this
only works with Python based command line programs.
* Created a new :func:`IPython.utils.path.get_ipython_module_path` to use
in finding paths to IPython modules.
Added a module-level INSTALLED flag, which can be set to false if the test
suite is being run in-place (without ipython having been installed at all).
This is because how we call and import things must be done differently
depending on whether the code is installed or is being run in-place. The
only ones that can know this reliably are the entry-point scripts, so those
are responsible for setting this flag.
Also made the code that validates ipython in subprocesses report errors
better, by checking stderr for errors before validating stdout output, as
anything on stderr will be likely informative of the real problem.
Now, calling:
- 'python iptest.py' from source dir or from src/IPython/testing should give
the same results
- 'python iptest.py IPython.SOMETHING' from either place should also give
the same results.
I fond some spurious warnings on Fedora, extra noise on stdout and other
small problems this commit fixes.
The test suite now runs cleanly on Fedora11 without Twisted available.
Also clean up the handling of command-line options for iptest, so that all
options given at the top-level are correctly passed to nose.
Fixes: https://bugs.launchpad.net/ipython/+bug/507079
installed.
Also activated testing.tools to be picked up by the test suite (was
excluded), this gives us a few more tests.
Status:
- On Linux, the full suite passes like before.
- On Win32, now that we have Twisted, we're seeing a few failures, because I
don't have the WinHPC server stuff. These should be easy for Brian to fix.
There are also two tests where the Skip nose exception isn't recognized by
Twisted, should also be easy. I'll file tickets for those.
After Brian's comments, I realized that our test machinery was NOT in
reality running all the ipython-syntax doctests we have. This is now fixed.
The test suite isn't completely passing, but this commit is for the
underlying machinery. I will now work on fixing as many broken tests as I
can.
Fixes https://bugs.launchpad.net/ipython/+bug/505071
A couple of issues came up:
* Some tests in testing and frontend rely on twisted, but are being
tested with nose. This is bad! We currently have hackish logic in
iptest to skip these if twisted is not installed, but if it is we
are testing them with nose!
* Some modules (engineservice, kernel/error, newserialized) have nose
skip logic even though they should never be tested with nose.
* When trial is run on testStrictDict we get an uncaught error.
testStrictDict ... ERROR: An unexpected error occurred while tokenizing
input The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (37, 0))
The main conflicts I had to fix were in ultratb. I have removed
the ultraTB.py in IPython/kernel/core. Now IPython/core/ultratb.py
is being used everywhere. Also I have protected the calls to ipapi.get
to see if None is returned. This happens when trial IPython.kernel
is run.
Check that wx.aui can be imported and otherwise exclude modules that use it to
avoid errors when loading the test suite.
Also, do load clearcmd so that the tests for %clear do work.
The regular expressions we were using on win32 were not matching. The
trick is to construct the regular expression with double \\ like this::
re.compile('foo\\\\bar')
Arggg!!
This is in an attempt at better isolating it from the rest of nose, because
we are seeing intermittent Twisted errors when it is enabled. However, I
still see them sometimes.
- Also, make the reference counting tests a little less verbose.
This plugin was causing problems with Twisted. We need to go through
the plugin to find the source of the problem. For now, our test suite
passes though.