strava-ruby-client 2.3.0 → 3.0.0.pre.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +60 -48
- data/LICENSE.md +1 -1
- data/README.md +100 -80
- data/bin/strava-activities.rb +2 -0
- data/bin/strava-oauth-token +43 -35
- data/bin/strava-refresh-token +32 -0
- data/lib/strava/api/client.rb +46 -6
- data/lib/strava/api/cursor.rb +26 -2
- data/lib/strava/api/endpoints/activities.rb +10 -7
- data/lib/strava/api/endpoints/athletes.rb +2 -2
- data/lib/strava/api/endpoints/clubs.rb +5 -5
- data/lib/strava/api/endpoints/gears.rb +1 -1
- data/lib/strava/api/endpoints/segment_efforts.rb +2 -2
- data/lib/strava/api/endpoints/segments.rb +3 -3
- data/lib/strava/api/pagination.rb +1 -2
- data/lib/strava/models/achievement.rb +1 -0
- data/lib/strava/models/activity_stats.rb +1 -0
- data/lib/strava/models/activity_total.rb +5 -9
- data/lib/strava/models/activity_zone.rb +4 -1
- data/lib/strava/models/base_stream.rb +12 -0
- data/lib/strava/models/club_activity.rb +22 -0
- data/lib/strava/models/{club_member.rb → club_athlete.rb} +5 -2
- data/lib/strava/models/club_event.rb +6 -4
- data/lib/strava/models/comment.rb +7 -2
- data/lib/strava/models/destination.rb +12 -0
- data/lib/strava/models/{activity.rb → detailed_activity.rb} +51 -103
- data/lib/strava/models/{athlete.rb → detailed_athlete.rb} +20 -14
- data/lib/strava/models/{club.rb → detailed_club.rb} +10 -3
- data/lib/strava/models/{gear.rb → detailed_gear.rb} +10 -7
- data/lib/strava/models/{photo.rb → detailed_photo.rb} +13 -5
- data/lib/strava/models/{photos.rb → detailed_photos.rb} +2 -1
- data/lib/strava/models/{segment.rb → detailed_segment.rb} +18 -24
- data/lib/strava/models/{segment_effort.rb → detailed_segment_effort.rb} +23 -17
- data/lib/strava/models/explorer_segment.rb +8 -5
- data/lib/strava/models/heart_rate_zone_ranges.rb +1 -0
- data/lib/strava/models/kudoser.rb +1 -0
- data/lib/strava/models/lap.rb +18 -16
- data/lib/strava/models/lat_lng.rb +46 -0
- data/lib/strava/models/local_legend.rb +16 -0
- data/lib/strava/models/meta_activity.rb +13 -0
- data/lib/strava/models/meta_athlete.rb +14 -0
- data/lib/strava/models/meta_club.rb +12 -0
- data/lib/strava/models/mixins/{time.rb → average_speed.rb} +6 -29
- data/lib/strava/models/mixins/elapsed_time.rb +20 -0
- data/lib/strava/models/mixins/elevation_difference.rb +39 -0
- data/lib/strava/models/mixins/elevation_gain.rb +39 -0
- data/lib/strava/models/mixins/estimated_moving_time.rb +20 -0
- data/lib/strava/models/mixins/moving_time.rb +20 -0
- data/lib/strava/models/mixins/sport_type.rb +73 -0
- data/lib/strava/models/mixins/time_in_hours.rb +26 -0
- data/lib/strava/models/mixins/{elevation.rb → total_elevation_gain.rb} +1 -1
- data/lib/strava/models/photos_summary.rb +12 -0
- data/lib/strava/models/photos_summary_primary.rb +15 -0
- data/lib/strava/models/power_zone_ranges.rb +1 -0
- data/lib/strava/models/route.rb +14 -13
- data/lib/strava/models/similar_activities.rb +2 -0
- data/lib/strava/models/split.rb +8 -6
- data/lib/strava/models/stats_visibility.rb +11 -0
- data/lib/strava/models/stream_set.rb +2 -1
- data/lib/strava/models/summary_activity.rb +71 -0
- data/lib/strava/models/summary_athlete.rb +31 -0
- data/lib/strava/models/summary_club.rb +34 -0
- data/lib/strava/models/summary_gear.rb +18 -0
- data/lib/strava/models/summary_pr_segment_effort.rb +16 -0
- data/lib/strava/models/summary_segment.rb +34 -0
- data/lib/strava/models/summary_segment_effort.rb +16 -0
- data/lib/strava/models/timed_zone_range.rb +1 -0
- data/lib/strava/models/token.rb +1 -1
- data/lib/strava/models/trend.rb +1 -0
- data/lib/strava/models/updatable_activity.rb +16 -0
- data/lib/strava/models/upload.rb +2 -0
- data/lib/strava/models/waypoint.rb +15 -0
- data/lib/strava/models/xoms.rb +13 -0
- data/lib/strava/models/zone_range.rb +1 -0
- data/lib/strava/models/zones.rb +1 -0
- data/lib/strava/version.rb +1 -1
- data/lib/strava/webhooks/models/event.rb +1 -1
- data/lib/strava-ruby-client.rb +55 -30
- metadata +47 -18
- data/lib/strava/api/endpoints/running_races.rb +0 -20
- data/lib/strava/models/club_admin.rb +0 -15
- data/lib/strava/models/running_race.rb +0 -35
- data/lib/strava/models/segment_stats.rb +0 -17
data/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Strava Ruby Client
|
|
1
|
+
# Strava Ruby Client<!-- omit in toc -->
|
|
2
2
|
|
|
3
3
|
[](https://badge.fury.io/rb/strava-ruby-client)
|
|
4
4
|
[](https://github.com/dblock/strava-ruby-client/actions/workflows/test.yml)
|
|
@@ -7,7 +7,7 @@ A complete Ruby client for the [Strava API v3](https://developers.strava.com).
|
|
|
7
7
|
|
|
8
8
|
Unlike other clients, including [strava-api-v3](https://github.com/jaredholdcroft/strava-api-v3), provides complete OAuth refresh token flow support, webhooks support, a richer first class interface to Strava models, conversion helpers for distance, time and elevation, natively supports pagination, implements more consistent error handling and is built with thorough test coverage using actual Strava data.
|
|
9
9
|
|
|
10
|
-
## Table of Contents
|
|
10
|
+
## Table of Contents<!-- omit in toc -->
|
|
11
11
|
|
|
12
12
|
- [Installation](#installation)
|
|
13
13
|
- [Usage](#usage)
|
|
@@ -40,8 +40,6 @@ Unlike other clients, including [strava-api-v3](https://github.com/jaredholdcrof
|
|
|
40
40
|
- [Export Route TCX](#export-route-tcx)
|
|
41
41
|
- [Get Route](#get-route)
|
|
42
42
|
- [List Athlete Routes](#list-athlete-routes)
|
|
43
|
-
- [Running Races](#running-races)
|
|
44
|
-
- [Get Running Race](#get-running-race)
|
|
45
43
|
- [Segment Efforts](#segment-efforts)
|
|
46
44
|
- [List Segment Efforts](#list-segment-efforts)
|
|
47
45
|
- [Get Segment Effort](#get-segment-effort)
|
|
@@ -73,6 +71,7 @@ Unlike other clients, including [strava-api-v3](https://github.com/jaredholdcrof
|
|
|
73
71
|
- [Errors](#errors)
|
|
74
72
|
- [Tools](#tools)
|
|
75
73
|
- [Strava OAuth Token](#strava-oauth-token)
|
|
74
|
+
- [Strava Refresh Token](#strava-refresh-token)
|
|
76
75
|
- [Users](#users)
|
|
77
76
|
- [Resources](#resources)
|
|
78
77
|
- [Upgrading](#upgrading)
|
|
@@ -98,7 +97,7 @@ client = Strava::Api::Client.new(
|
|
|
98
97
|
access_token: "12345678987654321"
|
|
99
98
|
)
|
|
100
99
|
|
|
101
|
-
client.athlete # => Strava::Models::
|
|
100
|
+
client.athlete # => Strava::Models::DetailedAthlete
|
|
102
101
|
```
|
|
103
102
|
|
|
104
103
|
Note that the token from the Strava website does not have enough permissions to retrieve your own activities. Use the [strava-oauth-token tool](#strava-oauth-token) to obtain a short lived with more access scopes.
|
|
@@ -106,16 +105,30 @@ Note that the token from the Strava website does not have enough permissions to
|
|
|
106
105
|
```bash
|
|
107
106
|
export STRAVA_CLIENT_ID=...
|
|
108
107
|
export STRAVA_CLIENT_SECRET=...
|
|
108
|
+
|
|
109
109
|
bundle exec ruby bin/strava-oauth-token
|
|
110
110
|
```
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
Set `STRAVA_ACCESS_TOKEN` to the value of `access_token` from the browser window and save `refresh_token` in a secure location.
|
|
113
113
|
|
|
114
114
|
```bash
|
|
115
115
|
export STRAVA_ACCESS_TOKEN=...
|
|
116
|
+
|
|
116
117
|
bundle exec ruby bin/strava-activities.rb
|
|
117
118
|
```
|
|
118
119
|
|
|
120
|
+
You can repeat the process above when the token expires, or use the `refresh_token`, which is faster.
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
export STRAVA_CLIENT_ID=...
|
|
124
|
+
export STRAVA_CLIENT_SECRET=...
|
|
125
|
+
export STRAVA_API_REFRESH_TOKEN=...
|
|
126
|
+
|
|
127
|
+
bundle exec ./bin/strava-refresh-token
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Set `STRAVA_ACCESS_TOKEN` to the value of `access_token`.
|
|
131
|
+
|
|
119
132
|
### Activities
|
|
120
133
|
|
|
121
134
|
#### Create an Activity
|
|
@@ -136,7 +149,7 @@ activity.name # => 'Afternoon Run'
|
|
|
136
149
|
activity.strava_url # => 'https://www.strava.com/activities/1982980795'
|
|
137
150
|
```
|
|
138
151
|
|
|
139
|
-
See [Strava::Models::
|
|
152
|
+
See [Strava::Models::DetailedActivity](lib/strava/models/detailed_activity.rb) for all available properties.
|
|
140
153
|
|
|
141
154
|
#### Get Activity
|
|
142
155
|
|
|
@@ -149,7 +162,7 @@ activity.name # => 'Afternoon Run'
|
|
|
149
162
|
activity.strava_url # => 'https://www.strava.com/activities/1982980795'
|
|
150
163
|
```
|
|
151
164
|
|
|
152
|
-
See [Strava::Models::
|
|
165
|
+
See [Strava::Models::DetailedActivity](lib/strava/models/detailed_activity.rb) for all available properties.
|
|
153
166
|
|
|
154
167
|
Use `map.summary_polyline` and combine with [polylines](https://github.com/joshuaclayton/polylines) to parse the activity map and to construct a Google maps URL with start and end markers.
|
|
155
168
|
|
|
@@ -179,11 +192,11 @@ See [Strava::Models::Map](lib/strava/models/map.rb) for all available properties
|
|
|
179
192
|
Returns the photos on the given activity. This API is undocumented in Strava's docs. But there is a discussion in the [strava community hub](https://communityhub.strava.com/t5/developer-discussions/download-all-photos-of-my-own-activities/m-p/11262).
|
|
180
193
|
|
|
181
194
|
```ruby
|
|
182
|
-
photos = client.activity_photos(1982980795) # => Array[Strava::Models::
|
|
195
|
+
photos = client.activity_photos(1982980795) # => Array[Strava::Models::DetailedPhoto]
|
|
183
196
|
# in order to request a certain size (by default it will return the biggest size possible):
|
|
184
|
-
# photos = client.activity_photos(1982980795, {size: 1920}) # => Array[Strava::Models::
|
|
197
|
+
# photos = client.activity_photos(1982980795, {size: 1920}) # => Array[Strava::Models::DetailedPhoto]
|
|
185
198
|
|
|
186
|
-
photo = photos.first # => Strava::Models::
|
|
199
|
+
photo = photos.first # => Strava::Models::DetailedPhoto
|
|
187
200
|
|
|
188
201
|
photo.id # => nil
|
|
189
202
|
photo.unique_id # => '65889142-538D-4EE5-96F5-3DC3B773B1E3'
|
|
@@ -197,7 +210,7 @@ photo.sizes # => { '0' => [29, 64] }
|
|
|
197
210
|
photo.default_photo # => false
|
|
198
211
|
```
|
|
199
212
|
|
|
200
|
-
See [Strava::Models::
|
|
213
|
+
See [Strava::Models::DetailedPhoto](lib/strava/models/detailed_photo.rb) for all available properties.
|
|
201
214
|
|
|
202
215
|
#### List Activity Comments
|
|
203
216
|
|
|
@@ -219,14 +232,14 @@ See [Strava::Models::Comment](lib/strava/models/comment.rb) for all available pr
|
|
|
219
232
|
Returns the athletes who kudoed an activity identified by an identifier.
|
|
220
233
|
|
|
221
234
|
```ruby
|
|
222
|
-
kudoers = client.activity_kudos(1982980795) # => Array[Strava::Models::
|
|
235
|
+
kudoers = client.activity_kudos(1982980795) # => Array[Strava::Models::SummaryAthlete]
|
|
223
236
|
|
|
224
|
-
kodoer = kudoers.first # => Strava::Models::
|
|
237
|
+
kodoer = kudoers.first # => Strava::Models::SummaryAthlete
|
|
225
238
|
|
|
226
239
|
kudoer.username # => 'zolotov'
|
|
227
240
|
```
|
|
228
241
|
|
|
229
|
-
See [Strava::Models::
|
|
242
|
+
See [Strava::Models::SummaryAthlete](lib/strava/models/summary_athlete.rb) for all available properties.
|
|
230
243
|
|
|
231
244
|
#### List Activity Laps
|
|
232
245
|
|
|
@@ -247,9 +260,9 @@ See [Strava::Models::Lap](lib/strava/models/lap.rb) for all available properties
|
|
|
247
260
|
Returns the currently logged-in athlete's activities.
|
|
248
261
|
|
|
249
262
|
```ruby
|
|
250
|
-
activities = client.athlete_activities # => Array[Strava::Models::
|
|
263
|
+
activities = client.athlete_activities # => Array[Strava::Models::SummaryActivity]
|
|
251
264
|
|
|
252
|
-
activity = activities.first # => Strava::Models::
|
|
265
|
+
activity = activities.first # => Strava::Models::SummaryActivity
|
|
253
266
|
|
|
254
267
|
activity.name # => 'NYC TCS Marathon 2018'
|
|
255
268
|
activity.strava_url # => 'https://www.strava.com/activities/1477353766'
|
|
@@ -259,13 +272,13 @@ activity.moving_time_in_hours_s # => '3h38m5s'
|
|
|
259
272
|
activity.elapsed_time_in_hours_s # => '3h42m13s'
|
|
260
273
|
activity.pace_s # => '5m15s/km'
|
|
261
274
|
activity.pace_per_mile_s # => '8m28s/mi'
|
|
262
|
-
activity.
|
|
263
|
-
activity.
|
|
275
|
+
activity.average_speed_s # => '11.4km/h'
|
|
276
|
+
activity.average_speed_miles_per_hour_s # => '7.1mph'
|
|
264
277
|
activity.total_elevation_gain_s # => '270.9m'
|
|
265
278
|
activity.total_elevation_gain_in_feet_s # => '888.8ft'
|
|
266
279
|
```
|
|
267
280
|
|
|
268
|
-
See [Strava::Models::
|
|
281
|
+
See [Strava::Models::SummaryActivity](lib/strava/models/summary_activity.rb), [Strava::Models::Mixins::Distance](lib/strava/models/mixins/distance.rb), [Strava::Models::Mixins::TotalElevationGain](lib/strava/models/mixins/total_elevation_gain.rb), [Strava::Models::Mixins::ElapsedTime](lib/strava/models/mixins/elapsed_time.rb) and [Strava::Models::Mixins::MovingTime](lib/strava/models/mixins/moving_time.rb) for all available properties.
|
|
269
282
|
|
|
270
283
|
#### Get Activity Zones
|
|
271
284
|
|
|
@@ -311,10 +324,10 @@ activity.strava_url # => 'https://www.strava.com/activities/1982980795'
|
|
|
311
324
|
Returns the currently authenticated athlete.
|
|
312
325
|
|
|
313
326
|
```ruby
|
|
314
|
-
client.athlete # => Strava::Models::
|
|
327
|
+
client.athlete # => Strava::Models::DetailedAthlete
|
|
315
328
|
```
|
|
316
329
|
|
|
317
|
-
See [Strava::Models::
|
|
330
|
+
See [Strava::Models::DetailedAthlete](lib/strava/models/detailed_athlete.rb) for all available properties.
|
|
318
331
|
|
|
319
332
|
#### Get Zones
|
|
320
333
|
|
|
@@ -364,7 +377,7 @@ Update the currently authenticated athlete.
|
|
|
364
377
|
athlete = client.update_athlete(weight: 90.1) # => Strava::Models::Athlete
|
|
365
378
|
```
|
|
366
379
|
|
|
367
|
-
See [Strava::Models::
|
|
380
|
+
See [Strava::Models::DetailedAthlete](lib/strava/models/detailed_athlete.rb) for all available returned properties.
|
|
368
381
|
|
|
369
382
|
### Clubs
|
|
370
383
|
|
|
@@ -373,14 +386,14 @@ See [Strava::Models::Athlete](lib/strava/models/athlete.rb) for all available re
|
|
|
373
386
|
Retrieve recent activities from members of a specific club.
|
|
374
387
|
|
|
375
388
|
```ruby
|
|
376
|
-
activities = client.club_activities(108605) # => Array[Strava::Models::
|
|
389
|
+
activities = client.club_activities(108605) # => Array[Strava::Models::ClubActivity]
|
|
377
390
|
|
|
378
|
-
activity = activities.first # => Strava::Models::
|
|
391
|
+
activity = activities.first # => Strava::Models::ClubActivity
|
|
379
392
|
|
|
380
393
|
activity.name # => 'Afternoon Run'
|
|
381
394
|
```
|
|
382
395
|
|
|
383
|
-
See [Strava::Models::
|
|
396
|
+
See [Strava::Models::ClubActivity](lib/strava/models/club_activity.rb) for all available properties. Note that Strava does not return activity or athlete ID via this API.
|
|
384
397
|
|
|
385
398
|
#### List Club Events
|
|
386
399
|
|
|
@@ -401,53 +414,53 @@ See [Strava::Models::ClubEvent](lib/strava/models/club_event.rb) for all availab
|
|
|
401
414
|
Returns a list of the administrators of a given club.
|
|
402
415
|
|
|
403
416
|
```ruby
|
|
404
|
-
admins = client.club_admins(108605) # => Array[Strava::Models::
|
|
417
|
+
admins = client.club_admins(108605) # => Array[Strava::Models::ClubAthlete]
|
|
405
418
|
|
|
406
|
-
admin = admins.first # => Strava::Models::
|
|
419
|
+
admin = admins.first # => Strava::Models::ClubAthlete
|
|
407
420
|
admin.name # => 'Peter Ciaccia'
|
|
408
421
|
```
|
|
409
422
|
|
|
410
|
-
See [Strava::Models::
|
|
423
|
+
See [Strava::Models::ClubAthlete](lib/strava/models/club_athlete.rb) for all available properties.
|
|
411
424
|
|
|
412
425
|
#### Get Club
|
|
413
426
|
|
|
414
427
|
Returns a given club using its identifier.
|
|
415
428
|
|
|
416
429
|
```ruby
|
|
417
|
-
club = client.club(108605) # => Strava::Models::
|
|
430
|
+
club = client.club(108605) # => Strava::Models::DetailedClub
|
|
418
431
|
|
|
419
432
|
club.name # => 'NYRR'
|
|
420
433
|
```
|
|
421
434
|
|
|
422
|
-
See [Strava::Models::
|
|
435
|
+
See [Strava::Models::DetailedClub](lib/strava/models/detailed_club.rb) for all available properties.
|
|
423
436
|
|
|
424
437
|
#### List Club Members
|
|
425
438
|
|
|
426
439
|
Returns a list of the members of a given club.
|
|
427
440
|
|
|
428
441
|
```ruby
|
|
429
|
-
members = client.club_members(108605) # => Array[Strava::Models::
|
|
442
|
+
members = client.club_members(108605) # => Array[Strava::Models::ClubAthlete]
|
|
430
443
|
|
|
431
|
-
member = members.first # => Strava::Models::
|
|
444
|
+
member = members.first # => Strava::Models::ClubAthlete
|
|
432
445
|
member.name # => 'Peter Ciaccia'
|
|
433
446
|
```
|
|
434
447
|
|
|
435
|
-
See [Strava::Models::
|
|
448
|
+
See [Strava::Models::ClubAthlete](lib/strava/models/club_athlete.rb) for all available properties.
|
|
436
449
|
|
|
437
450
|
#### List Athlete Clubs
|
|
438
451
|
|
|
439
452
|
Returns a list of the clubs whose membership includes the authenticated athlete.
|
|
440
453
|
|
|
441
454
|
```ruby
|
|
442
|
-
clubs = client.athlete_clubs # => Array[Strava::Models::
|
|
455
|
+
clubs = client.athlete_clubs # => Array[Strava::Models::SummaryClub]
|
|
443
456
|
|
|
444
|
-
club = clubs.first # => Strava::Models::
|
|
457
|
+
club = clubs.first # => Strava::Models::SummaryClub
|
|
445
458
|
|
|
446
459
|
activity.name # => 'NYRR'
|
|
447
460
|
activity.strava_url # => 'https://www.strava.com/clubs/nyrr'
|
|
448
461
|
```
|
|
449
462
|
|
|
450
|
-
See [Strava::Models::
|
|
463
|
+
See [Strava::Models::SummaryClub](lib/strava/models/summary_club.rb) for all available properties.
|
|
451
464
|
|
|
452
465
|
### Gears
|
|
453
466
|
|
|
@@ -456,7 +469,7 @@ See [Strava::Models::Club](lib/strava/models/club.rb) for all available properti
|
|
|
456
469
|
Returns an equipment using its identifier.
|
|
457
470
|
|
|
458
471
|
```ruby
|
|
459
|
-
gear = client.gear(id: 'b2338517') # => Strava::Models::
|
|
472
|
+
gear = client.gear(id: 'b2338517') # => Strava::Models::DetailedGear
|
|
460
473
|
|
|
461
474
|
gear.id # => 'b2338517'
|
|
462
475
|
gear.name # => 'Trek'
|
|
@@ -471,7 +484,7 @@ gear.weight # => '9'
|
|
|
471
484
|
gear.retired # => 'false'
|
|
472
485
|
```
|
|
473
486
|
|
|
474
|
-
See [Strava::Models::
|
|
487
|
+
See [Strava::Models::DetailedGear](lib/strava/models/detailed_gear.rb) for all available properties.
|
|
475
488
|
|
|
476
489
|
### Routes
|
|
477
490
|
|
|
@@ -533,27 +546,6 @@ route.moving_time_in_hours_s # => '1h21m5s'
|
|
|
533
546
|
|
|
534
547
|
See [Strava::Models::Route](lib/strava/models/route.rb) for all available properties.
|
|
535
548
|
|
|
536
|
-
### Running Races
|
|
537
|
-
|
|
538
|
-
#### Get Running Race
|
|
539
|
-
|
|
540
|
-
Returns a running race for a given identifier.
|
|
541
|
-
|
|
542
|
-
```ruby
|
|
543
|
-
running_race = client.running_race(1577) # => Strava::Models::RunningRace
|
|
544
|
-
|
|
545
|
-
running_race.name # => 'Walt Disney World Marathon 10k'
|
|
546
|
-
running_race.distance # => 10_000.0
|
|
547
|
-
running_race.distance_s # => '10km'
|
|
548
|
-
running_race.city # => 'Orlando'
|
|
549
|
-
running_race.state # => 'FL'
|
|
550
|
-
running_race.country # => 'United States'
|
|
551
|
-
running_race.strava_url # => 'https://www.strava.com/running-races/2018-walt-disney-world-marathon-10k'
|
|
552
|
-
running_race.website_url # => 'https://www.rundisney.com/disneyworld-marathon/'
|
|
553
|
-
```
|
|
554
|
-
|
|
555
|
-
See [Strava::Models::RunningRace](lib/strava/models/running_race.rb) for all available properties.
|
|
556
|
-
|
|
557
549
|
### Segment Efforts
|
|
558
550
|
|
|
559
551
|
#### List Segment Efforts
|
|
@@ -563,7 +555,7 @@ Returns a set of the authenticated athlete's segment efforts for a given segment
|
|
|
563
555
|
```ruby
|
|
564
556
|
segment_efforts = client.segment_efforts(1109718)
|
|
565
557
|
|
|
566
|
-
segment_effort = segment_efforts.first # => Strava::Models::
|
|
558
|
+
segment_effort = segment_efforts.first # => Strava::Models::DetailedSegmentEffort
|
|
567
559
|
|
|
568
560
|
segment_effort.name # => 'E 14th St Climb'
|
|
569
561
|
segment_effort.activity # => Strava::Models::Activity
|
|
@@ -582,27 +574,27 @@ achievement.type # => 'pr'
|
|
|
582
574
|
achievement.type_id # => 3
|
|
583
575
|
```
|
|
584
576
|
|
|
585
|
-
See [Strava::Models::
|
|
577
|
+
See [Strava::Models::DetailedSegmentEffort](lib/strava/models/detailed_segment_effort.rb) and [Strava::Models::Achievement](lib/strava/models/achievement.rb) for all available properties.
|
|
586
578
|
|
|
587
579
|
#### Get Segment Effort
|
|
588
580
|
|
|
589
581
|
Returns a segment effort from an activity that is owned by the authenticated athlete.
|
|
590
582
|
|
|
591
583
|
```ruby
|
|
592
|
-
segment_effort = client.segment_effort(41494197089) # => Strava::Models::
|
|
584
|
+
segment_effort = client.segment_effort(41494197089) # => Strava::Models::DetailedSegmentEffort
|
|
593
585
|
|
|
594
586
|
segment_effort.name # => 'E 14th St Climb'
|
|
595
587
|
segment_effort.activity # => Strava::Models::Activity
|
|
596
588
|
segment_effort.elapsed_time # => 116
|
|
597
589
|
|
|
598
|
-
segment_stats = segment_effort.athlete_segment_stats # => Strava::Models::
|
|
590
|
+
segment_stats = segment_effort.athlete_segment_stats # => Strava::Models::SummaryPRSegmentEffort
|
|
599
591
|
segment_stats.pr_elapsed_time # => 116
|
|
600
592
|
segment_stats.elapsed_time_in_hours_s # => '1m56s'
|
|
601
593
|
segment_stats.pr_date # => Date
|
|
602
594
|
segment_stats.effort_count # => 3
|
|
603
595
|
```
|
|
604
596
|
|
|
605
|
-
See [Strava::Models::
|
|
597
|
+
See [Strava::Models::DetailedSegmentEffort](lib/strava/models/detailed_segment_effort.rb) and [Strava::Models::SummaryPRSegmentEffort](lib/strava/models/summary_pr_segment_effort.rb) for all available properties.
|
|
606
598
|
|
|
607
599
|
### Segments
|
|
608
600
|
|
|
@@ -630,22 +622,23 @@ List of the authenticated athlete's starred segments.
|
|
|
630
622
|
```ruby
|
|
631
623
|
segments = client.starred_segments
|
|
632
624
|
|
|
633
|
-
segment = segments.first # => Strava::Models::
|
|
625
|
+
segment = segments.first # => Strava::Models::SummarySegment
|
|
634
626
|
|
|
635
627
|
segment.pr_time # => 256
|
|
636
628
|
segment.elapsed_time_in_hours_s # => '4m16s'
|
|
637
629
|
segment.starred_date # => Time
|
|
638
|
-
segment.
|
|
630
|
+
segment.athlete_segment_stats # => Strava::Models::SummarySegmentEffort
|
|
631
|
+
segment.athlete_pr_effort # => Strava::Models::SummaryPRSegmentEffort
|
|
639
632
|
```
|
|
640
633
|
|
|
641
|
-
See [Strava::Models::Segment](lib/strava/models/segment.rb) and [Strava::Models::
|
|
634
|
+
See [Strava::Models::Segment](lib/strava/models/segment.rb), [Strava::Models::SummarySegmentEffort](lib/strava/models/summary_segment_effort.rb) and [Strava::Models::SummaryPRSegmentEffort](lib/strava/models/summary_pr_segment_effort.rb) for all available properties.
|
|
642
635
|
|
|
643
636
|
#### Get Segment
|
|
644
637
|
|
|
645
638
|
Returns the specified segment.
|
|
646
639
|
|
|
647
640
|
```ruby
|
|
648
|
-
segment = client.segment(1109718) # => Strava::Models::
|
|
641
|
+
segment = client.segment(1109718) # => Strava::Models::DetailedSegment
|
|
649
642
|
|
|
650
643
|
segment.name # => 'E 14th St Climb'
|
|
651
644
|
segment.city # => 'New York'
|
|
@@ -655,23 +648,23 @@ segment.map # => Strava::Models::Map
|
|
|
655
648
|
segment.effort_count # => 750
|
|
656
649
|
segment.athlete_count # => 206
|
|
657
650
|
segment.star_count # => 1
|
|
658
|
-
segment.athlete_segment_stats # => Strava::Models::
|
|
651
|
+
segment.athlete_segment_stats # => Strava::Models::SummarySegmentEffort
|
|
659
652
|
```
|
|
660
653
|
|
|
661
|
-
See [Strava::Models::
|
|
654
|
+
See [Strava::Models::DetailedSegment](lib/strava/models/detailed_segment.rb) for all available properties.
|
|
662
655
|
|
|
663
656
|
#### Star Segment
|
|
664
657
|
|
|
665
658
|
Stars/unstars the given segment for the authenticated athlete.
|
|
666
659
|
|
|
667
660
|
```ruby
|
|
668
|
-
segment = client.star_segment(50272077110, starred: true) # => Strava::Models::
|
|
661
|
+
segment = client.star_segment(50272077110, starred: true) # => Strava::Models::DetailedSegment
|
|
669
662
|
|
|
670
663
|
segment.name # => 'E 14th St Climb'
|
|
671
664
|
segment.starred # => true
|
|
672
665
|
```
|
|
673
666
|
|
|
674
|
-
See [Strava::Models::
|
|
667
|
+
See [Strava::Models::DetailedSegment](lib/strava/models/detailed_segment.rb) for all available properties.
|
|
675
668
|
|
|
676
669
|
### Streams
|
|
677
670
|
|
|
@@ -798,7 +791,7 @@ See [Strava::Errors::UploadError](lib/strava/errors/upload_failed_error.rb) for
|
|
|
798
791
|
|
|
799
792
|
### Pagination
|
|
800
793
|
|
|
801
|
-
Some Strava APIs, including [athlete-activities](#list-athlete-activities) support pagination when supplying an optional `page` and `per_page` parameter. By default the client retrieves one page of data, which Strava currently defaults to 30 items. You can paginate through
|
|
794
|
+
Some Strava APIs, including [athlete-activities](#list-athlete-activities) support pagination when supplying an optional `page` and `per_page` parameter. By default the client retrieves one page of data, which Strava currently defaults to 30 items. If you supply `per_page`, the client will retrieve all pages. You can paginate through items incrementally by supplying a block. Use `limit` to limit the number of items returned. The underlying implementation makes page-sized calls and increments the `page` argument.
|
|
802
795
|
|
|
803
796
|
```ruby
|
|
804
797
|
client.athlete_activities(per_page: 30) do |activity|
|
|
@@ -806,6 +799,24 @@ client.athlete_activities(per_page: 30) do |activity|
|
|
|
806
799
|
end
|
|
807
800
|
```
|
|
808
801
|
|
|
802
|
+
```ruby
|
|
803
|
+
client.athlete_activities(per_page: 30) # => [Strava::Models::Activity], all pages
|
|
804
|
+
client.athlete_activities(per_page: 30, limit: 50) # => [Strava::Models::Activity], all pages, stop at 50 items
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
Some Strava APIs, including [activity-comments](#list-activity-comments) support cursor-based pagination when supplying optional `after_cursor` and `page_size` parameters. By default the client retrieves one page of data, which Strava currently defaults to 30 items. If you supply `page_size`, the client will retrieve all pages. You can paginate through items incrementally by supplying a block. Use `limit` to limit the number of items returned. The underlying implementation makes page-sized calls and uses the returned `cursor` as `after_cursor`.
|
|
808
|
+
|
|
809
|
+
```ruby
|
|
810
|
+
client.activity_comments(id: 1982980795, page_size: 30) do |comment|
|
|
811
|
+
comment # => Strava::Models::Comment
|
|
812
|
+
end
|
|
813
|
+
```
|
|
814
|
+
|
|
815
|
+
```ruby
|
|
816
|
+
client.activity_comments(id: 1982980795, page_size: 30) # => [Strava::Models::Comment], all pages
|
|
817
|
+
client.activity_comments(id: 1982980795, page_size: 30, limit: 100) # => [Strava::Models::Comment], paginated, stop at 100 items
|
|
818
|
+
```
|
|
819
|
+
|
|
809
820
|
### OAuth
|
|
810
821
|
|
|
811
822
|
#### OAuth Workflow
|
|
@@ -837,10 +848,10 @@ response # => Strava::Models::Token
|
|
|
837
848
|
response.access_token # access token
|
|
838
849
|
response.refresh_token # refresh token
|
|
839
850
|
response.expires_at # timestamp when the access token expires
|
|
840
|
-
response.athlete # => Strava::Models::
|
|
851
|
+
response.athlete # => Strava::Models::SummaryAthlete
|
|
841
852
|
```
|
|
842
853
|
|
|
843
|
-
See [Strava authentication documentation](https://developers.strava.com/docs/authentication/), [Strava::Models::Token](lib/strava/models/token.rb) and [Strava::Models::
|
|
854
|
+
See [Strava authentication documentation](https://developers.strava.com/docs/authentication/), [Strava::Models::Token](lib/strava/models/token.rb) and [Strava::Models::SummaryAthlete](lib/strava/models/summary_athlete.rb) for all available properties in the response.
|
|
844
855
|
|
|
845
856
|
If the access token is expired, refresh it before making any requests. You will get back all new tokens.
|
|
846
857
|
|
|
@@ -895,7 +906,7 @@ event = Strava::Webhooks::Models::Event.new(JSON.parse(request.body))
|
|
|
895
906
|
|
|
896
907
|
event # => Strava::Webhooks::Models::Event
|
|
897
908
|
event.object_type # => 'activity'
|
|
898
|
-
event.
|
|
909
|
+
event.id # => 1991813808
|
|
899
910
|
event.aspect_type # => 'update'
|
|
900
911
|
event.updates # => { 'sport_type' => 'Walk' }
|
|
901
912
|
event.owner_id # => 29323238
|
|
@@ -966,7 +977,7 @@ athlete = client.athlete # => Strava::Models::Athlete
|
|
|
966
977
|
athlete.http_response.ratelimit
|
|
967
978
|
```
|
|
968
979
|
|
|
969
|
-
The following properties are available on Strava::Api::Ratelimit.
|
|
980
|
+
The following properties are available on [Strava::Api::Ratelimit](lib/strava/api/ratelimit.rb).
|
|
970
981
|
|
|
971
982
|
- `limit`
|
|
972
983
|
- `limit?`
|
|
@@ -1014,7 +1025,7 @@ You can configure web client options used in the OAuth and API clients, globally
|
|
|
1014
1025
|
|
|
1015
1026
|
```ruby
|
|
1016
1027
|
Strava::Web::Client.configure do |config|
|
|
1017
|
-
config.user_agent = 'Strava Ruby Client/
|
|
1028
|
+
config.user_agent = 'Strava Ruby Client/3.0'
|
|
1018
1029
|
end
|
|
1019
1030
|
```
|
|
1020
1031
|
|
|
@@ -1140,9 +1151,18 @@ Use [strava-oauth-token](bin/strava-oauth-token) to obtain a token from the comm
|
|
|
1140
1151
|
STRAVA_CLIENT_ID=... STRAVA_CLIENT_SECRET=... strava-oauth-token
|
|
1141
1152
|
```
|
|
1142
1153
|
|
|
1154
|
+
### Strava Refresh Token
|
|
1155
|
+
|
|
1156
|
+
Use [strava-refresh-token](bin/strava-refresh-token) to obtain a token from the command-line using an existing refresh token.
|
|
1157
|
+
|
|
1158
|
+
```bash
|
|
1159
|
+
STRAVA_CLIENT_ID=... STRAVA_CLIENT_SECRET=... STRAVA_API_REFRESH_TOKEN=... strava-refresh-token
|
|
1160
|
+
```
|
|
1161
|
+
|
|
1143
1162
|
## Users
|
|
1144
1163
|
|
|
1145
1164
|
- [Slava: Strava integration with Slack](https://slava.playplay.io), [source](https://github.com/dblock/slack-strava).
|
|
1165
|
+
- [Strada: Strava integration with Discord](https://strada.playplay.io), [source](https://github.com/dblock/discord-strava).
|
|
1146
1166
|
- [Jekyll Blog at run.dblock.org](https://run.dblock.org), [source](https://github.com/dblock/run.dblock.org)
|
|
1147
1167
|
- [Secret Strava](https://steele.blue/secret-strava/), [source](https://github.com/mattdsteele/secret-strava)
|
|
1148
1168
|
|
|
@@ -1164,6 +1184,6 @@ See [CONTRIBUTING](CONTRIBUTING.md).
|
|
|
1164
1184
|
|
|
1165
1185
|
## Copyright and License
|
|
1166
1186
|
|
|
1167
|
-
Copyright (c) 2018, [Daniel Doubrovkine](https://twitter.com/dblockdotorg) and [Contributors](CHANGELOG.md).
|
|
1187
|
+
Copyright (c) 2018-2025, [Daniel Doubrovkine](https://twitter.com/dblockdotorg) and [Contributors](CHANGELOG.md).
|
|
1168
1188
|
|
|
1169
1189
|
This project is licensed under the [MIT License](LICENSE.md).
|
data/bin/strava-activities.rb
CHANGED
data/bin/strava-oauth-token
CHANGED
|
@@ -5,44 +5,52 @@ require 'dotenv/load'
|
|
|
5
5
|
require 'webrick'
|
|
6
6
|
require 'strava-ruby-client'
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
begin
|
|
9
|
+
server = WEBrick::HTTPServer.new(Port: 4242)
|
|
9
10
|
|
|
10
|
-
trap 'INT' do
|
|
11
|
-
|
|
12
|
-
end
|
|
11
|
+
trap 'INT' do
|
|
12
|
+
server.shutdown
|
|
13
|
+
end
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
client_secret: ENV.fetch('STRAVA_CLIENT_SECRET', nil)
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
server.mount_proc '/' do |req, res|
|
|
20
|
-
code = req.query['code']
|
|
21
|
-
response = client.oauth_token(code: code)
|
|
22
|
-
|
|
23
|
-
res.body = %(
|
|
24
|
-
<html>
|
|
25
|
-
<body>
|
|
26
|
-
<ul>
|
|
27
|
-
<li>token_type: #{response.token_type}</li>
|
|
28
|
-
<li>refresh_token: #{response.refresh_token}</li>
|
|
29
|
-
<li>access_token: #{response.access_token}</li>
|
|
30
|
-
<li>expires_at: #{response.expires_at}</li>
|
|
31
|
-
</ul>
|
|
32
|
-
<body>
|
|
33
|
-
</html>
|
|
34
|
-
)
|
|
15
|
+
client_id = ENV.fetch('STRAVA_CLIENT_ID', nil) || raise('Missing STRAVA_CLIENT_ID.')
|
|
16
|
+
client_secret = ENV.fetch('STRAVA_CLIENT_SECRET', nil) || raise('Missing STRAVA_CLIENT_SECRET.')
|
|
35
17
|
|
|
36
|
-
|
|
37
|
-
|
|
18
|
+
client = Strava::OAuth::Client.new(
|
|
19
|
+
client_id: client_id,
|
|
20
|
+
client_secret: client_secret
|
|
21
|
+
)
|
|
38
22
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
23
|
+
server.mount_proc '/' do |req, res|
|
|
24
|
+
code = req.query['code']
|
|
25
|
+
response = client.oauth_token(code: code)
|
|
26
|
+
|
|
27
|
+
res.body = %(
|
|
28
|
+
<html>
|
|
29
|
+
<body>
|
|
30
|
+
<ul>
|
|
31
|
+
<li>token_type: #{response.token_type}</li>
|
|
32
|
+
<li>refresh_token: #{response.refresh_token}</li>
|
|
33
|
+
<li>access_token: #{response.access_token}</li>
|
|
34
|
+
<li>expires_at: #{response.expires_at}</li>
|
|
35
|
+
</ul>
|
|
36
|
+
<body>
|
|
37
|
+
</html>
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
server.shutdown
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
redirect_url = client.authorize_url(
|
|
44
|
+
redirect_uri: 'http://localhost:4242/',
|
|
45
|
+
response_type: 'code',
|
|
46
|
+
scope: 'read_all,activity:read,activity:read_all,profile:read_all,profile:write,activity:write'
|
|
47
|
+
)
|
|
44
48
|
|
|
45
|
-
server.logger.info "opening browser at #{redirect_url}\n"
|
|
46
|
-
system 'open', redirect_url
|
|
49
|
+
server.logger.info "opening browser at #{redirect_url}\n"
|
|
50
|
+
system 'open', redirect_url
|
|
47
51
|
|
|
48
|
-
server.start
|
|
52
|
+
server.start
|
|
53
|
+
rescue Faraday::ClientError => e
|
|
54
|
+
puts e.message
|
|
55
|
+
puts e.response[:body]
|
|
56
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require 'dotenv/load'
|
|
5
|
+
require 'webrick'
|
|
6
|
+
require 'strava-ruby-client'
|
|
7
|
+
|
|
8
|
+
begin
|
|
9
|
+
client_id = ENV.fetch('STRAVA_CLIENT_ID', nil) || raise('Missing STRAVA_CLIENT_ID.')
|
|
10
|
+
client_secret = ENV.fetch('STRAVA_CLIENT_SECRET', nil) || raise('Missing STRAVA_CLIENT_SECRET.')
|
|
11
|
+
refresh_token = ENV.fetch('STRAVA_API_REFRESH_TOKEN', nil) || raise('Missing STRAVA_API_REFRESH_TOKEN.')
|
|
12
|
+
|
|
13
|
+
client = Strava::OAuth::Client.new(
|
|
14
|
+
client_id: client_id,
|
|
15
|
+
client_secret: client_secret
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
response = client.oauth_token(
|
|
19
|
+
refresh_token: refresh_token,
|
|
20
|
+
grant_type: 'refresh_token'
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
puts 'The Strava API refresh token has changed, it will need to be updated.' if refresh_token != response.refresh_token
|
|
24
|
+
|
|
25
|
+
puts "token_type: #{response.token_type}"
|
|
26
|
+
puts "refresh_token: #{response.refresh_token}"
|
|
27
|
+
puts "access_token: #{response.access_token}"
|
|
28
|
+
puts "expires_at: #{response.expires_at}"
|
|
29
|
+
rescue Faraday::ClientError => e
|
|
30
|
+
puts e.message
|
|
31
|
+
puts e.response[:body]
|
|
32
|
+
end
|