An event driven Meteor client
Installation
$ pip install python-meteor
Table of Contents
Latest Version 0.1.3
- Fixed a bug that was causing a crash while removing a field on a change event (thanks @ppettit)
Version 0.1.2
- Implemented auto reconnect (auto reconnect on by default) and reconnected event emitter
Version 0.1.1
- Fixed bug in setup, was including built in hashlib
Version 0.1.0
- Initial implementation, add ability to call, subscribe, unsubscribe, do basic queries and login
- Data is stored in a local python dictionary (in memory) and updated in real time as collection change events are received. This allows for very a basic find and find_one APIs to be implemented.
- Full minimongo API for find and find_one
- CI unit testing with Travis
Create a Meteor client and connect
from MeteorClient import MeteorClient
client = MeteorClient('ws://127.0.0.1:3000/websocket')
client.connect()
Establish A Connection Without Auto Reconnect
from MeteorClient import MeteorClient
client = MeteorClient('ws://127.0.0.1:3000/websocket', auto_reconnect=False)
client.connect()
Establish A Connection And With Reconnect Different Frequency
from MeteorClient import MeteorClient
# try to reconnect every second
client = MeteorClient('ws://127.0.0.1:3000/websocket', auto_reconnect=True, auto_reconnect_timeout=1)
client.connect()
Call a remote function
def callback_function(error, result):
if error:
print error
return
print result
client.call('someFunction', [1, 2, 3], callback_function)
Subscribe and Unsubscribe
def subscription_callback(error):
if error:
print error
client.subscribe('posts', callback=subscription_callback)
client.unsubscribe('posts')
Find All Data In a Collection
all_posts = client.find('posts')
Find Data In a Collection With Selector
sacha_posts = client.find('posts', selector={'author': 'Sacha Greif'})
Find One
one_post = client.find_one('posts')
Fine One With Selector
one_post = client.find_one('posts', selector={'author': 'Sacha Greif'})
Insert
def insert_callback(error, data):
if error:
print error
return
print data
client.insert('posts', {'title': 'Google', 'url': 'https://google.com', 'comments': 'Search'}, callback=insert_callback)
Update
def update_callback(error, data):
if error:
print error
return
print data
client.update('posts', {'title': 'Google'}, {'comments': 'Google main page'}, callback=update_callback)
Remove
def remove_callback(error, data):
if error:
print error
return
print data
client.remove('posts', {'title': 'Google'}, callback=remove_callback)
####DDPClient(url, auto_reconnect=True, auto_reconnect_timeout=0.5, debug=False)
Arguments
url - to connect to ddp server
Keyword Arguments
auto_reconnect - automatic reconnect (default: True)
auto_reconnect_timeout - reconnect every X seconds (default: 0.5)
debug - print out lots of debug info (default: False)
####connect()
Connect to the meteor server
####login(user, password, callback=None)
Login with a username and password
Arguments
user - username or email address
password - the password for the account
Keyword Arguments
callback - callback function containing error as first argument and login data
####logout(callback=None)
Logout a user
Keyword Arguments
callback - callback function called when the user has been logged out
Call a remote method
Arguments
method - remote method name
params - remote method parameters
Keyword Arguments
callback - callback function containing return data
Subscribe to a collection
Arguments
name - the name of the publication
params - the subscription parameters
Keyword Arguments
callback - a function callback that returns an error (if exists)
####unsubscribe(name)
Unsubscribe from a collection
Arguments
name - the name of the publication
####find(collection, selector={})
Find data in a collection
Arguments
collection - collection to search
Keyword Arguments
selector - the query (default returns all items in a collection)
####find_one(collection, selector={})
Return one item from a collection
Arguments
collection - collection to search
Keyword Arguments
selector - the query (default returns first item found)
####insert(collection, doc, callback=None)
Insert an item into a collection
Arguments
collection - the collection to be modified
doc - The document to insert. May not yet have an _id attribute,
in which case Meteor will generate one for you.
Keyword Arguments
callback - Optional. If present, called with an error object as the first argument and,
if no error, the _id as the second.
####update(collection, selector, modifier, callback=None)
Insert an item into a collection
Arguments
collection - the collection to be modified
selector - specifies which documents to modify
modifier - Specifies how to modify the documents
Keyword Arguments
callback - Optional. If present, called with an error object as the first argument and,
if no error, the number of affected documents as the second.
####remove(collection, selector, callback=None)
Remove an item from a collection
Arguments
collection - the collection to be modified
selector - Specifies which documents to remove
Keyword Arguments
callback - Optional. If present, called with an error object as its argument.
When creating an instance of MeteorClient
it is capable of emitting a few events with arguments. The documentation below assumes that you've instanciated a client with the following code:
from MeteorClient import MeteorClient
client = MeteorClient('ws://127.0.0.1:3000/websocket')
Register the event to a callback function
def connected(self):
print '* CONNECTED'
client.on('connected', connected)
The connected event callback takes no arguments
Register the event to a callback function
def closed(self, code, reason):
print '* CONNECTION CLOSED {} {}'.format(code, reason)
client.on('closed', closed)
closed
callback takes the following arguments
code - the error code
reason - the error message
def reconnected(self):
print '* RECONNECTED'
client.on('reconnected', reconnected)
reconnected
call back takes no arguments
Register the event to a callback function
def failed(collection, data):
print '* FAILED - data: {}'.format(str(data))
client.on('failed', failed)
failed
callback takes the following arguments
data - the error data
Register the event to a callback function
def added(collection, id, fields):
print '* ADDED {} {}'.format(collection, id)
for key, value in fields.items():
print ' - FIELD {} {}'.format(key, value)
client.on('added', added)
added
callback takes the following arguments
collection - the collection that has been modified
id - the collection item id
fields - the fields for item
Register the event to a callback function
def changed(self, collection, id, fields, cleared):
print '* CHANGED {} {}'.format(collection, id)
for key, value in fields.items():
print ' - FIELD {} {}'.format(key, value)
for key, value in cleared.items():
print ' - CLEARED {} {}'.format(key, value)
client.on('changed', changed)
changed
callback takes the following arguments
collection - the collection that has been modified
id - the collection item id
fields - the fields for item
cleared - the fields for the item that have been removed
Register the event to a callback function
def removed(collection, id):
print '* REMOVED {} {}'.format(collection, id)
client.on('removed', removed)
removed
callback takes the following arguments
collection - the collection that has been modified
id - the collection item id
Register the event to a callback function
def subscribed(subscription):
print '* SUBSCRIBED {}'.format(subscription)
client.on('subscribed', subscribed)
subscribed
callback takes the following arguments
subscription - the name of the subscription
Register the event to a callback function
def unsubscribed(subscription):
print '* UNSUBSCRIBED {}'.format(subscription)
client.on('unsubscribed', unsubscribed)
unsubscribed
callback takes the following arguments
subscription - the name of the subscription
Register the event to a callback function
def logging_in():
print '* LOGGIN IN'
client.on('logging_in', logging_in)
logging_in
callback takes no arguments
Register the event to a callback function
def logged_in(data):
print '* LOGGED IN {}'.format(data)
client.on('logged_in', logged_in)
logged_in
callback takes the following arguments
data - login return data
Register the event to a callback function
def logged_out():
print '* LOGGED OUT'
client.on('logged_out', logged_out)
logged_out
callback takes no arguments
####All of the callbacks
For reference
client.on('connected', connected)
client.on('socket_closed', closed)
client.on('reconnected', reconnected)
client.on('failed', failed)
client.on('added', added)
client.on('changed', changed)
client.on('removed', removed)
client.on('subscibed', subscibed)
client.on('unsubscribed', unsubscribed)
client.on('logging_in', logging_in)
client.on('logged_in', logged_in)
client.on('logged_out', logged_out)
##Example
There is an included example.py
script to use with the todo
sample app included with meteor
Create the sample meteor app and start it
$ meteor create --example todos
$ meteor
Then run example.py
$ python example.py
##Collaborators