nike_v2 0.1.2 → 0.2.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/lib/ext/core_ext.rb CHANGED
@@ -6,4 +6,23 @@ class String
6
6
  tr("-", "_").
7
7
  downcase
8
8
  end
9
+ def camelize(first_letter_in_uppercase = false)
10
+ lower_case_and_underscored_word = self.to_s
11
+ if first_letter_in_uppercase
12
+ lower_case_and_underscored_word.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
13
+ else
14
+ lower_case_and_underscored_word[0].downcase + lower_case_and_underscored_word.camelize[1..-1]
15
+ end
16
+ end
17
+ end
18
+
19
+ class Symbol
20
+ def camelize(first_letter_in_uppercase = false)
21
+ lower_case_and_underscored_word = self.to_s
22
+ if first_letter_in_uppercase
23
+ lower_case_and_underscored_word.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }.to_sym
24
+ else
25
+ (lower_case_and_underscored_word[0].downcase + lower_case_and_underscored_word.camelize[1..-1]).to_sym
26
+ end
27
+ end
9
28
  end
@@ -4,38 +4,69 @@ module NikeV2
4
4
  include Enumerable
5
5
  extend Forwardable
6
6
 
7
- def_delegators :@activities_array, :[]=, :<<, :[], :count, :length, :each, :first, :last
7
+ API_ARGS = [:offset, :count, :start_date, :end_date]
8
+
9
+ def_delegators :@activities_array, :[]=, :<<, :[], :count, :length, :each, :first, :last, :collect
8
10
  def_delegator :@person, :access_token
9
11
 
10
12
  API_URL = '/me/sport/activities'
11
13
 
12
14
  def initialize(attributes = {})
13
15
  raise "#{self.class} requires a person." unless attributes.keys.include?(:person)
16
+ @build_metrics = attributes.delete(:build_metrics) || false
17
+ api_args = extract_api_args(attributes)
14
18
  set_attributes(attributes)
15
19
  @activities_array = []
16
20
 
17
- #TODO: make it pass blocks
18
- activities = fetch_data
19
- build_activities(activities.delete('data'))
20
21
 
21
- super(activities)
22
+ #TODO: make it pass blocks
23
+ activities = fetch_data(api_args)
24
+ if !activities.nil? && !activities['data'].nil?
25
+ build_activities(activities.delete('data'))
26
+ super(activities)
27
+ end
22
28
  end
23
29
 
24
30
  def fetch_more
25
31
  unless self.paging['next'].blank?
26
- url, query = self.paging['next'].match(/^(.*?)\?(.*)$/)[1,2]
27
- query = query.split(/&/).inject({}){|h,item| k, v = item.split(/\=/); h[k] = v;h}
28
- activities = fetch_data(url, {query: query})
29
- build_activities(activities.delete('data'))
30
- self.paging = activities.delete['paging']
32
+ fetch_and_build_activities
33
+ end
34
+ end
35
+
36
+ def fetch_all
37
+ until self.paging['next'].blank? do
38
+ fetch_and_build_activities
31
39
  end
32
40
  end
33
41
 
42
+ def fuelpoints_during(start_time, end_time)
43
+ #reject activities that are not on the right date
44
+ end
45
+
34
46
  private
35
47
  def build_activities(data)
36
- data.each do |activity|
37
- self << NikeV2::Activity.new({:person => self}.merge(activity))
48
+ if data
49
+ data.each do |activity|
50
+ self << NikeV2::Activity.new({:person => self}.merge(activity))
51
+ end
52
+ end
53
+ if @build_metrics
54
+ self.collect(&:load_data)
38
55
  end
56
+
57
+ end
58
+
59
+ def extract_api_args(args)
60
+ args.inject({}){|h,a| h[a.first.camelize] = a.last if API_ARGS.include?(a.first); h}
61
+ end
62
+
63
+ def fetch_and_build_activities
64
+ url, query = self.paging['next'].match(/^(.*?)\?(.*)$/)[1,2]
65
+ query = query.split(/&/).inject({}){|h,item| k, v = item.split(/\=/); h[k] = v;h}
66
+ activities = fetch_data(url, {query: query})
67
+ build_activities(activities.delete('data'))
68
+
69
+ @paging = activities.delete('paging')
39
70
  end
40
71
  end
41
72
  end
@@ -1,13 +1,23 @@
1
+ require 'nike_v2/metrics'
1
2
  module NikeV2
2
3
  class Activity < Resource
3
4
  extend Forwardable
4
5
  def_delegator :@person, :access_token
5
6
 
7
+ Metrics::METRIC_TYPES.each do |type|
8
+ self.class_eval do
9
+ def_delegator :metrics, "total_#{type.downcase}"
10
+ def_delegator :metrics, type.downcase
11
+ def_delegator :metrics, "total_#{type.downcase}_during"
12
+ end
13
+ end
14
+
6
15
  API_URL = '/me/sport/activities'
7
16
 
8
17
  def initialize(attributes = {})
9
18
  raise "#{self.class} requires s person." unless attributes.keys.include?(:person)
10
19
  raise "#{self.class} requires an activityId." unless attributes.keys.include?('activityId')
20
+
11
21
  super(attributes)
12
22
  end
13
23
 
@@ -16,6 +26,7 @@ module NikeV2
16
26
  end
17
27
 
18
28
  def metrics
29
+ load_data unless @metrics
19
30
  @metrics
20
31
  end
21
32
 
@@ -5,7 +5,7 @@ module NikeV2
5
5
  @activity = activity
6
6
  @unit = data['intervalUnit']
7
7
  @type = data ['metricType']
8
- @values = data['values']
8
+ @values = data['values'].collect(&:to_f)
9
9
  end
10
10
 
11
11
  def type
@@ -21,7 +21,7 @@ module NikeV2
21
21
  end
22
22
 
23
23
  def total_during(start, stop)
24
- during(start, stop).collect(&:to_i).inject(:+)
24
+ during(start, stop).collect(&:to_f).inject(:+) rescue 0
25
25
  end
26
26
 
27
27
  def during(start, stop)
@@ -31,7 +31,7 @@ module NikeV2
31
31
  private
32
32
  def time_to_index(time)
33
33
  difference = time.to_i - @activity.started_at.to_i
34
- difference.seconds.to.send(@unit.downcase).to_s.to_i
34
+ difference.s.to.send(@unit.downcase).to_s.to_i
35
35
  end
36
36
  end
37
37
  end
@@ -6,22 +6,20 @@ module NikeV2
6
6
 
7
7
  def_delegators :@metrics_array, :[]=, :<<, :[], :count, :length, :each, :first, :last
8
8
 
9
+ METRIC_TYPES = %w(FUEL CALORIES DISTANCE STEPS)
10
+
9
11
  def initialize(activity, data_set)
10
12
  @activity = activity
11
13
  @metrics_array = []
12
14
  build_metrics(data_set)
13
15
  end
14
16
 
15
- def fuel_points
16
- @fuel_points ||= sum_of_type('FUELPOINTS')
17
- end
18
-
19
- def calories
20
- @fuel_points ||= sum_of_type('CALORIES')
21
- end
17
+ METRIC_TYPES.each do |type|
18
+ method_var_name = 'total_' + type.downcase
19
+ instance_variable_set('@' + method_var_name, 0.00)
20
+ define_method(method_var_name){ ivar = instance_variable_get('@' + method_var_name); ivar ||= sum_of_type(type)}
22
21
 
23
- def distance
24
- @fuel_points ||= sum_of_type('DISTANCE')
22
+ define_method(method_var_name + '_during'){|*args| sum_of_type_during(type, *args)}
25
23
  end
26
24
 
27
25
  private
@@ -34,5 +32,9 @@ module NikeV2
34
32
  def sum_of_type(type)
35
33
  @metrics_array.select{|m| m.type == type}.collect(&:total).inject(:+) || 0.00
36
34
  end
35
+
36
+ def sum_of_type_during(type, *args)
37
+ @metrics_array.select{|m| m.type == type}.collect{|m| m.total_during(*args)}.inject(:+) || 0.00
38
+ end
37
39
  end
38
40
  end
@@ -7,11 +7,11 @@ module NikeV2
7
7
  end
8
8
 
9
9
  def summary
10
- @summary ||= NikeV2::Summary.new(:person => self)
10
+ NikeV2::Summary.new(:person => self)
11
11
  end
12
12
 
13
- def activities
14
- @activities ||= NikeV2::Activities.new(:person => self)
13
+ def activities(args = {})
14
+ NikeV2::Activities.new(args.merge(:person => self))
15
15
  end
16
16
 
17
17
  end
@@ -4,13 +4,20 @@ module NikeV2
4
4
 
5
5
  base_uri 'https://api.nike.com'
6
6
 
7
+ RESP_MSG_INVALID_TOKEN = 'invalid_token'
8
+
7
9
  def initialize(attributes={})
8
10
  super(attributes)
9
11
  end
10
12
 
11
13
  def fetch_data(*args)
12
- args << api_url if args.empty?
13
- get(*args).parsed_response
14
+ args.unshift(api_url)
15
+ resp = get(*args).parsed_response
16
+
17
+ if !resp['error'].nil? && resp['error'] == RESP_MSG_INVALID_TOKEN
18
+ raise "#{self.class} invalid or expired token, can not fetch data from server."
19
+ end
20
+ resp
14
21
  end
15
22
 
16
23
  def get(*args, &block)
@@ -21,14 +28,13 @@ module NikeV2
21
28
  private
22
29
 
23
30
  def build_options(args)
24
- query = { 'access_token' => access_token }
31
+ query = has_options?(args) ? args.pop : {}
32
+
33
+ query.merge!('access_token' => access_token)
25
34
  headers = { 'Accept' => 'application/json', 'appid' => app_id }
26
35
  options = { query: query, headers: headers }
27
- if has_options?(args)
28
- args[-1] = options.merge(args.last)
29
- else
30
- args << options
31
- end
36
+
37
+ args << options
32
38
  end
33
39
 
34
40
 
@@ -14,11 +14,18 @@ module NikeV2
14
14
  private
15
15
  def initialize_data
16
16
  fuel_data = fetch_data
17
- initialization_data = {
18
- 'activity_types' => fuel_data['experienceTypes'].collect{|a| ExperienceType.new(a)}
19
- }
20
- fuel_data['summaries'].each do |data|
21
- initialization_data[data['experienceType'].downcase] = data['records']
17
+ initialization_data = {}
18
+ if fuel_data
19
+ if fuel_data.has_key?('experienceTypes')
20
+ initialization_data = {
21
+ 'activity_types' => fuel_data['experienceTypes'].collect{|a| ExperienceType.new(a)}
22
+ }
23
+ end
24
+ if fuel_data.has_key?('summaries')
25
+ fuel_data['summaries'].each do |data|
26
+ initialization_data[data['experienceType'].downcase] = data['records']
27
+ end
28
+ end
22
29
  end
23
30
 
24
31
  initialization_data
@@ -0,0 +1,3 @@
1
+ module NikeV2
2
+ VERSION = '0.2.0'
3
+ end
data/lib/nike_v2.rb CHANGED
@@ -1,18 +1,17 @@
1
+ require 'nike_v2/version'
2
+
1
3
  require 'httparty'
2
4
  require 'forwardable'
3
5
  require 'alchemist'
4
6
  require 'ext/core_ext'
7
+
5
8
  require 'nike_v2/base'
9
+ require 'nike_v2/metric'
10
+ require 'nike_v2/metrics'
6
11
  require 'nike_v2/experience_type'
7
12
  require 'nike_v2/resource'
8
13
  require 'nike_v2/person'
9
- require 'nike_v2/activities'
10
14
  require 'nike_v2/activity'
15
+ require 'nike_v2/activities'
11
16
  require 'nike_v2/summary'
12
- require 'nike_v2/gps_data'
13
- require 'nike_v2/metrics'
14
- require 'nike_v2/metric'
15
-
16
- module NikeV2
17
- VERSION = '0.1.2'
18
- end
17
+ require 'nike_v2/gps_data'
@@ -33,4 +33,70 @@ http_interactions:
33
33
  string: ! '{"data":[{"activityId":"91b501dc-4a38-44aa-b537-6095418713d8","calories":2475,"fuel":7500,"distance":19.665315,"steps":24975,"duration":"0:01:00.0000","activityType":"ALL_DAY","startTime":"2012-02-26T08:00:00Z","activityTimeZone":"America/Los_Angeles","status":"COMPLETE","deviceType":"FUELBAND","tags":[],"streams":[]},{"activityId":"8554c3bb-f985-4700-a52d-6235475a10f0","calories":1848,"fuel":5555,"distance":14.6834352,"steps":18648,"duration":"0:01:00.0000","activityType":"ALL_DAY","startTime":"2012-02-25T08:00:00Z","activityTimeZone":"America/Los_Angeles","status":"COMPLETE","deviceType":"FUELBAND","tags":[],"streams":[]},{"activityId":"b7511567-9414-429a-9b7b-40ebc15af985","calories":396,"fuel":1200,"distance":3.1464504,"steps":3996,"duration":"0:01:00.0000","activityType":"ALL_DAY","startTime":"2012-02-24T08:00:00Z","activityTimeZone":"America/Los_Angeles","status":"COMPLETE","deviceType":"FUELBAND","tags":[],"streams":[]},{"activityId":"b87bb409-a618-47ee-a75e-1bb5f8daf9a6","calories":300,"fuel":900,"distance":2.3621999999999996,"steps":3000,"duration":"0:01:00.0000","activityType":"ALL_DAY","startTime":"2012-02-23T08:00:00Z","activityTimeZone":"America/Los_Angeles","status":"COMPLETE","deviceType":"FUELBAND","tags":[],"streams":[]},{"activityId":"6c6eb89c-fa42-49a6-8b04-2596297a7c3a","calories":200,"fuel":600,"distance":1.5748,"steps":2000,"duration":"0:01:00.0000","activityType":"ALL_DAY","startTime":"2012-02-22T08:00:00Z","activityTimeZone":"America/Los_Angeles","status":"COMPLETE","deviceType":"FUELBAND","tags":[],"streams":[]}],"paging":{"next":"/me/sport/activities?access_token=68d1b7f5ec3e6a1ad3b349cd73983b34&amp;offset=6&amp;count=5","previous":null}}'
34
34
  http_version:
35
35
  recorded_at: Sun, 20 Jan 2013 04:21:05 GMT
36
+ - request:
37
+ method: get
38
+ uri: https://api.nike.com/me/sport/activities?access_token=foobar&count=1
39
+ body:
40
+ encoding: US-ASCII
41
+ string: ''
42
+ headers:
43
+ Accept:
44
+ - application/json
45
+ Appid:
46
+ - nike
47
+ response:
48
+ status:
49
+ code: 200
50
+ message: OK
51
+ headers:
52
+ Content-Type:
53
+ - application/json;charset=UTF-8
54
+ Date:
55
+ - Sun, 20 Jan 2013 04:21:04 GMT
56
+ Server:
57
+ - Apache
58
+ X-Swooshlet:
59
+ - app-msp-api-0 prd sin-82-app-msp-api-0
60
+ Content-Length:
61
+ - '340'
62
+ Connection:
63
+ - keep-alive
64
+ body:
65
+ encoding: US-ASCII
66
+ string: ! '{ "data": [ { "activityId": "c3337642-72db-41f7-b4a2-4da4600dfc9f", "calories": 581, "fuel": 1653, "distance": 2.0936965942382812, "steps": 2659, "duration": "7:02:00.000", "activityType": "ALL_DAY", "startTime": "2013-02-26T07:00:00Z", "activityTimeZone": "America/Phoenix", "status": "IN_PROGRESS", "deviceType": "FUELBAND", "tags": [], "metrics": [] } ], "paging": { "next": "/me/sport/activities?count=1&access_token=2159f27a88a8cc3b410e1529412b86f5&offset=2" } }'
67
+ http_version:
68
+ recorded_at: Wed, 27 Feb 2013 16:18:07 GMT
69
+ - request:
70
+ method: get
71
+ uri: https://api.nike.com/me/sport/activities?access_token=foobar&startDate=2013-01-01
72
+ body:
73
+ encoding: US-ASCII
74
+ string: ''
75
+ headers:
76
+ Accept:
77
+ - application/json
78
+ Appid:
79
+ - nike
80
+ response:
81
+ status:
82
+ code: 200
83
+ message: OK
84
+ headers:
85
+ Content-Type:
86
+ - application/json;charset=UTF-8
87
+ Date:
88
+ - Sun, 20 Jan 2013 04:21:04 GMT
89
+ Server:
90
+ - Apache
91
+ X-Swooshlet:
92
+ - app-msp-api-0 prd sin-82-app-msp-api-0
93
+ Content-Length:
94
+ - '340'
95
+ Connection:
96
+ - keep-alive
97
+ body:
98
+ encoding: US-ASCII
99
+ string: ! '{ "data": [ { "activityId": "c3337642-72db-41f7-b4a2-4da4600dfc9f", "calories": 581, "fuel": 1653, "distance": 2.0936965942382812, "steps": 2659, "duration": "7:02:00.000", "activityType": "ALL_DAY", "startTime": "2013-01-01T07:00:00Z", "activityTimeZone": "America/Phoenix", "status": "IN_PROGRESS", "deviceType": "FUELBAND", "tags": [], "metrics": [] } ], "paging": { "next": "/me/sport/activities?startDate=2013-01-01&access_token=2159f27a88a8cc3b410e1529412b86f5&offset=2" } }'
100
+ http_version:
101
+ recorded_at: Wed, 27 Feb 2013 16:18:07 GMT
36
102
  recorded_with: VCR 2.4.0
