Class: Fitgem::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/fitgem/foods.rb,
lib/fitgem/sleep.rb,
lib/fitgem/users.rb,
lib/fitgem/water.rb,
lib/fitgem/client.rb,
lib/fitgem/devices.rb,
lib/fitgem/friends.rb,
lib/fitgem/helpers.rb,
lib/fitgem/activities.rb,
lib/fitgem/time_range.rb,
lib/fitgem/notifications.rb,
lib/fitgem/body_measurements.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Client

Returns a new instance of Client.



25
26
27
28
29
30
31
32
33
34
# File 'lib/fitgem/client.rb', line 25

def initialize(options = {})
  @consumer_key = options[:consumer_key]
  @consumer_secret = options[:consumer_secret]
  @token = options[:token]
  @secret = options[:secret]
  @proxy = options[:proxy]
  @user_id = options[:user_id] || "-"
  @api_unit_system = Fitgem::ApiUnitSystem.US
  @api_version = "1"
end

Instance Attribute Details

#api_unit_systemObject

Returns the value of attribute api_unit_system.



22
23
24
# File 'lib/fitgem/client.rb', line 22

def api_unit_system
  @api_unit_system
end

#api_versionObject

Returns the value of attribute api_version.



21
22
23
# File 'lib/fitgem/client.rb', line 21

def api_version
  @api_version
end

#user_idObject

Returns the value of attribute user_id.



23
24
25
# File 'lib/fitgem/client.rb', line 23

def user_id
  @user_id
end

Instance Method Details

#accept_invite(requestor_id) ⇒ Object



32
33
34
# File 'lib/fitgem/friends.rb', line 32

def accept_invite(requestor_id)
  respond_to_invite(requestor_id, true)
end

#activities_on_date(date) ⇒ Object

Activity Retrieval Methods


7
8
9
# File 'lib/fitgem/activities.rb', line 7

def activities_on_date(date)
  get("/user/#{@user_id}/activities/date/#{format_date(date)}.json")
end

#activity(id, options = {}) ⇒ Object



23
24
25
# File 'lib/fitgem/activities.rb', line 23

def activity(id, options ={})
  get("/activities/#{id}.json")
end

#add_favorite_activity(activity_id) ⇒ Object



47
48
49
# File 'lib/fitgem/activities.rb', line 47

def add_favorite_activity(activity_id)
  post("/user/#{@user_id}/activities/log/favorite/#{activity_id}.json")
end

#add_favorite_food(food_id) ⇒ Object



47
48
49
# File 'lib/fitgem/foods.rb', line 47

def add_favorite_food(food_id)
  post("/user/#{@user_id}/foods/log/favorite/#{food_id}.json")
end

#authentication_request_token(options = {}) ⇒ Object



56
57
58
59
# File 'lib/fitgem/client.rb', line 56

def authentication_request_token(options={})
  consumer.options[:authorize_path] = '/oauth/authenticate'
  request_token(options)
end

#authorize(token, secret, options = {}) ⇒ Object



36
37
38
39
40
41
42
43
44
# File 'lib/fitgem/client.rb', line 36

def authorize(token, secret, options = {})
  request_token = OAuth::RequestToken.new(
    consumer, token, secret
  )
  @access_token = request_token.get_access_token(options)
  @token = @access_token.token
  @secret = @access_token.secret
  @access_token
end

#body_measurements_on_date(date) ⇒ Object

Body Measurements Update Methods


7
8
9
# File 'lib/fitgem/body_measurements.rb', line 7

def body_measurements_on_date(date)
  get("/user/#{@user_id}/body/date/#{format_date(date)}.json")
end

#construct_date_range_fragment(options) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/fitgem/time_range.rb', line 40

def construct_date_range_fragment(options)
  range_str = "date/"
  if options[:base_date] && options[:period]
    range_str += "#{options[:base_date]}/#{options[:period]}"
  elsif options[:base_date] && options[:end_date]
    range_str += "#{options[:base_date]}/#{options[:end_date]}"
  else
    raise Fitgem::InvalidTimeRange, "Must supply either base_date and period OR base_date and end_date"
  end
  range_str
