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.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +60 -48
  3. data/LICENSE.md +1 -1
  4. data/README.md +100 -80
  5. data/bin/strava-activities.rb +2 -0
  6. data/bin/strava-oauth-token +43 -35
  7. data/bin/strava-refresh-token +32 -0
  8. data/lib/strava/api/client.rb +46 -6
  9. data/lib/strava/api/cursor.rb +26 -2
  10. data/lib/strava/api/endpoints/activities.rb +10 -7
  11. data/lib/strava/api/endpoints/athletes.rb +2 -2
  12. data/lib/strava/api/endpoints/clubs.rb +5 -5
  13. data/lib/strava/api/endpoints/gears.rb +1 -1
  14. data/lib/strava/api/endpoints/segment_efforts.rb +2 -2
  15. data/lib/strava/api/endpoints/segments.rb +3 -3
  16. data/lib/strava/api/pagination.rb +1 -2
  17. data/lib/strava/models/achievement.rb +1 -0
  18. data/lib/strava/models/activity_stats.rb +1 -0
  19. data/lib/strava/models/activity_total.rb +5 -9
  20. data/lib/strava/models/activity_zone.rb +4 -1
  21. data/lib/strava/models/base_stream.rb +12 -0
  22. data/lib/strava/models/club_activity.rb +22 -0
  23. data/lib/strava/models/{club_member.rb → club_athlete.rb} +5 -2
  24. data/lib/strava/models/club_event.rb +6 -4
  25. data/lib/strava/models/comment.rb +7 -2
  26. data/lib/strava/models/destination.rb +12 -0
  27. data/lib/strava/models/{activity.rb → detailed_activity.rb} +51 -103
  28. data/lib/strava/models/{athlete.rb → detailed_athlete.rb} +20 -14
  29. data/lib/strava/models/{club.rb → detailed_club.rb} +10 -3
  30. data/lib/strava/models/{gear.rb → detailed_gear.rb} +10 -7
  31. data/lib/strava/models/{photo.rb → detailed_photo.rb} +13 -5
  32. data/lib/strava/models/{photos.rb → detailed_photos.rb} +2 -1
  33. data/lib/strava/models/{segment.rb → detailed_segment.rb} +18 -24
  34. data/lib/strava/models/{segment_effort.rb → detailed_segment_effort.rb} +23 -17
  35. data/lib/strava/models/explorer_segment.rb +8 -5
  36. data/lib/strava/models/heart_rate_zone_ranges.rb +1 -0
  37. data/lib/strava/models/kudoser.rb +1 -0
  38. data/lib/strava/models/lap.rb +18 -16
  39. data/lib/strava/models/lat_lng.rb +46 -0
  40. data/lib/strava/models/local_legend.rb +16 -0
  41. data/lib/strava/models/meta_activity.rb +13 -0
  42. data/lib/strava/models/meta_athlete.rb +14 -0
  43. data/lib/strava/models/meta_club.rb +12 -0
  44. data/lib/strava/models/mixins/{time.rb → average_speed.rb} +6 -29
  45. data/lib/strava/models/mixins/elapsed_time.rb +20 -0
  46. data/lib/strava/models/mixins/elevation_difference.rb +39 -0
  47. data/lib/strava/models/mixins/elevation_gain.rb +39 -0
  48. data/lib/strava/models/mixins/estimated_moving_time.rb +20 -0
  49. data/lib/strava/models/mixins/moving_time.rb +20 -0
  50. data/lib/strava/models/mixins/sport_type.rb +73 -0
  51. data/lib/strava/models/mixins/time_in_hours.rb +26 -0
  52. data/lib/strava/models/mixins/{elevation.rb → total_elevation_gain.rb} +1 -1
  53. data/lib/strava/models/photos_summary.rb +12 -0
  54. data/lib/strava/models/photos_summary_primary.rb +15 -0
  55. data/lib/strava/models/power_zone_ranges.rb +1 -0
  56. data/lib/strava/models/route.rb +14 -13
  57. data/lib/strava/models/similar_activities.rb +2 -0
  58. data/lib/strava/models/split.rb +8 -6
  59. data/lib/strava/models/stats_visibility.rb +11 -0
  60. data/lib/strava/models/stream_set.rb +2 -1
  61. data/lib/strava/models/summary_activity.rb +71 -0
  62. data/lib/strava/models/summary_athlete.rb +31 -0
  63. data/lib/strava/models/summary_club.rb +34 -0
  64. data/lib/strava/models/summary_gear.rb +18 -0
  65. data/lib/strava/models/summary_pr_segment_effort.rb +16 -0
  66. data/lib/strava/models/summary_segment.rb +34 -0
  67. data/lib/strava/models/summary_segment_effort.rb +16 -0
  68. data/lib/strava/models/timed_zone_range.rb +1 -0
  69. data/lib/strava/models/token.rb +1 -1
  70. data/lib/strava/models/trend.rb +1 -0
  71. data/lib/strava/models/updatable_activity.rb +16 -0
  72. data/lib/strava/models/upload.rb +2 -0
  73. data/lib/strava/models/waypoint.rb +15 -0
  74. data/lib/strava/models/xoms.rb +13 -0
  75. data/lib/strava/models/zone_range.rb +1 -0
  76. data/lib/strava/models/zones.rb +1 -0
  77. data/lib/strava/version.rb +1 -1
  78. data/lib/strava/webhooks/models/event.rb +1 -1
  79. data/lib/strava-ruby-client.rb +55 -30
  80. metadata +47 -18
  81. data/lib/strava/api/endpoints/running_races.rb +0 -20
  82. data/lib/strava/models/club_admin.rb +0 -15
  83. data/lib/strava/models/running_race.rb +0 -35
  84. 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
  [![Gem Version](https://badge.fury.io/rb/strava-ruby-client.svg)](https://badge.fury.io/rb/strava-ruby-client)
4
4
  [![Test](https://github.com/dblock/strava-ruby-client/actions/workflows/test.yml/badge.svg?branch=master)](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::Athlete
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
- Note the `access_token` from the browser window.
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::Activity](lib/strava/models/activity.rb) for all available properties.
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::Activity](lib/strava/models/activity.rb) for all available properties.
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::Photo]
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::Photo]
197
+ # photos = client.activity_photos(1982980795, {size: 1920}) # => Array[Strava::Models::DetailedPhoto]
185
198
 
