/pytile38

Tile38 python client

Primary LanguagePython

pytile38

Simple python client for Tile38. Currently, only a subset of commands are supported. However, you can manually add new commands by defining a scheme ( look at tile.py ).

Commands are built from instance properties or keyword arguments, therefore each command only requires missing attributes.

Models

Each model instance represents an entry in Tile38.

class Shop(TilePointBase):
	serializer = Serializer
        identifier = Key("shop")
	
        id = Value("")
        lat = Value(0.0)
        lon = Value(0.0)

Serializer is responsible for serializing/parsing data ( both for class methods and instance methods ).

class Serializer(object):
	@classmethod
	def is_valid(cls, response):
		if response.result:
			return True
		return False

	@classmethod
	def get(cls, instance=None, response=None, id=None, **kwargs):
		result = response.result
		fields = result[1] if (isinstance(result, list) and len(result) > 1) else None
		instance = instance()
		lat, lon = 0.0, 0.0
		if response.kwargs.get("withfields"):
			instance.fields = [tuple(fields[i:i+2]) for i in range(0, len(fields), 2)]
			result = result[0]
		if response.kwargs.get("type") == "point":
			lon, lat = list(map(float, result))			
		elif response.kwargs.get("type") == None:
			lon, lat = list(map(float, result.get("coordinates")))
		instance.lat = lat
		instance.lon = lon
		instance.id = id

		return instance

	@classmethod
	def ids(cls, response=None, **kwargs):
		data = response.result[1]
		result = []
		for d in data:
			name, info = d[0:2]
			name = name
			result.append(name)

		return result

	@classmethod
	def nearby(cls, response=None, **kwargs):
		data = response.result[1]
		result = []
		for d in data:
			name, info = d[0:2]
			lat, lon = info.get("coordinates")[::-1]
			coordinates = {"lat": lat, "long": lon}
			item = {"name":name, "coordinates": coordinates}
			result.append(item)

		return result

Example

shop1 = Shop.create(lat=45.02695, lon=-77.431641, id="modula")
shop1.set(type="point") # alternatively, you can add this property to Shop class
shop2 = Shop.create(lat=43.516689, lon=-74.794922, id="bellissimo", type="point")
shop2.set(type="point")

shop3 = Shop.create(lat=51.835778, 
                    lon=9.931641,
                    id="metzgerei",
                    type="point",
                    fields=[('hat_gelesen', 0),('agb_seiten', 100), ('kunde_muss_nochmal_bestätigen', 1)])
shop3.set(type="point", ex=60) # set expiration


shop4 = Shop.get(id="metzgerei", withfields=True) # get point with associated fields

shop4.fields
>>> [('agb_seiten', 100000000), ('kunde_muss_nochmal_bestätigen', 1), ('neu_dazukommende_agb_seiten', 19590713256714670000000), ('oh_neue_agb', 1), ('wird_im_x_tagen_gesendet', 3900)]

shop4.lat = 33.33
shop4.set(type="point") # update this point with new data
dict(shop4)
>>> {'lat': 33.33, 'lon': 9.931641, 'id': 'metzgerei'}

# check ttl
shop3.ttl().result
>>> 59

# remove expiration
shop3.persist().result 
>>> True

Shop.ids()
# >>> ['modula', 'bellissimo'] 

dependencies