Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Jupyter-server #28

Merged
merged 6 commits into from
Mar 1, 2019
Merged

Jupyter-server #28

merged 6 commits into from
Mar 1, 2019

Conversation

Zsailer
Copy link
Member

@Zsailer Zsailer commented Feb 12, 2019

After chatting with @SylvainCorlay, I'm sharing a new draft of the Jupyter Server enhancement proposal. This supersedes #21.

Check it out! Any feedback is welcome.

You can easily view a rich display version of the proposal here.

For those interested, I've been experimenting with some of the ideas in this proposal. Check out these repos (warning: all are experimental!):

Pingin: @SylvainCorlay, @blink1073, @kevin-bates, @lresende, @ellisonbg, @minrk, @bollwyvl

@willingc
Copy link
Member

willingc commented Feb 13, 2019

@rgbkrk @captainsafia @betatim @parente fyi


Right now, there are two ways to extend and customize the jupyter server: services and server extensions. This is a bit confusing for new contributors. The main difference is that services often (but not always) **depend on other services**.

On example is the `sessions` service, which depends on the `kernels` and `kernelspec` services. Without these two services, the `sessions` service doesn't work (or even make sense).
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Core services should stick around, otherwise I think we're going to end up further in this diaspora of endpoints with no concrete aim of what makes up the core of jupyter.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we're going to end up further in this diaspora of endpoints with no concrete aim of what makes up the core of jupyter.

That's a great point. Thanks, Kyle.

My original motivation for exploring the idea of merging services and extensions came from projects like kernel_gateway and enterprise_gateway. These projects only provide kernels as a service and drop the other services. My thought was that we could make "which services are provided" a configurable option.

By doing this though, I recognize that I'm approaching a point where the jupyter server is just a configurable tornado server. Perhaps this is the wrong move.

Maybe we need to define what the core jupyter server is--and maybe that's what we have already (minus the notebook). Or maybe "kernels as a service" is the smallest "jupyter unit", and other services should be extensions?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd think kernels and kernelspecs at the very least, as well as sessions.

I understand not having contents be part of this core service, though maybe that makes sessions non-functional(?).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Zsailer - thank you for writing this proposal and starting this great discussion!

@rgbkrk - I totally agree with the notion that kernel management (which needs to include kernelspecs or providers, etc. as you noted) are the root of what "a jupyter server" provides. It's not clear to me what sessions actually provide from a server perspective since clients of the gateways don't need them to spawn kernels.

Although I'm biased, I believe the ability to optionally (and easily) route the kernel management to another node is crucial for multi-tenant capabilities and achieves a natural separation of user data from computation. I can't think of good reasons to necessarily separate out other pieces but that could be due to my lack of experience outside of the gateways. I'm not saying that jupyter_server should solely consist of kernel management - not at all. Just that the "server" should be able to optionally remote certain services. One service that makes sense for this is kernel management (and by association kernelspec management).

@lresende fyi

-
6. Migrate configuration.
- Notebook App configuration stays in `jupyter_notebook_config.py`
- Server and services configurations move to `jupyter_server_config.py`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does it have to go in jupyter_server_config.py or can we use the general jupyter_config.py?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does it have to go in jupyter_server_config.py or can we use the general jupyter_config.py?
We always can so long as it is a standard JupyterApp also respect the jupyter_config.py, so I imagine this one would as well

However, I don't think that's the right problem. I think what we should do is make a change to JupyterApp from jupyter_core that allows us to declare additional configuration file names that should be picked up. Currently you can only address one app at time (or all apps with jupyter_config.py) based on the value of the app's class attribute name.

Additionally, we could make a Configurable class (NotebookAppConfig) that inherits from the NotebookApp and overwrites all of it's webserver capabilities so that we can continue to get access to the existing NotebookApp.nbserver_extension information. But again… that will be meaningless if we can't read in people's jupyter_notebook_config.py, jupyter_notebook_config.json, and jupyter_notebook_config.d/extension.json.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding on -- with Netflix's current deployments we deploy classic, jupyterlab, and nteract -- we want all of them and in many cases want to share config (so that ContentsManagers are the same and additional server extensions are available for APIs, like with bookstore).

Even if I was elsewhere, I'd still want to have a consistent deterministic config setup even with multiple jupyter apps attached to the server.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @rgbkrk and @mpacer for your comments here.

