Last active
March 13, 2016 16:50
-
-
Save tonyfast/b98e8a50521dad35caf5 to your computer and use it in GitHub Desktop.
Live updating html renderings in the notebook
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 256, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"import mistune, pyjade, pyquery, jinja2, pandas, IPython, ipywidgets, traitlets, requests, jinja2schema\n", | |
"from coffeetools import coffee\n", | |
"%reload_ext autoreload\n", | |
"%autoreload 2\n", | |
"%reload_ext jademagic\n", | |
"response = requests.get('https://api.github.com/repos/jupyter/jupyter/events')\n", | |
"df = pandas.DataFrame(response.json())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 257, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"class ComponentBase( traitlets.HasTraits ):\n", | |
" import jinja2, ipywidgets, traitlets, pyquery, jinja2schema\n", | |
" type = 'html'\n", | |
" query = pyquery.PyQuery(\"\"\"</>\"\"\")\n", | |
" string = traitlets.Unicode(default_value=\"\"\"\"\"\").tag(description=\"\"\"An HTML string template.\"\"\")\n", | |
" data = traitlets.Dict( default_value={} )\n", | |
" processor = staticmethod( lambda v: v) \n", | |
" \n", | |
" def __init__( self, env=jinja2.Environment(loader=jinja2.DictLoader({})), name=\"\", **kwargs ):\n", | |
" for key, value in kwargs.items():\n", | |
" if not key in ['string','data']:\n", | |
" setattr( self, key, value )\n", | |
" self.html = ipywidgets.HTML(\"\"\"\"\"\")\n", | |
" self.env, self.name = [env, name]\n", | |
" self._load_template(\"\"\"\"\"\") \n", | |
" for key, value in kwargs.items():\n", | |
" if key in ['string','data']:\n", | |
" setattr( self, key, value )\n", | |
"\n", | |
" \n", | |
" @traitlets.observe('string')\n", | |
" def reset( self, change = {} ):\n", | |
" value = self.processor( change['new'] if 'new' in change else self.string )\n", | |
" if self.type in ['javascript']:\n", | |
" self.query = self.pyquery.PyQuery( '<script></script>' ).text( value )\n", | |
" else:\n", | |
" self.query = self.pyquery.PyQuery( value )\n", | |
" self._update_template()\n", | |
" \n", | |
" def _load_template( self, template_string ):\n", | |
" if self.name:\n", | |
" self.env.loader.mapping[ self.name ] = template_string\n", | |
" self.template = self.env.get_template( self.name )\n", | |
" else:\n", | |
" self.template = self.env.from_string( template_string ) \n", | |
" \n", | |
" def _update_template( self ):\n", | |
" template_string = self.query.outerHtml() \n", | |
" self.template_variables = jinja2schema.infer( template_string )\n", | |
" self._load_template( template_string )\n", | |
" self.update()\n", | |
" \n", | |
" @traitlets.observe('data')\n", | |
" def update( self, change = {} ):\n", | |
" try:\n", | |
" self.html.value = self.template.render( **self.data )\n", | |
" except:\n", | |
" pass\n", | |
" \n", | |
" def __mul__( self, other ):\n", | |
" block_string = \"\"\"\"\"\"\n", | |
" for value in other:\n", | |
" block_string += self.template.render( **value )\n", | |
" return ComponentBase( env = self.env, string = block_string, data = self.data, type=self.type )\n", | |
" \n", | |
" def __sub__( self, other ):\n", | |
" for query_string in other.split( ',' ):\n", | |
" self.query(query_string).html(\"\")\n", | |
" return ComponentBase( env = self.env, string = self.query.outerHtml(), data = self.data, type=self.type )\n", | |
" \n", | |
" def _repr_html_( self ):\n", | |
" return self.html.value\n", | |
" \n", | |
" def __repr__( self ):\n", | |
" return self.html.value\n", | |
" \n", | |
"class LayoutComponent( ComponentBase ):\n", | |
" env = jinja2.Environment(loader=jinja2.DictLoader({}))\n", | |
" component = traitlets.Dict(default_value={}).tag(description=\"\"\"Components to Layout\"\"\")\n", | |
" \n", | |
" def __init__( self, **kwargs ):\n", | |
" super().__init__( name='page', env=self.env, **kwargs )\n", | |
" \n", | |
" def extend( self, component_name, **kwargs ):\n", | |
" self.component = { \n", | |
" **self.component, \n", | |
" **{ \n", | |
" component_name: ComponentBase( name=component_name, env=self.env, **kwargs ) \n", | |
" } \n", | |
" }\n", | |
" return self.component[ component_name ]\n", | |
" " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 258, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"issues = df[df.type.apply(lambda s:s.startswith('Issues'))].to_dict(orient='records')\n", | |
"layout = LayoutComponent()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 259, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"panel = layout.extend( 'new', string=\"\"\"h4 {{payload.issue.body}}\"\"\", processor=pyjade.process)\n", | |
"panel.html" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 260, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"panel.data = issues[0]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 261, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"panel.string = new.string.replace('h4','p.lead')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 262, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"panel.string = \"\"\"\n", | |
"div.row\n", | |
" div.panel.panel-warning\n", | |
" div.panel-heading\n", | |
" h4 {{actor.login}}\n", | |
" div.panel-body\n", | |
" \n", | |
" p.load {{payload.issue.body or 'None'}}\n", | |
"\"\"\"" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 263, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"header = panel - '.panel-body'\n", | |
"header.html" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 264, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"@ipywidgets.interact\n", | |
"def change_times( i=[0,len(issues)-1]):\n", | |
" panel.data = header.data = issues[i]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 265, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div><div class=\"row\">\n", | |
" <div class=\"panel panel-warning\">\n", | |
" <div class=\"panel-heading\">\n", | |
" <h4>ziky90</h4>\n", | |
" </div>\n", | |
" <div class=\"panel-body\">\n", | |
" <p class=\"load\">I am using `jupyter` notebook and since short time ago logs stopped to appear in output cells and started to appear only in the terminal. \n", | |
" \n", | |
"I have described the problem here: \n", | |
"http://stackoverflow.com/questions/35936086/jupyter-notebook-does-not-print-logs-to-the-output-cell/35940918#35940918 \n", | |
" \n", | |
"To summarise this, I have found that since there is not specified exact version of `ipykernel` package in setup in `jupyter`. There was changed `ipykernel`'s version that is being installed. \n", | |
" \n", | |
"Logging to output cell works correctly for `ipykernel==4.2.1` and earlier, but since `4.3.0` https://github.com/ipython/ipykernel/releases/tag/4.3.0 logs goes to terminal instead of the output cell.</p>\n", | |
" </div>\n", | |
" </div>\n", | |
"</div><div class=\"row\">\n", | |
" <div class=\"panel panel-warning\">\n", | |
" <div class=\"panel-heading\">\n", | |
" <h4>willingc</h4>\n", | |
" </div>\n", | |
" <div class=\"panel-body\">\n", | |
" <p class=\"load\">On Monday, ReadTheDocs changed their service to opt in projects for display of a small ad in the bottom left of the docs (they do not allow tracking of users by third party scripts). See [blog post](https://blog.readthedocs.com/ads-on-read-the-docs/) for details. \n", | |
" \n", | |
"For all the project documentation that I have permissions on, I have disabled the advertising feature for the following reasons: \n", | |
" \n", | |
"- this is a decision that should be made by the larger project community or steering council to opt in, if desired \n", | |
"- I personally support ReadTheDocs financially with the ReadTheDocs Gold contribution monthly. \n", | |
"- I also contribute my time as I know other devs on Jupyter do as well. \n", | |
" \n", | |
"It is my belief that the advertising feature was added to address commercial projects who are \"free riders\" in an economic sense. I believe that RTD is committed to the open source community and the needs of the community. \n", | |
" \n", | |
"For now, I will keep the ads turned off unless the consensus is different. Thanks! \n", | |
" \n", | |
"cc/ @fperez @ellisonbg @minrk @carreau @takluyver @jhamrick @jdfreder who are active with the docs. Others, please feel free to voice your thoughts as well.</p>\n", | |
" </div>\n", | |
" </div>\n", | |
"</div><div class=\"row\">\n", | |
" <div class=\"panel panel-warning\">\n", | |
" <div class=\"panel-heading\">\n", | |
" <h4>Carreau</h4>\n", | |
" </div>\n", | |
" <div class=\"panel-body\">\n", | |
" <p class=\"load\">when I start the server by command ```jupyter notebook```, the ___Notebooks___ options is disabled, even when I uninstall and then re-install all related packages, it still can't work. \n", | |
"my env is python3, mac osx 10.11.2, please kindly suggest, thanks. \n", | |
"<img width=\"1062\" alt=\"capture\" src=\"https://cloud.githubusercontent.com/assets/1047330/12407042/e7906cec-be8d-11e5-942b-111be929540c.png\"/> \n", | |
"</p>\n", | |
" </div>\n", | |
" </div>\n", | |
"</div><div class=\"row\">\n", | |
" <div class=\"panel panel-warning\">\n", | |
" <div class=\"panel-heading\">\n", | |
" <h4>juliohm</h4>\n", | |
" </div>\n", | |
" <div class=\"panel-body\">\n", | |
" <p class=\"load\">Moving the issue from IPython to Jupyter. \n", | |
" \n", | |
"Previous issue: https://github.com/ipython/ipython/issues/7519</p>\n", | |
" </div>\n", | |
" </div>\n", | |
"</div><div class=\"row\">\n", | |
" <div class=\"panel panel-warning\">\n", | |
" <div class=\"panel-heading\">\n", | |
" <h4>takluyver</h4>\n", | |
" </div>\n", | |
" <div class=\"panel-body\">\n", | |
" <p class=\"load\">I recently cannot use the notebook anymore with a python3 kernel. \n", | |
" \n", | |
"My syslog output : \n", | |
" \n", | |
"[78941.591573] jupyter-noteboo[4703]: segfault at bddc24180 ip 00007f0bdb576f5b sp 00007ffcbd5d6bf0 error 4 in socket.cpython-34m.so[7f0bdb567000+16000] \n", | |
" \n", | |
" \n", | |
"The only thing working is opening a python2 kernel with the notebook using the 'ipython2 notebook' command... \n", | |
" \n", | |
" \n", | |
"</p>\n", | |
" </div>\n", | |
" </div>\n", | |
"</div><div class=\"row\">\n", | |
" <div class=\"panel panel-warning\">\n", | |
" <div class=\"panel-heading\">\n", | |
" <h4>willingc</h4>\n", | |
" </div>\n", | |
" <div class=\"panel-body\">\n", | |
" <p class=\"load\">Since we are tending toward a full OS in the browser... ;-) I think it would help to be able to differentiate the jupyter-js-filebrowser, jupyter-js-editor, jupyter-js-terminal and jupyter-js-notebook navigation tabs from the favicon.</p>\n", | |
" </div>\n", | |
" </div>\n", | |
"</div></div>" | |
], | |
"text/plain": [ | |
"<div><div class=\"row\">\n", | |
" <div class=\"panel panel-warning\">\n", | |
" <div class=\"panel-heading\">\n", | |
" <h4>ziky90</h4>\n", | |
" </div>\n", | |
" <div class=\"panel-body\">\n", | |
" <p class=\"load\">I am using `jupyter` notebook and since short time ago logs stopped to appear in output cells and started to appear only in the terminal. \n", | |
" \n", | |
"I have described the problem here: \n", | |
"http://stackoverflow.com/questions/35936086/jupyter-notebook-does-not-print-logs-to-the-output-cell/35940918#35940918 \n", | |
" \n", | |
"To summarise this, I have found that since there is not specified exact version of `ipykernel` package in setup in `jupyter`. There was changed `ipykernel`'s version that is being installed. \n", | |
" \n", | |
"Logging to output cell works correctly for `ipykernel==4.2.1` and earlier, but since `4.3.0` https://github.com/ipython/ipykernel/releases/tag/4.3.0 logs goes to terminal instead of the output cell.</p>\n", | |
" </div>\n", | |
" </div>\n", | |
"</div><div class=\"row\">\n", | |
" <div class=\"panel panel-warning\">\n", | |
" <div class=\"panel-heading\">\n", | |
" <h4>willingc</h4>\n", | |
" </div>\n", | |
" <div class=\"panel-body\">\n", | |
" <p class=\"load\">On Monday, ReadTheDocs changed their service to opt in projects for display of a small ad in the bottom left of the docs (they do not allow tracking of users by third party scripts). See [blog post](https://blog.readthedocs.com/ads-on-read-the-docs/) for details. \n", | |
" \n", | |
"For all the project documentation that I have permissions on, I have disabled the advertising feature for the following reasons: \n", | |
" \n", | |
"- this is a decision that should be made by the larger project community or steering council to opt in, if desired \n", | |
"- I personally support ReadTheDocs financially with the ReadTheDocs Gold contribution monthly. \n", | |
"- I also contribute my time as I know other devs on Jupyter do as well. \n", | |
" \n", | |
"It is my belief that the advertising feature was added to address commercial projects who are \"free riders\" in an economic sense. I believe that RTD is committed to the open source community and the needs of the community. \n", | |
" \n", | |
"For now, I will keep the ads turned off unless the consensus is different. Thanks! \n", | |
" \n", | |
"cc/ @fperez @ellisonbg @minrk @carreau @takluyver @jhamrick @jdfreder who are active with the docs. Others, please feel free to voice your thoughts as well.</p>\n", | |
" </div>\n", | |
" </div>\n", | |
"</div><div class=\"row\">\n", | |
" <div class=\"panel panel-warning\">\n", | |
" <div class=\"panel-heading\">\n", | |
" <h4>Carreau</h4>\n", | |
" </div>\n", | |
" <div class=\"panel-body\">\n", | |
" <p class=\"load\">when I start the server by command ```jupyter notebook```, the ___Notebooks___ options is disabled, even when I uninstall and then re-install all related packages, it still can't work. \n", | |
"my env is python3, mac osx 10.11.2, please kindly suggest, thanks. \n", | |
"<img width=\"1062\" alt=\"capture\" src=\"https://cloud.githubusercontent.com/assets/1047330/12407042/e7906cec-be8d-11e5-942b-111be929540c.png\"/> \n", | |
"</p>\n", | |
" </div>\n", | |
" </div>\n", | |
"</div><div class=\"row\">\n", | |
" <div class=\"panel panel-warning\">\n", | |
" <div class=\"panel-heading\">\n", | |
" <h4>juliohm</h4>\n", | |
" </div>\n", | |
" <div class=\"panel-body\">\n", | |
" <p class=\"load\">Moving the issue from IPython to Jupyter. \n", | |
" \n", | |
"Previous issue: https://github.com/ipython/ipython/issues/7519</p>\n", | |
" </div>\n", | |
" </div>\n", | |
"</div><div class=\"row\">\n", | |
" <div class=\"panel panel-warning\">\n", | |
" <div class=\"panel-heading\">\n", | |
" <h4>takluyver</h4>\n", | |
" </div>\n", | |
" <div class=\"panel-body\">\n", | |
" <p class=\"load\">I recently cannot use the notebook anymore with a python3 kernel. \n", | |
" \n", | |
"My syslog output : \n", | |
" \n", | |
"[78941.591573] jupyter-noteboo[4703]: segfault at bddc24180 ip 00007f0bdb576f5b sp 00007ffcbd5d6bf0 error 4 in socket.cpython-34m.so[7f0bdb567000+16000] \n", | |
" \n", | |
" \n", | |
"The only thing working is opening a python2 kernel with the notebook using the 'ipython2 notebook' command... \n", | |
" \n", | |
" \n", | |
"</p>\n", | |
" </div>\n", | |
" </div>\n", | |
"</div><div class=\"row\">\n", | |
" <div class=\"panel panel-warning\">\n", | |
" <div class=\"panel-heading\">\n", | |
" <h4>willingc</h4>\n", | |
" </div>\n", | |
" <div class=\"panel-body\">\n", | |
" <p class=\"load\">Since we are tending toward a full OS in the browser... ;-) I think it would help to be able to differentiate the jupyter-js-filebrowser, jupyter-js-editor, jupyter-js-terminal and jupyter-js-notebook navigation tabs from the favicon.</p>\n", | |
" </div>\n", | |
" </div>\n", | |
"</div></div>" | |
] | |
}, | |
"execution_count": 265, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"panel * issues " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 266, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"js = layout.extend( 'js', type='javascript', processor=coffee.compile )\n", | |
"js.html" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 267, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"js.string = \"\"\"alert 10\"\"\"" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 268, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"@ipywidgets.interact\n", | |
"def do_a_thing_in_the_console( i=[0,100,5 ]):\n", | |
" js.string = \"\"\"console.log %i\"\"\" % i " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 269, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"js.string = \"\"\"d3.selectAll '.panel-warning'\n", | |
" .classed\n", | |
" 'panel-warning': no\n", | |
" 'panel-default': yes\n", | |
"\"\"\"" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 270, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"\"<script>// Generated by CoffeeScript 1.10.0\\n(function() {\\n d3.selectAll('.panel-warning').classed({\\n 'panel-warning': false,\\n 'panel-default': true\\n });\\n\\n}).call(this);\\n</script>\"" | |
] | |
}, | |
"execution_count": 270, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"js.query.outerHtml()" | |
] | |
}, | |
{ | |
"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.5.1" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment