From d6827c4eba9bb6c54b0b198ea544a0fc48ac337e Mon Sep 17 00:00:00 2001 From: craigsdennis Date: Tue, 6 Nov 2018 23:31:40 -0800 Subject: [PATCH 1/3] Adds widget based tests --- binder/environment.yml | 1 + s2n03-challenge1-top-referrers.ipynb | 82 +++++++++++++++++++++++++--- tests/helpers.py | 15 ++++- 3 files changed, 88 insertions(+), 10 deletions(-) diff --git a/binder/environment.yml b/binder/environment.yml index d5a1d4a..dc19b06 100644 --- a/binder/environment.yml +++ b/binder/environment.yml @@ -5,5 +5,6 @@ dependencies: - numpy=1.15.0 - pandas=0.23.4 - python=3.7.0 + - ipywidgets - faker diff --git a/s2n03-challenge1-top-referrers.ipynb b/s2n03-challenge1-top-referrers.ipynb index dca016d..e317654 100644 --- a/s2n03-challenge1-top-referrers.ipynb +++ b/s2n03-challenge1-top-referrers.ipynb @@ -10,12 +10,12 @@ "\n", "Currently, anyone with **5 or more** referrals is considered a top referrer.\n", "\n", - "In the cell labelled CHALLENGE, follow the instructions to return what is required. Use `Kernel > Restart and run all cells` to check your work. If all the tests pass, you got it!" + "When you have completed the challenge, press the `Run Tests` button" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -24,7 +24,7 @@ "475" ] }, - "execution_count": 1, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -44,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -223,7 +223,7 @@ "[475 rows x 7 columns]" ] }, - "execution_count": 2, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -238,9 +238,68 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 39, "metadata": {}, "outputs": [ + { + "data": { + "application/javascript": [ + "IPython.notebook.execute_all_cells();" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6dda60d04f0040859bd5f5db7db3eeea", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Button(description='Run Tests', style=ButtonStyle())" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "```\n", + "...\n", + "----------------------------------------------------------------------\n", + "Ran 3 tests in 0.004s\n", + "\n", + "OK\n", + "\n", + "```" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5fdab85d808240b5ba79999461a20256", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Button(description='Run Tests', style=ButtonStyle())" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "data": { "text/markdown": [ @@ -271,7 +330,7 @@ "AssertionError: 475 != 142 : Whoops I received a different count than I expected, make sure the last line is the entire resulting DataFrame (not just the head)\n", "\n", "----------------------------------------------------------------------\n", - "Ran 3 tests in 0.005s\n", + "Ran 3 tests in 0.004s\n", "\n", "FAILED (failures=3)\n", "\n", @@ -288,6 +347,13 @@ "source": [ "check(__name__, 'Find the top referrers')" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -306,7 +372,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.1" } }, "nbformat": 4, diff --git a/tests/helpers.py b/tests/helpers.py index 939ebaa..b2cb391 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -4,7 +4,8 @@ import sys import unittest -from IPython.display import display, Markdown +from IPython.display import display, Markdown, Javascript +import ipywidgets as widgets registered_tests = {} @@ -23,9 +24,13 @@ def wrapped(cls): def cell_matching(module, test_text): # In is a list of notebook cell inputs # Out is a dictionary of cell outputs + matching_indices = [] for index, value in enumerate(module.In): if test_text in value: - return Cell(value, module.Out.get(index)) + matching_indices.append(index) + if matching_indices: + # The last entry is the call to `check` + return Cell(value, module.Out.get(matching_indices[-2])) return None, None @@ -43,6 +48,9 @@ class BoundTestClass(test_cls): BoundTestClass.__doc__ = "Cell Tests for " + test_text return BoundTestClass +def execute_all_cells(b): + display(Javascript('''IPython.notebook.execute_all_cells();''')) + def check(module_name, test_text): module = sys.modules[module_name] @@ -51,4 +59,7 @@ def check(module_name, test_text): runner = unittest.TextTestRunner(stream=output_stream) runner.run(unittest.defaultTestLoader.loadTestsFromTestCase(test_class)) md = '```\n' + output_stream.getvalue() + '\n```' + button = widgets.Button(description='Run Tests') + button.on_click(execute_all_cells) + display(button) display(Markdown(md)) From 2e7a5e8d16873e4c660974c011189d0dd55acb1f Mon Sep 17 00:00:00 2001 From: craigsdennis Date: Tue, 6 Nov 2018 23:49:51 -0800 Subject: [PATCH 2/3] Adds forum links --- s2n03-challenge1-top-referrers.ipynb | 63 ++++------------------ s2n05-challenge2-update-user.ipynb | 39 ++++++++------ s2n09-challenge3-verified-email-list.ipynb | 22 ++++++-- 3 files changed, 53 insertions(+), 71 deletions(-) diff --git a/s2n03-challenge1-top-referrers.ipynb b/s2n03-challenge1-top-referrers.ipynb index e317654..725eec3 100644 --- a/s2n03-challenge1-top-referrers.ipynb +++ b/s2n03-challenge1-top-referrers.ipynb @@ -10,12 +10,14 @@ "\n", "Currently, anyone with **5 or more** referrals is considered a top referrer.\n", "\n", - "When you have completed the challenge, press the `Run Tests` button" + "When you have completed the challenge, press the `Run Tests` button.\n", + "\n", + "*Need a little extra help? Check out the [Treehouse Forum](https://teamtreehouse.com/community?instruction=4552).*" ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -24,7 +26,7 @@ "475" ] }, - "execution_count": 37, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -44,7 +46,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -223,7 +225,7 @@ "[475 rows x 7 columns]" ] }, - "execution_count": 38, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -238,58 +240,13 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 3, "metadata": {}, "outputs": [ - { - "data": { - "application/javascript": [ - "IPython.notebook.execute_all_cells();" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "6dda60d04f0040859bd5f5db7db3eeea", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Button(description='Run Tests', style=ButtonStyle())" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/markdown": [ - "```\n", - "...\n", - "----------------------------------------------------------------------\n", - "Ran 3 tests in 0.004s\n", - "\n", - "OK\n", - "\n", - "```" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "5fdab85d808240b5ba79999461a20256", + "model_id": "3173395f5f7e4c1dacc395df45c550f1", "version_major": 2, "version_minor": 0 }, @@ -330,7 +287,7 @@ "AssertionError: 475 != 142 : Whoops I received a different count than I expected, make sure the last line is the entire resulting DataFrame (not just the head)\n", "\n", "----------------------------------------------------------------------\n", - "Ran 3 tests in 0.004s\n", + "Ran 3 tests in 0.006s\n", "\n", "FAILED (failures=3)\n", "\n", diff --git a/s2n05-challenge2-update-user.ipynb b/s2n05-challenge2-update-user.ipynb index 7045ff3..3a817c8 100644 --- a/s2n05-challenge2-update-user.ipynb +++ b/s2n05-challenge2-update-user.ipynb @@ -12,7 +12,9 @@ "\n", "There are a couple ways to make this change happen, let's see what you can figure out!\n", "\n", - "After you've completed the TODO's choose `Kernel > Restart and Run all Cells` to see your results!\n" + "After you've completed the TODO's click the `Run Tests` button\n", + "\n", + "*Need a little extra help? Check out the [Treehouse Forum](https://teamtreehouse.com/community?instruction=4572).*" ] }, { @@ -44,13 +46,6 @@ "len(users)" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": 2, @@ -120,8 +115,8 @@ " \n", " adrian\n", " Adrian\n", - " Yang\n", - " adrian.yang@teamtreehouse.com\n", + " Fang\n", + " adrian.fang@teamtreehouse.com\n", " True\n", " 2018-04-28\n", " 3\n", @@ -207,7 +202,7 @@ "aaron Aaron Davis aaron6348@gmail.com \n", "acook Anthony Cook cook@gmail.com \n", "adam.saunders Adam Saunders adam@gmail.com \n", - "adrian Adrian Yang adrian.yang@teamtreehouse.com \n", + "adrian Adrian Fang adrian.fang@teamtreehouse.com \n", "adrian.blair Adrian Blair adrian9335@gmail.com \n", "... ... ... ... \n", "wilson Robert Wilson robert@yahoo.com \n", @@ -253,6 +248,20 @@ "execution_count": 3, "metadata": {}, "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ca87e33565ed41e39c1d89da5125f6cc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Button(description='Run Tests', style=ButtonStyle())" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "data": { "text/markdown": [ @@ -262,7 +271,7 @@ "FAIL: test_jeffrey_with_one_f (tests.helpers.TestUpdateUsers)\n", "----------------------------------------------------------------------\n", "Traceback (most recent call last):\n", - " File \"/Users/craig/Code/scripting/intro-to-pandas/tests/test_cells.py\", line 52, in test_jeffrey_with_one_f\n", + " File \"/Users/craig/Code/scripting/intro-to-pandas/tests/test_cells.py\", line 56, in test_jeffrey_with_one_f\n", " 'Did you rename the username jeffrey to jefrey?'\n", "AssertionError: False is not true : Did you rename the username jeffrey to jefrey?\n", "\n", @@ -270,12 +279,12 @@ "FAIL: test_kim_deal (tests.helpers.TestUpdateUsers)\n", "----------------------------------------------------------------------\n", "Traceback (most recent call last):\n", - " File \"/Users/craig/Code/scripting/intro-to-pandas/tests/test_cells.py\", line 46, in test_kim_deal\n", + " File \"/Users/craig/Code/scripting/intro-to-pandas/tests/test_cells.py\", line 50, in test_kim_deal\n", " 'Are you sure you updated the last name of kimberly@yahoo.com to \"Deal\"?'\n", "AssertionError: nan != 'Deal' : Are you sure you updated the last name of kimberly@yahoo.com to \"Deal\"?\n", "\n", "----------------------------------------------------------------------\n", - "Ran 2 tests in 0.002s\n", + "Ran 2 tests in 0.003s\n", "\n", "FAILED (failures=2)\n", "\n", @@ -310,7 +319,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.1" } }, "nbformat": 4, diff --git a/s2n09-challenge3-verified-email-list.ipynb b/s2n09-challenge3-verified-email-list.ipynb index 9c3f1e5..9b1d018 100644 --- a/s2n09-challenge3-verified-email-list.ipynb +++ b/s2n09-challenge3-verified-email-list.ipynb @@ -13,7 +13,9 @@ "\n", "Ensure that all first names are title cased. Do not include any records that have a missing last name, and make sure that their email is verified (**`email_verified`** should be set True). Sort by last name and then by first.\n", "\n", - "Choose `Kernel > Restart & Run all` to run the tests properly. \n" + "Once you have completed the TODOs, choose the `Run Tests` button.\n", + "\n", + "*Need a little extra help? Check out the [Treehouse Forum](https://teamtreehouse.com/community?instruction=4573).*\n" ] }, { @@ -245,6 +247,20 @@ "execution_count": 3, "metadata": {}, "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9979fc1830b443128f18c18c4cc5f59f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Button(description='Run Tests', style=ButtonStyle())" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "data": { "text/markdown": [ @@ -294,7 +310,7 @@ "AssertionError: 19 != 0 : Make sure you title case the first names, there are still some lower case versions\n", "\n", "----------------------------------------------------------------------\n", - "Ran 5 tests in 0.034s\n", + "Ran 5 tests in 0.033s\n", "\n", "FAILED (failures=5)\n", "\n", @@ -329,7 +345,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.1" } }, "nbformat": 4, From f8befe55cd01bbfd9e1dbbc003d4233f9c4e9ffd Mon Sep 17 00:00:00 2001 From: craigsdennis Date: Tue, 6 Nov 2018 23:52:26 -0800 Subject: [PATCH 3/3] Adds ipywidgets and friends to reqs --- requirements.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements.txt b/requirements.txt index 8a571d2..2573e05 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,10 +10,10 @@ backcall=0.1.0=py37_0 blas=1.0=mkl bleach=2.1.3=py37_0 ca-certificates=2018.03.07=0 -certifi=2018.8.24=py37_1 +certifi=2018.10.15=py37_0 cffi=1.11.5=py37h342bebf_0 constantly=15.1.0=py37h28b3542_0 -cryptography=2.3=py37hdbc3d79_0 +cryptography=2.3.1=py37ha12b0ac_2 cryptography-vectors=2.3=py37_0 dbus=1.13.2=h760590f_1 decorator=4.3.0=py37_0 @@ -31,7 +31,7 @@ intel-openmp=2018.0.3=0 ipykernel=4.8.2=py37_0 ipython=6.5.0=py37_0 ipython_genutils=0.2.0=py37_0 -ipywidgets=7.4.0=py37_0 +ipywidgets=7.4.2=py37_0 jedi=0.12.1=py37_0 jinja2=2.10=py37_0 jpeg=9b=he5867d9_2 @@ -59,7 +59,7 @@ ncurses=6.1=h0a44026_0 notebook=5.6.0=py37_0 numpy=1.15.0=py37h648b28d_0 numpy-base=1.15.0=py37h8a80b8c_0 -openssl=1.0.2p=h1de35cc_0 +openssl=1.1.1=h1de35cc_0 pandas=0.23.4=py37h6440ff4_0 pandoc=2.2.1=h1a437c5_0 pandocfilters=1.4.2=py37_1 @@ -77,7 +77,7 @@ pycparser=2.18=py37_1 pygments=2.2.0=py37_0 pyopenssl=18.0.0=py37_0 pyqt=5.9.2=py37h655552a_0 -python=3.7.0=hc167b69_0 +python=3.7.1=haf84260_3 python-dateutil=2.7.3=py37_0 pytz=2018.5=py37_0 pyzmq=17.1.2=py37h1de35cc_0 @@ -90,11 +90,11 @@ setuptools=40.0.0=py37_0 simplegeneric=0.8.1=py37_2 sip=4.19.8=py37h0a44026_0 six=1.11.0=py37_1 -sqlite=3.24.0=ha441bb4_0 +sqlite=3.25.2=ha441bb4_0 terminado=0.8.1=py37_1 testpath=0.3.1=py37_0 text-unidecode=1.2=py37_0 -tk=8.6.7=h35a86e2_3 +tk=8.6.8=ha441bb4_0 tornado=5.1=py37h1de35cc_0 traitlets=4.3.2=py37_0 twisted=18.7.0=py37h1de35cc_1 pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy