nikeplusgem 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 760d346b4935c6ee4a85ba97cb25aa07033a0088
4
+ data.tar.gz: a844e23ea7d883eadce81d2d0b239929faa4f12b
5
+ SHA512:
6
+ metadata.gz: 8c065121b3e68185e3179f54719d6d3c0202bae870e0e74e29e1f9f372313cfaf2ade16f77883bc9eeeb01e0ce15987fc2ccdc278391943373648ca68baa2f00
7
+ data.tar.gz: b9c98f8193a0188f28bd527c25afd1a378713a18d786637bc9353729b0e90ce65c80677715cc141fdebacc89a2a107b93c6d3c50d46bb138d611077eb0141097
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,44 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ nikeplusgem (0.0.1)
5
+ httparty
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ addressable (2.3.5)
11
+ crack (0.4.2)
12
+ safe_yaml (~> 1.0.0)
13
+ diff-lcs (1.2.5)
14
+ httparty (0.13.0)
15
+ json (~> 1.8)
16
+ multi_xml (>= 0.5.2)
17
+ json (1.8.1)
18
+ multi_xml (0.5.5)
19
+ rake (10.1.1)
20
+ rspec (2.14.1)
21
+ rspec-core (~> 2.14.0)
22
+ rspec-expectations (~> 2.14.0)
23
+ rspec-mocks (~> 2.14.0)
24
+ rspec-core (2.14.8)
25
+ rspec-expectations (2.14.5)
26
+ diff-lcs (>= 1.1.3, < 2.0)
27
+ rspec-mocks (2.14.6)
28
+ safe_yaml (1.0.1)
29
+ vcr (2.8.0)
30
+ webmock (1.15.2)
31
+ addressable (>= 2.2.7)
32
+ crack (>= 0.3.2)
33
+ yard (0.8.7.3)
34
+
35
+ PLATFORMS
36
+ ruby
37
+
38
+ DEPENDENCIES
39
+ nikeplusgem!
40
+ rake
41
+ rspec
42
+ vcr
43
+ webmock (>= 1.8.0, < 1.16.0)
44
+ yard
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2013 - Rob Shaw, http://borwahs.com/
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,47 @@
1
+ require 'rake'
2
+ require 'rake/clean'
3
+ require 'rspec/core/rake_task'
4
+ require 'yard'
5
+
6
+ # values to reuse
7
+ NAME = 'nikeplusgem'
8
+ VERSION = lambda do
9
+ require File.expand_path("../lib/nikeplusgem", __FILE__)
10
+ NikePlusGem::VERSION
11
+ end
12
+
13
+ # set default task to install and build the gem
14
+ task :default => :install
15
+
16
+ # tasks to manage gem
17
+ desc "Build gem"
18
+ task :build do
19
+ sh %{gem build #{NAME}.gemspec}
20
+ end
21
+
22
+ desc "Install gem"
23
+ task :install => [:build] do
24
+ sh %{gem install ./#{NAME}-#{VERSION.call}.gem --local}
25
+ end
26
+
27
+ desc "Uninstall gem"
28
+ task :uninstall do
29
+ sh %{gem uninstall #{NAME}}
30
+ end
31
+
32
+ # get version
33
+ desc "Print current version"
34
+ task :version do
35
+ puts VERSION.call
36
+ end
37
+
38
+ # testing
39
+ desc "run rspec tests"
40
+ RSpec::Core::RakeTask.new(:spec)
41
+
42
+ task :test => :spec
43
+
44
+ desc "Create documentation"
45
+ YARD::Rake::YardocTask.new do |t|
46
+ t.files = ['lib/**/*.rb']
47
+ end
@@ -0,0 +1,21 @@
1
+ require 'json'
2
+ require 'date'
3
+ require 'time'
4
+ require 'uri'
5
+ require 'httparty'
6
+
7
+ require_relative 'nikeplusgem/client'
8
+ require_relative 'nikeplusgem/version'
9
+ require_relative 'nikeplusgem/list_activities'
10
+ require_relative 'nikeplusgem/aggregate_sport'
11
+ require_relative 'nikeplusgem/experience_type'
12
+ require_relative 'nikeplusgem/activity_data'
13
+ require_relative 'nikeplusgem/extensions'
14
+ require_relative 'nikeplusgem/helpers'
15
+ require_relative 'nikeplusgem/errors'
16
+
17
+ # Read data from Nike+ Developer API
18
+ #
19
+ # @author Rob Shaw
20
+ module NikePlusGem
21
+ end
@@ -0,0 +1,14 @@
1
+ module NikePlusGem
2
+ class Client
3
+
4
+ # Get details of one of the user's activities, by Activity ID
5
+ #
6
+ # @param activity_id [String, Integer] The Activity ID to request
7
+ #
8
+ # @return [Hash] A hash with the requested Activity
9
+ def activity_data(activity_id)
10
+ get("/me/sport/activities/#{activity_id}")
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module NikePlusGem
2
+ class Client
3
+
4
+ # Get list of Nike+ experiences in which the user participates and
5
+ # a summary of the user's statistics for each sport category
6
+ #
7
+ # @return [Hash] A hash of the user's Nike+ Experiences
8
+ def aggregate_sport()
9
+ get("/me/sport")
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,56 @@
1
+ module NikePlusGem
2
+ class Client
3
+ include HTTParty
4
+
5
+ BASE_URL = "https://api.nike.com"
6
+
7
+ # Gets the Access Token to be used in calls to API. Set via
8
+ # the constructor.
9
+ #
10
+ # @return [String]
11
+ attr_reader :access_token
12
+
13
+ # Gets the Application ID to be sent in Header for calls to
14
+ # API. Set via the constructor.
15
+ #
16
+ # @return [String]
17
+ attr_reader :app_id
18
+
19
+ # Creates a client object to communicate with API
20
+ #
21
+ # @param access_token [String] The Access Token needed to authorize
22
+ # @param app_id [String] The Application ID to send in Header
23
+ #
24
+ # @example Create new client with Access Token and App ID
25
+ # client = NikePlusGem::Client.new("abcdef12345", "My Nike+ Data")
26
+ #
27
+ # @return [Client] A NikePlusGem::Client object
28
+ def initialize(access_token, app_id)
29
+
30
+ if access_token.nil? or access_token.empty?
31
+ raise InvalidArgumentError, "The Access Token must be set"
32
+ end
33
+
34
+ if app_id.nil? or app_id.empty?
35
+ raise InvalidArgumentError, "The App ID must be set"
36
+ end
37
+
38
+ @access_token = access_token
39
+ @app_id = app_id
40
+ end
41
+
42
+ private
43
+
44
+ def get(endpoint, qs_options={}, headers={})
45
+ options = {}
46
+ options[:headers] = Helpers.merge_required_headers(@app_id, headers)
47
+ options[:query] = Helpers.merge_required_qs_params(@access_token, qs_options)
48
+
49
+ url = Helpers.combine_url_endpoint(BASE_URL, endpoint)
50
+
51
+ res = self.class.get(url.to_s, options)
52
+ res.parsed_response
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,6 @@
1
+ module NikePlusGem
2
+
3
+ class InvalidArgumentError < ArgumentError
4
+ end
5
+
6
+ end
@@ -0,0 +1,32 @@
1
+ module NikePlusGem
2
+ class Client
3
+
4
+ EXPERIENCE_TYPE_PARAM = ["experienceType", "offset", "count", "startDate", "endDate"]
5
+ EXPERIENCE_TYPES = ["RUNNING", "FUELBAND"]
6
+
7
+ # Get the User's sport activity for the specified experience type as a paginated list
8
+ #
9
+ # @param params [Hash] Query Parameters to include in call
10
+ #
11
+ # @option params [String] experienceType The Experience Type by which to
12
+ # filter the list (FUELBAND or RUNNING). REQUIRED
13
+ #
14
+ # @return [Hash] A hash with the requested sport activity.
15
+ def experience_type(params={})
16
+ params = params.only(EXPERIENCE_TYPE_PARAM)
17
+
18
+ unless params.include?("experienceType") and !params["experienceType"].empty?
19
+ raise InvalidArgumentError, "Must specify the Experience Type to fetch results for."
20
+ end
21
+
22
+ unless EXPERIENCE_TYPES.include?params["experienceType"]
23
+ raise InvalidArgumentError, "Must specify a valid Experience Type"
24
+ end
25
+
26
+ exp_type = params["experienceType"]
27
+
28
+ get("/me/sport/activities/" << exp_type, params)
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,12 @@
1
+ class Hash
2
+
3
+ # Removes keys from Hash that aren't provided in params
4
+ #
5
+ # @param params [Hash] The keys to keep in the returned hash
6
+ #
7
+ # @return [Hash] A hash with only the keys provided
8
+ def only(params)
9
+ self.select {|param| params.include?(param)}
10
+ end
11
+
12
+ end
@@ -0,0 +1,74 @@
1
+ module NikePlusGem
2
+ class Helpers
3
+
4
+ # Format any of a variety of date types into the formatted string
5
+ # required when using the API.
6
+ #
7
+ # The date parameter can take several different kind of objects: a
8
+ # DateTime object, a Date object, a Time object or a String object.
9
+ #
10
+ # @param [DateTime, Date, Time, String] date The object to format into a
11
+ # date string
12
+ #
13
+ # @return [String] Date in "yyyy/MM/dd" string format; or ERROR if unable
14
+ # parse
15
+ def self.format_date(date)
16
+ if date.nil?
17
+ return "ERROR"
18
+ end
19
+
20
+ if date.instance_of? Date or date.instance_of? Time or date.instance_of? DateTime
21
+ return date.strftime("%Y/%m/%d")
22
+ elsif date.is_a? String and not date.empty?
23
+ match = date.match(/(\d{4}\/\d{2}\/\d{2}).*/)
24
+
25
+ if match.nil?
26
+ return "ERROR"
27
+ end
28
+
29
+ capture_groups = match.captures
30
+
31
+ return Date.strptime(capture_groups[0], "%Y/%m/%d").strftime("%Y/%m/%d")
32
+ end
33
+
34
+ "ERROR"
35
+ end
36
+
37
+ # Merges user defined headers with the required headers needed by API
38
+ #
39
+ # @param app_id [String] The Application ID
40
+ # @param headers [Hash] Additional headers defined by user
41
+ #
42
+ # @return [Hash] Merge of user Headers and required headers by API
43
+ def self.merge_required_headers(app_id, headers={})
44
+ req_headers = {"appid" => app_id, "Accept" => "application/json"}
45
+
46
+ if not headers.empty?
47
+ req_headers.merge!(headers)
48
+ end
49
+
50
+ req_headers
51
+ end
52
+
53
+ # Merges query parameter key/value with the required Access Token parameter
54
+ #
55
+ # @param access_token [String] The Access Token to communicate with the API
56
+ # @param params [Hash] Additional Query String Parameters
57
+ #
58
+ # @return [Hash] Passed in query string parameter hash with Access Token key/value
59
+ def self.merge_required_qs_params(access_token, params={})
60
+ params.merge!({"access_token" => access_token})
61
+ end
62
+
63
+ # Joins two strings into a URI object
64
+ #
65
+ # @param base [String] The base portion of the URL
66
+ # @param endpoint [String] The endpoint to append to the base URL
67
+ #
68
+ # @return [URI] Joined URL of base and endpoint
69
+ def self.combine_url_endpoint(base, endpoint)
70
+ URI.join(base, endpoint)
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,27 @@
1
+ module NikePlusGem
2
+ class Client
3
+
4
+ LIST_ACTIVITY_PARAMS = ["offset", "count", "startDate", "endDate"]
5
+
6
+ # Get details of the user's activities, beginning with the most recent, as a paginated list
7
+ #
8
+ # @param params [Hash] Query Parameters to include in call
9
+ #
10
+ # @option params [String] offset Pagination - first record to
11
+ # retrieve (starts at 1)
12
+ # @option params [String] count Pagination - number of records to
13
+ # retrieve (default 5)
14
+ # @option params [String] startDate The Activity list's start date
15
+ # in ISO8601 standard format, 'yyyy-mm-dd'
16
+ # @option params [String] endDate The Activity list's end date in
17
+ # ISO8601 standard format, 'yyyy-mm-dd'
18
+ #
19
+ # @return [Hash] A hash with the requested Activities
20
+ def list_activities(params={})
21
+ params = params.only(LIST_ACTIVITY_PARAMS)
22
+
23
+ get("/me/sport/activities", params)
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module NikePlusGem
2
+ VERSION = '0.1.0'.freeze
3
+ end
Binary file
Binary file
@@ -0,0 +1,28 @@
1
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
2
+ require 'nikeplusgem/version'
3
+
4
+ Gem::Specification.new do |g|
5
+ g.name = "nikeplusgem"
6
+ g.version = NikePlusGem::VERSION
7
+ g.platform = Gem::Platform::RUBY
8
+ g.license = "MIT"
9
+ g.summary = "Nike+ Gem"
10
+ g.description = "A client library to retrieve data from the Nike+ Developer Resources API."
11
+ g.authors = ["Rob Shaw"]
12
+ g.email = ["rob@borwahs.com"]
13
+ g.homepage = "https://github.com/borwahs/nikeplusgem/"
14
+
15
+ g.files = Dir["./**/*"].reject{|file| file =~ /\.\/(doc|pkg|spec|test)/}
16
+ g.require_paths = ["lib"]
17
+
18
+ g.test_files = Dir["./spec/**/*"]
19
+
20
+ # Dependencies
21
+ g.add_development_dependency "rspec"
22
+ g.add_development_dependency "rake"
23
+ g.add_development_dependency "vcr"
24
+ g.add_development_dependency "yard"
25
+ g.add_development_dependency "webmock", ">= 1.8.0", "< 1.16.0"
26
+
27
+ g.add_runtime_dependency "httparty"
28
+ end
@@ -0,0 +1,32 @@
1
+ # Nike Plus Gem
2
+
3
+ This gem provides access to the [Nike+ Developer Resources](http://developer.nike.com) data through their REST API.
4
+
5
+ ## Documentation
6
+
7
+ Good method documentation is available at [rubydoc.info](http://www.rubydoc.info/github/borwahs/nikeplusgem/frames).
8
+
9
+ The API methods are exposed in the Client class:
10
+
11
+ * Aggregate Sports Data
12
+ * List Activities
13
+ * Activities By Experience Type
14
+ * Activity Details
15
+
16
+ At the moment, the only way to connect is to get a specific Access Token for an account from [Nike+ Developer API Portal](https://developer.nike.com).
17
+
18
+ ##Usage
19
+
20
+ Require the gem:
21
+
22
+ require 'nikeplusgem'
23
+
24
+ Setup a new Client object with an Access Token and Application ID:
25
+
26
+ client = NikePlusGem::Client.new("access_token", "app_id")
27
+
28
+ # Disclaimer
29
+
30
+ This is MIT licensed with no added caveats. See LICENSE file for more details.
31
+
32
+ **I am not employed by or have any association with Nike or the development of the Nike+ API.**
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe NikePlusGem::Client do
4
+
5
+ before :each do
6
+ @access_token = "12345"
7
+ @app_id = "abcde"
8
+
9
+ @client = NikePlusGem::Client.new(@access_token, @app_id)
10
+ end
11
+
12
+ describe "#new" do
13
+ it "takes two parameters and returns a Client object" do
14
+ @client.should be_an_instance_of NikePlusGem::Client
15
+ end
16
+
17
+ it "requires the access_token to be non-empty and not nil" do
18
+ expect {
19
+ client = NikePlusGem::Client.new("", @app_id)
20
+ }.to raise_error(NikePlusGem::InvalidArgumentError)
21
+
22
+ expect {
23
+ client = NikePlusGem::Client.new(nil, @app_id)
24
+ }.to raise_error(NikePlusGem::InvalidArgumentError)
25
+ end
26
+
27
+ it "requires the app_id to be non-empty and not nil" do
28
+ expect {
29
+ client = NikePlusGem::Client.new(@access_token, "")
30
+ }.to raise_error(NikePlusGem::InvalidArgumentError)
31
+
32
+ expect {
33
+ client = NikePlusGem::Client.new(@access_token, nil)
34
+ }.to raise_error(NikePlusGem::InvalidArgumentError)
35
+ end
36
+ end
37
+
38
+ describe "#access_token" do
39
+ it "returns the correct access token" do
40
+ @client.access_token.should eql @access_token
41
+ end
42
+ end
43
+
44
+ describe "#app_id" do
45
+ it "returns the correct app id" do
46
+ @client.app_id.should eql @app_id
47
+ end
48
+ end
49
+
50
+ end
@@ -0,0 +1,99 @@
1
+ require 'spec_helper'
2
+
3
+ describe NikePlusGem::Client do
4
+
5
+ before :each do
6
+ @access_token = "12345"
7
+ @app_id = "abcde"
8
+
9
+ @client = NikePlusGem::Client.new(@access_token, @app_id)
10
+ end
11
+
12
+ describe "list_activities" do
13
+
14
+ before do
15
+ VCR.insert_cassette 'list_activities'
16
+ end
17
+
18
+ it "return json request for list activities" do
19
+ @client.list_activities.should be_instance_of Hash
20
+ end
21
+
22
+ after do
23
+ VCR.eject_cassette
24
+ end
25
+
26
+ end
27
+
28
+ describe "aggregate_sport" do
29
+
30
+ before do
31
+ VCR.insert_cassette 'aggregate_sport'
32
+ end
33
+
34
+ it "return json request for aggregate sport" do
35
+ @client.aggregate_sport.should be_instance_of Hash
36
+ end
37
+
38
+ after do
39
+ VCR.eject_cassette
40
+ end
41
+
42
+ end
43
+
44
+ describe "experience_type" do
45
+
46
+ before do
47
+ VCR.insert_cassette 'experience_type'
48
+ end
49
+
50
+ before(:each) do
51
+ @params = {}
52
+ @params["experienceType"] = "FUELBAND"
53
+ end
54
+
55
+ it "return json request for experience type" do
56
+ @client.experience_type(@params).should be_instance_of Hash
57
+ end
58
+
59
+ it 'raises an exception if the experience type key is missing' do
60
+ @params.delete("experienceType")
61
+
62
+ expect {
63
+ @client.experience_type(@params)
64
+ }.to raise_error(NikePlusGem::InvalidArgumentError)
65
+ end
66
+
67
+ it 'raises an exception if the experience type value is not valid' do
68
+ @params["experienceType"] = "NOT_SOMETHING"
69
+
70
+ expect {
71
+ @client.experience_type(@params)
72
+ }.to raise_error(NikePlusGem::InvalidArgumentError)
73
+ end
74
+
75
+
76
+ after do
77
+ VCR.eject_cassette
78
+ end
79
+
80
+ end
81
+
82
+ describe "activity_data" do
83
+
84
+ before do
85
+ VCR.insert_cassette 'activity_data'
86
+ @activity_id = "2bd0fec0-3955-450b-92dd-29426a19d2f5"
87
+ end
88
+
89
+ it "return json request for activity data with string parameter" do
90
+ @client.activity_data(@activity_id).should be_instance_of Hash
91
+ end
92
+
93
+ after do
94
+ VCR.eject_cassette
95
+ end
96
+
97
+ end
98
+
99
+ end
@@ -0,0 +1,36 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.nike.com/me/sport/activities/2bd0fec0-3955-450b-92dd-29426a19d2f5?access_token=<ACCESS_TOKEN>
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Appid:
11
+ - <APP_ID>
12
+ Accept:
13
+ - application/json
14
+ response:
15
+ status:
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ Content-Type:
20
+ - application/json;charset=UTF-8
21
+ Date:
22
+ - Tue, 04 Mar 2014 04:15:29 GMT
23
+ Server:
24
+ - Apache
25
+ X-Swooshlet:
26
+ - app-msp-api-0 prd sin-85-app-msp-api-0
27
+ Content-Length:
28
+ - '23937'
29
+ Connection:
30
+ - keep-alive
31
+ body:
32
+ encoding: UTF-8
33
+ string: '{"activityId":"2bd0fec0-3955-450b-92dd-29426a19d2f5","activityType":"ALL_DAY","startTime":"2014-02-09T05:00:00Z","activityTimeZone":"America/Indiana/Indianapolis","status":"IN_PROGRESS","deviceType":"FUELBAND","metricSummary":{"calories":678,"fuel":2369,"distance":6.01494836807251,"steps":7639,"duration":"5:40:00.000"},"tags":[],"metrics":[{"intervalMetric":1,"intervalUnit":"MIN","metricType":"FUEL","values":["1","1","0","0","0","0","0","0","2","0","0","0","0","1","0","0","1","1","1","5","10","8","12","7","1","2","4","1","4","5","9","11","0","3","6","3","4","2","5","5","10","1","2","1","1","18","18","11","9","9","9","5","10","7","2","2","2","2","1","2","1","1","12","6","3","0","0","0","2","1","6","19","3","9","2","8","3","1","5","3","4","2","7","4","8","4","5","9","13","8","7","10","16","16","10","1","5","6","6","1","5","1","3","1","5","8","0","2","2","3","12","14","7","6","8","5","3","4","4","18","4","7","5","4","6","2","9","8","5","3","5","2","4","3","1","2","1","0","1","4","0","3","3","4","0","9","5","7","13","0","0","1","1","2","12","7","8","1","2","7","0","1","4","0","2","3","1","3","0","0","0","0","0","0","1","0","1","6","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","15","17","5","11","18","16","17","18","16","10","14","20","20","20","19","12","20","18","20","17","19","21","18","19","22","46","40","20","30","49","44","43","16","17","28","48","23","16","14","3","5","17","24","24","21","9","13","22","3","4","16","4","8","4","3","7","10","9","5","2","0","0","0","0","0","0","2","3","0","0","0","0","0","0","0","0","0","0","0","0","2","1","3","2","8","2","0","1","6","5","15","14","3","4","2","8","8","9","7","17","6","0","0","11","6","7","5","6","13","6","5","4","1","7","1","4","1","1","4","0","0","0","0","0","1","0","0","0","2","2","3","1","4","9","3","1","3","0","1","2","4","1","3","4","4","3","2","3","1","4","5","3","6","16","6","4","15","4","4","4","5","1","11","4","1","6","2","1","3","2","0","0","0","1","0","0","0","2","1","3","6","1","0","0","0","0","0","2","6","1","1","6","4","0","0","1","9","9","1","3","6","1","8","2","2","0","1","2","2","0","2","5","10","2","3","2","1","1","3","1","2","1","0","0","0","1","3","2","3","4","0","0","0","0","0","1","1","7","2","2","5","2","5","6","0","0","0","0","9","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]},{"intervalMetric":1,"intervalUnit":"MIN","metricType":"CALORIES","values":["0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","1","0","1","3","3","3","2","0","1","1","0","1","2","3","2","0","2","1","1","1","1","1","2","2","1","0","1","0","5","5","3","3","3","2","1","3","2","1","0","1","1","0","0","1","0","4","1","1","0","0","0","1","0","2","5","1","3","0","3","0","1","1","1","1","1","2","1","2","1","2","2","4","2","2","3","5","4","3","1","1","2","1","1","1","0","1","1","1","2","0","1","0","1","4","4","2","2","2","1","1","1","1","5","2","2","1","1","2","0","3","2","2","1","1","1","1","1","0","0","1","0","0","1","0","1","1","1","0","3","1","2","4","0","0","0","1","0","3","3","2","0","1","2","0","0","1","0","1","1","0","1","0","0","0","0","0","0","0","0","0","2","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","4","5","1","3","5","5","5","5","5","3","4","5","6","5","6","3","6","5","6","5","5","6","5","6","6","13","12","5","9","14","13","12","5","5","8","13","7","5","3","1","2","5","7","6","6","3","4","6","1","1","5","1","2","1","1","2","3","3","1","1","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","1","0","1","0","3","0","0","1","1","2","4","4","1","1","0","3","2","3","2","5","1","0","0","4","1","2","2","1","4","2","1","1","1","2","0","1","0","1","1","0","0","0","0","0","0","0","0","0","1","0","1","0","2","2","1","0","1","0","0","1","1","1","0","2","1","0","1","1","0","1","2","1","1","5","2","1","4","1","1","1","2","0","3","1","1","2","0","0","1","1","0","0","0","0","0","0","0","1","0","1","2","0","0","0","0","0","0","0","2","0","1","1","2","0","0","0","2","3","0","1","2","0","2","1","0","0","1","1","0","0","1","1","3","0","1","1","0","1","0","1","0","1","0","0","0","0","1","0","1","1","0","0","0","0","0","0","1","2","0","1","1","1","1","2","0","0","0","0","3","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]},{"intervalMetric":1,"intervalUnit":"MIN","metricType":"STEPS","values":["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","7","16","37","24","0","0","0","0","0","16","27","34","0","0","0","0","17","0","25","0","54","0","0","0","0","64","32","63","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","18","35","13","0","0","9","0","0","0","11","15","15","0","24","11","0","0","42","24","44","36","47","61","56","30","0","0","0","0","13","0","0","0","10","0","0","0","0","0","7","83","70","31","11","0","8","0","0","0","14","34","33","48","23","44","13","122","91","0","18","0","0","0","9","0","0","0","0","9","9","0","29","14","9","0","7","24","0","20","0","0","0","0","0","43","36","41","0","0","34","0","0","0","0","0","0","0","0","0","0","0","0","0","0","6","0","10","10","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","27","59","16","70","107","99","97","80","81","45","72","108","108","108","108","27","108","99","108","101","104","115","106","107","102","156","139","81","109","152","141","131","68","54","103","152","95","72","81","9","7","54","50","27","18","0","0","17","7","0","0","0","0","0","0","64","31","62","14","0","0","0","0","0","0","0","6","0","0","0","0","0","0","0","0","0","0","0","0","0","10","6","14","0","18","9","0","6","19","28","70","92","0","0","0","34","79","51","27","63","37","0","0","67","36","9","20","0","91","27","18","41","0","0","0","0","11","0","20","0","0","0","0","0","9","0","0","0","0","9","17","11","13","49","0","0","0","0","0","0","0","0","0","10","12","7","0","25","0","7","29","0","52","54","0","10","14","9","7","27","14","7","39","0","0","0","0","0","0","0","0","0","0","9","0","0","0","0","0","24","37","7","0","0","0","0","0","10","21","10","6","7","0","0","0","0","7","0","0","0","0","0","0","0","0","0","0","11","0","0","0","20","19","15","18","23","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","7","0","7","33","0","30","6","0","0","0","0","26","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]},{"intervalMetric":1,"intervalUnit":"MIN","metricType":"STARS","values":["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","1","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]}]}'
34
+ http_version:
35
+ recorded_at: Tue, 04 Mar 2014 04:15:30 GMT
36
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,36 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.nike.com/me/sport?access_token=<ACCESS_TOKEN>
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Appid:
11
+ - <APP_ID>
12
+ Accept:
13
+ - application/json
14
+ response:
15
+ status:
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ Content-Type:
20
+ - application/json;charset=UTF-8
21
+ Date:
22
+ - Sun, 02 Mar 2014 07:45:20 GMT
23
+ Server:
24
+ - Apache
25
+ X-Swooshlet:
26
+ - app-msp-api-0 prd sin-87-app-msp-api-0
27
+ Content-Length:
28
+ - '643'
29
+ Connection:
30
+ - keep-alive
31
+ body:
32
+ encoding: UTF-8
33
+ string: '{"experienceTypes":["FUELBAND"],"summaries":[{"experienceType":"ALL","records":[{"recordType":"LIFETIMEFUEL","recordValue":"424189"}]},{"experienceType":"FUELBAND","records":[{"recordType":"LIFETIMEFUEL","recordValue":"424189"},{"recordType":"DAILYGOALTARGETVALUE","recordValue":"2250.0"},{"recordType":"CURRENTSTREAK","recordValue":"1"},{"recordType":"TOTALDAILYGOALSACHIEVED","recordValue":"127"},{"recordType":"LIFETIMEAVERAGEFUELDAY","recordValue":"2790"},{"recordType":"LIFETIMEAVERAGEFUELWEEK","recordValue":"19281"},{"recordType":"LIFETIMEAVERAGEFUELMONTH","recordValue":"70698"},{"recordType":"NUMOFACTIVITIES","recordValue":"152"}]}]}'
34
+ http_version:
35
+ recorded_at: Sun, 02 Mar 2014 07:45:37 GMT
36
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,36 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.nike.com/me/sport/activities/FUELBAND?access_token=<ACCESS_TOKEN>&experienceType=FUELBAND
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Appid:
11
+ - <APP_ID>
12
+ Accept:
13
+ - application/json
14
+ response:
15
+ status:
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ Content-Type:
20
+ - application/json;charset=UTF-8
21
+ Date:
22
+ - Sun, 02 Mar 2014 07:45:23 GMT
23
+ Server:
24
+ - Apache
25
+ X-Swooshlet:
26
+ - app-msp-api-0 prd sin-84-app-msp-api-0
27
+ Content-Length:
28
+ - '1871'
29
+ Connection:
30
+ - keep-alive
31
+ body:
32
+ encoding: UTF-8
33
+ string: '{"data":[{"activityId":"2bd0fec0-3955-450b-92dd-29426a19d2f5","activityType":"ALL_DAY","startTime":"2014-02-09T05:00:00Z","activityTimeZone":"America/Indiana/Indianapolis","status":"IN_PROGRESS","deviceType":"FUELBAND","metricSummary":{"calories":678,"fuel":2369,"distance":6.01494836807251,"steps":7639,"duration":"5:40:00.000"},"tags":[],"metrics":[]},{"activityId":"eb68365c-819e-4638-ad7b-57ff23f034ad","activityType":"ALL_DAY","startTime":"2014-02-08T05:00:00Z","activityTimeZone":"America/Indiana/Indianapolis","status":"IN_PROGRESS","deviceType":"FUELBAND","metricSummary":{"calories":527,"fuel":1839,"distance":2.8440887928009033,"steps":3612,"duration":"7:51:00.000"},"tags":[],"metrics":[]},{"activityId":"047eb85a-f60f-4c13-b6a9-392c3ef9ec98","activityType":"ALL_DAY","startTime":"2014-02-07T05:00:00Z","activityTimeZone":"America/Indiana/Indianapolis","status":"IN_PROGRESS","deviceType":"FUELBAND","metricSummary":{"calories":896,"fuel":3134,"distance":6.509435653686523,"steps":8267,"duration":"10:43:00.000"},"tags":[],"metrics":[]},{"activityId":"5bce184b-7ec4-4bd2-9681-79e40803093f","activityType":"ALL_DAY","startTime":"2014-02-06T05:00:00Z","activityTimeZone":"America/Indiana/Indianapolis","status":"IN_PROGRESS","deviceType":"FUELBAND","metricSummary":{"calories":358,"fuel":1249,"distance":1.348816156387329,"steps":1713,"duration":"7:12:00.000"},"tags":[],"metrics":[]},{"activityId":"f334bdf7-1e21-48e1-8c7c-ad38d122b294","activityType":"ALL_DAY","startTime":"2014-02-05T05:00:00Z","activityTimeZone":"America/Indiana/Indianapolis","status":"IN_PROGRESS","deviceType":"FUELBAND","metricSummary":{"calories":622,"fuel":2171,"distance":3.0338521003723145,"steps":3853,"duration":"9:50:00.000"},"tags":[],"metrics":[]}],"paging":{"next":"/me/sport/activities/FUELBAND?experienceType=FUELBAND&access_token=<ACCESS_TOKEN>&offset=6"}}'
34
+ http_version:
35
+ recorded_at: Sun, 02 Mar 2014 07:45:38 GMT
36
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,36 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.nike.com/me/sport/activities?access_token=<ACCESS_TOKEN>
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Appid:
11
+ - <APP_ID>
12
+ Accept:
13
+ - application/json
14
+ response:
15
+ status:
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ Content-Type:
20
+ - application/json;charset=UTF-8
21
+ Date:
22
+ - Fri, 14 Feb 2014 03:20:22 GMT
23
+ Server:
24
+ - Apache
25
+ X-Swooshlet:
26
+ - app-msp-api-0 prd sin-163-app-msp-api-0
27
+ Content-Length:
28
+ - '1838'
29
+ Connection:
30
+ - keep-alive
31
+ body:
32
+ encoding: UTF-8
33
+ string: '{"data":[{"activityId":"2bd0fec0-3955-450b-92dd-29426a19d2f5","activityType":"ALL_DAY","startTime":"2014-02-09T05:00:00Z","activityTimeZone":"America/Indiana/Indianapolis","status":"IN_PROGRESS","deviceType":"FUELBAND","metricSummary":{"calories":678,"fuel":2369,"distance":6.01494836807251,"steps":7639,"duration":"5:40:00.000"},"tags":[],"metrics":[]},{"activityId":"eb68365c-819e-4638-ad7b-57ff23f034ad","activityType":"ALL_DAY","startTime":"2014-02-08T05:00:00Z","activityTimeZone":"America/Indiana/Indianapolis","status":"IN_PROGRESS","deviceType":"FUELBAND","metricSummary":{"calories":527,"fuel":1839,"distance":2.8440887928009033,"steps":3612,"duration":"7:51:00.000"},"tags":[],"metrics":[]},{"activityId":"047eb85a-f60f-4c13-b6a9-392c3ef9ec98","activityType":"ALL_DAY","startTime":"2014-02-07T05:00:00Z","activityTimeZone":"America/Indiana/Indianapolis","status":"IN_PROGRESS","deviceType":"FUELBAND","metricSummary":{"calories":896,"fuel":3134,"distance":6.509435653686523,"steps":8267,"duration":"10:43:00.000"},"tags":[],"metrics":[]},{"activityId":"5bce184b-7ec4-4bd2-9681-79e40803093f","activityType":"ALL_DAY","startTime":"2014-02-06T05:00:00Z","activityTimeZone":"America/Indiana/Indianapolis","status":"IN_PROGRESS","deviceType":"FUELBAND","metricSummary":{"calories":358,"fuel":1249,"distance":1.348816156387329,"steps":1713,"duration":"7:12:00.000"},"tags":[],"metrics":[]},{"activityId":"f334bdf7-1e21-48e1-8c7c-ad38d122b294","activityType":"ALL_DAY","startTime":"2014-02-05T05:00:00Z","activityTimeZone":"America/Indiana/Indianapolis","status":"IN_PROGRESS","deviceType":"FUELBAND","metricSummary":{"calories":622,"fuel":2171,"distance":3.0338521003723145,"steps":3853,"duration":"9:50:00.000"},"tags":[],"metrics":[]}],"paging":{"next":"/me/sport/activities?access_token=<ACCESS_TOKEN>&offset=6"}}'
34
+ http_version:
35
+ recorded_at: Fri, 14 Feb 2014 03:20:23 GMT
36
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hash do
4
+
5
+ before :each do
6
+ @include_params = ["param1", "param3", "Param5", "PaRam6"]
7
+ @test_params = { "param1" => 1, "param2" => 2, "param3" => 3, "param4" => 4, "param5" => 5, "PaRam6" => 6}
8
+ end
9
+
10
+ it 'should include a new method called only' do
11
+ @test_params.should respond_to(:only)
12
+ end
13
+
14
+ it 'should accept an array as the parameter object' do
15
+ params = @test_params.only(@include_params)
16
+
17
+ params.should be_an_instance_of Hash
18
+ end
19
+
20
+ it 'should only include keys in argument passed in' do
21
+ params = @test_params.only(@include_params)
22
+
23
+ params.should have_key("param1")
24
+ params.should have_key("param3")
25
+ params.should have_key("PaRam6")
26
+ end
27
+
28
+ it 'should not include keys that argument is missing' do
29
+ params = @test_params.only(@include_params)
30
+
31
+ params.should_not have_key("param2")
32
+ params.should_not have_key("param4")
33
+ params.should_not have_key("PaRam5")
34
+ end
35
+
36
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe NikePlusGem::Helpers do
4
+
5
+ it 'should return a string object' do
6
+ date_value = "2013/06/21"
7
+ date = NikePlusGem::Helpers.format_date(date_value)
8
+
9
+ date.should.instance_of? String
10
+ end
11
+
12
+ it 'should accept a string in the correct format' do
13
+ date_value = "2013/06/21"
14
+ date = NikePlusGem::Helpers.format_date(date_value)
15
+
16
+ date.should.eql? "2013/06/21"
17
+ end
18
+
19
+ it 'should error on a string in the incorrect format' do
20
+ date_value = "13/06/21"
21
+ date = NikePlusGem::Helpers.format_date(date_value)
22
+
23
+ date.should.eql? "ERROR"
24
+ end
25
+
26
+ it 'should accept a Date object' do
27
+ date_value = Date.new(2013,6,21)
28
+ date = NikePlusGem::Helpers.format_date(date_value)
29
+
30
+ date.should.eql? "2013/06/21"
31
+ end
32
+
33
+ describe "#merge_required_headers" do
34
+ it 'should include the App ID key in the header hash' do
35
+ headers = NikePlusGem::Helpers.merge_required_headers("appIdValue", {"test" => "value", "test2" => "value2"})
36
+ headers.should have_key("appid")
37
+ end
38
+
39
+ it 'should include the Accept key in the header hash' do
40
+ headers = NikePlusGem::Helpers.merge_required_headers("appIdValue", {"test" => "value", "test2" => "value2"})
41
+ headers.should have_key("Accept")
42
+ end
43
+
44
+ it 'should include the two keys passed in' do
45
+ headers = NikePlusGem::Helpers.merge_required_headers("appIdValue", {"test" => "value", "test2" => "value2"})
46
+ headers.should have_key("test")
47
+ headers.should have_key("test2")
48
+ end
49
+
50
+ it 'should set app_id to appIdValue' do
51
+ headers = NikePlusGem::Helpers.merge_required_headers("appIdValue", {"test" => "value", "test2" => "value2"})
52
+ headers.should have_key("appid")
53
+ headers["appid"].should.eql?("appIdValue")
54
+ end
55
+ end
56
+
57
+ describe "#merge_required_qs_params" do
58
+ it 'should include the Access Token key in the hash' do
59
+ query_string_params = NikePlusGem::Helpers.merge_required_qs_params("accessTokenValue", {"test" => "one"})
60
+ query_string_params.should have_key("access_token")
61
+ query_string_params.should have_key("test")
62
+ end
63
+
64
+ it 'should set access_token to accessTokenValue' do
65
+ query_string_params = NikePlusGem::Helpers.merge_required_qs_params("accessTokenValue", {"test" => "value"})
66
+ query_string_params.should have_key("access_token")
67
+ query_string_params["access_token"].should.eql?("accessTokenValue")
68
+ end
69
+ end
70
+
71
+ end
@@ -0,0 +1,11 @@
1
+ require_relative '../lib/nikeplusgem'
2
+
3
+ require 'webmock/rspec'
4
+ require 'vcr'
5
+
6
+ VCR.configure do |c|
7
+ c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
8
+ c.hook_into :webmock
9
+ c.filter_sensitive_data('<ACCESS_TOKEN>') { '12345' }
10
+ c.filter_sensitive_data('<APP_ID>') { 'abcde' }
11
+ end
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nikeplusgem
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Rob Shaw
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: vcr
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: yard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: 1.8.0
76
+ - - <
77
+ - !ruby/object:Gem::Version
78
+ version: 1.16.0
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - '>='
84
+ - !ruby/object:Gem::Version
85
+ version: 1.8.0
86
+ - - <
87
+ - !ruby/object:Gem::Version
88
+ version: 1.16.0
89
+ - !ruby/object:Gem::Dependency
90
+ name: httparty
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ description: A client library to retrieve data from the Nike+ Developer Resources
104
+ API.
105
+ email:
106
+ - rob@borwahs.com
107
+ executables: []
108
+ extensions: []
109
+ extra_rdoc_files: []
110
+ files:
111
+ - ./Gemfile
112
+ - ./Gemfile.lock
113
+ - ./lib/nikeplusgem/activity_data.rb
114
+ - ./lib/nikeplusgem/aggregate_sport.rb
115
+ - ./lib/nikeplusgem/client.rb
116
+ - ./lib/nikeplusgem/errors.rb
117
+ - ./lib/nikeplusgem/experience_type.rb
118
+ - ./lib/nikeplusgem/extensions.rb
119
+ - ./lib/nikeplusgem/helpers.rb
120
+ - ./lib/nikeplusgem/list_activities.rb
121
+ - ./lib/nikeplusgem/version.rb
122
+ - ./lib/nikeplusgem.rb
123
+ - ./LICENSE
124
+ - ./nikeplusgem-0.0.1.gem
125
+ - ./nikeplusgem-0.1.0.gem
126
+ - ./nikeplusgem.gemspec
127
+ - ./Rakefile
128
+ - ./readme.markdown
129
+ - ./spec/client_spec.rb
130
+ - ./spec/endpoints_spec.rb
131
+ - ./spec/fixtures/vcr_cassettes/activity_data.yml
132
+ - ./spec/fixtures/vcr_cassettes/aggregate_sport.yml
133
+ - ./spec/fixtures/vcr_cassettes/experience_type.yml
134
+ - ./spec/fixtures/vcr_cassettes/list_activities.yml
135
+ - ./spec/hash_extension_spec.rb
136
+ - ./spec/helpers_spec.rb
137
+ - ./spec/spec_helper.rb
138
+ homepage: https://github.com/borwahs/nikeplusgem/
139
+ licenses:
140
+ - MIT
141
+ metadata: {}
142
+ post_install_message:
143
+ rdoc_options: []
144
+ require_paths:
145
+ - lib
146
+ required_ruby_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ required_rubygems_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - '>='
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ requirements: []
157
+ rubyforge_project:
158
+ rubygems_version: 2.1.11
159
+ signing_key:
160
+ specification_version: 4
161
+ summary: Nike+ Gem
162
+ test_files:
163
+ - ./spec/client_spec.rb
164
+ - ./spec/endpoints_spec.rb
165
+ - ./spec/fixtures/vcr_cassettes/activity_data.yml
166
+ - ./spec/fixtures/vcr_cassettes/aggregate_sport.yml
167
+ - ./spec/fixtures/vcr_cassettes/experience_type.yml
168
+ - ./spec/fixtures/vcr_cassettes/list_activities.yml
169
+ - ./spec/hash_extension_spec.rb
170
+ - ./spec/helpers_spec.rb
171
+ - ./spec/spec_helper.rb
172
+ has_rdoc: