Ejemplo n.º 1
0
class TestMisfitAPI(unittest.TestCase):
    def setUp(self):
        self.misfit = Misfit('FAKE_ID', 'FAKE_SECRET', 'FAKE_TOKEN')

    def test_goal(self):
        """ Test retrieving a goal by date range """
        goal_dict = {
            "id": "51a4189acf12e53f81000001",
            "date": "2014-10-05",
            "points": 500,
            "targetPoints": 1000,
            "timeZoneOffset": -8
        }
        end_date = '2014-10-07'
        with HTTMock(MisfitHttMock('goal').json_http):
            goal_list = self.misfit.goal(start_date=goal_dict['date'],
                                         end_date=end_date)
        eq_(len(goal_list), 3)
        goal = goal_list[0]
        eq_(type(goal), MisfitGoal)
        self.assert_misfit_string(goal, goal_dict)
        eq_(goal_list[2].date, arrow.get(end_date))
        eq_(goal.id, goal_dict['id'])
        eq_(goal.date, arrow.get(goal_dict['date']))
        eq_(goal.points, goal_dict['points'])
        eq_(goal.targetPoints, goal_dict['targetPoints'])
        eq_(goal.timeZoneOffset, goal_dict['timeZoneOffset'])
        self.assertAlmostEqual(goal.percent_complete(), 50)

        # Check that percent_complete is None if targetPoints is 0
        goal.targetPoints = 0
        assert goal.percent_complete() is None

    def test_goal_single(self):
        """ Test retrieving a goal by object_id """
        goal_dict = {
            "id": "51a4189acf12e53f81000001",
            "date": "2014-10-05",
            "points": 500,
            "targetPoints": 1000,
            "timeZoneOffset": -8
        }
        with HTTMock(MisfitHttMock('goal_single').json_http):
            goal = self.misfit.goal(object_id=goal_dict['id'])
        eq_(type(goal), MisfitGoal)
        self.assert_misfit_string(goal, goal_dict)
        eq_(goal.id, goal_dict['id'])
        eq_(goal.date, arrow.get(goal_dict['date']))
        eq_(goal.points, goal_dict['points'])
        eq_(goal.targetPoints, goal_dict['targetPoints'])
        eq_(goal.timeZoneOffset, goal_dict['timeZoneOffset'])
        self.assertAlmostEqual(goal.percent_complete(), 50)

        # Check that percent_complete is None if targetPoints is 0
        goal.targetPoints = 0
        assert goal.percent_complete() is None

    def test_goal_object_date_exception(self):
        """
        Check that an exception is raised when no date range or object id is
        supplied to goal
        """
        self.assertRaises(MisfitException, self.misfit.goal)

    def test_summary(self):
        """ Test retrieving a non-detail summary """
        date_range = {'start_date': '2014-12-10', 'end_date': '2014-12-17'}
        with HTTMock(MisfitHttMock('summary').json_http):
            summary = self.misfit.summary(start_date='2014-12-10',
                                          end_date='2014-12-17')

        summ_dict = {
            'activityCalories': 1449.2,
            'calories': 16310.24,
            'distance': 13.5227,
            'points': 3550,
            'steps': 34030
        }
        eq_(type(summary), MisfitSummary)
        self.assert_misfit_string(summary, summ_dict)
        eq_(summary.data, summ_dict)
        eq_(summary.activityCalories, summ_dict['activityCalories'])
        eq_(summary.calories, summ_dict['calories'])
        eq_(summary.distance, summ_dict['distance'])
        eq_(summary.points, summ_dict['points'])
        eq_(summary.steps, summ_dict['steps'])

    def test_summary_detail(self):
        summ_dict = {
            "date": "2014-10-05",
            "points": 394.4,
            "steps": 3650,
            "calories": 1687.4735,
            "activityCalories": 412.3124,
            "distance": 1.18
        }
        end_date = "2014-10-07"
        with HTTMock(MisfitHttMock('summary_detail').json_http):
            summary_list = self.misfit.summary(start_date=summ_dict['date'],
                                               end_date=end_date,
                                               detail=True)
        eq_(len(summary_list), 3)
        summary = summary_list[0]
        eq_(type(summary), MisfitSummary)
        self.assert_misfit_string(summary, summ_dict)
        eq_(summary_list[2].date, arrow.get(end_date))
        eq_(summary.data, summ_dict)
        eq_(summary.date, arrow.get(summ_dict['date']))
        eq_(summary.points, summ_dict['points'])
        eq_(summary.steps, summ_dict['steps'])
        eq_(summary.calories, summ_dict['calories'])
        eq_(summary.activityCalories, summ_dict['activityCalories'])
        eq_(summary.distance, summ_dict['distance'])

    def assert_misfit_string(self, obj, data):
        """
        The string representing the misfit object should be the classname,
        followed by a ":", followed by the json data
        """
        parts = ('%s' % obj).split(': ', 1)
        eq_(parts[0], '%s' % type(obj))
        eq_(json.loads(parts[1]), data)
