Pythomnic3k

Syntax reference card

Modules

Each Pythomnic3k module has the following format:
__all__ = [ "method" ] # methods accessible with pmnc calls

def method(...):
    ...

# EOF

Calls between modules within one cage

To call one local module from another:
result = pmnc.module.method(...)
To enqueue a retriable call (returns immediately, runs later):
retry_id = pmnc(queue = "retry").module.method(...)

Calls between cages

To execute synchronous RPC call:
result = pmnc("other_cage").module.method(...)
To send asynchronous reliable message (with retriable call semantics):
retry_id = pmnc("other_cage", queue = "retry").module.method(...)

Resource transactions

To engage one or more resource in a transaction:
xa = pmnc.transaction.create()
xa.resource1.execute(...)
xa.resource2.execute(...)
result1, result2 = xa.execute()
The shortcut syntax for transactions with just one participant:
result = pmnc.transaction.resource.execute(...)
More specifically, here is an example of a database query:
xa = pmnc.transaction.create()
xa.some_db.execute("SELECT foo FROM bar WHERE key = {value}",
                   value = 123)
records = xa.execute()[0][0]
for r in records:
    foo = r["foo"]
and this is an example of SMS being sent:
message_id = pmnc.transaction.\
    smpp_prov.submit(destination_addr = "79876543210",
                     short_message = "hello")

Persistent state

To access persistent state private to each cage's module:
pmnc.state.set(key, value)
value = pmnc.state.get(key, default)
pmnc.state.delete(key)

Configuration

Each module (foo.py) may have its own configuration file (config_foo.py) and access it like this:
value = pmnc.config.get(key, default)
And the configuration file itself simply contains a dict:
config = dict \
(
key = "value",
)

Logging

To write to a local cage's log file:
pmnc.log.debug("Don't bother reading this")
pmnc.log.info("This is mildly interesting")
pmnc.log("This says something relevant")
pmnc.log.warning("Something's not right")
pmnc.log.error("Definetely !")
To send a message to a health monitor:
pmnc.notify.info("Situation normal")
pmnc.notify.warning("Uhm... it's getting worse")
pmnc.notify.error("Call the administrator")
pmnc.notify.alert("Now !")
Logging level can be temporarily increased using
with pmnc.log.level("DEBUG"):
    ...

Special constants

Name of the current cage:
pmnc.log(__cage__) # somecage
Name of the current server (node):
pmnc.log(__node__) # cruncher
Cage's private directory:
pmnc.log(__cage_dir__) # /pythomnic3k/cages/somecage