diff --git a/.gitignore b/.gitignore
index a633c69018..a8862c19c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,3 +42,4 @@ config.rst
package-lock.json
geckodriver.log
*.ipynb
+.vscode/settings.json
\ No newline at end of file
diff --git a/Create and Deploy an Azure ML Web Service.ipynb b/Create and Deploy an Azure ML Web Service.ipynb
deleted file mode 100644
index a62ae4c84d..0000000000
--- a/Create and Deploy an Azure ML Web Service.ipynb
+++ /dev/null
@@ -1,563 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# # Create and deploy an Azure Machine Learning web service\n",
- "\n",
- "Although web services can be created directly within [Azure ML Studio](https://studio.azureml.net), in some cases it may be more straightforward to develop and deploy a web service entirely within a Python notebook. Python notebooks allow rapid prototyping and allow developers to include commentary in Markdown. This tutorial demonstrates how the [`azureml`](https://github.com/Azure/Azure-MachineLearning-ClientLibrary-Python) package can be used to deploy Azure ML web services directly from within a Python notebook (or other Python environment).\n",
- "\n",
- "> **Note**: the `azureml` package presently works only with Python 2; be sure to set the notebook's kernel appropriately.\n",
- "\n",
- "In this notebook:\n",
- "- [Prerequisites](#Prerequisites)\n",
- " - [Credentials needed to connect to your workspace](#Credentials-needed-to-connect-to-your-workspace)\n",
- "- [Explore beaver fever](#explore-beaver-fever)\n",
- " - [Loading and exploring the dataset](#Loading-and-exploring-the-dataset)\n",
- " - [Transferring data to and from Azure ML Studio](#Transferring-data-to-and-from-Azure-ML-Studio)\n",
- "- [Creating the predictive model](#Creating-the-predictive-model)\n",
- "- [Deploying the model as a web service](#Deploying-the-model-as-a-web-service)\n",
- "- [Consuming the web service](#Consuming-the-web-service)\n",
- "\n",
- "Refer to the [azureml GitHub repository](https://github.com/Azure/Azure-MachineLearning-ClientLibrary-Python) for more information on its capabilities.\n",
- "\n",
- "## Prerequisites\n",
- "\n",
- "This walkthrough assumes that you're familiar with Python and [Azure ML Studio](https://studio.azureml.net). You also need a workspace in Azure ML Studio and its credentials, which is described in the next section.\n",
- "\n",
- "Your environment also requires the `azureml` package, which is installed by default with Azure Notebooks.\n",
- "\n",
- "### Create and connect to an Azure ML Studio workspace\n",
- "\n",
- "The `azureml` package uses your workspace ID and authorization token to connect to the workspace, provide that you're the owner of the workspace (authorized users who are not owners need to ask an owner for these details):\n",
- "\n",
- "1. Open [Azure ML Studio](https://studio.azureml.net) in a browser and sign in with a Microsoft Account. Azure ML Studio is free and doesn't require an Azure subscription. Once signed in, you're in your \"workspace.\"\n",
- "\n",
- "1. Select the **Settings** button on the left pane:\n",
- "\n",
- " ![Settings button](https://github.com/Microsoft/AzureNotebooks/blob/master/Samples/images/azure-ml-studio-settings.png?raw=true)
\n",
- "\n",
- "1. On the **Name** tab, the **Workspace ID** field contains your workspace ID. Copy that ID into the `workspace_id` value in the code cell that follows.\n",
- "\n",
- " ![Location of workspace ID](https://github.com/Microsoft/AzureNotebooks/blob/master/Samples/images/azure-ml-studio-workspace-id.png?raw=true)
\n",
- "\n",
- "1. Select the **Authorization Tokens** tab and copy either token into the `authorization_token` value in the code cell that follows.\n",
- "\n",
- " ![Location of authorization token](https://github.com/Microsoft/AzureNotebooks/blob/master/Samples/images/azure-ml-studio-tokens.png?raw=true)
\n",
- "\n",
- "1. Run the code cell; if it runs without error, you're ready to continue."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "from azureml import Workspace\n",
- "\n",
- "# Replace the values with those from your own Azure ML Studio instance; see Prerequisites\n",
- "# The workspace_id is a string of hexadecimal characters; the toke is a long string of random characters.\n",
- "workspace_id = 'your_workspace_id'\n",
- "authorization_token = 'your_auth_token'\n",
- "\n",
- "ws = Workspace(workspace_id, authorization_token)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Explore beaver fever\n",
- "\n",
- "Reynolds (1994) collected data on the body temperatures of female beavers living in Wisconsin. We use this dataset to train a decision tree model which predicts a beaver's body temperature. Then we create a web service based on this model that can be used to predict body temperatures for other beavers.\n",
- "\n",
- "> P. S. Reynolds (1994). \"Time-series analyses of beaver body temperatures.\" Chapter 11 of Lange, N., Ryan, L., Billard, L., Brillinger, D., Conquest, L. and Greenhouse, J. eds (1994) *Case Studies in Biometry*. New York: John Wiley and Sons.\n",
- "\n",
- "## Loading and exploring the dataset\n",
- "\n",
- "Our dataset contains the following features:\n",
- "\n",
- "- `time`: The time of day on which the recording was made\n",
- "- `activ`: Binary indicator of whether activity is occurring outside of the beaver lodge\n",
- "- `beaver`: The beaver being measured\n",
- "- `temp`: The recorded body temperature"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Install the dataset\n",
- "!pip install pydataset --disable-pip-version-check -q"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Load the dataset and plot each of these features on the same axes to see whether any patterns may be present:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "initiated datasets repo at: /home/nbuser/.pydataset/\n"
- ]
- },
- {
- "data": {
- "image/png": "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6faGRURERER6QqeD+Pe+9z1++tOfcv311/P4448zd+5cfvazn/Hggw92Z/tERERERE7rzjvvZMCAAZxzzjknvN+yLO677z6GDx/O2LFjWbNmTQ+3sKNOD015/vnnWbNmDYWFheHbrrrqKs4//3wee+yxbmmciIiIiEhnLFy4kG9961ssWLDghPcvXryYnTt3sn37dlauXMk3vvENPvnkkx5uZaROB/E+ffrQp0+fDrdlZmZGvVEiIiIikniKL7iy25+jctVfT3j7xRdfTGVl5Ukf9/rrr3P77bcDMHHiRJqbm6mpqSEvL687mtkpnR6acv/993P99dfzt7/9jc8++4x33nmHG2+8ke985zvs3Lkz/E9EREREJN7s27ePgoKC8HJhYSH79u2LYYvOoEf829/+NgDLli2LuH3JkiXcd999QPuURqFQKIrNExERERHpuhNNMGIYRgxackyng3iizqspIiIiInJ8D/jevXvJz8+PYYt0ZU0RERER6QWuvfZaXnjhBQBWrlxJenp6TMeHwxn0iFdVVfGjH/2ItWvX0tzcHHHf1q1bo94wEREREUksJzuRsifccsstvPfeexw6dIjCwkJ+9KMfhS86dc899zB79mzeeusthg0bRlpaGs8991zM2npUp4P4jTfeSGlpKY8++iipqand2SYRERERkTPy0ksvnfJ+wzB46qmneqg1ndPpIL5582Y+/vhjbDaNZhERERER6apOp+prrrmG5cuXd2dbRERERER6jU73iP/qV7/ioosuYtiwYQwcODDivmeffTbqDRMRERERSWadDuJ33HEHdrudUaNGaYy4iIiIiEgXdTqIL126lOrq6g6XuRcRETmRrfU26toMRueE6Os++XpBE9ZVG2S2+Bmmfh4R6UU6HcTHjh1LXV2dgriIiJzWmzsc/HGrC4C+bosfXthGTmrHq9qZFjyxys3GOjvQyjn97XznggC22F7sTkSkR3Q6iM+cOZMrrriCO+64o8MY8TvvvDPqDRMRkcT1TqUz/PMRn8Hfq+1cNSzYYb29TcbnIbzdhkM29jYZFGV2DO0iIqeydetW7rrrLhoaGrDZbPzwhz/kxhtvjFjH5/OxYMEC1qxZQ05ODn/4wx8oLi6OTYM5gyD+wQcfUFBQwDvvvBNxu2EYCuIiIhIhzWnR6De+sHyS9RxgYGHRvq6BRWqnv5lERI5xu908/fTTlJaWcuDAAc4//3yuuOIK+vbtG17nmWeeoX///mzbto1XX32VBx98kJdffjlmbe70x92yZcu6sx0iIpJE7jzXz6/XuGnyG5w/MMi0wo694QD90yzmlQZ4dYsTMLh5tIknTb3hIonqgm/8ptufY9X//eoJbx88eHD454EDB9K/f38OHjwYEcRff/11Hn30UQCuv/56vvWtb2FZFoYRm/FwZ9TvUFdXx1tvvcX+/fv57ne/S3V1NaZpUlhYGJXGLFq0iF27duH3+8nIyGDKlClMmDCBiooK3njjjfB6lmURDAa5++67yc/Pj9hGMBjkzTffZOfOnXi9Xvr168ell15KSUkJAA0NDTz55JM4nce6Z6ZOncr06dOj8hpERARKsk2enOnFb4Lbfup1Zw0JcuVwA4+nPw11h/j8itQiImdt5cqVhEIhhg0bFnH7vn37KCgoAMBut5OVlUVdXR39+/ePRTM7H8SXL1/O3LlzueCCC/jwww/57ne/y7Zt2/jZz34WEZK7Ytq0acyZMweHw0FtbS3PP/88eXl5jB07lrFjx4bXW7t2LStWrCAvL6/DNkzTJDMzk4ULF9K3b9/woYdvfOMbZGdnh9d76KGHsNtP8+0gIiJnzTBOH8KPctjAoTM0pYesXLeRNRu2MGJoETMuuiDWzZEoO3jwILfffjvPPPNMhyvCW1bHI26x6g2HMwji999/Py+//DKXXnppONBOmjSJTz/9NGqNGTBgQPhnwzAwDIP6+voOvd7l5eWMGzfuhL84l8vFjBkzwssjR44kKyuLmpqaiCAuIiIivc+Kv6/l4Z/8ZziQ3f+1W7jpmstj3CqJltbWVq699lp+8IMfMGXKlA73FxYWsm/fPgoLCwmFQhw+fJh+/frFoKXtOh3EKysrufTSS4Fjew4ul4tg8MTj/s5WWVkZ69atIxgMkpubGx5SctThw4fZvXs3c+bM6dT2mpubqaurw+PxRNz+xBNPADBs2DAuv/xy0tPTAWhsbKS5uTliXb/fH76/Ozgcjoj/k4ndbo8YBpQMkrVeyV6rJh/8dacNXxDsNghZMHWQSXHf02wkDiV7rZJNstUr0Wu14pM1Eb2iyz9ew23XzwY6V6vlf1/DyrUbGDF0MNfO0rDWeBIKhbjlllu47rrrmD9//gnXufbaa/ntb3/LpEmTeO2115g+fXpi9IiPHj2at99+m1mzZoVve/fddzn33HOj2qCrr76a2bNns2fPHiorKzu80cvLyykqKupU73YoFGLRokWMHz8+HMTT0tL42te+Rm5uLl6vlzfffJPXXnuN22+/HYDVq1ezfPnyiO1Mnz49ope9u6jHPrGoXomjT98sHlrWRGWDGXH7sio7/3VdHwr7aphavND7KnEkaq2GDy2GJR+Gl4cWD+rQWXcyb737Pv/8o1+Gl72+AN+665ZoNzGhnexEyp6wePFiysrK2L17N3/4wx8AeP7553nttde44IILuPbaa7nrrru4/fbbGT58OP369QuvFyudDuK/+MUvuOqqq7jqqqvwer18/etf54033uD111+PeqNsNhuDBw+moqKClStXMnny5PB95eXlTJs27bTbME2T1157DbvdzuzZs8O3u93u8CD9jIwMZs+ezc9//nPa2tpISUlhwoQJjBw5MmJbfr+f2traKL26jhwOB9nZ2TQ0NET9CEOsud1ufD5frJsRVclar2St1RErk+c/baSyoWOPhy8IH25tYGZxYs3Skay1Ssb3FSRfvRKlVoePNPHcK2/Q0urlxqsuZeTwYgBuunomO3buZmX5JkYOG8w3FswNf8efrlZvvhvZUff2ex8y79rLuu01nInO7kwks6uvvppQKNTh9vHjx4d/TklJ4dVXX+3JZp1Sp4P4+++/T0VFBb/73e+48847GTRoEJ9++imvvPIKEydO7JbGmaZJQ0NDeLmqqoqmpiZGjx59ysdZlsVf/vIXWlpauO222055UubxhyMyMzPJzMyMuK26uppAD5zGHwwGe+R5epLD4Ui613RUstUrGWt1uA0eXt5Mk+/khx09KUECAfOk98ejZKzVUcn2voLkrVe81+pb3/8pW3bsBuDdFZ/wwq8fJdeTg80w+P63I69/cvR1nK5Wg/IjL2hYlJ8b178DiX+dDuKPPvoo//zP/8z3vve9iNv//d//nQceeKDLDWlubmbXrl2MGDECp9PJzp072bBhA3Pnzg2vs27dOkaNGoXb7T7ltsrKyqitrWXBggUdxnrt3buXlJQU+vXrR1tbG4sXL6a4uJiUlJQuvwYRiS+VRwyafJG93QPSTFyf75vPGBSkNCexQriInF5jU3M4hAO0tHrZtHUXuZ6cLm331i9fSV3DEVat28TwIYP49ldv7mpTpZc7bRBf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\n",
- "text/plain": [
- "
"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "ggplot(aes(x='time', y='temp', color='activ'), data=df) + geom_point()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "It also appears that all else being equal, Beaver 2 is warmer than Beaver 1.\n",
- "\n",
- "Notice that some trends seem to apply to a subset of the data. For example, if the measurement is from Beaver 2 *and* the beaver was active, then the body temperature is likely to be above 37.5; otherwise, the temperature is likely below 37.5. When trends apply to observation subsets that can be clearly defined using thresholding, decision tree models are good candidates. We therefore implement a decision tree model in the next section of the tutorial.\n",
- "\n",
- "### Transferring data to and from Azure ML Studio\n",
- "\n",
- "In this section, you create a predictive model entirely in Azure Notebooks. (You can also use the `azureml` Python program to transfer the data over to Azure ML Studio to create your model there.)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {},
- "outputs": [],
- "source": [
- "# This code is repeated from the Prerequisites section\n",
- "\n",
- "from azureml import Workspace\n",
- "\n",
- "# Replace the values with those from your own Azure ML Studio instance; see Prerequisites\n",
- "# The workspace_id is a string of hexadecimal characters; the toke is a long string of random characters.\n",
- "workspace_id = 'your_workspace_id'\n",
- "authorization_token = 'your_auth_token'\n",
- "\n",
- "ws = Workspace(workspace_id, authorization_token)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {},
- "outputs": [],
- "source": [
- "from azureml import DataTypeIds\n",
- "\n",
- "dataset = ws.datasets.add_from_dataframe(\n",
- " dataframe=df,\n",
- " data_type_id=DataTypeIds.GenericCSV,\n",
- " name='Beaver Body Temperature Data',\n",
- " description='From Reynolds 1994 via pydataset'\n",
- " )"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "After running the code above, you can see the dataset listed in the **Datasets** section of the workspace (you may need to refresh the page):\n",
- "\n",
- "![Dataset shown in Azure ML Studio](https://github.com/Microsoft/AzureNotebooks/blob/master/Samples/images/azure-ml-studio-dataset.png?raw=true) \n",
- "\n",
- "It is also straightforward to list the datasets available in the workspace and transfer datasets from the workspace to the notebook:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Beaver Body Temperature Data\n"
- ]
- }
- ],
- "source": [
- "print('\\n'.join([i.name for i in ws.datasets if not i.is_example])) # only list user-created datasets"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Beaver Body Temperature Data\n",
- "From Reynolds 1994 via pydataset\n",
- "abe2e90f1544425999981e5e637982ea\n",
- "GenericCSV\n",
- "2018-11-27 17:18:36.802000\n",
- "3579\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
activ
\n",
- "
beaver
\n",
- "
temp
\n",
- "
time
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
0
\n",
- "
0
\n",
- "
1.0
\n",
- "
36.33
\n",
- "
840
\n",
- "
\n",
- "
\n",
- "
1
\n",
- "
0
\n",
- "
1.0
\n",
- "
36.34
\n",
- "
850
\n",
- "
\n",
- "
\n",
- "
2
\n",
- "
0
\n",
- "
1.0
\n",
- "
36.35
\n",
- "
900
\n",
- "
\n",
- "
\n",
- "
3
\n",
- "
0
\n",
- "
1.0
\n",
- "
36.42
\n",
- "
910
\n",
- "
\n",
- "
\n",
- "
4
\n",
- "
0
\n",
- "
1.0
\n",
- "
36.55
\n",
- "
920
\n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " activ beaver temp time\n",
- "0 0 1.0 36.33 840\n",
- "1 0 1.0 36.34 850\n",
- "2 0 1.0 36.35 900\n",
- "3 0 1.0 36.42 910\n",
- "4 0 1.0 36.55 920"
- ]
- },
- "execution_count": 20,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# Read some more of the metadata\n",
- "ds = ws.datasets['Beaver Body Temperature Data']\n",
- "print(ds.name)\n",
- "print(ds.description)\n",
- "print(ds.family_id)\n",
- "print(ds.data_type_id)\n",
- "print(ds.created_date)\n",
- "print(ds.size)\n",
- "\n",
- "# Read the contents\n",
- "df2 = ds.to_dataframe()\n",
- "df2.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Creating the predictive model\n",
- "\n",
- "To assess overfitting, train your decision tree using only a subset of the available data. You can then assess performance using the withheld observation. Below, `sklearn`'s `train_test_split()` function is used to select 70% of the data points for training and 30% for validation."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {},
- "outputs": [],
- "source": [
- "from sklearn.model_selection import train_test_split\n",
- "\n",
- "X_train, X_test, y_train, y_test = train_test_split(\n",
- " df[['activ', 'beaver', 'time']],\n",
- " df['temp'],\n",
- " test_size=0.3,\n",
- " random_state=42\n",
- " )"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Fit `scikit-learn`'s `DecisionTreeRegressor` model using the training data, then make predictions about the withheld body temperature measurements:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "R^2 for true vs. predicted test set temperature measurements: 0.94\n"
- ]
- }
- ],
- "source": [
- "from sklearn.tree import DecisionTreeRegressor\n",
- "from sklearn.metrics import r2_score\n",
- "\n",
- "regressor = DecisionTreeRegressor(random_state=42)\n",
- "regressor.fit(X_train, y_train)\n",
- "y_test_predictions = regressor.predict(X_test)\n",
- "print('R^2 for true vs. predicted test set temperature measurements: {:0.2f}'.format(r2_score(y_test, y_test_predictions)))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "It seems like this is a reasonably accurate model!"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Deploying the model as a web service\n",
- "\n",
- "To deploy your model as a predictive web service, create a wrapper function that takes input data as an argument and calls `predict()` with your trained model and this input data, returning the results."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {},
- "outputs": [],
- "source": [
- "from azureml import services\n",
- "\n",
- "@services.publish(workspace_id, authorization_token)\n",
- "@services.types(activ=int, beaver=float, time=int)\n",
- "@services.returns(float)\n",
- "\n",
- "# The name of your web service is set to this function's name\n",
- "def beaver_body_temp_predictor(activ, beaver, time):\n",
- " return regressor.predict([activ, beaver, time])\n",
- "\n",
- "# Hold onto information about your web service so you can call it within the notebook later\n",
- "service_url = beaver_body_temp_predictor.service.url \n",
- "api_key = beaver_body_temp_predictor.service.api_key\n",
- "help_url = beaver_body_temp_predictor.service.help_url\n",
- "service_id = beaver_body_temp_predictor.service.service_id"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Consuming the web service\n",
- "\n",
- "While you are in the notebook session in which the web service was created, you can call the predictor directly:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "36.78"
- ]
- },
- "execution_count": 24,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "beaver_body_temp_predictor.service(0, 1, 1200)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "At any later time, you can use the stored API key and service URL to call the service:"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# import urllib2\n",
- "import json\n",
- "\n",
- "data = {\"Inputs\": { \n",
- " \"input1\": {\n",
- " \"ColumnNames\": [ \"beaver\", \"activ\", \"time\"],\n",
- " \"Values\": [[\"1\", \"0\", \"1200\"]] \n",
- " }\n",
- " }, # specified feature values\n",
- " \n",
- " \"GlobalParameters\": {}\n",
- " }\n",
- "\n",
- "body = json.dumps(data)\n",
- "headers = {'Content-Type':'application/json', 'Authorization':('Bearer '+ api_key)}\n",
- "req = urllib2.Request(service_url, body, headers) \n",
- "\n",
- "try:\n",
- " response = urllib2.urlopen(req)\n",
- " result = json.loads(response.read()) # load json-formatted string response as dictionary\n",
- " print(result['Results']['output1']['value']['Values'][0][0]) # get the returned prediction\n",
- " \n",
- "except urllib2.HTTPError, error:\n",
- " print(\"The request failed with status code: \" + str(error.code))\n",
- " print(error.info())\n",
- " print(json.loads(error.read())) "
- ]
- }
- ],
- "metadata": {
- "celltoolbar": "Attachments",
- "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.7.3"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 1
-}
diff --git a/notebook/static/acc_overwrite.less b/notebook/static/acc_overwrite.less
index 8acbd9f67b..8d9c3e6431 100644
--- a/notebook/static/acc_overwrite.less
+++ b/notebook/static/acc_overwrite.less
@@ -51,4 +51,10 @@
// background-color: @navbar-default-link-hover-bg;
}
}
- }
+}
+
+.menu_focus_highlight{
+ a:focus {
+ outline: -webkit-focus-ring-color auto 5px;
+}
+}
\ No newline at end of file
diff --git a/notebook/static/base/js/dialog.js b/notebook/static/base/js/dialog.js
index b2e81e7b02..3bb6f7367a 100644
--- a/notebook/static/base/js/dialog.js
+++ b/notebook/static/base/js/dialog.js
@@ -65,6 +65,7 @@ define(['jquery',
.attr("data-dismiss", "modal")
.attr("aria-hidden", "true")
.html("×")
+ .attr("tabindex","0")
).append(
options.type ? options.type.addClass('modal-title').text(options.title || "")
: $("").addClass('modal-title').text(options.title || "")
@@ -193,12 +194,19 @@ define(['jquery',
.append(textarea)
)
);
+
+ //fix issue#4012
var editor = CodeMirror.fromTextArea(textarea[0], {
lineNumbers: true,
matchBrackets: true,
indentUnit: 2,
autoIndent: true,
mode: 'application/json',
+ extraKeys:{
+ Tab:false,
+ Shift:false,
+ 'Shift-Tab':false
+ }
});
var title_msg;
if (options.name === "Notebook") {
diff --git a/notebook/static/notebook/js/celltoolbarpresets/tags.js b/notebook/static/notebook/js/celltoolbarpresets/tags.js
index ff531cfe62..d5afc86df1 100644
--- a/notebook/static/notebook/js/celltoolbarpresets/tags.js
+++ b/notebook/static/notebook/js/celltoolbarpresets/tags.js
@@ -169,6 +169,7 @@ define([
.attr('rows', '13')
.attr('cols', '80')
.attr('name', 'tags')
+ // .attr('title','edit text area')
.text(tag_list.join('\n'));
var dialogform = $('').attr('title', i18n.msg._('Edit the tags'))
diff --git a/notebook/static/notebook/js/main.js b/notebook/static/notebook/js/main.js
index 5a1eaf4a5c..641c40ad3f 100644
--- a/notebook/static/notebook/js/main.js
+++ b/notebook/static/notebook/js/main.js
@@ -45,7 +45,8 @@ requirejs([
'notebook/js/about',
'notebook/js/searchandreplace',
'notebook/js/clipboard',
- 'bidi/bidi'
+ 'bidi/bidi',
+ 'notebook/js/celltoolbarpresets/tags'
], function(
$,
contents_service,
diff --git a/notebook/static/notebook/js/menubar.js b/notebook/static/notebook/js/menubar.js
index 2ec2180808..dec73134b1 100644
--- a/notebook/static/notebook/js/menubar.js
+++ b/notebook/static/notebook/js/menubar.js
@@ -152,12 +152,27 @@ define([
this.events.trigger('resize-header.Page');
};
+ (function($){
+ $(document).ready(function(){
+ $('ul.dropdown-menu [data-toggle=dropdown]').on('click', function(event) {
+ event.preventDefault();
+ event.stopPropagation();
+ $(this).parent().siblings().removeClass('open');
+ $(this).parent().toggleClass('open');
+ });
+ });
+ })(jQuery);
+
MenuBar.prototype.bind_events = function () {
/**
* File
*/
var that = this;
+ this.element.find("#new_notebook").click(function(){
+ console.log("11");
+ })
+
this.element.find('#open_notebook').click(function () {
var parent = utils.url_path_split(that.notebook.notebook_path)[0];
window.open(
diff --git a/notebook/static/notebook/less/menubar.less b/notebook/static/notebook/less/menubar.less
index 414557aee4..e5209f257b 100644
--- a/notebook/static/notebook/less/menubar.less
+++ b/notebook/static/notebook/less/menubar.less
@@ -1,4 +1,7 @@
+
+
#menubar {
+
.border-box-sizing();
margin-top: 1px;
@@ -44,6 +47,8 @@
}
}
+ul.dropdown-menu:focus
+
[dir="rtl"] ul.dropdown-menu {
text-align: right;
left : auto;
@@ -86,6 +91,8 @@ ul#help_menu li a{
}
}
+
+
// Make sub menus work in BS3.
// Credit: http://www.bootply.com/86684
.dropdown-submenu {
diff --git a/notebook/static/tree/js/main.js b/notebook/static/tree/js/main.js
index 5df78359b4..a29b235e60 100644
--- a/notebook/static/tree/js/main.js
+++ b/notebook/static/tree/js/main.js
@@ -117,6 +117,20 @@ requirejs([
)
);
+
+
+ $("#refresh_notebook_list").click(function(){
+ if($(this).attr("aria-label")=="pressing refresh button"){
+ $(this).attr("aria-label","pressing refresh button.");
+ }
+ else if($(this).attr("aria-label")=="pressing refresh button."){
+ $(this).attr("aria-label","pressing refresh button");
+ }
+ else{
+ $(this).attr("aria-label","pressing refresh button");
+ }
+ });
+
var interval_id=0;
// auto refresh every xx secondes, no need to be fast,
// update is done most of the time when page get focus
diff --git a/notebook/static/tree/js/notebooklist.js b/notebook/static/tree/js/notebooklist.js
index aa672dd367..34617318b3 100644
--- a/notebook/static/tree/js/notebooklist.js
+++ b/notebook/static/tree/js/notebooklist.js
@@ -421,6 +421,7 @@ define([
var crumb = $('').append(
$('')
.attr('href', url)
+ .attr('title',"link to"+url)
.text(path_part)
.click(function(e) {
// Allow the default browser action when the user holds a modifier (e.g., Ctrl-Click)
@@ -817,13 +818,16 @@ define([
if(selected.length>=1){
if($('#select-all').prop("checked")){
$('#button-select-all').attr("aria-label","Selected All "+ selected.length+" items");
+ $("#button-select-all").attr("aria-checked","true");
}
else{
$('#button-select-all').attr("aria-label","Selected, "+ selected.length+" items");
+ $("#button-select-all").attr("aria-checked","true");
}
}
else{
$('#button-select-all').attr("aria-label","Select All/None");
+ $("#button-select-all").attr("aria-checked","false");
}
// If at aleast on item is selected, hide the selection instructions.
diff --git a/notebook/templates/notebook.html b/notebook/templates/notebook.html
index ae8d9d3bf5..e2aad54289 100644
--- a/notebook/templates/notebook.html
+++ b/notebook/templates/notebook.html
@@ -77,12 +77,12 @@
{% for exporter in get_frontend_exporters() %}
@@ -175,8 +175,8 @@
title="{% trans %}Show/Hide line numbers in cells{% endtrans %}">
{% trans %}Toggle Line Numbers{% endtrans %}