strava-api 0.13.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/LICENSE +20 -0
- data/README.rdoc +221 -0
- data/Rakefile +56 -0
- data/lib/strava-api.rb +22 -0
- data/lib/strava-api/base.rb +37 -0
- data/lib/strava-api/bike.rb +8 -0
- data/lib/strava-api/club.rb +17 -0
- data/lib/strava-api/clubs.rb +28 -0
- data/lib/strava-api/effort.rb +50 -0
- data/lib/strava-api/efforts.rb +9 -0
- data/lib/strava-api/exceptions.rb +9 -0
- data/lib/strava-api/hash_based_store.rb +52 -0
- data/lib/strava-api/member.rb +8 -0
- data/lib/strava-api/ride.rb +55 -0
- data/lib/strava-api/rides.rb +39 -0
- data/lib/strava-api/segment.rb +36 -0
- data/lib/strava-api/segments.rb +39 -0
- data/test/helper.rb +133 -0
- data/test/test_base.rb +40 -0
- data/test/test_club.rb +45 -0
- data/test/test_clubs.rb +87 -0
- data/test/test_effort.rb +31 -0
- data/test/test_hash_based_store.rb +79 -0
- data/test/test_ride.rb +49 -0
- data/test/test_rides.rb +186 -0
- data/test/test_segment.rb +63 -0
- data/test/test_segments.rb +166 -0
- data/test/test_strava.rb +36 -0
- metadata +136 -0
@@ -0,0 +1,166 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'mocha'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
class TestSegments < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
@s = StravaApi::Base.new
|
8
|
+
end
|
9
|
+
def test_segments_index
|
10
|
+
#curl http://www.strava.com/api/v1/segments?name=hawk%20hill
|
11
|
+
api_result = JSON.parse segments_index_json
|
12
|
+
api_result.stubs(:parsed_response).returns("")
|
13
|
+
StravaApi::Base.stubs(:get).with('/segments', {:query => {:name => 'Hawk Hill'}}).returns(api_result)
|
14
|
+
|
15
|
+
result = @s.segments('Hawk Hill')
|
16
|
+
|
17
|
+
assert result.is_a?(Array)
|
18
|
+
|
19
|
+
result.each do |segment|
|
20
|
+
assert segment.is_a?(StravaApi::Segment)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_segments_index_that_returns_nothing
|
25
|
+
#curl http://www.strava.com/api/v1/segments?name=hawk%20hillxxxy
|
26
|
+
api_result = JSON.parse '{"segments":[]}'
|
27
|
+
api_result.stubs(:parsed_response).returns("")
|
28
|
+
StravaApi::Base.stubs(:get).with('/segments', {:query => {:name => 'Hawk Hill98xcasdf'}}).returns(api_result)
|
29
|
+
|
30
|
+
result = @s.segments('Hawk Hill98xcasdf')
|
31
|
+
|
32
|
+
assert result.is_a?(Array)
|
33
|
+
assert result.empty?
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_segment_show
|
37
|
+
#rl http://www.strava.com/api/v1/segments/99243
|
38
|
+
api_result = JSON.parse segment_show_json
|
39
|
+
api_result.stubs(:parsed_response).returns("")
|
40
|
+
StravaApi::Base.stubs(:get).with('/segments/99243', { :query => {} }).returns(api_result)
|
41
|
+
|
42
|
+
result = @s.segment_show(99243)
|
43
|
+
|
44
|
+
assert result.is_a?(StravaApi::Segment)
|
45
|
+
assert result.name == "Hawk Hill Saddle"
|
46
|
+
assert result.id == 99243
|
47
|
+
assert result.average_grade == 4.63873
|
48
|
+
assert result.climb_category == "4"
|
49
|
+
assert result.elevation_gain == 76.553
|
50
|
+
assert result.distance == 1771.88
|
51
|
+
assert result.elevation_high == 172.694
|
52
|
+
assert result.elevation_low == 90.5013
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_segment_efforts_with_invalid_id
|
56
|
+
api_result = JSON.parse '{"error":"Invalid segments/0"}'
|
57
|
+
api_result.stubs(:parsed_response).returns("")
|
58
|
+
StravaApi::Base.stubs(:get).with('/segments/0/efforts', {:query => {}}).returns(api_result)
|
59
|
+
|
60
|
+
expect_error(StravaApi::InvalidResponseError) { @s.segment_efforts(0) }
|
61
|
+
|
62
|
+
assert @s.errors.include?("Invalid segments/0")
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_segment_efforts_index
|
66
|
+
#curl http://www.strava.com/api/v1/segments/99243/efforts
|
67
|
+
#note: cut some out because the response was so long
|
68
|
+
api_result = JSON.parse segment_efforts_index_json
|
69
|
+
api_result.stubs(:parsed_response).returns("")
|
70
|
+
StravaApi::Base.stubs(:get).with('/segments/99243/efforts', {:query => {}}).returns(api_result)
|
71
|
+
|
72
|
+
result = @s.segment_efforts(99243)
|
73
|
+
|
74
|
+
assert result.is_a?(Array)
|
75
|
+
|
76
|
+
result.each do |effort|
|
77
|
+
assert effort.is_a?(StravaApi::Effort)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_segment_efforts_index_by_athlete_id
|
82
|
+
#curl http://www.strava.com/api/v1/segments/99243/efforts?athleteId=1377
|
83
|
+
api_result = JSON.parse segment_efforts_index_by_athlete_id_json
|
84
|
+
api_result.stubs(:parsed_response).returns("")
|
85
|
+
StravaApi::Base.stubs(:get).with('/segments/99243/efforts', {:query => {'athleteId' => 1377}}).returns(api_result)
|
86
|
+
|
87
|
+
result = @s.segment_efforts(99243, {:athlete_id => 1377})
|
88
|
+
|
89
|
+
assert result.is_a?(Array)
|
90
|
+
|
91
|
+
result.each do |effort|
|
92
|
+
assert effort.is_a?(StravaApi::Effort)
|
93
|
+
assert effort.athlete.id == 1377, "#{effort.athlete.id} != 1377"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_segment_efforts_index_by_athlete_id_and_start_date
|
98
|
+
#curl "http://www.strava.com/api/v1/segments/99243/efforts?athleteId=1377&startDate=2010-07-01"
|
99
|
+
api_result = JSON.parse segment_efforts_index_by_athlete_id_and_start_date_json
|
100
|
+
api_result.stubs(:parsed_response).returns("")
|
101
|
+
StravaApi::Base.stubs(:get).with('/segments/99243/efforts', {:query => {'athleteId' => 1377, 'startDate' => Date.civil(2010,7,1)}}).returns(api_result)
|
102
|
+
|
103
|
+
result = @s.segment_efforts(99243, {:athlete_id => 1377, :start_date => Date.civil(2010,7,1)})
|
104
|
+
|
105
|
+
assert result.is_a?(Array)
|
106
|
+
|
107
|
+
result.each do |effort|
|
108
|
+
assert effort.is_a?(StravaApi::Effort)
|
109
|
+
assert effort.athlete.id == 1377, "#{effort.athlete.id} != 1377"
|
110
|
+
|
111
|
+
#works with the real api call, but the stub that is just JSON parsing isn't converting times to Time objects
|
112
|
+
#assert effort.start_date >= Time.utc(2010,7,1), "#{effort.start_date} < 2010-7-1"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_segment_efforts_index_by_club_id_and_best
|
117
|
+
#using test data for club 15
|
118
|
+
#curl http://www.strava.com/api/v1/segments/99243/efforts?clubId=15&best=true
|
119
|
+
api_result = JSON.parse segment_efforts_index_by_club_id_and_best_json
|
120
|
+
api_result.stubs(:parsed_response).returns("")
|
121
|
+
StravaApi::Base.stubs(:get).with('/segments/99243/efforts', {:query => {'clubId' => 15, 'best' => true}}).returns(api_result)
|
122
|
+
|
123
|
+
result = @s.segment_efforts(99243, {:club_id => 15, :best => true})
|
124
|
+
|
125
|
+
assert result.is_a?(Array)
|
126
|
+
|
127
|
+
result.each do |effort|
|
128
|
+
assert effort.is_a?(StravaApi::Effort)
|
129
|
+
end
|
130
|
+
|
131
|
+
athletes = result.collect {|e| e.athlete.username}.sort
|
132
|
+
i = 0
|
133
|
+
while i < athletes.length do
|
134
|
+
assert athletes[i] != athletes[i+1], "Problem -- two athletes in the list with the same username"
|
135
|
+
i += 1
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_segment_efforts_index_using_offset
|
140
|
+
#curl http://www.strava.com/api/v1/segments/99243/efforts
|
141
|
+
api_result = JSON.parse segment_efforts_index_using_offset_json
|
142
|
+
api_result.stubs(:parsed_response).returns("")
|
143
|
+
StravaApi::Base.stubs(:get).with('/segments/99243/efforts', {:query => {}}).returns(api_result)
|
144
|
+
|
145
|
+
api_result2 = JSON.parse segment_efforts_index_using_offset_50_json
|
146
|
+
api_result2.stubs(:parsed_response).returns("")
|
147
|
+
StravaApi::Base.stubs(:get).with('/segments/99243/efforts', {:query => {'offset' => 50}}).returns(api_result2)
|
148
|
+
|
149
|
+
set_1 = @s.segment_efforts(99243)
|
150
|
+
set_2 = @s.segment_efforts(99243, :offset => 50)
|
151
|
+
|
152
|
+
assert set_1.is_a?(Array)
|
153
|
+
assert set_2.is_a?(Array)
|
154
|
+
|
155
|
+
set_1.each {|ride| assert ride.is_a?(StravaApi::Effort)}
|
156
|
+
set_2.each {|ride| assert ride.is_a?(StravaApi::Effort)}
|
157
|
+
|
158
|
+
#but there shouldn't be any overlap
|
159
|
+
set_1_ids = set_1.collect(&:id)
|
160
|
+
set_2_ids = set_2.collect(&:id)
|
161
|
+
|
162
|
+
set_1_ids.each do |set_1_id|
|
163
|
+
assert !set_2_ids.include?(set_1_id), "Error: #{set_1_id} is included in both sets"
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
data/test/test_strava.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'mocha'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
class TestStravaApi < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
@s = StravaApi::Base.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_effort_show
|
11
|
+
#curl http://www.strava.com/api/v1/efforts/688432
|
12
|
+
api_result = JSON.parse '{"effort":{"ride":{"name":"02/28/10 San Francisco, CA","id":77563},"averageSpeed":14317.7658862876,"startDate":"2010-02-28T18:10:07Z","averageWatts":287.765,"startDateLocal":"2010-02-28T10:10:07Z","maximumSpeed":18894.384,"timeZoneOffset":-8.0,"athlete":{"username":"julianbill","name":"Julian Bill","id":1139},"elevationGain":151.408,"distance":2344.82,"elapsedTime":598,"segment":{"name":"Panoramic to Pan Toll","id":156},"id":688432,"movingTime":598}}'
|
13
|
+
api_result.stubs(:parsed_response).returns("")
|
14
|
+
StravaApi::Base.stubs(:get).with('/efforts/688432', { :query => {} }).returns(api_result)
|
15
|
+
|
16
|
+
result = @s.effort_show(688432)
|
17
|
+
|
18
|
+
assert result.is_a?(StravaApi::Effort)
|
19
|
+
assert result.elapsed_time == 598
|
20
|
+
assert result.athlete.is_a?(StravaApi::Member)
|
21
|
+
assert result.athlete.name == "Julian Bill"
|
22
|
+
assert result.average_speed == 14317.7658862876
|
23
|
+
assert result.id == 688432
|
24
|
+
#assert result.start_date == Time.parse('2010-02-28T18:10:07Z')
|
25
|
+
assert result.time_zone_offset == -8.0
|
26
|
+
assert result.maximum_speed == 18894.384
|
27
|
+
assert result.average_watts == 287.765
|
28
|
+
assert result.elevation_gain == 151.408
|
29
|
+
assert result.ride.is_a?(StravaApi::Ride)
|
30
|
+
assert result.ride.name == "02/28/10 San Francisco, CA"
|
31
|
+
assert result.moving_time == 598
|
32
|
+
assert result.distance == 2344.82
|
33
|
+
assert result.segment.is_a?(StravaApi::Segment)
|
34
|
+
assert result.segment.name == "Panoramic to Pan Toll"
|
35
|
+
end
|
36
|
+
end
|
metadata
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: strava-api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 43
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 13
|
9
|
+
- 0
|
10
|
+
version: 0.13.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Steven Chanin
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-10-04 00:00:00 -07:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: httparty
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 5
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 6
|
33
|
+
- 1
|
34
|
+
version: 0.6.1
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: mocha
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 43
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
- 9
|
49
|
+
- 8
|
50
|
+
version: 0.9.8
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
description: Strava (http://www.strava.com/) allows access to it's data via a JSON api. This gem wraps that API an allows you to interact with Ruby classes instead.
|
54
|
+
email: schanin@devleverage.com
|
55
|
+
executables: []
|
56
|
+
|
57
|
+
extensions: []
|
58
|
+
|
59
|
+
extra_rdoc_files:
|
60
|
+
- LICENSE
|
61
|
+
- README.rdoc
|
62
|
+
files:
|
63
|
+
- LICENSE
|
64
|
+
- README.rdoc
|
65
|
+
- Rakefile
|
66
|
+
- lib/strava-api.rb
|
67
|
+
- lib/strava-api/base.rb
|
68
|
+
- lib/strava-api/bike.rb
|
69
|
+
- lib/strava-api/club.rb
|
70
|
+
- lib/strava-api/clubs.rb
|
71
|
+
- lib/strava-api/effort.rb
|
72
|
+
- lib/strava-api/efforts.rb
|
73
|
+
- lib/strava-api/exceptions.rb
|
74
|
+
- lib/strava-api/hash_based_store.rb
|
75
|
+
- lib/strava-api/member.rb
|
76
|
+
- lib/strava-api/ride.rb
|
77
|
+
- lib/strava-api/rides.rb
|
78
|
+
- lib/strava-api/segment.rb
|
79
|
+
- lib/strava-api/segments.rb
|
80
|
+
- test/helper.rb
|
81
|
+
- test/test_base.rb
|
82
|
+
- test/test_club.rb
|
83
|
+
- test/test_clubs.rb
|
84
|
+
- test/test_effort.rb
|
85
|
+
- test/test_hash_based_store.rb
|
86
|
+
- test/test_ride.rb
|
87
|
+
- test/test_rides.rb
|
88
|
+
- test/test_segment.rb
|
89
|
+
- test/test_segments.rb
|
90
|
+
- test/test_strava.rb
|
91
|
+
has_rdoc: true
|
92
|
+
homepage: http://github.com/stevenchanin/strava-api
|
93
|
+
licenses: []
|
94
|
+
|
95
|
+
post_install_message:
|
96
|
+
rdoc_options:
|
97
|
+
- --charset=UTF-8
|
98
|
+
require_paths:
|
99
|
+
- lib
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
hash: 3
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
version: "0"
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
hash: 3
|
115
|
+
segments:
|
116
|
+
- 0
|
117
|
+
version: "0"
|
118
|
+
requirements: []
|
119
|
+
|
120
|
+
rubyforge_project:
|
121
|
+
rubygems_version: 1.3.7
|
122
|
+
signing_key:
|
123
|
+
specification_version: 3
|
124
|
+
summary: Provides a Ruby interface to the Strava api
|
125
|
+
test_files:
|
126
|
+
- test/helper.rb
|
127
|
+
- test/test_base.rb
|
128
|
+
- test/test_club.rb
|
129
|
+
- test/test_clubs.rb
|
130
|
+
- test/test_effort.rb
|
131
|
+
- test/test_hash_based_store.rb
|
132
|
+
- test/test_ride.rb
|
133
|
+
- test/test_rides.rb
|
134
|
+
- test/test_segment.rb
|
135
|
+
- test/test_segments.rb
|
136
|
+
- test/test_strava.rb
|