# Overview of the Evennia library ```{sidebar} API API stands for `Application Programming Interface`, a description for how to access the resources of a program or library. ``` There are several good ways to explore the Evennia library. - This documentation contains the [Evennia-API docs](../../../Evennia-API.md), generated automatically from sources. Try clicking through to a few entries - once you get deep enough you'll see full descriptions of each component along with their documentation. You can also click `[source]` to see the full Python source code for each thing. - There are [separate doc pages for each component](../../../Components/Components-Overview.md) if you want more detailed explanations. - You can browse [the evennia repository on github](https://github.com/evennia/evennia). This is exactly what you can download from us. - Finally, you can clone the evennia repo to your own computer and read the sources. This is necessary if you want to *really* understand what's going on, or help with Evennia's development. See the [extended install instructions](../../../Setup/Installation-Git.md) if you want to do this. ## Where is it? If Evennia is installed, you can import from it simply with import evennia from evennia import some_module from evennia.some_module.other_module import SomeClass and so on. If you installed Evennia with `pip install`, the library folder will be installed deep inside your Python installation; you are better off [looking at it on github](github:evennia). If you cloned it, you should have an `evennia` folder to look into. You'll find this being the outermost structure: evennia/ bin/ CHANGELOG.md ... ... docs/ evennia/ This outer layer is for Evennia's installation and package distribution. That internal folder `evennia/evennia/` is the _actual_ library, the thing covered by the API auto-docs and what you get when you do `import evennia`. > The `evennia/docs/` folder contains the sources for this documentation. See > [contributing to the docs](../../../Contributing-Docs.md) if you want to learn more about how this works. This is the structure of the Evennia library: - evennia - [`__init__.py`](../../../Evennia-API.md#shortcuts) - The "flat API" of Evennia resides here. - [`settings_default.py`](../../../Setup/Settings.md#settings-file) - Root settings of Evennia. Copy settings from here to `mygame/server/settings.py` file. - [`commands/`](../../../Components/Commands.md) - The command parser and handler. - `default/` - The [default commands](../../../Components/Default-Commands.md) and cmdsets. - [`comms/`](../../../Components/Channels.md) - Systems for communicating in-game. - `contrib/` - Optional plugins too game-specific for core Evennia. - `game_template/` - Copied to become the "game directory" when using `evennia --init`. - [`help/`](../../../Components/Help-System.md) - Handles the storage and creation of help entries. - `locale/` - Language files ([i18n](../../../Concepts/Internationalization.md)). - [`locks/`](../../../Components/Locks.md) - Lock system for restricting access to in-game entities. - [`objects/`](../../../Components/Objects.md) - In-game entities (all types of items and Characters). - [`prototypes/`](../../../Components/Prototypes.md) - Object Prototype/spawning system and OLC menu - [`accounts/`](../../../Components/Accounts.md) - Out-of-game Session-controlled entities (accounts, bots etc) - [`scripts/`](../../../Components/Scripts.md) - Out-of-game entities equivalence to Objects, also with timer support. - [`server/`](../../../Components/Portal-And-Server.md) - Core server code and Session handling. - `portal/` - Portal proxy and connection protocols. - [`typeclasses/`](../../../Components/Typeclasses.md) - Abstract classes for the typeclass storage and database system. - [`utils/`](../../../Components/Coding-Utils.md) - Various miscellaneous useful coding resources. - [`web/`](../../../Concepts/Web-Features.md) - Web resources and webserver. Partly copied into game directory on initialization. ```{sidebar} __init__.py The `__init__.py` file is a special Python filename used to represent a Python 'package'. When you import `evennia` on its own, you import this file. When you do `evennia.foo` Python will first look for a property `.foo` in `__init__.py` and then for a module or folder of that name in the same location. ``` While all the actual Evennia code is found in the various folders, the `__init__.py` represents the entire package `evennia`. It contains "shortcuts" to code that is actually located elsewhere. Most of these shortcuts are listed if you [scroll down a bit](../../../Evennia-API.md) on the Evennia-API page. ## An example of exploring the library In the [previous lesson](./Beginner-Tutorial-Python-classes-and-objects.md#on-classes-and-objects) we took a brief look at `mygame/typeclasses/objects` as an example of a Python module. Let's open it again. ```python """ module docstring """ from evennia import DefaultObject class Object(DefaultObject): """ class docstring """ pass ``` We have the `Object` class, which inherits from `DefaultObject`. Near the top of the module is this line: from evennia import DefaultObject We want to figure out just what this DefaultObject offers. Since this is imported directly from `evennia`, we are actually importing from `evennia/__init__.py`. [Look at Line 160](github:evennia/__init__.py#L160) of `evennia/__init__.py` and you'll find this line: from .objects.objects import DefaultObject ```{sidebar} Relative and absolute imports The first full-stop in `from .objects.objects ...` means that we are importing from the current location. This is called a `relative import`. By comparison, `from evennia.objects.objects` is an `absolute import`. In this particular case, the two would give the same result. ``` > You can also look at [the right section of the API frontpage](../../../Evennia-API.md#typeclasses) and click through to the code that way. The fact that `DefaultObject` is imported into `__init__.py` here is what makes it possible to also import it as `from evennia import DefaultObject` even though the code for the class is not actually here. So to find the code for `DefaultObject` we need to look in `evennia/objects/objects.py`. Here's how to look it up in the docs: 1. Open the [API frontpage](../../../Evennia-API.md) 2. Locate the link to [evennia.objects.objects](../../../api/evennia.objects.objects.md) and click on it. 3. You are now in the python module. Scroll down (or search in your web browser) to find the `DefaultObject` class. 4. You can now read what this does and what methods are on it. If you want to see the full source, click the \[source\] link next to it. ## Conclusions This is an important lesson. It teaches you how to find information for yourself. Knowing how to follow the class inheritance tree and navigate to things you need is a big part in learning a new library like Evennia. Next we'll start to make use of what we have learned so far and combine it with the building blocks provided by Evennia.