@@ -30,7 +30,7 @@ http_interactions:
30
30
  - keep-alive
31
31
  body:
32
32
  encoding: US-ASCII
33
- string: ! '{ "activityId": "91b501dc-4a38-44aa-b537-6095418713d8", "calories": 257, "fuel": 662, "distance": 3.1317999362945557, "steps": 10, "duration": "0:14:31.000", "activityType": "RUN", "startTime": "2011-08-11T02:44:39Z", "activityTimeZone": "GMT-08:00", "status": "COMPLETE", "deviceType": "SPORTWATCH", "tags": [ { "tagType": "NOTE", "value": "text string" }, { "tagType": "COURT", "value": "DUNK" }, { "tagType": "TERRAIN", "value": "TRAIL" }, { "tagType": "EMOTION", "value": "HAPPY" }, { "tagType": "SHOES", "value": "AirMax" }, { "tagType": "WEATHER", "value": "RAINY" } ], "metrics": [ { "intervalMetric": 10, "intervalUnit": "SEC", "metricType": "DISTANCE", "values": [ 0.0299, 0.0562, 0.0794, 0.114, 3.0967, 3.1296 ] }, { "intervalMetric": 1, "intervalUnit": "MIN", "metricType": "FUEL", "values": [ "21", "8", "21", "3", "19", "19", "8", "25", "8", "3", "16", "14", "23", "26", "28", "24", "14", "19", "16", "0", "2", "20", "22", "3", "21", "7", "24", "26", "25", "8", "21", "22", "20", "6", "22", "17", "15", "2", "22", "4", "18", "16", "9", "10", "0", "24", "7", "25", "9", "8", "15", "3", "7", "12", "22", "18", "13", "28", "15", "0", "22", "24", "16", "14", "12", "14", "18", "5", "8", "24", "9", "18", "25", "15", "6", "3", "28", "5", "8", "6", "19", "6", "18", "18", "21", "24", "26", "0", "24", "12", "5", "11", "3", "12", "22", "22", "22", "23", "1", "1", "16", "6", "26", "14", "11", "23", "15", "4", "13", "2", "3", "28", "2", "7", "9", "0", "4", "25", "18", "10", "25", "3", "23", "27", "10", "20", "2", "15", "23", "1", "21", "14", "4", "1", "26", "20", "20", "28", "24", "18", "9", "24", "23", "16", "0", "11", "14", "14", "12", "15", "12", "3", "14", "21", "17", "22", "28", "28", "27", "21", "15", "25", "24", "2", "25", "21", "20", "3", "20", "6", "2", "6", "1", "25", "20", "20", "23", "9", "8", "17", "5", "15", "2", "15", "21", "21", "25", "13", "10", "22", "10", "6", "25", "27", "6", "24", "0", "20", "27", "12", "23", "7", "20", "11", "15", "23", "20", "21", "24", "25", "21", "20", "12", "7", "16", "24", "16", "26", "15", "16", "15", "7", "11", "17", "26", "24", "17", "25", "12", "23", "12", "5", "23", "7", "11", "1", "6", "14", "18", "14", "8", "11", "13", "0", "17", "15", "26", "25", "0", "17", "27", "6", "14", "19", "16", "12", "15", "1", "12", "15", "12", "0", "7", "16", "12", "22", "10", "14", "27", "9", "6", "16", "4", "18", "18", "19", "16", "7", "12", "12", "4", "17", "25", "20", "28", "7", "9", "5", "2", "14", "7", "28", "11", "11", "3", "25", "13", "1", "15", "3", "27", "8", "6", "17", "24", "6", "19", "25", "2", "3", "12", "2", "18", "15", "25", "25", "26", "28", "22", "18", "0", "0", "24", "25", "7", "2", "28", "0", "21", "23", "26", "25", "7", "22", "27", "11", "4", "15", "12", "3", "2", "26", "6", "13", "26", "1", "18", "14", "22", "9", "9", "1", "19", "12", "27", "10", "6", "6", "25", "1", "21", "21", "6", "20", "22", "1", "3", "8", "1", "7", "11", "10", "16", "5", "14", "19", "21", "23", "3", "3", "4", "10", "20", "6", "1", "19", "0", "8", "28", "10", "19", "14", "17", "3", "13", "7", "24", "26", "8", "1", "27", "5", "2", "9", "13", "0", "20", "9", "23", "13", "27", "13", "1", "2", "12", "13", "17", "20", "21", "22", "1", "13", "14", "2", "16", "12", "9", "19", "10", "2", "28", "27", "23", "25", "27", "9", "28", "25", "3", "28", "13", "18", "3", "25", "25", "3", "10", "20", "5", "27", "14", "24", "10", "4", "11", "16", "11", "6", "16", "24", "20", "14", "23", "8", "13", "5", "25", "7", "11", "23", "10", "0", "27", "1", "22", "28", "26", "13", "16", "23", "13", "2", "22", "23", "25", "2", "7", "1", "9", "28", "13", "24", "16", "1", "24", "4", "21", "25", "12", "7", "26", "0", "1", "13", "23", "12", "2", "4", "1", "12", "23", "12", "21", "21", "2", "10", "5", "16", "1", "17", "1", "2", "4", "1", "27", "14", "12", "13", "27", "28", "8", "21", "18", "6", "15", "10", "12", "7", "0", "26", "4", "12", "1", "1", "20", "22", "10", "19", "27", "16", "7", "24", "14", "25", "0", "10", "5", "5", "8", "5", "3", "16", "15", "6", "7", "5", "14", "6", "11", "18", "17", "11", "7", "7", "2", "24", "11", "13", "17", "26", "6", "13", "9", "16", "18", "3", "12", "14", "3", "13", "11", "20", "8", "18", "12", "0", "3", "22", "17", "4", "0", "8", "3", "21", "28", "5", "14", "8", "20", "17", "24", "15", "7", "1", "1", "27", "12", "12", "4", "4", "27", "25", "0", "5", "9", "2", "9", "26", "13", "11", "9", "21", "14", "27", "28", "25", "10", "17", "5", "18", "10", "3", "13", "14", "28", "9", "9", "22", "20", "0", "28", "25", "25", "14", "18", "7", "28", "28", "16", "13", "2", "21", "24", "19", "16", "27", "5", "9", "22", "11", "24", "24", "12", "18", "10", "6", "2", "18", "8", "27", "8", "10", "5", "2", "7", "21", "4", "7", "13", "27", "20", "25", "19", "4", "9", "28", "11", "15", "13", "17", "7", "12", "27", "6", "3", "15", "22", "14", "2", "17", "21", "16", "17", "7", "10", "24", "26", "16", "11", "27", "11", "28", "25", "27", "9", "3", "19", "20", "23", "4", "24", "27", "14", "20", "15", "15", "3", "22", "18", "9", "17", "22", "16", "28", "1", "14", "13", "8", "21", "25", "16", "24", "16", "15", "16", "13", "17", "8", "24", "0", "19", "5", "18", "18", "3", "16", "18", "10", "22", "3", "24", "27", "15", "28", "9", "17", "24", "15", "3", "15", "16", "24", "25", "25", "28", "20", "10", "19", "1", "12", "12", "28", "23", "17", "24", "4", "10", "25", "19", "25", "5", "5", "10", "23", "17", "18", "17", "4", "5", "26", "27", "6", "9", "23", "3", "5", "12", "21", "22", "7", "4", "22", "10", "4", "14", "23", "9", "20", "26", "2", "5", "21", "4", "11", "18", "19", "14", "21", "16", "9", "13", "0", "14", "19", "14", "2", "10", "9", "4", "23", "8", "0", "10", "12", "24", "6", "3", "1", "20", "28", "24", "11", "5", "14", "23", "0", "20", "24", "4", "6", "5", "21", "13", "5", "28", "9", "11", "5", "12", "1", "10", "8", "24", "23", "28", "14", "2", "2", "10", "3", "21", "23", "2", "0", "12", "20", "20", "17", "18", "27", "20", "0", "27", "28", "11", "15", "5", "0", "1", "4", "3", "21", "22", "22", "22", "1", "7", "19", "8", "6", "11", "5", "19", "16", "6", "11", "20", "23", "5", "25", "27", "16", "5", "18", "17", "18", "25", "11", "25", "5", "16", "13", "16", "8", "7", "0", "13", "27", "14", "20", "26", "26", "11", "12", "16", "25", "6", "24", "16", "20", "26", "14", "22", "16", "12", "21", "23", "15", "20", "24", "23", "14", "10", "1", "11", "0", "16", "15", "9", "24", "14", "11", "9", "21", "18", "13", "26", "4", "16", "7", "16", "14", "11", "6", "13", "2", "6", "19", "21", "4", "4", "14", "22", "28", "23", "1", "2", "11", "24", "13", "20", "7", "28", "15", "6", "14", "25", "5", "21", "17", "25", "23", "18", "4", "11", "28", "5", "24", "19", "17", "4", "1", "1", "9", "15", "16", "12", "26", "4", "12", "21", "9", "11", "4", "19", "13", "25", "11", "13", "3", "10", "13", "22", "21", "22", "5", "18", "9", "18", "26", "15", "9", "12", "3", "27", "25", "19", "11", "28", "23", "19", "2", "16", "18", "21", "26", "28", "25", "18", "23", "23", "5", "22", "13", "15", "12", "24", "25", "20", "9", "16", "13", "21", "15", "17", "25", "11", "21", "21", "13", "25", "24", "26", "12", "1", "28", "6", "19", "19", "22", "15", "9", "0", "16", "0", "4", "8", "4", "8", "7", "21", "23", "15", "19", "5", "13", "19", "19", "22", "14", "8", "2", "4", "15", "27", "19", "21", "27", "1", "7", "5", "15", "15", "6", "25", "11", "7", "19", "17", "17", "3", "10", "26", "1", "25", "6", "0", "20", "0", "23", "20", "0", "13", "27", "2", "12", "4", "16", "13", "22", "19", "15", "11", "27", "21", "26", "26", "9", "8", "24", "10", "20", "21", "7", "17", "28", "21", "19", "3", "21", "7", "9", "21", "6", "13", "26", "20", "6", "7", "4", "0", "7", "17", "12", "21", "12", "14", "17", "21", "4", "12", "8", "20", "2", "4", "6", "23", "27", "16", "16", "19", "10", "14", "9", "8", "14", "18", "19", "22", "21", "24", "0", "14", "15", "17", "10", "17", "28", "27", "26", "16", "10", "14", "6", "25", "20", "22", "26", "5", "0", "26", "1", "16", "4", "1", "13", "24", "9", "25", "19", "26", "16", "27", "28", "5", "8", "27", "9", "16", "24", "2", "3", "23", "15", "10", "17", "11", "24", "1", "2", "19", "5", "25", "27", "16", "17", "27", "15", "15", "27", "8", "2", "7", "25", "14", "3", "12", "16", "17", "20", "19", "9", "11", "1", "22", "13", "7", "7", "21", "18", "15", "14", "18", "23", "5", "11", "17", "15", "7", "17", "17", "15", "16", "17", "4", "10", "21", "13", "25", "0", "17", "17", "5", "15", "27", "25", "24", "5", "0", "18", "8", "6", "25", "25", "20", "27", "21", "25", "3", "5", "0", "13", "6", "7", "9", "7", "19", "13", "13", "4", "24", "0", "23", "17", "0", "7", "1", "16", "4", "21", "10", "23", "6", "12", "21", "1", "5", "11", "25", "8", "15", "26", "3", "2", "0", "22", "16", "8", "19", "16", "2", "9", "28", "14", "9", "15", "1", "8", "18", "9", "4", "9", "19", "18", "16", "28", "4", "10", "23", "22", "9", "21", "25", "8", "9", "16", "16", "21", "18", "8", "20", "17", "3", "15", "23", "16", "24", "10", "10", "28", "27", "18", "4", "25", "22", "19", "11", "2", "23" ] } ] }'
33
+ string: ! '{ "activityId": "91b501dc-4a38-44aa-b537-6095418713d8", "calories": 257, "fuel": 662, "distance": 3.1317999362945557, "steps": 10, "duration": "0:14:31.000", "activityType": "RUN", "startTime": "2011-08-11T00:00:00Z", "activityTimeZone": "GMT-08:00", "status": "COMPLETE", "deviceType": "SPORTWATCH", "tags": [ { "tagType": "NOTE", "value": "text string" }, { "tagType": "COURT", "value": "DUNK" }, { "tagType": "TERRAIN", "value": "TRAIL" }, { "tagType": "EMOTION", "value": "HAPPY" }, { "tagType": "SHOES", "value": "AirMax" }, { "tagType": "WEATHER", "value": "RAINY" } ], "metrics": [ { "intervalMetric": 10, "intervalUnit": "SEC", "metricType": "DISTANCE", "values": [ 0.0299, 0.0562, 0.0794, 0.114, 3.0967, 3.1296 ] }, { "intervalMetric": 1, "intervalUnit": "MIN", "metricType": "FUEL", "values": [ "21", "8", "21", "3", "19", "19", "8", "25", "8", "3", "16", "14", "23", "26", "28", "24", "14", "19", "16", "0", "2", "20", "22", "3", "21", "7", "24", "26", "25", "8", "21", "22", "20", "6", "22", "17", "15", "2", "22", "4", "18", "16", "9", "10", "0", "24", "7", "25", "9", "8", "15", "3", "7", "12", "22", "18", "13", "28", "15", "0", "22", "24", "16", "14", "12", "14", "18", "5", "8", "24", "9", "18", "25", "15", "6", "3", "28", "5", "8", "6", "19", "6", "18", "18", "21", "24", "26", "0", "24", "12", "5", "11", "3", "12", "22", "22", "22", "23", "1", "1", "16", "6", "26", "14", "11", "23", "15", "4", "13", "2", "3", "28", "2", "7", "9", "0", "4", "25", "18", "10", "25", "3", "23", "27", "10", "20", "2", "15", "23", "1", "21", "14", "4", "1", "26", "20", "20", "28", "24", "18", "9", "24", "23", "16", "0", "11", "14", "14", "12", "15", "12", "3", "14", "21", "17", "22", "28", "28", "27", "21", "15", "25", "24", "2", "25", "21", "20", "3", "20", "6", "2", "6", "1", "25", "20", "20", "23", "9", "8", "17", "5", "15", "2", "15", "21", "21", "25", "13", "10", "22", "10", "6", "25", "27", "6", "24", "0", "20", "27", "12", "23", "7", "20", "11", "15", "23", "20", "21", "24", "25", "21", "20", "12", "7", "16", "24", "16", "26", "15", "16", "15", "7", "11", "17", "26", "24", "17", "25", "12", "23", "12", "5", "23", "7", "11", "1", "6", "14", "18", "14", "8", "11", "13", "0", "17", "15", "26", "25", "0", "17", "27", "6", "14", "19", "16", "12", "15", "1", "12", "15", "12", "0", "7", "16", "12", "22", "10", "14", "27", "9", "6", "16", "4", "18", "18", "19", "16", "7", "12", "12", "4", "17", "25", "20", "28", "7", "9", "5", "2", "14", "7", "28", "11", "11", "3", "25", "13", "1", "15", "3", "27", "8", "6", "17", "24", "6", "19", "25", "2", "3", "12", "2", "18", "15", "25", "25", "26", "28", "22", "18", "0", "0", "24", "25", "7", "2", "28", "0", "21", "23", "26", "25", "7", "22", "27", "11", "4", "15", "12", "3", "2", "26", "6", "13", "26", "1", "18", "14", "22", "9", "9", "1", "19", "12", "27", "10", "6", "6", "25", "1", "21", "21", "6", "20", "22", "1", "3", "8", "1", "7", "11", "10", "16", "5", "14", "19", "21", "23", "3", "3", "4", "10", "20", "6", "1", "19", "0", "8", "28", "10", "19", "14", "17", "3", "13", "7", "24", "26", "8", "1", "27", "5", "2", "9", "13", "0", "20", "9", "23", "13", "27", "13", "1", "2", "12", "13", "17", "20", "21", "22", "1", "13", "14", "2", "16", "12", "9", "19", "10", "2", "28", "27", "23", "25", "27", "9", "28", "25", "3", "28", "13", "18", "3", "25", "25", "3", "10", "20", "5", "27", "14", "24", "10", "4", "11", "16", "11", "6", "16", "24", "20", "14", "23", "8", "13", "5", "25", "7", "11", "23", "10", "0", "27", "1", "22", "28", "26", "13", "16", "23", "13", "2", "22", "23", "25", "2", "7", "1", "9", "28", "13", "24", "16", "1", "24", "4", "21", "25", "12", "7", "26", "0", "1", "13", "23", "12", "2", "4", "1", "12", "23", "12", "21", "21", "2", "10", "5", "16", "1", "17", "1", "2", "4", "1", "27", "14", "12", "13", "27", "28", "8", "21", "18", "6", "15", "10", "12", "7", "0", "26", "4", "12", "1", "1", "20", "22", "10", "19", "27", "16", "7", "24", "14", "25", "0", "10", "5", "5", "8", "5", "3", "16", "15", "6", "7", "5", "14", "6", "11", "18", "17", "11", "7", "7", "2", "24", "11", "13", "17", "26", "6", "13", "9", "16", "18", "3", "12", "14", "3", "13", "11", "20", "8", "18", "12", "0", "3", "22", "17", "4", "0", "8", "3", "21", "28", "5", "14", "8", "20", "17", "24", "15", "7", "1", "1", "27", "12", "12", "4", "4", "27", "25", "0", "5", "9", "2", "9", "26", "13", "11", "9", "21", "14", "27", "28", "25", "10", "17", "5", "18", "10", "3", "13", "14", "28", "9", "9", "22", "20", "0", "28", "25", "25", "14", "18", "7", "28", "28", "16", "13", "2", "21", "24", "19", "16", "27", "5", "9", "22", "11", "24", "24", "12", "18", "10", "6", "2", "18", "8", "27", "8", "10", "5", "2", "7", "21", "4", "7", "13", "27", "20", "25", "19", "4", "9", "28", "11", "15", "13", "17", "7", "12", "27", "6", "3", "15", "22", "14", "2", "17", "21", "16", "17", "7", "10", "24", "26", "16", "11", "27", "11", "28", "25", "27", "9", "3", "19", "20", "23", "4", "24", "27", "14", "20", "15", "15", "3", "22", "18", "9", "17", "22", "16", "28", "1", "14", "13", "8", "21", "25", "16", "24", "16", "15", "16", "13", "17", "8", "24", "0", "19", "5", "18", "18", "3", "16", "18", "10", "22", "3", "24", "27", "15", "28", "9", "17", "24", "15", "3", "15", "16", "24", "25", "25", "28", "20", "10", "19", "1", "12", "12", "28", "23", "17", "24", "4", "10", "25", "19", "25", "5", "5", "10", "23", "17", "18", "17", "4", "5", "26", "27", "6", "9", "23", "3", "5", "12", "21", "22", "7", "4", "22", "10", "4", "14", "23", "9", "20", "26", "2", "5", "21", "4", "11", "18", "19", "14", "21", "16", "9", "13", "0", "14", "19", "14", "2", "10", "9", "4", "23", "8", "0", "10", "12", "24", "6", "3", "1", "20", "28", "24", "11", "5", "14", "23", "0", "20", "24", "4", "6", "5", "21", "13", "5", "28", "9", "11", "5", "12", "1", "10", "8", "24", "23", "28", "14", "2", "2", "10", "3", "21", "23", "2", "0", "12", "20", "20", "17", "18", "27", "20", "0", "27", "28", "11", "15", "5", "0", "1", "4", "3", "21", "22", "22", "22", "1", "7", "19", "8", "6", "11", "5", "19", "16", "6", "11", "20", "23", "5", "25", "27", "16", "5", "18", "17", "18", "25", "11", "25", "5", "16", "13", "16", "8", "7", "0", "13", "27", "14", "20", "26", "26", "11", "12", "16", "25", "6", "24", "16", "20", "26", "14", "22", "16", "12", "21", "23", "15", "20", "24", "23", "14", "10", "1", "11", "0", "16", "15", "9", "24", "14", "11", "9", "21", "18", "13", "26", "4", "16", "7", "16", "14", "11", "6", "13", "2", "6", "19", "21", "4", "4", "14", "22", "28", "23", "1", "2", "11", "24", "13", "20", "7", "28", "15", "6", "14", "25", "5", "21", "17", "25", "23", "18", "4", "11", "28", "5", "24", "19", "17", "4", "1", "1", "9", "15", "16", "12", "26", "4", "12", "21", "9", "11", "4", "19", "13", "25", "11", "13", "3", "10", "13", "22", "21", "22", "5", "18", "9", "18", "26", "15", "9", "12", "3", "27", "25", "19", "11", "28", "23", "19", "2", "16", "18", "21", "26", "28", "25", "18", "23", "23", "5", "22", "13", "15", "12", "24", "25", "20", "9", "16", "13", "21", "15", "17", "25", "11", "21", "21", "13", "25", "24", "26", "12", "1", "28", "6", "19", "19", "22", "15", "9", "0", "16", "0", "4", "8", "4", "8", "7", "21", "23", "15", "19", "5", "13", "19", "19", "22", "14", "8", "2", "4", "15", "27", "19", "21", "27", "1", "7", "5", "15", "15", "6", "25", "11", "7", "19", "17", "17", "3", "10", "26", "1", "25", "6", "0", "20", "0", "23", "20", "0", "13", "27", "2", "12", "4", "16", "13", "22", "19", "15", "11", "27", "21", "26", "26", "9", "8", "24", "10", "20", "21", "7", "17", "28", "21", "19", "3", "21", "7", "9", "21", "6", "13", "26", "20", "6", "7", "4", "0", "7", "17", "12", "21", "12", "14", "17", "21", "4", "12", "8", "20", "2", "4", "6", "23", "27", "16", "16", "19", "10", "14", "9", "8", "14", "18", "19", "22", "21", "24", "0", "14", "15", "17", "10", "17", "28", "27", "26", "16", "10", "14", "6", "25", "20", "22", "26", "5", "0", "26", "1", "16", "4", "1", "13", "24", "9", "25", "19", "26", "16", "27", "28", "5", "8", "27", "9", "16", "24", "2", "3", "23", "15", "10", "17", "11", "24", "1", "2", "19", "5", "25", "27", "16", "17", "27", "15", "15", "27", "8", "2", "7", "25", "14", "3", "12", "16", "17", "20", "19", "9", "11", "1", "22", "13", "7", "7", "21", "18", "15", "14", "18", "23", "5", "11", "17", "15", "7", "17", "17", "15", "16", "17", "4", "10", "21", "13", "25", "0", "17", "17", "5", "15", "27", "25", "24", "5", "0", "18", "8", "6", "25", "25", "20", "27", "21", "25", "3", "5", "0", "13", "6", "7", "9", "7", "19", "13", "13", "4", "24", "0", "23", "17", "0", "7", "1", "16", "4", "21", "10", "23", "6", "12", "21", "1", "5", "11", "25", "8", "15", "26", "3", "2", "0", "22", "16", "8", "19", "16", "2", "9", "28", "14", "9", "15", "1", "8", "18", "9", "4", "9", "19", "18", "16", "28", "4", "10", "23", "22", "9", "21", "25", "8", "9", "16", "16", "21", "18", "8", "20", "17", "3", "15", "23", "16", "24", "10", "10", "28", "27", "18", "4", "25", "22", "19", "11", "2", "23" ] } ] }'
34
34
  http_version:
35
35
  recorded_at: Sun, 20 Jan 2013 04:21:05 GMT
36
36
  recorded_with: VCR 2.4.0
@@ -4,7 +4,7 @@ describe NikeV2::Activities do
4
4
  let(:person){ build(:person) }
5
5
 
6
6
  describe 'new from person' do
7
- before{ VCR.insert_cassette 'activities', record: :new_episodes }
7
+ before{ VCR.insert_cassette 'activities', record: :new_episodes, :allow_playback_repeats => true }
8
8
  after{ VCR.eject_cassette }
9
9
 
10
10
  it 'should return an array of Nike::Activity' do
@@ -12,5 +12,17 @@ describe NikeV2::Activities do
12
12
  person.activities.first.should be_kind_of(NikeV2::Activity)
13
13
  person.activities.length.should == 5
14
14
  end
15
+
16
+ it 'should accept the count parameter and return an array of Nike::Activity' do
17
+ person.activities(:count => 1).should be_kind_of(NikeV2::Activities)
18
+ person.activities(:count => 1).first.should be_kind_of(NikeV2::Activity)
19
+ person.activities(:count => 1).length.should == 1
20
+ end
21
+
22
+ it 'should accept the start_date parameter, camelcase it and return an array of Nike::Activity' do
23
+ person.activities(:count => 1).should be_kind_of(NikeV2::Activities)
24
+ person.activities(:count => 1).first.should be_kind_of(NikeV2::Activity)
25
+ person.activities(:count => 1).length.should == 1
26
+ end
15
27
  end