186
- photo = photos.first # => Strava::Models::Photo
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::Photo](lib/strava/models/photo.rb) for all available properties.
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::Athlete]
235
+ kudoers = client.activity_kudos(1982980795) # => Array[Strava::Models::SummaryAthlete]
223
236
 
224
- kodoer = kudoers.first # => Strava::Models::Athlete
237
+ kodoer = kudoers.first # => Strava::Models::SummaryAthlete
225
238
 
226
239
  kudoer.username # => 'zolotov'
227
240
  ```
228
241
 
229
- See [Strava::Models::Athlete](lib/strava/models/athlete.rb) for all available properties.
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::Activity]
263
+ activities = client.athlete_activities # => Array[Strava::Models::SummaryActivity]
251
264
 
252
- activity = activities.first # => Strava::Models::Activity
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.speed_s # => '11.4km/h'
263
- activity.miles_per_hour_s # => '7.1mph'
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::Activity](lib/strava/models/activity.rb), [Strava::Models::Mixins::Distance](lib/strava/models/mixins/distance.rb), [Strava::Models::Mixins::Elevation](lib/strava/models/mixins/elevation.rb) and [Strava::Models::Mixins::Time](lib/strava/models/mixins/time.rb) for all available properties.
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::Athlete
327
+ client.athlete # => Strava::Models::DetailedAthlete
315
328
  ```
316
329
 
317
- See [Strava::Models::Athlete](lib/strava/models/athlete.rb) for all available properties.
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::Athlete](lib/strava/models/athlete.rb) for all available returned properties.
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::Activity]
389
+ activities = client.club_activities(108605) # => Array[Strava::Models::ClubActivity]
377
390
 
378
- activity = activities.first # => Strava::Models::Activity
391
+ activity = activities.first # => Strava::Models::ClubActivity
379
392
 
380
393
  activity.name # => 'Afternoon Run'
