Skip to content
This repository has been archived by the owner on Jul 14, 2021. It is now read-only.

Commit

Permalink
Merge d78edf3 into c0f224a
Browse files Browse the repository at this point in the history
  • Loading branch information
wtfrank committed Sep 26, 2016
2 parents c0f224a + d78edf3 commit 685762e
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 4 deletions.
36 changes: 36 additions & 0 deletions evelink/cache/memcached.py
@@ -0,0 +1,36 @@
import pickle
import time
import memcache

from evelink import api

class MemcachedCache(api.APICache):
"""An implementation of APICache using memcached."""

def __init__(self, serverList, prefix='el_'):
"""
serverList could be ['127.0.0.1:11211']
prefix allows multiple applications to share the same memcached instance if necessary
"""
super(MemcachedCache, self).__init__()
self.mc = memcache.Client(serverList, debug=0)
self.prefix = prefix


def get(self, key):
prefix_key = self.prefix + key
result = self.mc.get(prefix_key)
if not result:
return None
value, expiration = result
if expiration < time.time():
self.mc.delete(prefix_key)
return None
return value

def put(self, key, value, duration):
prefix_key = self.prefix + key
expiration = time.time() + duration
res = self.mc.set(prefix_key, (value, expiration), time=duration)
return res

4 changes: 2 additions & 2 deletions evelink/char.py
Expand Up @@ -83,8 +83,8 @@ def contract_items(self, contract_id, api_result=None):
"""Lists items that a specified contract contains"""
return api.APIResult(parse_contract_items(api_result.result), api_result.timestamp, api_result.expires)

@auto_call('char/Contracts')
def contracts(self, api_result=None):
@auto_call('char/Contracts', map_params={'contract_id' : 'contractID'})
def contracts(self, contract_id = None, api_result=None):
"""Returns a record of all contracts for a specified character"""
return api.APIResult(parse_contracts(api_result.result), api_result.timestamp, api_result.expires)

Expand Down
4 changes: 2 additions & 2 deletions evelink/corp.py
Expand Up @@ -262,8 +262,8 @@ def contract_items(self, contract_id, api_result=None):
"""Lists items that a specified contract contains"""
return api.APIResult(parse_contract_items(api_result.result), api_result.timestamp, api_result.expires)

@api.auto_call('corp/Contracts')
def contracts(self, api_result=None):
@api.auto_call('corp/Contracts', map_params={'contract_id' : 'contractID'})
def contracts(self, contract_id = None, api_result=None):
"""Get information about corp contracts."""
return api.APIResult(parse_contracts(api_result.result), api_result.timestamp, api_result.expires)

Expand Down
16 changes: 16 additions & 0 deletions tests/test_char.py
Expand Up @@ -96,6 +96,22 @@ def test_contracts(self, mock_parse):
self.assertEqual(current, 12345)
self.assertEqual(expires, 67890)

@mock.patch('evelink.char.parse_contracts')
def test_contracts_specific(self, mock_parse):
self.api.get.return_value = API_RESULT_SENTINEL
mock_parse.return_value = mock.sentinel.parsed_contracts

result, current, expires = self.char.contracts(contract_id=23)
self.assertEqual(result, mock.sentinel.parsed_contracts)
self.assertEqual(mock_parse.mock_calls, [
mock.call(mock.sentinel.api_result),
])
self.assertEqual(self.api.mock_calls, [
mock.call.get('char/Contracts', params={'characterID': 1, 'contractID' : 23,}),
])
self.assertEqual(current, 12345)
self.assertEqual(expires, 67890)

@mock.patch('evelink.char.parse_wallet_journal')
def test_wallet_journal(self, mock_parse):
self.api.get.return_value = API_RESULT_SENTINEL
Expand Down
16 changes: 16 additions & 0 deletions tests/test_corp.py
Expand Up @@ -240,6 +240,22 @@ def test_contracts(self, mock_parse):
self.assertEqual(current, 12345)
self.assertEqual(expires, 67890)

@mock.patch('evelink.corp.parse_contracts')
def test_contracts_specific(self, mock_parse):
self.api.get.return_value = API_RESULT_SENTINEL
mock_parse.return_value = mock.sentinel.parsed_contracts

result, current, expires = self.corp.contracts(contract_id=2468)
self.assertEqual(result, mock.sentinel.parsed_contracts)
self.assertEqual(mock_parse.mock_calls, [
mock.call(mock.sentinel.api_result),
])
self.assertEqual(self.api.mock_calls, [
mock.call.get('corp/Contracts', params={'contractID' : 2468}),
])
self.assertEqual(current, 12345)
self.assertEqual(expires, 67890)

@mock.patch('evelink.corp.parse_contact_list')
def test_contacts(self, mock_parse):
self.api.get.return_value = API_RESULT_SENTINEL
Expand Down

0 comments on commit 685762e

Please sign in to comment.