make a change to JupyterApp from jupyter_core that allows us to declare additional configuration file names

@mpacer this is a good idea--add a trait to the JupyterApp for listing configuration files that should get loaded (and in what order of precedence). That would certainly help with avoiding breaking everyone's configuration system in this transition.

I missed jupyter/notebook#4376 when trying to research all the threads around configuration. Sorry about that! I'll need to think about this a bit more for a new draft. (I'm working on adding flow diagram/visualizations showing the proposed configuration models to this proposal to help others follow the conversation as well).

That said, I know that jupyterlab has moved towards a configuration model where each extension has its own config file a conf.d. I was modeling the jupyter server (and its extensions) after this model. But, this conversation has made me realize this needs a lot more thought. Specifically, I need to think a lot more about Netflix's use-case here... thanks for sharing @rgbkrk

**Cons** associated with this implementation include:

* Break the classic notebook in a backwards incompatible way.
* Affects many projects. The transition may be painful?
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are there any transition difficulties that we can plan for?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a great question.

I think we should start listing specific transition difficulties and how to move foward here. I was kind of getting at that in the "How this effects other projects" section, but it needs to be fleshed out a lot more.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure if it makes sense to provide tool for the transition, which may end up being harder to use and maintain than doing the change manually.

@Zsailer
Copy link
Member Author

Zsailer commented Feb 13, 2019

Thank you @rgbkrk and @captainsafia for looking at this document already! And thank you @willingc for pinging them.

Copy link
Member

@mpacer mpacer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall, I think splitting out the jupyter server would be a huge boon to the project. I'm excited to see someone proposing this!

However, my excitement is tempered by my experiences around the notebook configuration system. I have major concerns over the proposed approach to configuration, migration and backwards incompatibility.

I think the most important piece of this is extracting the jupyter server from the notebook front end. I'm pretty sure this can be accomplished without breaking backwards compatibility by adding additional functionality to JupyterApps (the ability to read multiple jupyter_<name>_config files) and a class that acts as a wrapper for the current notebook server's configuration management that can then be reused by the new jupyter server app.

If we want to then also do a configuration migration later, I could see a case for that, but I think that should be tackled as a completely separate problem.

I also think that if we are going to separate the server from the classic notebook interface, as much as possible we should be retaining existing behaviour. The suggestion to simultaneously rework the logic of how serverextensions work at the same time as separating the server into its own repo and forcing a restructuring of everyone's configuration logic… it just seems like too much is being attempted in a single step.

5. Namespacing static files and REST API urls.
- Each extension serves static files at the `/static/<extension>` url.
-
6. Migrate configuration.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is going to be the biggest pain point of this move for users and deployers alike. I suggested some stuff below, but I'll try to pull up a more formal plan for how I could see this going remotely smoothly.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @mpacer.

I think you're absolutely right. This is an early draft still, so there should be many more iterations to improve this JEP.

6. Migrate configuration.
- Notebook App configuration stays in `jupyter_notebook_config.py`
- Server and services configurations move to `jupyter_server_config.py`
- Add a `migrate` application to automate this migration.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be non-trivial and buggy. I think is a suboptimal approach compared to not breaking currently working infrastructure.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a fair critique. First and foremost, it sounds like I need to rethink the configuration model and flesh out the details. Perhaps we can reach a solution without requiring a migration.

- Notebook App configuration stays in `jupyter_notebook_config.py`
- Server and services configurations move to `jupyter_server_config.py`
- Add a `migrate` application to automate this migration.
7. Add necessary documentation to notebook and jupyter_server repos.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the jupyter_server repo would benefit from a history doc to explain why some of the complexity is in place as well.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍


In the proposed jupyter_server, extension developers may also create an application from their extension, using a new `JupyterServerExtensionApp` class. Extension developers can subclass the new base class to make server extensions into Jupyter applications (configurable and launchable from the commmand line). This new class loads extension config from file and parses configuration set from the command line.

For example, the legacy notebook could be started: 1) as an enabled extension or 2) by running the traitlets application from the command line.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be 100% clear you mean the JupyterApp application?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, the language is a bit sloppy.

The idea here is to make server extensions that can behave like stand alone applications. You can load them by launching jupyter server and listing them as an extension or you can call jupyter <my_extension> from the command line (and pass configurable traits to that extension at the CLI).

The example I mention is a "classic notebook" extension, which launches the classic notebook frontend. You would be able run the notebook application by launching jupyter server and loading the notebook extension or calling the extension directly from the CLI (i.e. jupyter classic-notebook or maybe jupyter notebook).

This would be made possible by a JupyterServerExtensionApp class (which inherit JupyterApp). An extension that inherit this class behaves like a JupyterApp that starts a jupyter server and appends the extension to the server.

As a prototype, checkout out jupyter_server_extension.

Does that make sense?

load_jupyter_server_extension = staticmethod(load_jupyter_server_extension)
```

`JupyterServerExtensionApp` subclasses are configurable using Jupyter's configuration system. Users can generate config files for each extension in the Jupyter config path (see `jupyter --paths`). Each extension's configuration is loaded when the server is initialized or the extension application is launched.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this be a proper JupyterApp as well or only a Configurable?

I think this configuration problem is going to be more challenging than this proposal suggests. See the conversation on jupyter/notebook#4376 for an example of how the current server has issues with its configuration setup.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In which repo would the JupyterServerExtensionApp live?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this be a proper JupyterApp as well or only a Configurable?

It would be a JupyterApp.

In which repo would the JupyterServerExtensionApp live?

I'm not sure quite yet. Maybe inside the jupyter_server repo? Or it could live as a small side repo.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This name is java-like in length... perhaps jupyter_server.ExtensionApp?

- enabling an extension at the same level (user / sys-prefix / system) as where it was installed, or at a higher level (user for sys-prefix and system, or sys-prefix for system).
- forcibly disabling an extension that was enabled at a lower level of precedence.
- forcibly enabling an extension that was disabled at a lower level of precedence.
This would be done via two `conf.d` configuration directories managing a list of disabled extensions and list of enabled extensions in the form of empty files having the name of the corresponding extension. If an extension is both disabled and enabled at the same level of precedence, disabling has precedence. Packages (conda or wheels) could place such a enabler file in the sys-prefix path by default. The `jupyter server extension enable` command would be required for development installations.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where would these conf.d configuration directories live?

I feel like it's a mistake to allow serverextensions packages to automatically disable other serverextensions on install and that would be possible with this behaviour.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These conf.d configuration files would live in PREFIX/etc/jupyter/server/.

@mpacer what do you mean about allowing server extension packages to automatically disable other server extensions?


### Services become server extensions (with dependency injection)

Right now, there are two ways to extend and customize the jupyter server: services and server extensions. This is a bit confusing for new contributors. The main difference is that services often (but not always) **depend on other services**.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where are the docs describing how to use services as a way to customize the jupyter server. As far as I can tell searching through the readthedocs page we have only traitlets documentation and one changelog mentioning anything about services.

From my perspective the lack of documentation is likely far more confusing for new contributors. That documentation needs to be addressed before I feel comfortable with us moving forward with a proposal like this.


On example is the `sessions` service, which depends on the `kernels` and `kernelspec` services. Without these two services, the `sessions` service doesn't work (or even make sense).

We could reduce complexity around `jupyter_server` by making *everything* a server extension. We would need to add a **dependency injection** system to allow extensions to depend on other extensions. Some good options are [pyinject](https://github.com/google/pinject) or [python-dependency-injector](https://github.com/ets-labs/python-dependency-injector).
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm confused. We already have an example of an extension depending on another extension using standard python dependency management: bookstore and the nteract_on_jupyter extensions (see a WIP PR for making this work nteract/nteract#4144; it would be much easier if we had our configuration setup in the notebook working correctly jupyter/notebook#4376).

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the intent is for an extension to depend on some implementation of a feature provided by a serverextension that you might not know the name of, so can't look for and/or import? I suppose you could walk all of the serverextensions and see if they have the function you want...

serverextension config issues aside (which will be good to fix, good show!) I think the closest thing we have today are the various *_managers, but first-party code is littered with use of private methods of specific implementations, which extensions see and replicate. However, I don't know if we should be looking to find more dependencies to solve these problems: I'd love to have this server end up with fewer. entry_points of course come to mind, but with conf.d we've mostly solved the discoverability need, but maybe we just need more/different named extension points with tighter contracts than here's the whole app, don't break anything!

However, at the same time, a lot of the by-inheritance or replacement patterns we have make it hard to compose behaviors. For example, I would like a ContentsManager that offered a route scheme, such that I could have, say, /contents/local/index.ipynb and /contents/github/jupyter/notebook/index.ipynb, that the frontend and other services would transparently work with, but it's either git or local unless I want to write my own ecosystem. Kernelspecs are much the same way: nb_conda_kernels still confuses the hell out of people, but is actually a pretty sane way to work on multiple notebook-driven projects, but can't be easily composed with, say, a docker provider and remote provider. @takluyver has made significant strides towards this with the KernelFinder pattern, but we'd need lots more: ContentsFinder, AuthFinder, SessionFinder.

~/.jupyter/
├── jupyter_server_config.py
└── jupyter_server_config.d
├── notebook.py|json
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There was discussion specifically around not allowing .py files in the jupyter_server_config.d setup.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hear, hear!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you point me to this discussion? There are many threads, so it's easy to get lost.

I'm coming to jupyter server conversation/topic very late in the game... so I'm working hard to get up to speed, but I'm definitely going to miss key conversations. Its helping me a ton to compile all that information here.

Copy link
Member

@rgbkrk rgbkrk Feb 14, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure where the thread is, but I'd expect jupyter_*_.d to not be dynamic config, only static json.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure where the thread is, but I'd expect jupyter_*_.d to not be dynamic config, only static json.

I would agree with that

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks everyone. I've adjusted this in the new draft of the proposal.


**Migration application**

To make migration easier on users, the jupyter server will include a `migrate` application to split notebook and server configurations into their appropriate locations (listed above). This application will find any `jupyter_notebook_config.py|json` files in `jupyter --paths`, read configured traits, sort server vs. notebook traits, and write them to the appropriate `jupyter_server_config.py|json` and `jupyter_notebook_config.py|json` files.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I fear this is likely to be brittle and cause a lot of headaches given how complicated our configuration system is.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a fair point. Perhaps this will go away after I rethink this proposal some more.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am am also doubtful about an auto-migration tool. It might be better to merely document the migration.

@Zsailer
Copy link
Member Author

Zsailer commented Feb 13, 2019

@mpacer Thank you for the review and comments! My day is a little crazy today, but I'll try to get to these points by tomorrow.

- `view` module: handlers for file viewer component.
- `static` directory: all js and style sheets for notebook frontend.
- `tree` module: a classic notebook file browser+handlers.
- `auth` module? *(Should this move to jupyter_server?)*

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel like auth should probably be the new server, but potentially have a more pluggable design. Security should be pretty hard-nosed by default, e.g. base handlers that already have @web.authenticated on, etc. with it being an explicit decision for some new handler to not be authenticated.

@Zsailer
Copy link
Member Author

Zsailer commented Feb 14, 2019

@mpacer Thanks a ton for you comments and feedback! This was extremely helpful.

@Zsailer
Copy link
Member Author

Zsailer commented Feb 14, 2019

In full disclosure, I'm entering this JEP way late in the game. I realize there have been many conversations (and likely debates) in the past that are before my time at Jupyter, and thus, I'm completely unaware of. Please don't hold it against me! 😃 I promise I'm not intentionally ignoring anyone's previous thoughts or comments. I am trying to synthesize everything I come across into this single document. Any links to conversations you know we had in the past would help me tremendously.

I'm hoping that this PR becomes a great opportunity to gather those opinions/thoughts again in one place and reignite the conversation. I'll do my best to iterate on this document quickly and improve it based on the feedback. I'm just hoping to make progress on this proposal since it's been sitting for a while.

I posted this before the dev meeting to get some eyes on the documents. Then, maybe it would be a good idea to discuss this deeper in person. Either way, keep sharing your feedback! I really appreciate it!

@bollwyvl
Copy link

bollwyvl commented Feb 14, 2019 via email

@Zsailer
Copy link
Member Author

Zsailer commented Feb 20, 2019

Okay, I realized that I didn't fully understand Jupyter's configuration system before.

So, I took the time to create this "Jupyter Configuration Overview" repo. It shows an example notebook server config setup, with READMEs in each subdirectory explaining the various pieces. It also shows an example jupyter server config setup for comparison.

The main README also has a section listing the differences between the two. I tried to make it simple and transparent. It also lists some practical steps to reduce friction for such as a transition.

I'd love to get your thoughts from those of you who know Jupyter's core much better than me: @mpacer, @rgbkrk, @bollwyvl, and @willingc.

I've opened an issue for discussion.

Once that discussion rounds off, I'll fix/update the JEP with our conclusions.

Does that work for others?

Copy link
Member

@willingc willingc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall, I would recommend giving this document a way to be iterated upon. Something similar to #29 (comment) would apply here too. While the status is DRAFT for the JEP, it would be a work in process and not accepted.


## Problem

There are now multiple frontends that talk to the backend services provided by the notebook server: the legacy Notebook, the dashboards, JupyterLab, standalone widgets and more. The configuration of legacy notebook and the backend server are tightly coupled. As a consequence, the other applications are forced to load the legacy notebook to use the backend server.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's add nteract into list of services.


Decouple the backend server (and its configuration) from the classic notebook frontend. This will require the following steps:

1. Create `jupyter_server` repository
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hasn't this already been done? https://github.com/jupyter/jupyter_server Or will there be a new_jupyter_server repo?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps instead of steps, provide an overview of key functional components that would be stored in a repo together:

  • backend server which handles services
  • base server extensions provided for access to server information and processes
  • services, built upon base extensions, which can inject dependencies
  • REST API and namespacing of static files
  • configuration for server, base server extensions, and services

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Each functional component would then be broken out as its own section to better scope discussion, options, reject alternatives etc.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hasn't this already been done?

👍 Yes, I am referring to the (already created) jupyter_server repo. This repo was created after the original draft of this proposal (~2 years ago). "Create" was a poor choice of words. It's already been created. They point is to explicitly state that jupyter_server is a product of this proposal.

Perhaps instead of steps, provide an overview of key functional components

👍 That sounds like a good idea. I had organized each item in my mind as a chronological set of steps to implementation, but there is not practical hierarchy to the pieces in this proposal. For the most part, they are separate pieces that with separate discussion.

@Zsailer
Copy link
Member Author

Zsailer commented Feb 27, 2019

Overall, I would recommend giving this document a way to be iterated upon. Something similar to #29 (comment) would apply here too. While the status is DRAFT for the JEP, it would be a work in process and not accepted.

That's a great idea. Thanks @willingc. I'll adjust the proposal to reflect a "draft" status and make it easier to iterate.

@willingc
Copy link
Member

willingc commented Feb 28, 2019

@Zsailer Perhaps let's do this...

  • Add a header block similar to what I suggested in the comment and similar to a Python PEP. Use this original PR number as the JEP number. Status is DRAFT.
  • Incorporate any straightforward changes from all these comments
  • Larger changes, such as my request to break into sections instead of steps, leave as is for the moment. Let's open individual issues on this JEP repo capturing each discussion point.
  • After the issues are opened, let's merge this PR.

I think then we'll be in good shape to iterate and refine the JEP through smaller subsequent PRs.

@Zsailer
Copy link
Member Author

Zsailer commented Feb 28, 2019

Per @willingc's great suggestion, I've done the following:

  • Added a header block marking this as a "Draft"
  • Revised the proposal, incorporating some of the changes discussed here (plus some updates from things I've learned along the way).
  • Broken each point into separate Issues on this repo (prefixed with [JEP 10]).
  • Merge PR and iterate later.

Check out the newest draft. We can now iterate on this document through later PRs. And as always, thank you ahead of time for any feedback!

@willingc
Copy link
Member

willingc commented Mar 1, 2019

I'm going to go ahead and merge this PR after all this great work by @Zsailer. I hope that the process of iterating on the JEP and tackling the issues that were opened will help move forward the direction.

@willingc willingc merged commit 29f0f36 into jupyter:master Mar 1, 2019
@SylvainCorlay
Copy link
Member

Many thanks to @Zsailer for pushing this!

@rgbkrk
Copy link
Member

rgbkrk commented Mar 1, 2019

Thank you for marking it as a draft and getting it moving in a positive direction @Zsailer + @willingc. 😄

@Zsailer
Copy link
Member Author

Zsailer commented Mar 1, 2019

Thank you all for the review!

I'll work on moving the comment threads left here to the issues I opened for each section in the proposal. I look forward to further discussion. 😄

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants