Hello community,

here is the log from the commit of package python-jupyter_ipywidgets for 
openSUSE:Factory checked in at 2015-10-14 16:45:13
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-jupyter_ipywidgets (Old)
 and      /work/SRC/openSUSE:Factory/.python-jupyter_ipywidgets.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-jupyter_ipywidgets"

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-jupyter_ipywidgets/python-jupyter_ipywidgets.changes
      2015-09-30 05:50:36.000000000 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-jupyter_ipywidgets.new/python-jupyter_ipywidgets.changes
 2015-10-14 16:45:15.000000000 +0200
@@ -1,0 +2,11 @@
+Mon Oct 12 13:47:20 UTC 2015 - toddrme2...@gmail.com
+
+- Update to 4.0.3
+  * Provide link to example notebooks in the README.md
+  * Correct some bugs in the code 
+  * Add __version__ to ipywidgets package
+  * Call correct superclass in AccordionView
+  * Make long description part of setup.py
+  * Remove README.md from manifest
+
+-------------------------------------------------------------------

Old:
----
  ipywidgets-4.0.2.tar.gz

New:
----
  ipywidgets-4.0.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-jupyter_ipywidgets.spec ++++++
--- /var/tmp/diff_new_pack.mtI8To/_old  2015-10-14 16:45:15.000000000 +0200
+++ /var/tmp/diff_new_pack.mtI8To/_new  2015-10-14 16:45:15.000000000 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           python-jupyter_ipywidgets
-Version:        4.0.2
+Version:        4.0.3
 Release:        0
 Summary:        IPython HTML widgets for Jupyter
 License:        BSD-3-Clause

++++++ ipywidgets-4.0.2.tar.gz -> ipywidgets-4.0.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipywidgets-4.0.2/PKG-INFO 
new/ipywidgets-4.0.3/PKG-INFO
--- old/ipywidgets-4.0.2/PKG-INFO       2015-08-04 00:18:39.000000000 +0200
+++ new/ipywidgets-4.0.3/PKG-INFO       2015-09-21 17:49:07.000000000 +0200
@@ -1,12 +1,33 @@
 Metadata-Version: 1.1
 Name: ipywidgets
-Version: 4.0.2
+Version: 4.0.3
 Summary: IPython HTML widgets for Jupyter
 Home-page: http://ipython.org
 Author: IPython Development Team
 Author-email: ipython-...@scipy.org
 License: BSD