Ejemplo n.º 2
0
class TestMisfitAPI(unittest.TestCase):
    def setUp(self):
        self.misfit = Misfit('FAKE_ID', 'FAKE_SECRET', 'FAKE_TOKEN')

    def test_goal(self):
        """ Test retrieving a goal by date range """
        goal_dict = {
            "id": "51a4189acf12e53f81000001",
            "date": "2014-10-05",
            "points": 500,
            "targetPoints": 1000,
            "timeZoneOffset": -8
        }
        end_date = '2014-10-07'
        with HTTMock(MisfitHttMock('goal').json_http):
            goal_list = self.misfit.goal(start_date=goal_dict['date'],
                                         end_date=end_date)
        eq_(len(goal_list), 3)
        goal = goal_list[0]
        eq_(type(goal), MisfitGoal)
        self.assert_misfit_string(goal, goal_dict)
        eq_(goal_list[2].date, arrow.get(end_date))
        eq_(goal.id, goal_dict['id'])
        eq_(goal.date, arrow.get(goal_dict['date']))
        eq_(goal.points, goal_dict['points'])
        eq_(goal.targetPoints, goal_dict['targetPoints'])
        eq_(goal.timeZoneOffset, goal_dict['timeZoneOffset'])
        self.assertAlmostEqual(goal.percent_complete(), 50)

        # Check that percent_complete is None if targetPoints is 0
        goal.targetPoints = 0
        assert goal.percent_complete() is None

    def test_goal_single(self):
        """ Test retrieving a goal by object_id """
        goal_dict = {
            "id": "51a4189acf12e53f81000001",
            "date": "2014-10-05",
            "points": 500,
            "targetPoints": 1000,
            "timeZoneOffset": -8
        }
        with HTTMock(MisfitHttMock('goal_single').json_http):
            goal = self.misfit.goal(object_id=goal_dict['id'])
        eq_(type(goal), MisfitGoal)
        self.assert_misfit_string(goal, goal_dict)
        eq_(goal.id, goal_dict['id'])
        eq_(goal.date, arrow.get(goal_dict['date']))
        eq_(goal.points, goal_dict['points'])
        eq_(goal.targetPoints, goal_dict['targetPoints'])
        eq_(goal.timeZoneOffset, goal_dict['timeZoneOffset'])
        self.assertAlmostEqual(goal.percent_complete(), 50)

        # Check that percent_complete is None if targetPoints is 0
        goal.targetPoints = 0
        assert goal.percent_complete() is None

    def test_goal_object_date_exception(self):
        """
        Check that an exception is raised when no date range or object id is
        supplied to goal
        """
        self.assertRaises(MisfitException, self.misfit.goal)

    def test_summary(self):
        """ Test retrieving a non-detail summary """
        date_range = {'start_date': '2014-12-10', 'end_date': '2014-12-17'}
        with HTTMock(MisfitHttMock('summary').json_http):
            summary = self.misfit.summary(start_date='2014-12-10',
                                          end_date='2014-12-17')

        summ_dict = {
            'activityCalories': 1449.2,
            'calories': 16310.24,
            'distance': 13.5227,
            'points': 3550,
            'steps': 34030
        }
        eq_(type(summary), MisfitSummary)
        self.assert_misfit_string(summary, summ_dict)
        eq_(summary.data, summ_dict)
        eq_(summary.activityCalories, summ_dict['activityCalories'])
        eq_(summary.calories, summ_dict['calories'])
        eq_(summary.distance, summ_dict['distance'])
        eq_(summary.points, summ_dict['points'])
        eq_(summary.steps, summ_dict['steps'])

    def test_summary_detail(self):
        summ_dict = {
            "date": "2014-10-05",
            "points": 394.4,
            "steps": 3650,
            "calories": 1687.4735,
            "activityCalories": 412.3124,
            "distance": 1.18
        }
        end_date = "2014-10-07"
        with HTTMock(MisfitHttMock('summary_detail').json_http):
            summary_list = self.misfit.summary(
                start_date=summ_dict['date'], end_date=end_date, detail=True)
        eq_(len(summary_list), 3)
        summary = summary_list[0]
        eq_(type(summary), MisfitSummary)
        self.assert_misfit_string(summary, summ_dict)
        eq_(summary_list[2].date, arrow.get(end_date))
        eq_(summary.data, summ_dict)
        eq_(summary.date, arrow.get(summ_dict['date']))
        eq_(summary.points, summ_dict['points'])
        eq_(summary.steps, summ_dict['steps'])
        eq_(summary.calories, summ_dict['calories'])
        eq_(summary.activityCalories, summ_dict['activityCalories'])
        eq_(summary.distance, summ_dict['distance'])

    def assert_misfit_string(self, obj, data):
        """
        The string representing the misfit object should be the classname,
        followed by a ":", followed by the json data
        """
        parts = ('%s' % obj).split(': ', 1)
        eq_(parts[0], '%s' % type(obj))
        eq_(json.loads(parts[1]), data)