end

#create_food(options) ⇒ Object

Create a food defined by the following items in the options hash:

options[:name] (required) => Food name
options[:defaultFoodMeasurementUnitId] (required) => Unit id; default measurement unit; full list of units could be retrieved via a previous calls to Get Food Units
options[:defaultServingSize] (required) => Size of the default serving; nutritional values should be provided for this serving size
options[:calories] (required) => Calories in the default serving size
options[:formType] (optional) => Form type; (LIQUID or DRY)
options[:description] (optional) => Description


74
75
76
# File 'lib/fitgem/foods.rb', line 74

def create_food(options)
  post("/foods.json", options)
end

#create_subscription(options = {}) ⇒ Object



4
5
6
7
8
9
10
# File 'lib/fitgem/notifications.rb', line 4

def create_subscription(options={})
  unless options[:type] && [:sleep,:body,:activities,:foods].include?(options[:type])
    raise Error, 'Must include options[:type] (values are :activities, :foods, :sleep, and :body)'
  end
  base_url = "/user/#{@user_id}/#{options[:type].to_s}/apiSubscriptions"
  post_subscription(base_url, options)
end

#data_by_time_range(resource_path, options) ⇒ Object

Gets historical resource data in the time range specified by options param. The time range can either be specified by :base_date and :end_date OR by using :base_date and a :period (supported periods are 1d, 7d, 30d, 1w, 1m, 3m, 6m, 1y, max)

Example values for resource_path are below:

Food: /foods/log/caloriesIn

Activity: /activities/log/calories /activities/log/steps /activities/log/distance /activities/log/minutesSedentary /activities/log/minutesLightlyActive /activities/log/minutesFairlyActive /activities/log/minutesVeryActive /activities/log/activeScore /activities/log/activityCalories

Sleep: /sleep/minutesAsleep /sleep/minutesAwake /sleep/awakeningsCount /sleep/timeInBed

Body: /body/weight /body/bmi /body/fat



35
36
37
38
# File 'lib/fitgem/time_range.rb', line 35

def data_by_time_range(resource_path, options)
  range_str = construct_date_range_fragment(options)
  get("/user/#{@user_id}#{resource_path}/#{range_str}.json")
end

#decline_invite(requestor_id) ⇒ Object



36
37
38
# File 'lib/fitgem/friends.rb', line 36

def decline_invite(requestor_id)
  respond_to_invite(requestor_id, false)
end

#delete_logged_activity(activity_log_id) ⇒ Object

Activity Removal Methods


55
56
57
# File 'lib/fitgem/activities.rb', line 55

def delete_logged_activity(activity_log_id)
  delete("/user/#{@user_id}/activities/#{activity_log_id}.json")
end

#delete_logged_food(food_log_id) ⇒ Object

Food Removal Methods


55
56
57
# File 'lib/fitgem/foods.rb', line 55

def delete_logged_food(food_log_id)
  delete("/user/#{@user_id}/foods/log/#{food_log_id}.json")
end

#delete_water_log(log_id) ⇒ Object

Water Log Deletion Methods


30
31
32
# File 'lib/fitgem/water.rb', line 30

def delete_water_log(log_id)
  delete("/user/-/foods/log/water/#{log_id}.json")
end

#device_info(device_id) ⇒ Object



12
13
14
# File 'lib/fitgem/devices.rb', line 12

def device_info(device_id)
  get("/user/#{@user_id}/devices/#{device_id}.json")
end

#devicesObject

Device Retrieval Methods


8
9
10
# File 'lib/fitgem/devices.rb', line 8

def devices
  get("/user/#{@user_id}/devices.json")
end

#favorite_activitiesObject



19
20
21
# File 'lib/fitgem/activities.rb', line 19

def favorite_activities()
  get("/user/#{@user_id}/activities/favorite.json")
end

#favorite_foodsObject



20
21
22
# File 'lib/fitgem/foods.rb', line 20

def favorite_foods()
  get("/user/#{@user_id}/foods/log/favorite.json")