-Description: UNKNOWN
+Description: 
+        .. image:: https://img.shields.io/pypi/v/ipywidgets.svg
+           :target: https://pypi.python.org/pypi/ipywidgets/
+           :alt: Version Number
+        
+        .. image:: https://img.shields.io/pypi/dm/ipywidgets.svg
+           :target: https://pypi.python.org/pypi/ipywidgets/
+           :alt: Number of PyPI downloads
+        
+        Interactive HTML Widgets
+        ========================
+        
+        Interactive HTML widgets for Jupyter notebooks and the IPython kernel.
+        
+        Usage
+        =====
+        
+        .. code-block:: python
+        
+            from ipywidgets import IntSlider
+            IntSlider()
+        
 Keywords: Interactive,Interpreter,Shell,Web
 Platform: Linux
 Platform: Mac OS X
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipywidgets-4.0.2/README.md 
new/ipywidgets-4.0.3/README.md
--- old/ipywidgets-4.0.2/README.md      2015-07-30 18:34:34.000000000 +0200
+++ new/ipywidgets-4.0.3/README.md      2015-09-15 01:32:04.000000000 +0200
@@ -2,7 +2,7 @@
 
 [![Build 
Status](https://travis-ci.org/ipython/ipywidgets.svg?branch=master)](https://travis-ci.org/ipython/ipywidgets)
 [![Join the chat at 
https://gitter.im/ipython/ipywidgets](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ipython/ipywidgets?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 
-Interactive HTML widgets for Jupyter notebooks and the IPython kernel.
+[Interactive HTML 
widgets](https://github.com/ipython/ipywidgets/blob/master/examples/Index.ipynb)
 for Jupyter notebooks and the IPython kernel.
 
 ## Install
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipywidgets-4.0.2/examples/Controller.ipynb 
new/ipywidgets-4.0.3/examples/Controller.ipynb
--- old/ipywidgets-4.0.2/examples/Controller.ipynb      1970-01-01 
01:00:00.000000000 +0100
+++ new/ipywidgets-4.0.3/examples/Controller.ipynb      2015-09-15 
01:32:04.000000000 +0200
@@ -0,0 +1,90 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Using Game Controllers in the Jupyter Notebook"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The controller widget automatically detects connected gamepad and 
joysticks"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "from ipywidgets import Controller"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "Controller()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "collapsed": false
+   },
+   "source": [
+    "In the case where multiple controllers are connected, you may address the 
controllers by index"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "Controller(index=1)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.4.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipywidgets-4.0.2/examples/Image Processing.ipynb 
new/ipywidgets-4.0.3/examples/Image Processing.ipynb
--- old/ipywidgets-4.0.2/examples/Image Processing.ipynb        2015-08-03 
22:45:16.000000000 +0200
+++ new/ipywidgets-4.0.3/examples/Image Processing.ipynb        2015-09-15 
01:32:04.000000000 +0200
@@ -69,7 +69,7 @@
    "outputs": [],
    "source": [
     "def edit_image(image, sigma=0.1, r=1.0, g=1.0, b=1.0):\n",
-    "    new_image = filter.gaussian_filter(image, sigma=sigma, 
multichannel=True)\n",
+    "    new_image = filters.gaussian_filter(image, sigma=sigma, 
multichannel=True)\n",
     "    new_image[:,:,0] = r*new_image[:,:,0]\n",
     "    new_image[:,:,1] = g*new_image[:,:,1]\n",
     "    new_image[:,:,2] = b*new_image[:,:,2]\n",
@@ -127,7 +127,7 @@
     "\n",
     "@interact\n",
     "def edit_image(image: fixed(i), sigma:(0.0,10.0,0.1)=0.1, r:lims=1.0, 
g:lims=1.0, b:lims=1.0):\n",
-    "    new_image = filter.gaussian_filter(image, sigma=sigma, 
multichannel=True)\n",
+    "    new_image = filters.gaussian_filter(image, sigma=sigma, 
multichannel=True)\n",
     "    new_image[:,:,0] = r*new_image[:,:,0]\n",
     "    new_image[:,:,1] = g*new_image[:,:,1]\n",
     "    new_image[:,:,2] = b*new_image[:,:,2]\n",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipywidgets-4.0.2/examples/Widget Events.ipynb 
new/ipywidgets-4.0.3/examples/Widget Events.ipynb
--- old/ipywidgets-4.0.2/examples/Widget Events.ipynb   2015-08-03 
22:45:16.000000000 +0200
+++ new/ipywidgets-4.0.3/examples/Widget Events.ipynb   2015-09-15 
01:32:04.000000000 +0200
@@ -99,7 +99,7 @@
     }
    },
    "source": [
-    "### on_sumbit"
+    "### on_submit"
    ]
   },
   {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipywidgets-4.0.2/ipywidgets/__init__.py 
new/ipywidgets-4.0.3/ipywidgets/__init__.py
--- old/ipywidgets-4.0.2/ipywidgets/__init__.py 2015-08-03 19:04:47.000000000 
+0200
+++ new/ipywidgets-4.0.3/ipywidgets/__init__.py 2015-09-15 01:32:04.000000000 
+0200
@@ -1,6 +1,7 @@
 import os
 
 from IPython import get_ipython
+from ._version import version_info, __version__
 from .widgets import *
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipywidgets-4.0.2/ipywidgets/_version.py 
new/ipywidgets-4.0.3/ipywidgets/_version.py
--- old/ipywidgets-4.0.2/ipywidgets/_version.py 2015-08-04 00:17:54.000000000 
+0200
+++ new/ipywidgets-4.0.3/ipywidgets/_version.py 2015-09-21 17:42:15.000000000 
+0200
@@ -1,2 +1,2 @@
-version_info = (4, 0, 2)
+version_info = (4, 0, 3)
 __version__ = '.'.join(map(str, version_info))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ipywidgets-4.0.2/ipywidgets/static/widgets/css/widgets.min.css 
new/ipywidgets-4.0.3/ipywidgets/static/widgets/css/widgets.min.css
--- old/ipywidgets-4.0.2/ipywidgets/static/widgets/css/widgets.min.css  
2015-08-04 00:18:36.000000000 +0200
+++ new/ipywidgets-4.0.3/ipywidgets/static/widgets/css/widgets.min.css  
2015-09-21 17:49:04.000000000 +0200
@@ -1 +1 @@
-.widget-interact>div,.widget-interact>input{padding:2.5px}.widget-area{display:-webkit-box;-webkit-box-align:stretch;display:-moz-box;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.widget-area
 .widget-subarea{padding:.44em .4em .4em 
1px;margin-left:6px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-box-flex:2;-moz-box-flex:2;box-flex:2;box-align:start;display:-webkit-box;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}.widget-area.connection-problems
 
.prompt:after{content:"\f127";font-family:'FontAwesome';color:#d9534f;top:3px;padding:3px}.slide-track{border:1px
 solid 
#CCC;background:#FFF;border-radius:4px}.widget-hslider{padding-left:8px;padding-right:2px;overflow:visible;width:350px;height:5px;max-height:5px;margin-top:13px;margin-bottom:10px;border:1px
 solid 
#CCC;border-radius:4px;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.widget-hslider
 
.ui-slider{display:-webkit-box;-webkit-box-align:stretch;display:-moz-box;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1;border:0;background:0
 0}.widget-hslider .ui-slider 
.ui-slider-handle{width:12px;height:28px;margin-top:-8px;border-radius:4px}.widget-hslider
 .ui-slider 
.ui-slider-range{height:12px;margin-top:-4px}.widget-vslider{padding-bottom:5px;overflow:visible;width:5px;max-width:5px;height:250px;margin-left:12px;border:1px
 solid 
#CCC;border-radius:4px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}.widget-vslider
 
.ui-slider{display:-webkit-box;-webkit-box-align:stretch;display:-moz-box;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1;border:0;background:0
 
0;margin-left:-4px;margin-top:5px}.widget-hbox,.widget-vbox{display:-webkit-box;display:-moz-box}.widget-vslider
 .ui-slider 
.ui-slider-handle{width:28px;height:12px;margin-left:-9px;border-radius:4px}.widget-vslider
 .ui-slider 
.ui-slider-range{width:12px;margin-left:-1px}.widget-text{width:350px;margin:0}.widget-listbox{width:350px;margin-bottom:0}.widget-numeric-text{width:150px;margin:0}.widget-hprogress{margin-top:6px;min-width:350px}.widget-hprogress
 
.progress-bar{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.widget-vprogress{margin-top:6px;min-height:250px;width:12px}.widget-vprogress
 
.progress-bar{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.widget-combo-btn{min-width:125px}.widget_item
 .dropdown-menu li a{color:inherit}.widget-valid{margin:9px 3px 
10px}.widget-hbox{-webkit-box-align:stretch;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.widget-hbox
 input[type=checkbox]{margin-top:9px;margin-bottom:10px}.widget-hbox 
.widget-label{min-width:10ex;padding-right:8px;padding-top:5px;text-align:right;vertical-align:text-top}.widget-hbox
 
.widget-readout{padding-left:8px;padding-top:5px;text-align:left;vertical-align:text-top}.widget-vbox{-webkit-box-align:stretch;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}.widget-vbox
 
.widget-label{padding-bottom:5px;text-align:center;vertical-align:text-bottom}.widget-vbox
 
.widget-readout{padding-top:5px;text-align:center;vertical-align:text-top}.widget-box{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-box-align:start;-moz-box-align:start;box-align:start;align-items:flex-start}.widget-radio-box{display:-webkit-box;-webkit-box-align:stretch;display:-moz-box;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding-top:4px}.widget-radio-box
 label{margin-top:0;margin-left:20px}/*# sourceMappingURL=widgets.min.css.map */
\ No newline at end of file
+.widget-area,.widget-hslider{-webkit-box-orient:horizontal;-webkit-box-align:stretch;-moz-box-orient:horizontal;display:flex}.widget-interact>div,.widget-interact>input{padding:2.5px}.widget-area{page-break-inside:avoid;-moz-box-align:stretch;box-orient:horizontal;box-align:stretch;flex-direction:row;align-items:stretch}.widget-area
 
.widget-subarea,.widget-vslider{-webkit-box-orient:vertical;-moz-box-orient:vertical}.widget-area
 .widget-subarea{padding:.44em .4em .4em 
1px;margin-left:6px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-box-flex:2;-moz-box-flex:2;box-flex:2;flex:2;-webkit-box-align:stretch;-moz-box-align:stretch;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}.widget-area.connection-problems
 
.prompt:after{content:"\f127";font-family:FontAwesome;color:#d9534f;top:3px;padding:3px}.slide-track{border:1px
 solid 
#CCC;background:#FFF;border-radius:4px}.widget-hslider{padding-left:8px;padding-right:2px;overflow:visible;width:350px;height:5px;max-height:5px;margin-top:13px;margin-bottom:10px;border:1px
 solid 
#CCC;background:#FFF;border-radius:4px;-moz-box-align:stretch;box-orient:horizontal;box-align:stretch;flex-direction:row;align-items:stretch}.widget-hslider
 
.ui-slider{-webkit-box-orient:horizontal;-webkit-box-align:stretch;-moz-box-orient:horizontal;-moz-box-align:stretch;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1;border:0;background:0
 0}.widget-hslider .ui-slider 
.ui-slider-handle{width:12px;height:28px;margin-top:-8px;border-radius:4px}.widget-hslider
 .ui-slider 
.ui-slider-range{height:12px;margin-top:-4px}.widget-vslider{padding-bottom:5px;overflow:visible;width:5px;max-width:5px;height:250px;margin-left:12px;border:1px
 solid 
#CCC;background:#FFF;border-radius:4px;-webkit-box-align:stretch;-moz-box-align:stretch;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}.widget-vbox,.widget-vslider
 
.ui-slider{-webkit-box-orient:vertical;-moz-box-orient:vertical;display:flex}.widget-vslider
 
.ui-slider{-webkit-box-align:stretch;-moz-box-align:stretch;box-orient:vertical;box-align:stretch;flex-direction:column;align-items:stretch;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1;border:0;background:0
 0;margin-left:-4px;margin-top:5px}.widget-vslider .ui-slider 
.ui-slider-handle{width:28px;height:12px;margin-left:-9px;border-radius:4px}.widget-vslider
 .ui-slider 
.ui-slider-range{width:12px;margin-left:-1px}.widget-text{width:350px;margin:0}.widget-listbox{width:350px;margin-bottom:0}.widget-numeric-text{width:150px;margin:0}.widget-hprogress{margin-top:6px;min-width:350px}.widget-hprogress
 
.progress-bar{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.widget-vprogress{margin-top:6px;min-height:250px;width:12px}.widget-vprogress
 
.progress-bar{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.widget-combo-btn{min-width:125px}.widget_item
 .dropdown-menu li a{color:inherit}.widget-valid{margin:9px 3px 
10px}.widget-hbox{-webkit-box-orient:horizontal;-webkit-box-align:stretch;-moz-box-orient:horizontal;-moz-box-align:stretch;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.widget-hbox
 input[type=checkbox]{margin-top:9px;margin-bottom:10px}.widget-hbox 
.widget-label{min-width:10ex;padding-right:8px;padding-top:5px;text-align:right;vertical-align:text-top}.widget-hbox
 
.widget-readout{padding-left:8px;padding-top:5px;text-align:left;vertical-align:text-top}.widget-vbox{-webkit-box-align:stretch;-moz-box-align:stretch;box-orient:vertical;box-align:stretch;flex-direction:column;align-items:stretch}.widget-vbox
 
.widget-label{padding-bottom:5px;text-align:center;vertical-align:text-bottom}.widget-vbox
 
.widget-readout{padding-top:5px;text-align:center;vertical-align:text-top}.widget-box{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-box-align:start;-moz-box-align:start;box-align:start;align-items:flex-start}.widget-radio-box{-webkit-box-orient:vertical;-webkit-box-align:stretch;-moz-box-orient:vertical;-moz-box-align:stretch;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding-top:4px}.widget-radio-box
 label{margin-top:0;margin-left:20px}/*# sourceMappingURL=widgets.min.css.map */
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ipywidgets-4.0.2/ipywidgets/static/widgets/css/widgets.min.css.map 
new/ipywidgets-4.0.3/ipywidgets/static/widgets/css/widgets.min.css.map
--- old/ipywidgets-4.0.2/ipywidgets/static/widgets/css/widgets.min.css.map      
2015-08-04 00:18:36.000000000 +0200
+++ new/ipywidgets-4.0.3/ipywidgets/static/widgets/css/widgets.min.css.map      
2015-09-21 17:49:04.000000000 +0200
@@ -1 +1 @@
-{"version":3,"sources":["ipywidgets/static/widgets/css/widgets.css"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"sources":["ipywidgets/static/widgets/css/widgets.css"],"names":[],"mappings":"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"}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ipywidgets-4.0.2/ipywidgets/static/widgets/js/init.js 
new/ipywidgets-4.0.3/ipywidgets/static/widgets/js/init.js
--- old/ipywidgets-4.0.2/ipywidgets/static/widgets/js/init.js   2015-05-27 
22:24:49.000000000 +0200
+++ new/ipywidgets-4.0.3/ipywidgets/static/widgets/js/init.js   2015-09-15 
01:32:04.000000000 +0200
@@ -15,6 +15,7 @@
     "nbextensions/widgets/widgets/js/widget_selection",
     "nbextensions/widgets/widgets/js/widget_selectioncontainer",
     "nbextensions/widgets/widgets/js/widget_string",
+    "nbextensions/widgets/widgets/js/widget_controller",
 ], function(widgetmanager, widget) {
     // Register all of the loaded models and views with the widget manager.
     for (var i = 2; i < arguments.length; i++) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ipywidgets-4.0.2/ipywidgets/static/widgets/js/widget_controller.js 
new/ipywidgets-4.0.3/ipywidgets/static/widgets/js/widget_controller.js
--- old/ipywidgets-4.0.2/ipywidgets/static/widgets/js/widget_controller.js      
1970-01-01 01:00:00.000000000 +0100
+++ new/ipywidgets-4.0.3/ipywidgets/static/widgets/js/widget_controller.js      
2015-09-15 01:32:04.000000000 +0200
@@ -0,0 +1,312 @@
+// Copyright (c) Jupyter Development Team.
+// Distributed under the terms of the Modified BSD License.
+
+define([
+    "nbextensions/widgets/widgets/js/widget", 
+    "base/js/utils", 
+], function(widget, utils) {
+    'use strict';
+
+    var Button = widget.DOMWidgetView.extend({
+        /* Very simple view for a gamepad button. */
+
+        render : function(){
+            this.$support = $('<div />').css({
+                    'position': 'relative',
+                    'margin': '1px',
+                    'width': '16px',
+                    'height': '16px',
+                    'border': '1px solid black',
+                    'background': 'lightgray',
+                })
+                .appendTo(this.$el);
+            this.$bar = $('<div />')
+                .css({
+                    'position': 'absolute',
+                    'width': '100%',
+                    'bottom': 0,
+                    'background': 'gray',
+                })
+                .appendTo(this.$support);
+            this.$label = $('<div />')
+                .text(this.model.get('description'))
+                .css('text-align', 'center')
+                .appendTo(this.$el);
+            this.update();
+        },
+
+        update : function() {
+            this.$bar.css('height', 100 * this.model.get('value') + '%');
+        },
+
+    });
+
+    var Axis = widget.DOMWidgetView.extend({
+        /* Very simple view for a gamepad axis. */
+
+        render : function() {
+            this.$el.css({
+                    'width': '16px',
+                    'padding': '4px',
+                });
+            this.$support = $('<div />').css({
+                    'position': 'relative',
+                    'margin': '1px',
+                    'width': '4px',
+                    'height': '64px',
+                    'border': '1px solid black',
+                    'background': 'lightgray',
+                })
+                .appendTo(this.$el);
+            this.$bullet = $('<div />')
+                .css({
+                    'position': 'absolute',
+                    'margin': '-4px',
+                    'width': '10px',
+                    'height': '10px',
+                    'background': 'gray',
+                })
+                .appendTo(this.$support);
+            this.$label = $('<div />')
+                .text(this.model.get('description'))
+                .css('text-align', 'center')
+                .appendTo(this.$el);
+            this.update();
+        },
+
+        update : function() {
+            this.$bullet.css('top', 50 * (this.model.get('value') + 1) + '%');
+        },
+
+    });
+
+    var Controller = widget.WidgetModel.extend({
+        /* The Controller model. */
+
+        initialize: function() {
+            if (navigator.getGamepads === void 0) {
+                // Checks if the browser supports the gamepad API
+                this.readout = 'This browser does not support gamepads.';
+                console.error(this.readout);
+            } else {
+                // Start the wait loop, and listen to updates of the only
+                // user-provided attribute, the gamepad index.
+                this.readout = 'Connect gamepad and press any button.';
+                this.wait_loop();
+            }
+        },
+
+        wait_loop: function() {
+            /* Waits for a gamepad to be connected at the provided index.
+             * Once one is connected, it will start the update loop, which
+             * populates the update of axes and button values.
+             */
+            var index = this.get('index');
+            var pad = navigator.getGamepads()[index];
+            if (pad) {
+                this.index = index;
+                var that = this;
+                this.setup(pad).then(function(controls) {
+                    that.set(controls);
+                    that.save_changes();
+                    window.requestAnimationFrame(that.update_loop.bind(that));
+                });
+            } else {
+                window.requestAnimationFrame(this.wait_loop.bind(this));
+            }
+        },
+
+        setup: function(pad) {
+            /* Given a native gamepad object, returns a promise for a 
dictionary of
+             * controls, of the form
+             * {
+             *     buttons: list of Button models,
+             *     axes: list of Axis models,
+             * }
+             */
+            // Set up the main gamepad attributes
+            this.set({
+                name: pad.id,
+                mapping: pad.mapping,
+                connected: pad.connected,
+                timestamp: pad.timestamp,
+            });
+            // Create buttons and axes. When done, start the update loop
+            var that = this;
+            return utils.resolve_promises_dict({
+                buttons: Promise.all(pad.buttons.map(function(btn, index) {
+                    return that._create_button_model(index);
+                })),
+                axes: Promise.all(pad.axes.map(function(axis, index) {
+                    return that._create_axis_model(index);
+                })),
+            });
+        },
+
+        update_loop: function() {
+            /* Populates axes and button values, until the gamepad is 
disconnected.
+             * When the gamepad is disconnected, this.reset_gamepad is called.
+             */ 
+            var index = this.get('index');
+            var pad = navigator.getGamepads()[index];
+            if (pad && this.index === index) {
+                this.set({
+                    timestamp: pad.timestamp,
+                    connected: pad.connected,
+                });
+                this.save_changes();
+                this.get('buttons').forEach(function(model, index) {
+                    model.set({
+                        value: pad.buttons[index].value,
+                        pressed: pad.buttons[index].pressed,
+                    });
+                    model.save_changes();
+                });
+                this.get('axes').forEach(function(model, index) {
+                    model.set('value', pad.axes[index]);
+                    model.save_changes();
+                });
+                window.requestAnimationFrame(this.update_loop.bind(this));
+            } else {
+                this.reset_gamepad();
+            } 
+        },
+
+        reset_gamepad: function() {
+            /* Resets the gamepad attributes, and calls the wait_loop.
+             */
+            this.get('buttons').forEach(function(button) {
+                button.close();
+            });
+            this.get('axes').forEach(function(axis) {
+                axis.close();
+            });
+            this.set({
+                name: '',
+                mapping: '',
+                connected: false,
+                timestamp: 0.0,
+                buttons: [],
+                axes: [],
+            });
+            this.save_changes();
+            window.requestAnimationFrame(this.wait_loop.bind(this));
+        },
+
+        _create_button_model: function(index) {
+            /* Creates a gamepad button widget.
+             */
+            return this.widget_manager.new_widget({
+                 model_name: 'WidgetModel', 
+                 widget_class: 'ipywidgets.widgets.widget_controller.Button',
+            }).then(function(model) {
+                 model.set('description', index);
+                 return model;
+            });
+        },
+
+        _create_axis_model: function(index) {
+            /* Creates a gamepad axis widget.
+             */
+            return this.widget_manager.new_widget({
+                 model_name: 'WidgetModel', 
+                 widget_class: 'ipywidgets.widgets.widget_controller.Axis',
+            }).then(function(model) {
+                 model.set('description', index);
+                 return model;
+            });
+        },
+
+    }, { 
+
+        serializers: _.extend({
+            buttons: {deserialize: widget.unpack_models},
+            axes: {deserialize: widget.unpack_models},
+        }, widget.WidgetModel.serializers)
+
+    });
+
+    var ControllerView = widget.DOMWidgetView.extend({
+        /* A simple view for a gamepad. */
+
+        initialize: function() {
+            ControllerView.__super__.initialize.apply(this, arguments);
+
+            this.button_views = new widget.ViewList(this.add_button, null, 
this);
+            this.listenTo(this.model, 'change:buttons', function(model, value) 
{
+                this.button_views.update(value);
+            }, this);
+
+            this.axis_views = new widget.ViewList(this.add_axis, null, this);
+            this.listenTo(this.model, 'change:axes', function(model, value) {
+                this.axis_views.update(value);
+            }, this);
+
+            this.listenTo(this.model, 'change:name', this.update_label, this);
+        },
+
+        render: function(){
+            this.$box = this.$el;
+
+            this.$label = $('<div />')
+                .appendTo(this.$box);
+
+            this.$axis_box = $('<div />')
+                .css('display', 'flex')
+                .appendTo(this.$box);
+
+            this.$button_box = $('<div />')
+                .css('display', 'flex')
+                .appendTo(this.$box);
+
+            this.button_views.update(this.model.get('buttons'));
+            this.axis_views.update(this.model.get('axes'));
+
+            this.update_label();
+        },
+
+        update_label: function() {
+            this.$label.text(this.model.get('name') || this.model.readout);
+        }, 
+
+        add_button: function(model) {
+            var that = this;
+            var dummy = $('<div/>');
+            that.$button_box.append(dummy);
+            return this.create_child_view(model).then(function(view) {
+                dummy.replaceWith(view.el);
+                that.displayed.then(function() {
+                    view.trigger('displayed');
+                });
+                return view;
+            }).catch(utils.reject('Could not add button view', true));
+        },
+
+        add_axis: function(model) {
+            var that = this;
+            var dummy = $('<div/>');
+            that.$axis_box.append(dummy);
+            return this.create_child_view(model).then(function(view) {
+                dummy.replaceWith(view.el);
+                that.displayed.then(function() {
+                    view.trigger('displayed');
+                });
+                return view;
+            }).catch(utils.reject('Could not add axis view', true));
+        },
+ 
+        remove: function() {
+            ControllerView.__super__.remove.apply(this, arguments);
+            this.button_views.remove();
+            this.axis_views.remove();
+        },
+
+    });
+
+    return {
+        ControllerButton: Button,
+        ControllerAxis: Axis,
+        Controller: Controller,
+        ControllerView: ControllerView,
+    };
+});
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ipywidgets-4.0.2/ipywidgets/static/widgets/js/widget_selectioncontainer.js 
new/ipywidgets-4.0.3/ipywidgets/static/widgets/js/widget_selectioncontainer.js
--- 
old/ipywidgets-4.0.2/ipywidgets/static/widgets/js/widget_selectioncontainer.js  
    2015-07-17 00:45:13.000000000 +0200
+++ 
new/ipywidgets-4.0.3/ipywidgets/static/widgets/js/widget_selectioncontainer.js  
    2015-09-15 01:32:04.000000000 +0200
@@ -49,7 +49,7 @@
         update: function(options) {
             this.update_titles();
             this.update_selected_index(options);
-            return TabView.__super__.update.apply(this);
+            return AccordionView.__super__.update.apply(this);
         },
 
         update_titles: function() {
@@ -62,7 +62,7 @@
                 var accordian = that.containers[page_index];
                 if (accordian !== undefined) {
                     accordian
-                        .find('.panel-heading')
+                        .children('.panel-heading')
                         .find('.accordion-toggle')
                         .text(title);
                 }
@@ -77,9 +77,13 @@
             if (options === undefined || options.updated_view != this) {
                 var old_index = this.model.previous('selected_index');
                 var new_index = this.model.get('selected_index');
-                
this.containers[old_index].find('.panel-collapse').collapse('hide');
+                /* old_index can be out of bounds, this check avoids raising
+                   a (hrmless) javascript error. */
+                if (0 <= old_index && old_index < this.containers.length) {
+                    
this.containers[old_index].children('.panel-collapse').collapse('hide');
+                }
                 if (0 <= new_index && new_index < this.containers.length) {
-                    
this.containers[new_index].find('.panel-collapse').collapse('show');
+                    
this.containers[new_index].children('.panel-collapse').collapse('show');
                 }
             }
         },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipywidgets-4.0.2/ipywidgets/widgets/__init__.py 
new/ipywidgets-4.0.3/ipywidgets/widgets/__init__.py
--- old/ipywidgets-4.0.2/ipywidgets/widgets/__init__.py 2015-07-31 
23:06:56.000000000 +0200
+++ new/ipywidgets-4.0.3/ipywidgets/widgets/__init__.py 2015-09-15 
01:32:04.000000000 +0200
@@ -12,5 +12,6 @@
 from .widget_selection import RadioButtons, ToggleButtons, Dropdown, Select, 
SelectMultiple
 from .widget_selectioncontainer import Tab, Accordion
 from .widget_string import HTML, Latex, Text, Textarea
+from .widget_controller import Controller 
 from .interaction import interact, interactive, fixed, interact_manual
 from .widget_link import jslink, jsdlink
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipywidgets-4.0.2/ipywidgets/widgets/interaction.py 
new/ipywidgets-4.0.3/ipywidgets/widgets/interaction.py
--- old/ipywidgets-4.0.2/ipywidgets/widgets/interaction.py      2015-07-17 
00:45:13.000000000 +0200
+++ new/ipywidgets-4.0.3/ipywidgets/widgets/interaction.py      2015-09-15 
01:32:04.000000000 +0200
@@ -218,7 +218,8 @@
             manual_button.disabled = True
         try:
             container.result = f(**container.kwargs)
-            display(container.result)
+            if container.result is not None:
+                display(container.result)
         except Exception as e:
             ip = get_ipython()
             if ip is None:
@@ -316,7 +317,8 @@
             # so wrap in a lambda
             f = lambda *args, **kwargs: __interact_f(*args, **kwargs)
             f.widget = w
-        display(w)
+        if w is not None:
+            display(w)
         return f
     else:
         # This branch handles the case 3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ipywidgets-4.0.2/ipywidgets/widgets/tests/test_interaction.py 
new/ipywidgets-4.0.3/ipywidgets/widgets/tests/test_interaction.py
--- old/ipywidgets-4.0.2/ipywidgets/widgets/tests/test_interaction.py   
2015-05-27 22:24:49.000000000 +0200
+++ new/ipywidgets-4.0.3/ipywidgets/widgets/tests/test_interaction.py   
2015-09-15 01:32:04.000000000 +0200
@@ -411,6 +411,22 @@
     )
 
 @nt.with_setup(clear_display)
+def test_call_interact_on_trait_changed_none_return():
+    def foo(a='default'):
+        pass
+    with patch.object(interaction, 'display', record_display):
+        ifoo = interact(foo)
+    nt.assert_equal(len(displayed), 1)
+    w = displayed[0].children[0]
+    check_widget(w,
+        cls=widgets.Text,
+        value='default',
+    )
+    with patch.object(interaction, 'display', record_display):
+        w.value = 'called'
+    nt.assert_equal(len(displayed), 1)
+
+@nt.with_setup(clear_display)
 def test_call_interact_kwargs():
     def foo(a='default'):
         pass
@@ -444,8 +460,11 @@
     nt.assert_equal(d['a'], 'hello')
     
     # test that setting trait values calls the function
-    w.value = 'called'
+    with patch.object(interaction, 'display', record_display):
+        w.value = 'called'
     nt.assert_equal(d['a'], 'called')
+    nt.assert_equal(len(displayed), 2)
+    nt.assert_equal(w.value, displayed[-1])
 
 @nt.with_setup(clear_display)
 def test_call_decorated_kwargs_on_trait_change():
@@ -468,8 +487,13 @@
     nt.assert_equal(d['a'], 'hello')
     
     # test that setting trait values calls the function
-    w.value = 'called'
+    with patch.object(interaction, 'display', record_display):
+        w.value = 'called'
     nt.assert_equal(d['a'], 'called')
+    nt.assert_equal(len(displayed), 2)
+    nt.assert_equal(w.value, displayed[-1])
+
+
 
 def test_fixed():
     c = interactive(f, a=widgets.fixed(5), b='text')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ipywidgets-4.0.2/ipywidgets/widgets/widget_controller.py 
new/ipywidgets-4.0.3/ipywidgets/widgets/widget_controller.py
--- old/ipywidgets-4.0.2/ipywidgets/widgets/widget_controller.py        
1970-01-01 01:00:00.000000000 +0100
+++ new/ipywidgets-4.0.3/ipywidgets/widgets/widget_controller.py        
2015-09-15 01:32:04.000000000 +0200
@@ -0,0 +1,50 @@
+"""Controller class.
+
+Represents a Gamepad or Joystick controller.
+"""
+
+# Copyright (c) Jupyter Development Team.
+# Distributed under the terms of the Modified BSD License.
+
+from .widget import Widget, register, widget_serialization
+from traitlets import Bool, Int, Float, Unicode, List, Instance
+
+
+@register('IPython.ControllerButton')
+class Button(Widget):
+    """Represents a gamepad or joystick button"""
+    value = Float(min=0.0, max=1.0, read_only=True, sync=True)
+    pressed = Bool(read_only=True, sync=True)
+
+    _view_name = Unicode('ControllerButton', sync=True)
+
+
+@register('IPython.ControllerAxis')
+class Axis(Widget):
+    """Represents a gamepad or joystick axis"""
+    value = Float(min=-1.0, max=1.0, read_only=True, sync=True)
+
+    _view_name = Unicode('ControllerAxis', sync=True)
+
+
+@register('IPython.Controller')
+class Controller(Widget):
+    """Represents a game controller"""
+    index = Int(sync=True)
+
+    # General information about the gamepad, button and axes mapping, name.
+    # These values are all read-only and set by the JavaScript side.
+    name = Unicode(read_only=True, sync=True)
+    mapping = Unicode(read_only=True, sync=True)
+    connected = Bool(read_only=True, sync=True)
+    timestamp = Float(read_only=True, sync=True)
+
+    # Buttons and axes - read-only
+    buttons = List(trait=Instance(Button), read_only=True,
+                   sync=True, **widget_serialization)
+    axes = List(trait=Instance(Axis), read_only=True, sync=True,
+                **widget_serialization)
+
+    _view_name = Unicode('ControllerView', sync=True)
+    _model_name = Unicode('Controller', sync=True)
+ 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipywidgets-4.0.2/package.json 
new/ipywidgets-4.0.3/package.json
--- old/ipywidgets-4.0.2/package.json   2015-08-03 22:58:46.000000000 +0200
+++ new/ipywidgets-4.0.3/package.json   2015-09-21 17:42:23.000000000 +0200
@@ -1,6 +1,6 @@
 {
   "name": "ipython-widget-deps",
-  "version": "4.0.0",
+  "version": "4.0.3",
   "description": "IPython widget nodejs build dependencies",
   "author": "IPython Developers",
   "license": "BSD",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ipywidgets-4.0.2/setup.py 
new/ipywidgets-4.0.3/setup.py
--- old/ipywidgets-4.0.2/setup.py       2015-07-31 18:49:13.000000000 +0200
+++ new/ipywidgets-4.0.3/setup.py       2015-09-21 17:37:24.000000000 +0200
@@ -9,6 +9,29 @@
 # the name of the package
 name = 'ipywidgets'
 
+LONG_DESCRIPTION = """
+.. image:: https://img.shields.io/pypi/v/ipywidgets.svg
+   :target: https://pypi.python.org/pypi/ipywidgets/
+   :alt: Version Number
+
+.. image:: https://img.shields.io/pypi/dm/ipywidgets.svg
+   :target: https://pypi.python.org/pypi/ipywidgets/
+   :alt: Number of PyPI downloads
+
+Interactive HTML Widgets
+========================
+
+Interactive HTML widgets for Jupyter notebooks and the IPython kernel.
+
+Usage
+=====
+
+.. code-block:: python
+
+    from ipywidgets import IntSlider
+    IntSlider()
+"""
+
 #-----------------------------------------------------------------------------
 # Minimal Python version sanity check
 #-----------------------------------------------------------------------------
@@ -219,6 +242,7 @@
     packages        = packages,
     package_data    = package_data,
     description     = "IPython HTML widgets for Jupyter",
+    long_description = LONG_DESCRIPTION,
     author          = 'IPython Development Team',
     author_email    = 'ipython-...@scipy.org',
     url             = 'http://ipython.org',


Reply via email to