diff --git a/docs/source/Coding/Coding-Introduction.md b/docs/source/Coding/Coding-Introduction.md index 8157b03005..15696c9457 100644 --- a/docs/source/Coding/Coding-Introduction.md +++ b/docs/source/Coding/Coding-Introduction.md @@ -38,10 +38,38 @@ That is, enter `evennia.` and press the `` key. This will show you all the available at the top level of Evennia's "flat API". See the [flat API](../Evennia-API) page for more info on how to explore it efficiently. +#### Jupyter Notebook Support + +You can now explore evennia interactively with jupyter notebooks. There are a few extra steps that must be taken in order for this to work: + + # [open a new console/terminal] + # [activate your evennia virtualenv in this console/terminal] + cd evennia + pip install -r requirements_extra.txt # this installs optional, but necessary modules for this to work. + cd mygame # make sure you are in root of your grame + evennia shell_plus --notebook& # this will start the notebook in the background + +Open an existing, or create, a notebook and in the first cell you must run: + +```python +import evennia +evennia._init() +``` + +This will initialize all module level variables located in `evennia.__init__`. +Now you have the same support as `evennia shell`, but in a more visual and persistent form. + +*It is important to remember, everytime the kernel restarts within a notebook you must first run +`evennia._init()`* + + You can complement your exploration by peeking at the sections of the much more detailed [Evennia Component overview](../Components/Components-Overview). The [Tutorials](../Howto/Howto-Overview) section also contains a growing collection of system- or implementation-specific help. + + + ### Use a python syntax checker Evennia works by importing your own modules and running them as part of the server. Whereas Evennia @@ -103,4 +131,4 @@ chat](http://webchat.freenode.net/?channels=evennia) are also there for you. And finally, of course, have fun! [feature-request]: (https://github.com/evennia/evennia/issues/new?title=Feature+Request%3a+%3Cdescriptive+title+here%3E&body=%23%23%23%23+Description+of+the+suggested+feature+and+how+it+is+supposed+to+work+for+the+admin%2fend+user%3a%0D%0A%0D%0A%0D%0A%23%23%23%23+A+list+of+arguments+for+why+you+think+this+new+feature+should+be+included+in+Evennia%3a%0D%0A%0D%0A1.%0D%0A2.%0D%0A%0D%0A%23%23%23%23+Extra+information%2c+such+as+requirements+or+ideas+on+implementation%3a%0D%0A%0D%0A -[bug](https://github.com/evennia/evennia/issues/new?title=Bug%3a+%3Cdescriptive+title+here%3E&body=%23%23%23%23+Steps+to+reproduce+the+issue%3a%0D%0A%0D%0A1.+%0D%0A2.+%0D%0A3.+%0D%0A%0D%0A%23%23%23%23+What+I+expect+to+see+and+what+I+actually+see+%28tracebacks%2c+error+messages+etc%29%3a%0D%0A%0D%0A%0D%0A%0D%0A%23%23%23%23+Extra+information%2c+such+as+Evennia+revision%2frepo%2fbranch%2c+operating+system+and+ideas+for+how+to+solve%3a%0D%0A%0D%0A) \ No newline at end of file +[bug](https://github.com/evennia/evennia/issues/new?title=Bug%3a+%3Cdescriptive+title+here%3E&body=%23%23%23%23+Steps+to+reproduce+the+issue%3a%0D%0A%0D%0A1.+%0D%0A2.+%0D%0A3.+%0D%0A%0D%0A%23%23%23%23+What+I+expect+to+see+and+what+I+actually+see+%28tracebacks%2c+error+messages+etc%29%3a%0D%0A%0D%0A%0D%0A%0D%0A%23%23%23%23+Extra+information%2c+such+as+Evennia+revision%2frepo%2fbranch%2c+operating+system+and+ideas+for+how+to+solve%3a%0D%0A%0D%0A) diff --git a/evennia/accounts/accounts.py b/evennia/accounts/accounts.py index 9b87b00b92..96f5400ce6 100644 --- a/evennia/accounts/accounts.py +++ b/evennia/accounts/accounts.py @@ -373,7 +373,7 @@ class DefaultAccount(AccountDB, metaclass=TypeclassBase): puppet (Object): The matching puppeted object, if any. """ - return session.puppet + return session.puppet if session else None def get_all_puppets(self): """ diff --git a/evennia/commands/default/account.py b/evennia/commands/default/account.py index ae284a6c85..b54f99f8a5 100644 --- a/evennia/commands/default/account.py +++ b/evennia/commands/default/account.py @@ -999,7 +999,7 @@ class CmdQuell(COMMAND_DEFAULT_CLASS): self.msg("Already quelling Account %s permissions." % permstr) return account.attributes.add("_quell", True) - puppet = self.session.puppet + puppet = self.session.puppet if self.session else None if puppet: cpermstr = "(%s)" % ", ".join(puppet.permissions.all()) cpermstr = "Quelling to current puppet's permissions %s." % cpermstr diff --git a/evennia/server/evennia_launcher.py b/evennia/server/evennia_launcher.py index 9fed573caf..dcfbbb8a7c 100644 --- a/evennia/server/evennia_launcher.py +++ b/evennia/server/evennia_launcher.py @@ -2259,7 +2259,7 @@ def main(): if option in ("makemessages", "compilemessages"): # some commands don't require the presence of a game directory to work need_gamedir = False - if option in ("shell", "check", "makemigrations", "createsuperuser"): + if option in ("shell", "check", "makemigrations", "createsuperuser", "shell_plus"): # some django commands requires the database to exist, # or evennia._init to have run before they work right. check_db = True diff --git a/requirements_extra.txt b/requirements_extra.txt index ff69a03ee6..c7a911f4e1 100644 --- a/requirements_extra.txt +++ b/requirements_extra.txt @@ -14,3 +14,8 @@ service_identity >= 18.1.0 # AWS-storage contrib boto3 >= 1.4.4 botocore >= 1.15 + +# Jupyter Notebook support +jupyter >= 1.0.0 +ipython >= 7.19.0 +django-extensions >= 3.1.0