end

#find_food(query_string) ⇒ Object



28
29
30
# File 'lib/fitgem/foods.rb', line 28

def find_food(query_string)
  get("/foods/search.json?query=#{URI.escape(query_string)}")
end

#foods_on_date(date) ⇒ Object

Food Retrieval Methods


8
9
10
# File 'lib/fitgem/foods.rb', line 8

def foods_on_date(date)
  get("/user/#{@user_id}/foods/log/date/#{format_date(date)}.json")
end

#foods_unitsObject



24
25
26
# File 'lib/fitgem/foods.rb', line 24

def foods_units()
  get("/foods/units.json")
end

#format_date(date) ⇒ Object

Should return date as YYYY-MM-DD



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/fitgem/helpers.rb', line 5

def format_date(date)
  if date.is_a? String
    case date
      when 'today'
        return Date.today.strftime("%Y-%m-%d")
      when 'yesterday'
        return (Date.today-1).strftime("%Y-%m-%d")
      else
        return date
    end
  elsif Date === date || Time === date || DateTime === date
    return date.strftime("%Y-%m-%d")
  else
    raise Fitgem::InvalidArgumentError, "Date used must be a date/time object or a string in the format YYYY-MM-DD; current argument is a #{date.class}"
  end
end

#frequent_activitiesObject



11
12
13
# File 'lib/fitgem/activities.rb', line 11

def frequent_activities()
  get("/user/#{@user_id}/activities/frequent.json")
end

#frequent_foodsObject



16
17
18
# File 'lib/fitgem/foods.rb', line 16

def frequent_foods()
  get("/user/#{@user_id}/foods/log/frequent.json")
end

#friendsObject

Friend Retrieval Methods


7
8
9
# File 'lib/fitgem/friends.rb', line 7

def friends
  get("/user/#{@user_id}/friends.json")
end

#invite_friend(options) ⇒ Object

Invitation Management Methods


22
23
24
25
26
27
28
29
30
# File 'lib/fitgem/friends.rb', line 22

def invite_friend(options)
  unless options[:email] || options[:user_id]
    raise InvalidArgumentError.new "add_friend hash argument must include :email or :user_id"
  end
  translated_options = {}
  translated_options[:invitedUserEmail] = options[:email] if options[:email]
  translated_options[:invitedUserId] = options[:user_id] if options[:user_id]
  post("/user/#{@user_id}/friends/invitations.json", translated_options)
end

#log_activity(options) ⇒ Object

The following values are REQUIRED when logging an activity:

options[:activityId]      =>  The id of the activity, directory activity or intensity level activity. See activity types at http://wiki.fitbit.com/display/API/API-Log-Activity for more information.
options[:durationMillis]  =>  Activity duration in milliseconds
options[:startTime]       =>  Activity start time hours and minutes in the format HH:mm
options[:date]            =>  Set to today's date when not provided

The following value is REQUIRED when logging directory activity, OPTIONAL otherwise

options[:distance]

The following values are OPTIONAL when logging an activity:

options[:distanceUnit]    => One of Fitgem::ApiDistanceUnit values
options[:manualCalories]  => Number of calories determined manually


43
44
45
# File 'lib/fitgem/activities.rb', line 43

def log_activity(options)
  post("/user/#{@user_id}/activities.json", options)
end

#log_food(options) ⇒ Object

Send the following required ID’s in the options hash:

options[:foodId]      => ID of the food to log
options[:mealTypeId]  => ID of the meal to log the food for
options[:unitId]      => ID of the unit to log with the food
   (typically retrieved via a previous call to get Foods (all, recent, frequent, favorite) or Food Units. )
options[:amount]      => Amount consumed of the selected unit; a floating point number
options[:date]        => Log date in the format yyyy-MM-dd


43
44
45
# File 'lib/fitgem/foods.rb', line 43

def log_food(options)
  post("/user/#{@user_id}/foods/log.json", options)
end

#log_water(options) ⇒ Object

options Required options Optional (“ml”, “fl oz” or “cup”) options Required yyyy-MM-dd format



