calculate.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import pydux_thunk
  2. import asyncio
  3. initial_state = {
  4. 'running': False,
  5. 'result': None,
  6. 'error': None
  7. }
  8. class ActionTypes(object):
  9. CALCULATE = 'calculate/CALCULATE'
  10. START = 'calculate/START'
  11. FAILURE = 'calculate/FAILURE'
  12. SUCCESS = 'calculate/SUCCESS'
  13. class ActionCreators(object):
  14. def calculate(value1, value2):
  15. return thunk(value1, value2)
  16. def start():
  17. return dict(
  18. type=ActionTypes.START
  19. )
  20. def success(result):
  21. return dict(
  22. type=ActionTypes.SUCCESS,
  23. result=result
  24. )
  25. def failure(error):
  26. return dict(
  27. type=ActionTypes.FAILURE,
  28. error=error
  29. )
  30. def reducer (state=None, action=None):
  31. if state is None:
  32. state = initial_state
  33. if not (isinstance(action, dict) and 'type' in action):
  34. return state
  35. if action['type'] == ActionTypes.CALCULATE:
  36. state['running'] = True
  37. elif action['type'] == ActionTypes.SUCCESS:
  38. state['running'] = False
  39. state['result'] = action['result']
  40. state['error'] = None
  41. elif action['type'] == ActionTypes.FAILURE:
  42. state['running'] = False
  43. state['result'] = None
  44. state['error'] = action['error']
  45. return state
  46. async def calculate(value1, value2):
  47. print('calculating pi', value1, value2)
  48. await asyncio.sleep(5)
  49. return data**2
  50. def thunk(value1, value2):
  51. async def wrapper(dispatch, get_state):
  52. dispatch(ActionCreators.calculate())
  53. result = await calculate(value1, value2)
  54. dispatch(ActionCreators.success(result))
  55. return wrapper
  56. if __name__ == '__main__':
  57. import unittest
  58. class TestSuite(unittest.TestCase):
  59. def test_action_creators(self):
  60. #self.assertEqual(ActionCreators.calculate(1, 2), thunk(1, 2))
  61. self.assertEqual(ActionCreators.start(), {'type': 'calculate/START'})
  62. self.assertEqual(ActionCreators.success(4), {'type': 'calculate/SUCCESS', 'result': 4})
  63. #self.assertEqual(ActionCreators.failure(ZeroDivisionError()), {'type': 'calculate/FAILURE', 'error': ZeroDivisionError()})
  64. def test_reducer(self):
  65. self.assertEqual(reducer(None, ActionCreators.calculate(6,2)), {'running': False, 'result': None, 'error': None})
  66. #self.assertEqual(reducer(452, ActionCreators.set_state(13)), 13)
  67. #self.assertEqual(reducer(None, ActionCreators.increment()), 1)
  68. #self.assertEqual(reducer(341, ActionCreators.increment()), 342)
  69. #self.assertEqual(reducer(None, ActionCreators.decrement()), -1)
  70. #self.assertEqual(reducer(251, ActionCreators.decrement()), 250)
  71. unittest.main()