ev-API cleanups. ev can now be imported also from a non-django initiated python interpreter (it initiates itself). Gave some more info text and made sure wrapped db_ methods correctly forward their doc strings for introspection.

This commit is contained in:
Griatch 2012-03-27 09:59:11 +02:00
parent 9409f835bc
commit da51cb063f
3 changed files with 42 additions and 15 deletions

47
ev.py
View file

@ -1,14 +1,16 @@
""" """
Central API for Evennia MUD/MUX/MU* system. Central API for the Evennia MUD/MUX/MU* creation system.
This basically a set of shortcuts to the main modules in src/. Import this This basically a set of shortcuts to the main modules in src/. Import this
from your code or eplore it interactively from ./manage.py shell (or a normal from your code or explore it interactively from ./manage.py shell (or a normal
python shell if you set DJANGO_SETTINGS_MODULE manually). python shell if you set DJANGO_SETTINGS_MODULE manually).
1) You should import things explicitly from the root of this module - you can generally Notes:
not use dot-notation to import deeper. Hence, to access a default command, you can do
the following: 1) You should import things explicitly from the root of this module - you can not use
dot-notation to import deeper. Hence, to access a default command, you can do the
following:
import ev import ev
ev.default_cmds.CmdLook ev.default_cmds.CmdLook
@ -29,7 +31,10 @@ python shell if you set DJANGO_SETTINGS_MODULE manually).
-not- set up Typeclasses correctly and will lead to errors. Other types of database objects -not- set up Typeclasses correctly and will lead to errors. Other types of database objects
can be created normally, but there are conveniant create_* functions for those too, making can be created normally, but there are conveniant create_* functions for those too, making
some more error checking. some more error checking.
4) The API accesses all relevant and most-neeeded functions/classes from src/, but might not 4) "settings" links to Evennia's game/settings file. "settings_full" shows all of django's available
settings. Note that you cannot change settings from here in a meaningful way, you need to update
game/settings.py and restart the server.
5) The API accesses all relevant and most-neeeded functions/classes from src/, but might not
always include all helper-functions referenced from each such entity. To get to those, access always include all helper-functions referenced from each such entity. To get to those, access
the modules in src/ directly. You can always do this anyway, if you do not want to go through the modules in src/ directly. You can always do this anyway, if you do not want to go through
this API. this API.
@ -42,14 +47,30 @@ import sys, os
# not yet initialized) # not yet initialized)
if __name__ == "__main__": if __name__ == "__main__":
print \ info = __doc__ + \
""" """
This module gives access to Evennia's programming API. | This module gives access to Evennia's programming API. It should
It should not be run on its own, but be imported and accessed as you develop your game. | not be run on its own, but be imported and accessed as described
To start the server, see game/manage.py and game/evennia.py. | above.
More help can be found at http://www.evennia.com. |
| To start the Evennia server, see game/manage.py and game/evennia.py.
| More help can be found at http://www.evennia.com.
""" """
print info
sys.exit() sys.exit()
# make sure settings is available, also if starting this API stand-alone
# make settings available, and also the full django settings
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from django.core.management import setup_environ
from game import settings
setup_environ(settings)
del setup_environ
from django.conf import settings as settings_full
# set Evennia version in __version__ property
try: try:
f = open(os.path.dirname(os.path.abspath(__file__)) + os.sep + "VERSION", 'r') f = open(os.path.dirname(os.path.abspath(__file__)) + os.sep + "VERSION", 'r')
__version__ = "Evennia %s-r%s" % (f.read().strip(), os.popen("hg id -i").read().strip()) __version__ = "Evennia %s-r%s" % (f.read().strip(), os.popen("hg id -i").read().strip())
@ -59,9 +80,11 @@ except IOError:
__version__ = "Evennia (unknown version)" __version__ = "Evennia (unknown version)"
del sys, os del sys, os
#
# Start Evennia API (easiest is to import this module interactively to explore it) # Start Evennia API (easiest is to import this module interactively to explore it)
#
README = "Evennia flat API. See the module header for usage information." README = __doc__
# help entries # help entries
from src.help.models import HelpEntry from src.help.models import HelpEntry

View file

@ -10,9 +10,10 @@ character object, so you should customize that
instead for most things). instead for most things).
""" """
from django.conf import settings
from src.typeclasses.typeclass import TypeClass from src.typeclasses.typeclass import TypeClass
from settings import CMDSET_OOC CMDSET_OOC = settings.CMDSET_OOC
class Player(TypeClass): class Player(TypeClass):
""" """

View file

@ -3,6 +3,7 @@ This implements the common managers that are used by the
abstract models in dbobjects.py (and which are thus shared by abstract models in dbobjects.py (and which are thus shared by
all Attributes and TypedObjects). all Attributes and TypedObjects).
""" """
from functools import update_wrapper
from django.db import models from django.db import models
from src.utils import idmapper from src.utils import idmapper
from src.utils.utils import make_iter from src.utils.utils import make_iter
@ -39,9 +40,10 @@ def returns_typeclass_list(method):
""" """
def func(self, *args, **kwargs): def func(self, *args, **kwargs):
"decorator. Returns a list." "decorator. Returns a list."
self.__doc__ = method.__doc__
matches = method(self, *args, **kwargs) matches = method(self, *args, **kwargs)
return [(hasattr(dbobj, "typeclass") and dbobj.typeclass) or dbobj for dbobj in make_iter(matches)] return [(hasattr(dbobj, "typeclass") and dbobj.typeclass) or dbobj for dbobj in make_iter(matches)]
return func return update_wrapper(func, method)
def returns_typeclass(method): def returns_typeclass(method):
""" """
@ -49,12 +51,13 @@ def returns_typeclass(method):
""" """
def func(self, *args, **kwargs): def func(self, *args, **kwargs):
"decorator. Returns result or None." "decorator. Returns result or None."
self.__doc__ = method.__doc__
rfunc = returns_typeclass_list(method) rfunc = returns_typeclass_list(method)
try: try:
return rfunc(self, *args, **kwargs)[0] return rfunc(self, *args, **kwargs)[0]
except IndexError: except IndexError:
return None return None
return func return update_wrapper(func, method)
#class TypedObjectManager(idmap.CachingManager): #class TypedObjectManager(idmap.CachingManager):