Ejemplo n.º 3
0
class MyFitness():
    """
    This class creates a misfit object which can be used by the user
    to access his/her profile, retrieve historical data on his/her goals,
    daity activity, performance and analysis.
    Later, the class will be extended to allow the user to look at his/her
    friends' data
    """
    def __init__(self,path):
        """
        Initialize my fitness object object
        path: str, path to the directory which contains credentials file
        """
        credentials = pd.read_csv(os.path.join(path,'credentials.csv'))
        self._client_id = credentials['client_id'][0]
        self._client_secret = credentials['client_secret'][0]
        self._access_token = credentials['access_token'][0]
        self.misfit = Misfit(self._client_id, self._client_secret, self._access_token)

    def getProfile(self):
        """
        This method returns data on the user's profile
        """
        print "Fetching user's profile ... ",
        profile = self.misfit.profile().data
        print "Done!"
        return profile

    def getGoals(self,start_date = '2015-10-1', end_date = time.strftime("%Y-%m-%d")):
        """
        This method return goals between
        start_date: str, starting date
        end_date: str, end date
        dates should be given in string  format as yyyy-mm-d or format("%Y-%m-%d") 
        """
        goals = self.misfit.goal(start_date,end_date)
        goals_dict = {'date':[],'targetPoints':[],'points':[]}

        print "Fetching user's goals ... "
        for i in range(0,len(goals)):
            goal = goals[i]
            goals_dict['date'].append(str(goal.date.date()))
            goals_dict['targetPoints'].append(goal.targetPoints)
            goals_dict['points'].append(goal.points)

        print len(goals), " goals found :-)"

        return pd.DataFrame(goals_dict)

    def deviceInfo(self):
        """Use this method to get information on the user's device"""
        deviceInfo = self.misfit.device().data
        return deviceInfo

    def activityDetails(self,start_date = '2015-10-1', end_date = time.strftime("%Y-%m-%d")):
        """
        Use this method to get information on the user's sessions
        """
        sessions = self.misfit.session(start_date, end_date)
        sessionDetails = {'activityType':[], 'distance':[],'steps':[], 'startTime':[],
                          'duration':[], 'calories':[],'points':[]}
        for i in range(0,len(sessions)):
            sdata = sessions[i].data
            sessionDetails['activityType'].append(sdata['activityType'])
            sessionDetails['distance'].append(sdata['distance'])
            sessionDetails['steps'].append(sdata['steps'])
            sessionDetails['startTime'].append(sdata['startTime'])
            sessionDetails['duration'].append(sdata['duration'])
            sessionDetails['calories'].append(sdata['calories'])
            sessionDetails['points'].append(sdata['points'])
        return pd.DataFrame(sessionDetails)

    def getSummary(self, start_date = '2015-10-01', end_date = time.strftime("%Y-%m-%d")):
        """Use this method to get summary of the user's activity"""
        summary = self.misfit.summary(start_date, end_date)
        return summary

    
    def analyzePerformance(self):
        pass