/python-meteor

A meteor client for python

Primary LanguagePythonMIT LicenseMIT

python-meteor

An event driven Meteor client

Installation

$ pip install python-meteor

Table of Contents

History

Latest Version 0.1.6

  • Add support for meteor login resume tokens (thanks @ppettit)

Version 0.1.5

  • BUGFIX - unsubscribe was not unsubcribing (missing sub ID) (thanks @tdamsma)
  • examples and docs support python 3

Version 0.1.4

  • BUGFIX - update connected status when reconnecting (thanks @ppettit)
  • BUGFIX - make sure logged_in callback get's fired (thanks @pmgration)
  • NOTE: python-ddp library has been updated that addresses connection problems

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.

TODO

  • Full minimongo API for find and find_one
  • CI unit testing with Travis

Quick Start

General Commands

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)

Usage

Class Init

####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)

Functions

####connect()

Connect to the meteor server

####login(user, password, token=token, callback=None)

Login with a username and password. If a token is provided it will be tried first, falling back to username and password if the token is invalid.

Arguments

user - username or email address
password - the password for the account

Keyword Arguments

token - meteor resume token 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(method, params, callback=None)

Call a remote method

Arguments

method - remote method name
params - remote method parameters

Keyword Arguments

callback - callback function containing return data

subscribe(name, params=[], callback=None)

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.

Events and Callback Arguments

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')

connected

Register the event to a callback function

def connected(self):
    print('* CONNECTED')

client.on('connected', connected)

The connected event callback takes no arguments

closed

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

reconnected

def reconnected(self):
    print('* RECONNECTED')

client.on('reconnected', reconnected)

reconnected call back takes no arguments

failed

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

added

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

changed

Register the event to a callback function

def changed(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

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

subscribed

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

unsubscribed

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

logging_in

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

logged_in

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

logged_out

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