16
28
  end
@@ -4,12 +4,20 @@ describe NikeV2::Activity do
4
4
  let(:activity){ build(:activity) }
5
5
 
6
6
  describe 'fetch_data' do
7
- before{ VCR.insert_cassette 'activity', record: :new_episodes }
7
+ before{ VCR.insert_cassette 'activity', record: :new_episodes, :allow_playback_repeats => true }
8
8
  after{ VCR.eject_cassette }
9
9
 
10
- it 'should load the activity from the api' do
10
+ it 'should load the activity metrics from the api' do
11
11
  activity.load_data.should be_true
12
12
  activity.calories.should == 257
13
13
  end
14
+
15
+ it 'should load the activity metrics from the api without explicit call' do
16
+ activity.total_fuel.should == 20491.0
17
+ end
18
+
19
+ it 'should sum the metrics during a time period' do
20
+ activity.total_fuel_during(Time.parse('2011-08-11T00:00:00'), Time.parse('2011-08-11T01:00:00')).should == 934.0
21
+ end
14
22
  end
15
23
  end
@@ -16,7 +16,7 @@ describe NikeV2::Metrics do
16
16
  end
17
17
 
18
18
  it 'should sum the metrics of a given type' do
19
- activity.metrics.distance.should == 6.5058
19
+ activity.metrics.total_distance.should == 6.5058
20
20
  end
21
21
  end
22
22
  end
@@ -4,7 +4,7 @@ describe NikeV2::Summary do
4
4
  let(:person){ build(:person) }
5
5
 
6
6
  describe 'new' do
7
- before{ VCR.insert_cassette 'summary', record: :new_episodes }
7
+ before{ VCR.insert_cassette 'summary', record: :new_episodes, :allow_playback_repeats => true }
8
8
  after{ VCR.eject_cassette }
9
9
 
10
10
  it 'should return a Summary of user data' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nike_v2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-16 00:00:00.000000000 Z
12
+ date: 2013-03-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
@@ -146,6 +146,7 @@ files:
146
146
  - lib/nike_v2/person.rb
147
147
  - lib/nike_v2/resource.rb
148
148
  - lib/nike_v2/summary.rb
149
+ - lib/nike_v2/version.rb
149
150
  - nike_v2.gemspec
150
151
  - spec/factories/activity_factory.rb
151
152
  - spec/factories/person_factory.rb