19
20
21
22
23
24
# File 'lib/fitgem/water.rb', line 19

def log_water(options)
  unless options[:amount] && options[:date]
    raise "Must include both an :amount and :date to log water"
  end
  post("/user/#{@user_id}/foods/log/water.json",options)
end

#log_weight(weight, date, options = {}) ⇒ Object

Body Measurements Update Methods


15
16
17
# File 'lib/fitgem/body_measurements.rb', line 15

def log_weight(weight, date, options={})
  post("/user/#{@user_id}/body/weight.json", options.merge(:weight => weight, :date => format_date(date)))
end

#monthly_leaderboardObject



15
16
17
# File 'lib/fitgem/friends.rb', line 15

def monthly_leaderboard
  leaderboard('30d')
end

#recent_activitiesObject



15
16
17
# File 'lib/fitgem/activities.rb', line 15

def recent_activities()
  get("/user/#{@user_id}/activities/recent.json")
end

#recent_foodsObject



12
13
14
# File 'lib/fitgem/foods.rb', line 12

def recent_foods()
  get("/user/#{@user_id}/foods/log/recent.json")
end

#reconnect(token, secret) ⇒ Object



46
47
48
49
50
# File 'lib/fitgem/client.rb', line 46

def reconnect(token, secret)
  @token = token
  @secret = secret
  access_token
end

#remove_favorite_activity(activity_id) ⇒ Object



59
60
61
62
# File 'lib/fitgem/activities.rb', line 59

def remove_favorite_activity(activity_id)
  delete("/user/#{@user_id}/activities/log/favorite/#{activity_id}.json")

end

#remove_favorite_food(food_id) ⇒ Object



59
60
61
# File 'lib/fitgem/foods.rb', line 59

def remove_favorite_food(food_id)
  delete("/user/#{@user_id}/foods/favorite/#{food_id}.json")
end

#remove_subscription(options = {}) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/fitgem/notifications.rb', line 12

def remove_subscription(options={})
  unless options[:type] && [:sleep,:body,:activities,:foods].include?(options[:type])
    raise Error, 'Must include options[:type] (values are :activities, :foods, :sleep, and :body)'
  end
  unless options[:subscription_id]
    raise Error, "Must include options[:subscription_id] to delete a subscription"
  end
  base_url = "/user/#{@user_id}/#{options[:type].to_s}/apiSubscriptions"
  url = finalize_subscription_url(base_url, options)
  headers = {}
  headers['X-Fitgem-Subscriber-Id'] = options[:subscriber_id] if options[:subscriber_id]
  delete(url, headers)
end

#request_token(options = {}) ⇒ Object



52
53
54
# File 'lib/fitgem/client.rb', line 52

def request_token(options={})
  consumer.get_request_token(options)
end

#sleep_on_date(date) ⇒ Object

Sleep Retrieval Methods


7
8
9
# File 'lib/fitgem/sleep.rb', line 7

def sleep_on_date(date)
  get("/user/#{@user_id}/sleep/date/#{format_date(date)}.json")
end

#update_user_info(options) ⇒ Object

options optional Gender; (MALE/FEMALE/NA) options optional Date of Birth; in the format yyyy-MM-dd options optional Height options optional Nickname options optional Full name options optional Timezone; in the format “America/Los_Angeles”



14
15
16
# File 'lib/fitgem/users.rb', line 14

def (options)
  post("/user/#{@user_id}/profile.json", options)
end

#user_info(options = {}) ⇒ Object



4
5
6
# File 'lib/fitgem/users.rb', line 4

def (options = {})
  get("/user/#{@user_id}/profile.json")
end

#water_on_date(date) ⇒ Object

Water Retrieval Methods


7
8
9
# File 'lib/fitgem/water.rb', line 7

def water_on_date(date)
  get("/user/#{@user_id}/foods/log/water/date/#{format_date(date)}.json")
end

#weekly_leaderboardObject



11
12
13
# File 'lib/fitgem/friends.rb', line 11

def weekly_leaderboard
  leaderboard('7d')
end