381
394
  ```
382
395
 
383
- See [Strava::Models::Activity](lib/strava/models/activity.rb) for all available properties. Note that Strava does not return activity or athlete ID via this API.
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::ClubAdmin]
417
+ admins = client.club_admins(108605) # => Array[Strava::Models::ClubAthlete]
405
418
 
406
- admin = admins.first # => Strava::Models::ClubAdmin
419
+ admin = admins.first # => Strava::Models::ClubAthlete
407
420
  admin.name # => 'Peter Ciaccia'
408
421
  ```
409
422
 
410
- See [Strava::Models::ClubAdmin](lib/strava/models/club_admin.rb) for all available properties.
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::Club
430
+ club = client.club(108605) # => Strava::Models::DetailedClub
418
431
 
419
432
  club.name # => 'NYRR'
420
433
  ```
421
434
 
422
- See [Strava::Models::Club](lib/strava/models/club.rb) for all available properties.
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::ClubMember]
442
+ members = client.club_members(108605) # => Array[Strava::Models::ClubAthlete]
430
443
 
431
- member = members.first # => Strava::Models::ClubMember
444
+ member = members.first # => Strava::Models::ClubAthlete
432
445
  member.name # => 'Peter Ciaccia'
433
446
  ```
434
447
 
435
- See [Strava::Models::ClubMember](lib/strava/models/club_member.rb) for all available properties.
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::Club]
455
+ clubs = client.athlete_clubs # => Array[Strava::Models::SummaryClub]
443
456
 
444
- club = clubs.first # => Strava::Models::Club
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::Club](lib/strava/models/club.rb) for all available properties.
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::Gear
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::Gear](lib/strava/models/gear.rb) for all available properties.
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::SegmentEffort
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::SegmentEffort](lib/strava/models/segment_effort.rb) and [Strava::Models::Achievement](lib/strava/models/achievement.rb) for all available properties.
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::SegmentEffort
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::SegmentStats
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::SegmentEffort](lib/strava/models/segment_effort.rb) and [Strava::Models::SegmentStats](lib/strava/models/segment_stats.rb) for all available properties.
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::Segment
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.athlete_pr_effort # => Strava::Models::SegmentEffort
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::SegmentEffort](lib/strava/models/segment_effort.rb) for all available properties.
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::Segment
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::SegmentStats
651
+ segment.athlete_segment_stats # => Strava::Models::SummarySegmentEffort
659
652
  ```
660
653
 
661
- See [Strava::Models::Segment](lib/strava/models/segment.rb) for all available properties.
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::Segment
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::Segment](lib/strava/models/segment.rb) for all available properties.
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 more data by supplying a block and an optional `per_page` parameter. The underlying implementation makes page-sized calls and increments the `page` argument.
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::Athlete
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::Athlete](lib/strava/models/athlete.rb) for all available properties in the response.
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.object_id # => 1991813808
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/1.0'
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).
@@ -8,6 +8,8 @@ client = Strava::Api::Client.new(
8
8
  access_token: access_token
9
9
  )
10
10
 
11
+ puts "Logged in as #{client.athlete.name}."
12
+
11
13
  client.athlete_activities.each do |activity|
12
14
  puts activity.name
13
15
  end
@@ -5,44 +5,52 @@ require 'dotenv/load'
5
5
  require 'webrick'
6
6
  require 'strava-ruby-client'
7
7
 
8
- server = WEBrick::HTTPServer.new(Port: 4242)
8
+ begin
9
+ server = WEBrick::HTTPServer.new(Port: 4242)
9
10
 
10
- trap 'INT' do
11
- server.shutdown
12
- end
11
+ trap 'INT' do
12
+ server.shutdown
13
+ end
13
14
 
14
- client = Strava::OAuth::Client.new(
15
- client_id: ENV.fetch('STRAVA_CLIENT_ID', nil),
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
- server.shutdown
37
- end
18
+ client = Strava::OAuth::Client.new(
19
+ client_id: client_id,
20
+ client_secret: client_secret
21
+ )
38
22
 
39
- redirect_url = client.authorize_url(
40
- redirect_uri: 'http://localhost:4242/',
41
- response_type: 'code',
42
- scope: 'read_all,activity:read,activity:read_all,profile:read_all,profile:write,activity:write'
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