fitgem 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +2 -2
- data/fitgem.gemspec +3 -0
- data/lib/fitgem/blood_pressure.rb +48 -0
- data/lib/fitgem/client.rb +11 -8
- data/lib/fitgem/errors.rb +3 -0
- data/lib/fitgem/glucose.rb +45 -0
- data/lib/fitgem/heart_rate.rb +50 -0
- data/lib/fitgem/helpers.rb +30 -0
- data/lib/fitgem/time_range.rb +9 -1
- data/lib/fitgem/version.rb +1 -1
- data/spec/fitgem_helper_spec.rb +51 -2
- metadata +29 -20
    
        data/README.md
    CHANGED
    
    | @@ -2,7 +2,7 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            Provides access to fitbit.com data through their OAuth/REST API.  Fitgem can pull data with or without user authentication. Without user authentication, any data that the a fitbit.com user has denoted as 'public' can be gathered.  If a user logs in via OAuth then all exposed data can be gathered.
         | 
| 4 4 |  | 
| 5 | 
            -
            The fitbit.com API is currently ( | 
| 5 | 
            +
            The fitbit.com API is currently (Early 2012) in BETA and is under development to extend its reach.  Since it is early in the lifecycle of the API I expect this gem to go through a number of revisions as we attempt to match the functionality of their platform.
         | 
| 6 6 |  | 
| 7 7 | 
             
            # Usage #
         | 
| 8 8 |  | 
| @@ -15,7 +15,7 @@ $ gem install fitgem | |
| 15 15 |  | 
| 16 16 | 
             
            ## Usage in a Rails Application ##
         | 
| 17 17 |  | 
| 18 | 
            -
            We've started to develop an example app using the fitgem client.  See [https://github.com/whazzmaster/fitgem-client](https://github.com/whazzmaster/fitgem-client) for more information or check out [the hosted version](http://www. | 
| 18 | 
            +
            We've started to develop an example app using the fitgem client.  See [https://github.com/whazzmaster/fitgem-client](https://github.com/whazzmaster/fitgem-client) for more information or check out [the hosted version](http://www.fitbitclient.com). The fitgem-client project is evolving more slowly than the library itself, but work continues.
         | 
| 19 19 |  | 
| 20 20 | 
             
            # Subscriptions #
         | 
| 21 21 |  | 
    
        data/fitgem.gemspec
    CHANGED
    
    | @@ -55,6 +55,9 @@ Gem::Specification.new do |s| | |
| 55 55 | 
             
                'lib/fitgem/units.rb',
         | 
| 56 56 | 
             
                'lib/fitgem/users.rb',
         | 
| 57 57 | 
             
                'lib/fitgem/water.rb',
         | 
| 58 | 
            +
                'lib/fitgem/blood_pressure.rb',
         | 
| 59 | 
            +
                'lib/fitgem/glucose.rb',
         | 
| 60 | 
            +
                'lib/fitgem/heart_rate.rb',
         | 
| 58 61 | 
             
                'spec/fitgem_spec.rb',
         | 
| 59 62 | 
             
                'spec/spec_helper.rb',
         | 
| 60 63 | 
             
                'spec/fitgem_notifications_spec.rb',
         | 
| @@ -0,0 +1,48 @@ | |
| 1 | 
            +
            module Fitgem
         | 
| 2 | 
            +
              class Client
         | 
| 3 | 
            +
                # ==========================================
         | 
| 4 | 
            +
                #       Blood Pressure Retrieval Methods
         | 
| 5 | 
            +
                # ==========================================
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                # Get blood pressure log entries for the supplied date
         | 
| 8 | 
            +
                #
         | 
| 9 | 
            +
                # @param [DateTime, Date, String] date
         | 
| 10 | 
            +
                # @return [Hash] Hash containing an average of the days logs, and a
         | 
| 11 | 
            +
                #   list of all individual entries
         | 
| 12 | 
            +
                def blood_pressure_on_date(date)
         | 
| 13 | 
            +
                  get("/user/#{@user_id}/bp/date/#{format_date(date)}.json")
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                # ==========================================
         | 
| 17 | 
            +
                #        Blood Pressure Logging Methods
         | 
| 18 | 
            +
                # ==========================================
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                # Log blood pressure information to fitbit
         | 
| 21 | 
            +
                #
         | 
| 22 | 
            +
                # @param [Hash] opts Heart rate data
         | 
| 23 | 
            +
                # @option opts [Integer, String] :systolic Systolic measurement (REQUIRED)
         | 
| 24 | 
            +
                # @option opts [Integer, String] :diastolic Diastolic measurement (REQUIRED)
         | 
| 25 | 
            +
                # @option opts [DateTime, Date, String] :date Log entry date (REQUIRED)
         | 
| 26 | 
            +
                # @option opts [DateTime, Time, String] :time Time of the measurement; hours and minutes in the format HH:mm
         | 
| 27 | 
            +
                #
         | 
| 28 | 
            +
                # @return [Hash] Summary of logged information
         | 
| 29 | 
            +
                def log_blood_pressure(opts)
         | 
| 30 | 
            +
                  unless opts[:systolic] && opts[:diastolic] && opts[:date]
         | 
| 31 | 
            +
                    raise Fitgem::InvalidArgumentError, "Must include :systolic, :diastolic, and :date in order to log blood pressure data"
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  opts[:date] = format_date(opts[:date])
         | 
| 35 | 
            +
                  opts[:time] = format_time(opts[:time]) if opts[:time]
         | 
| 36 | 
            +
                  post("/user/#{@user_id}/bp.json", opts)
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                # Delete logged blood pressure information
         | 
| 40 | 
            +
                #
         | 
| 41 | 
            +
                # @param [Integer, String] blood_pressure_log_id The id of previously logged
         | 
| 42 | 
            +
                #   blood pressure data
         | 
| 43 | 
            +
                # @return [Hash] Empty hash denotes success
         | 
| 44 | 
            +
                def delete_blood_pressure_log(blood_pressure_log_id)
         | 
| 45 | 
            +
                  delete("/user/-/bp/#{blood_pressure_log_id}.json")
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
            end
         | 
    
        data/lib/fitgem/client.rb
    CHANGED
    
    | @@ -5,6 +5,9 @@ require 'fitgem/users' | |
| 5 5 | 
             
            require 'fitgem/activities'
         | 
| 6 6 | 
             
            require 'fitgem/sleep'
         | 
| 7 7 | 
             
            require 'fitgem/water'
         | 
| 8 | 
            +
            require 'fitgem/blood_pressure'
         | 
| 9 | 
            +
            require 'fitgem/glucose'
         | 
| 10 | 
            +
            require 'fitgem/heart_rate'
         | 
| 8 11 | 
             
            require 'fitgem/units'
         | 
| 9 12 | 
             
            require 'fitgem/foods'
         | 
| 10 13 | 
             
            require 'fitgem/friends'
         | 
| @@ -32,7 +35,7 @@ module Fitgem | |
| 32 35 | 
             
                # @example Set this using the {Fitgem::ApiUnitSystem}
         | 
| 33 36 | 
             
                #   client.api_unit_system = Fitgem::ApiUnitSystem.UK
         | 
| 34 37 | 
             
                # @example May also be set in the constructor call
         | 
| 35 | 
            -
                #   client = Fitgem::Client { | 
| 38 | 
            +
                #   client = Fitgem::Client {
         | 
| 36 39 | 
             
                #     :consumer_key => my_key,
         | 
| 37 40 | 
             
                #     :consumer_secret => my_secret,
         | 
| 38 41 | 
             
                #     :token => fitbit_oauth_token,
         | 
| @@ -76,11 +79,11 @@ module Fitgem | |
| 76 79 | 
             
                #   client = Fitgem::Client.new { :consumer_key => my_key, :consumer_secret => my_secret }
         | 
| 77 80 | 
             
                #
         | 
| 78 81 | 
             
                # @example User has already authorized with fitbit, and we have a stored token/secret
         | 
| 79 | 
            -
                #   client = Fitgem::Client.new { | 
| 80 | 
            -
                #     :consumer_key => my_key, | 
| 81 | 
            -
                #     :consumer_secret => my_secret, | 
| 82 | 
            -
                #     :token => fitbit_oauth_token, | 
| 83 | 
            -
                #     :secret => fitbit_oauth_secret | 
| 82 | 
            +
                #   client = Fitgem::Client.new {
         | 
| 83 | 
            +
                #     :consumer_key => my_key,
         | 
| 84 | 
            +
                #     :consumer_secret => my_secret,
         | 
| 85 | 
            +
                #     :token => fitbit_oauth_token,
         | 
| 86 | 
            +
                #     :secret => fitbit_oauth_secret
         | 
| 84 87 | 
             
                #   }
         | 
| 85 88 | 
             
                #
         | 
| 86 89 | 
             
                # @return [Client] A Fitgem::Client; may be in a logged-in state or
         | 
| @@ -168,8 +171,8 @@ module Fitgem | |
| 168 171 | 
             
                private
         | 
| 169 172 |  | 
| 170 173 | 
             
                  def consumer
         | 
| 171 | 
            -
                    @consumer ||= OAuth::Consumer.new(@consumer_key, @consumer_secret, { | 
| 172 | 
            -
                      :site => 'http://api.fitbit.com', | 
| 174 | 
            +
                    @consumer ||= OAuth::Consumer.new(@consumer_key, @consumer_secret, {
         | 
| 175 | 
            +
                      :site => 'http://api.fitbit.com',
         | 
| 173 176 | 
             
                      :proxy => @proxy
         | 
| 174 177 | 
             
                    })
         | 
| 175 178 | 
             
                  end
         | 
    
        data/lib/fitgem/errors.rb
    CHANGED
    
    
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            module Fitgem
         | 
| 2 | 
            +
              class Client
         | 
| 3 | 
            +
                # ==========================================
         | 
| 4 | 
            +
                #       Glucose Retrieval Methods
         | 
| 5 | 
            +
                # ==========================================
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                # Get glucose log entries for the supplied date
         | 
| 8 | 
            +
                #
         | 
| 9 | 
            +
                # @param [DateTime, Date, String] date
         | 
| 10 | 
            +
                # @return [Hash] Hash containing an average of the days logs, and a
         | 
| 11 | 
            +
                #   list of all individual entries
         | 
| 12 | 
            +
                def glucose_on_date(date)
         | 
| 13 | 
            +
                  get("/user/#{@user_id}/glucose/date/#{format_date(date)}.json")
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                # ==========================================
         | 
| 17 | 
            +
                #        Glucose Logging Methods
         | 
| 18 | 
            +
                # ==========================================
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                # Log glucose information to fitbit
         | 
| 21 | 
            +
                #
         | 
| 22 | 
            +
                # @param [Hash] opts Glucose data
         | 
| 23 | 
            +
                # @option opts [String] :tracker Glucose tracker name;
         | 
| 24 | 
            +
                #   predefined or custom tracker name (matches tracker name on the website) (this or :hba1c is REQUIRED)
         | 
| 25 | 
            +
                # @option opts [String] :hba1c HbA1c measurement; in the format "X.X" (this or :tracker is REQUIRED)
         | 
| 26 | 
            +
                # @option opts [String] :glucose Glucose measurement; in the format "X.X" (REQUIRED with :tracker, OPTIONAL otherwise)
         | 
| 27 | 
            +
                # @option opts [DateTime, Date, String] :date Log entry date (REQUIRED)
         | 
| 28 | 
            +
                # @option opts [DateTime, String] :time Time of the measurement; hours and minutes in the format HH:mm
         | 
| 29 | 
            +
                #
         | 
| 30 | 
            +
                # @return [Hash] Summary of logged information
         | 
| 31 | 
            +
                def log_glucose(opts)
         | 
| 32 | 
            +
                  unless opts[:tracker] || opts[:hba1c]
         | 
| 33 | 
            +
                    raise Fitgem::InvalidArgumentError, "Must include :tracker or :hba1c in order to log glucose data"
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  if opts[:tracker] && opts[:hba1c].nil? && opts[:glucose].nil?
         | 
| 37 | 
            +
                    raise Fitgem::InvalidArgumentError, "Must include :glucose if using :tracker with no :hba1c value in order to log glucose data"
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  opts[:date] = format_date(opts[:date])
         | 
| 41 | 
            +
                  opts[:time] = format_time(opts[:time]) if opts[:time]
         | 
| 42 | 
            +
                  post("/user/#{@user_id}/glucose.json", opts)
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
            end
         | 
| @@ -0,0 +1,50 @@ | |
| 1 | 
            +
            module Fitgem
         | 
| 2 | 
            +
              class Client
         | 
| 3 | 
            +
                # ==========================================
         | 
| 4 | 
            +
                #       Heart Rate Retrieval Methods
         | 
| 5 | 
            +
                # ==========================================
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                # Get heart rate log entries for the supplied date
         | 
| 8 | 
            +
                #
         | 
| 9 | 
            +
                # @param [DateTime, Date, String] date
         | 
| 10 | 
            +
                # @return [Hash] Hash containing an average of the days logs, and a
         | 
| 11 | 
            +
                #   list of all individual entries
         | 
| 12 | 
            +
                def heart_rate_on_date(date)
         | 
| 13 | 
            +
                  get("/user/#{@user_id}/heart/date/#{format_date(date)}.json")
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                # ==========================================
         | 
| 17 | 
            +
                #        Heart Rate Logging Methods
         | 
| 18 | 
            +
                # ==========================================
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                # Log heart rate information to fitbit
         | 
| 21 | 
            +
                #
         | 
| 22 | 
            +
                # @param [Hash] opts Heart rate data
         | 
| 23 | 
            +
                # @option opts [String] :tracker Heart rate tracker name;
         | 
| 24 | 
            +
                #   predefined or custom tracker name (matches tracker name on the website) (REQUIRED)
         | 
| 25 | 
            +
                # @option opts [Integer, String] :heart_rate Heart rate measurement (REQUIRED)
         | 
| 26 | 
            +
                # @option opts [DateTime, Date, String] :date Log entry date (REQUIRED)
         | 
| 27 | 
            +
                # @option opts [DateTime, String] :time Time of the measurement; hours and minutes in the format HH:mm
         | 
| 28 | 
            +
                #
         | 
| 29 | 
            +
                # @return [Hash] Summary of logged information
         | 
| 30 | 
            +
                def log_heart_rate(opts)
         | 
| 31 | 
            +
                  unless opts[:tracker] && opts[:heart_rate] && opts[:date]
         | 
| 32 | 
            +
                    raise Fitgem::InvalidArgumentError, "Must include :tracker, :heart_rate, and :date in order to lof heart rate data"
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  opts[:heartRate] = opts.delete :heart_rate
         | 
| 36 | 
            +
                  opts[:date] = format_date(opts[:date])
         | 
| 37 | 
            +
                  opts[:time] = format_time(opts[:time]) if opts[:time]
         | 
| 38 | 
            +
                  post("/user/#{@user_id}/heart.json", opts)
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                # Delete logged heart rate information
         | 
| 42 | 
            +
                #
         | 
| 43 | 
            +
                # @param [Integer, String] heart_rate_log_id The id of previously logged
         | 
| 44 | 
            +
                #   heart rate data
         | 
| 45 | 
            +
                # @return [Hash] Empty hash denotes success
         | 
| 46 | 
            +
                def delete_heart_rate_log(heart_rate_log_id)
         | 
| 47 | 
            +
                  delete("/user/-/heart/#{heart_rate_log_id}.json")
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
            end
         | 
    
        data/lib/fitgem/helpers.rb
    CHANGED
    
    | @@ -33,5 +33,35 @@ module Fitgem | |
| 33 33 | 
             
                    raise Fitgem::InvalidDateArgument, "Date used must be a date/time object or a string in the format YYYY-MM-DD; supplied argument is a #{date.class}"
         | 
| 34 34 | 
             
                  end
         | 
| 35 35 | 
             
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                # Format any of a variety of time-related types into the formatted string
         | 
| 38 | 
            +
                # required when using the fitbit API.
         | 
| 39 | 
            +
                #
         | 
| 40 | 
            +
                # The time parameter can take several different kind of objects: a DateTime object,
         | 
| 41 | 
            +
                # a Time object, or a String Object.  Furthermore, the string object may be either
         | 
| 42 | 
            +
                # the date in a preformatted string ("HH:mm"), or it may be the string value "now" to
         | 
| 43 | 
            +
                # indicate that the time value used is the current localtime.
         | 
| 44 | 
            +
                #
         | 
| 45 | 
            +
                # @param [DateTime, Time, String] time The object to format into a time string
         | 
| 46 | 
            +
                # @raise [Fitgem::InvalidTimeArgument] Raised when the parameter object is not a
         | 
| 47 | 
            +
                #   DateTime, Time, or a valid ("HH:mm" or "now") string object
         | 
| 48 | 
            +
                # @return [String] Date in "HH:mm" string format
         | 
| 49 | 
            +
                def format_time(time)
         | 
| 50 | 
            +
                  if time.is_a? String
         | 
| 51 | 
            +
                    case time
         | 
| 52 | 
            +
                      when 'now'
         | 
| 53 | 
            +
                        return DateTime.now.strftime("%H:%M")
         | 
| 54 | 
            +
                      else
         | 
| 55 | 
            +
                        unless time =~ /\d{2}\:\d{2}/
         | 
| 56 | 
            +
                          raise Fitgem::InvalidTimeArgument, "Invalid time (#{time}), must be in HH:mm format"
         | 
| 57 | 
            +
                        end
         | 
| 58 | 
            +
                        return time
         | 
| 59 | 
            +
                    end
         | 
| 60 | 
            +
                  elsif DateTime === time || Time === time
         | 
| 61 | 
            +
                    return time.strftime("%H:%M")
         | 
| 62 | 
            +
                  else
         | 
| 63 | 
            +
                    raise Fitgem::InvalidTimeArgument, "Date used must be a valid time object or a string in the format HH:mm; supplied argument is a #{time.class}"
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
                end
         | 
| 36 66 | 
             
              end
         | 
| 37 67 | 
             
            end
         | 
    
        data/lib/fitgem/time_range.rb
    CHANGED
    
    | @@ -23,7 +23,15 @@ module Fitgem | |
| 23 23 | 
             
                #   /activities/log/minutesVeryActive
         | 
| 24 24 | 
             
                #   /activities/log/activeScore
         | 
| 25 25 | 
             
                #   /activities/log/activityCalories
         | 
| 26 | 
            -
                # | 
| 26 | 
            +
                #
         | 
| 27 | 
            +
                # Raw Tracker Activity:
         | 
| 28 | 
            +
                #   /activities/tracker/calories
         | 
| 29 | 
            +
                #   /activities/tracker/steps
         | 
| 30 | 
            +
                #   /activities/tracker/distance
         | 
| 31 | 
            +
                #   /activities/tracker/floors
         | 
| 32 | 
            +
                #   /activities/tracker/elevation
         | 
| 33 | 
            +
                #   /activities/tracker/activeScore
         | 
| 34 | 
            +
                #
         | 
| 27 35 | 
             
                # Sleep:
         | 
| 28 36 | 
             
                #   /sleep/startTime
         | 
| 29 37 | 
             
                #   /sleep/timeInBed
         | 
    
        data/lib/fitgem/version.rb
    CHANGED
    
    
    
        data/spec/fitgem_helper_spec.rb
    CHANGED
    
    | @@ -58,7 +58,7 @@ describe Fitgem::Client do | |
| 58 58 | 
             
                  date = "2011-3-2"
         | 
| 59 59 | 
             
                  expect {
         | 
| 60 60 | 
             
                    @client.format_date(date)
         | 
| 61 | 
            -
                  }.to raise_error Fitgem::InvalidDateArgument, "Invalid date (2011-3-2), must be in yyyy-MM-dd format" | 
| 61 | 
            +
                  }.to raise_error Fitgem::InvalidDateArgument, "Invalid date (2011-3-2), must be in yyyy-MM-dd format"
         | 
| 62 62 | 
             
                end
         | 
| 63 63 |  | 
| 64 64 | 
             
                it "rejects strings are formatted correctly but include non-numeric elements" do
         | 
| @@ -74,5 +74,54 @@ describe Fitgem::Client do | |
| 74 74 | 
             
                    @client.format_date(date)
         | 
| 75 75 | 
             
                  }.to raise_error Fitgem::InvalidDateArgument, "Date used must be a date/time object or a string in the format YYYY-MM-DD; supplied argument is a Fixnum"
         | 
| 76 76 | 
             
                end
         | 
| 77 | 
            -
              end | 
| 77 | 
            +
              end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
              describe "#format_time" do
         | 
| 80 | 
            +
                it "accepts DateTime objects" do
         | 
| 81 | 
            +
                  time = DateTime.parse("3rd Feb 2001 04:05:06 PM")
         | 
| 82 | 
            +
                  @client.format_time(time).should == "16:05"
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                it "accepts Time objects" do
         | 
| 86 | 
            +
                  time = Time.mktime 2012, 1, 20, 13, 33, 30
         | 
| 87 | 
            +
                  @client.format_time(time).should == "13:33"
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                it "accepts the string 'now' to denote the current localtime" do
         | 
| 91 | 
            +
                  now = DateTime.now
         | 
| 92 | 
            +
                  @client.format_time('now').should == now.strftime("%H:%M")
         | 
| 93 | 
            +
                end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                it "accepts strings in HH:mm format" do
         | 
| 96 | 
            +
                  time = "04:20"
         | 
| 97 | 
            +
                  @client.format_time(time).should == "04:20"
         | 
| 98 | 
            +
                end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                it "rejects Date objects" do
         | 
| 101 | 
            +
                  date = Date.today
         | 
| 102 | 
            +
                  expect {
         | 
| 103 | 
            +
                    @client.format_time(date)
         | 
| 104 | 
            +
                  }.to raise_error Fitgem::InvalidTimeArgument
         | 
| 105 | 
            +
                end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                it "rejects strings that are not in HH:mm format" do
         | 
| 108 | 
            +
                  time = "4:20pm"
         | 
| 109 | 
            +
                  expect {
         | 
| 110 | 
            +
                    @client.format_time(time)
         | 
| 111 | 
            +
                  }.to raise_error Fitgem::InvalidTimeArgument
         | 
| 112 | 
            +
                end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                it "rejects strings that are formatted correctly but include non-numeric elements" do
         | 
| 115 | 
            +
                  time = "4a:33"
         | 
| 116 | 
            +
                  expect {
         | 
| 117 | 
            +
                    @client.format_time(time)
         | 
| 118 | 
            +
                  }.to raise_error Fitgem::InvalidTimeArgument
         | 
| 119 | 
            +
                end
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                it "rejects arguments that do not conform to accepted types" do
         | 
| 122 | 
            +
                  expect {
         | 
| 123 | 
            +
                    @client.format_time(200)
         | 
| 124 | 
            +
                  }.to raise_error Fitgem::InvalidTimeArgument
         | 
| 125 | 
            +
                end
         | 
| 126 | 
            +
              end
         | 
| 78 127 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: fitgem
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.5.0
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,11 +9,11 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2012-01-22 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: oauth
         | 
| 16 | 
            -
              requirement: & | 
| 16 | 
            +
              requirement: &70184430460560 !ruby/object:Gem::Requirement
         | 
| 17 17 | 
             
                none: false
         | 
| 18 18 | 
             
                requirements:
         | 
| 19 19 | 
             
                - - ! '>='
         | 
| @@ -21,10 +21,10 @@ dependencies: | |
| 21 21 | 
             
                    version: '0'
         | 
| 22 22 | 
             
              type: :runtime
         | 
| 23 23 | 
             
              prerelease: false
         | 
| 24 | 
            -
              version_requirements: * | 
| 24 | 
            +
              version_requirements: *70184430460560
         | 
| 25 25 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 26 26 | 
             
              name: rake
         | 
| 27 | 
            -
              requirement: & | 
| 27 | 
            +
              requirement: &70184430460140 !ruby/object:Gem::Requirement
         | 
| 28 28 | 
             
                none: false
         | 
| 29 29 | 
             
                requirements:
         | 
| 30 30 | 
             
                - - ! '>='
         | 
| @@ -32,10 +32,10 @@ dependencies: | |
| 32 32 | 
             
                    version: '0'
         | 
| 33 33 | 
             
              type: :development
         | 
| 34 34 | 
             
              prerelease: false
         | 
| 35 | 
            -
              version_requirements: * | 
| 35 | 
            +
              version_requirements: *70184430460140
         | 
| 36 36 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 37 37 | 
             
              name: rspec
         | 
| 38 | 
            -
              requirement: & | 
| 38 | 
            +
              requirement: &70184430495900 !ruby/object:Gem::Requirement
         | 
| 39 39 | 
             
                none: false
         | 
| 40 40 | 
             
                requirements:
         | 
| 41 41 | 
             
                - - ! '>='
         | 
| @@ -43,10 +43,10 @@ dependencies: | |
| 43 43 | 
             
                    version: '0'
         | 
| 44 44 | 
             
              type: :development
         | 
| 45 45 | 
             
              prerelease: false
         | 
| 46 | 
            -
              version_requirements: * | 
| 46 | 
            +
              version_requirements: *70184430495900
         | 
| 47 47 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 48 48 | 
             
              name: guard
         | 
| 49 | 
            -
              requirement: & | 
| 49 | 
            +
              requirement: &70184430494680 !ruby/object:Gem::Requirement
         | 
| 50 50 | 
             
                none: false
         | 
| 51 51 | 
             
                requirements:
         | 
| 52 52 | 
             
                - - ! '>='
         | 
| @@ -54,10 +54,10 @@ dependencies: | |
| 54 54 | 
             
                    version: '0'
         | 
| 55 55 | 
             
              type: :development
         | 
| 56 56 | 
             
              prerelease: false
         | 
| 57 | 
            -
              version_requirements: * | 
| 57 | 
            +
              version_requirements: *70184430494680
         | 
| 58 58 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 59 59 | 
             
              name: guard-rspec
         | 
| 60 | 
            -
              requirement: & | 
| 60 | 
            +
              requirement: &70184430493220 !ruby/object:Gem::Requirement
         | 
| 61 61 | 
             
                none: false
         | 
| 62 62 | 
             
                requirements:
         | 
| 63 63 | 
             
                - - ! '>='
         | 
| @@ -65,10 +65,10 @@ dependencies: | |
| 65 65 | 
             
                    version: '0'
         | 
| 66 66 | 
             
              type: :development
         | 
| 67 67 | 
             
              prerelease: false
         | 
| 68 | 
            -
              version_requirements: * | 
| 68 | 
            +
              version_requirements: *70184430493220
         | 
| 69 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 70 | 
             
              name: rb-fsevent
         | 
| 71 | 
            -
              requirement: & | 
| 71 | 
            +
              requirement: &70184430492320 !ruby/object:Gem::Requirement
         | 
| 72 72 | 
             
                none: false
         | 
| 73 73 | 
             
                requirements:
         | 
| 74 74 | 
             
                - - ! '>='
         | 
| @@ -76,10 +76,10 @@ dependencies: | |
| 76 76 | 
             
                    version: '0'
         | 
| 77 77 | 
             
              type: :development
         | 
| 78 78 | 
             
              prerelease: false
         | 
| 79 | 
            -
              version_requirements: * | 
| 79 | 
            +
              version_requirements: *70184430492320
         | 
| 80 80 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 81 81 | 
             
              name: growl
         | 
| 82 | 
            -
              requirement: & | 
| 82 | 
            +
              requirement: &70184430491460 !ruby/object:Gem::Requirement
         | 
| 83 83 | 
             
                none: false
         | 
| 84 84 | 
             
                requirements:
         | 
| 85 85 | 
             
                - - ! '>='
         | 
| @@ -87,10 +87,10 @@ dependencies: | |
| 87 87 | 
             
                    version: '0'
         | 
| 88 88 | 
             
              type: :development
         | 
| 89 89 | 
             
              prerelease: false
         | 
| 90 | 
            -
              version_requirements: * | 
| 90 | 
            +
              version_requirements: *70184430491460
         | 
| 91 91 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 92 92 | 
             
              name: yard
         | 
| 93 | 
            -
              requirement: & | 
| 93 | 
            +
              requirement: &70184430490160 !ruby/object:Gem::Requirement
         | 
| 94 94 | 
             
                none: false
         | 
| 95 95 | 
             
                requirements:
         | 
| 96 96 | 
             
                - - ! '>='
         | 
| @@ -98,10 +98,10 @@ dependencies: | |
| 98 98 | 
             
                    version: '0'
         | 
| 99 99 | 
             
              type: :development
         | 
| 100 100 | 
             
              prerelease: false
         | 
| 101 | 
            -
              version_requirements: * | 
| 101 | 
            +
              version_requirements: *70184430490160
         | 
| 102 102 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 103 103 | 
             
              name: rdiscount
         | 
| 104 | 
            -
              requirement: & | 
| 104 | 
            +
              requirement: &70184430488900 !ruby/object:Gem::Requirement
         | 
| 105 105 | 
             
                none: false
         | 
| 106 106 | 
             
                requirements:
         | 
| 107 107 | 
             
                - - ! '>='
         | 
| @@ -109,7 +109,7 @@ dependencies: | |
| 109 109 | 
             
                    version: '0'
         | 
| 110 110 | 
             
              type: :development
         | 
| 111 111 | 
             
              prerelease: false
         | 
| 112 | 
            -
              version_requirements: * | 
| 112 | 
            +
              version_requirements: *70184430488900
         | 
| 113 113 | 
             
            description: A client library to send and retrieve workout, weight, and diet data
         | 
| 114 114 | 
             
              from fitbit.com
         | 
| 115 115 | 
             
            email:
         | 
| @@ -146,6 +146,9 @@ files: | |
| 146 146 | 
             
            - lib/fitgem/units.rb
         | 
| 147 147 | 
             
            - lib/fitgem/users.rb
         | 
| 148 148 | 
             
            - lib/fitgem/water.rb
         | 
| 149 | 
            +
            - lib/fitgem/blood_pressure.rb
         | 
| 150 | 
            +
            - lib/fitgem/glucose.rb
         | 
| 151 | 
            +
            - lib/fitgem/heart_rate.rb
         | 
| 149 152 | 
             
            - spec/fitgem_spec.rb
         | 
| 150 153 | 
             
            - spec/spec_helper.rb
         | 
| 151 154 | 
             
            - spec/fitgem_notifications_spec.rb
         | 
| @@ -163,12 +166,18 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 163 166 | 
             
              - - ! '>='
         | 
| 164 167 | 
             
                - !ruby/object:Gem::Version
         | 
| 165 168 | 
             
                  version: '0'
         | 
| 169 | 
            +
                  segments:
         | 
| 170 | 
            +
                  - 0
         | 
| 171 | 
            +
                  hash: 2581731821553703730
         | 
| 166 172 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 167 173 | 
             
              none: false
         | 
| 168 174 | 
             
              requirements:
         | 
| 169 175 | 
             
              - - ! '>='
         | 
| 170 176 | 
             
                - !ruby/object:Gem::Version
         | 
| 171 177 | 
             
                  version: '0'
         | 
| 178 | 
            +
                  segments:
         | 
| 179 | 
            +
                  - 0
         | 
| 180 | 
            +
                  hash: 2581731821553703730
         | 
| 172 181 | 
             
            requirements: []
         | 
| 173 182 | 
             
            rubyforge_project: fitgem
         | 
| 174 183 | 
             
            rubygems_version: 1.8.10
         |