strava-ruby-client 0.4.3 → 1.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -1
- data/README.md +90 -88
- data/bin/strava-oauth-token +2 -2
- data/bin/strava-webhooks +2 -2
- data/lib/strava/api/client.rb +21 -2
- data/lib/strava/api/endpoints/routes.rb +2 -2
- data/lib/strava/api/endpoints/running_races.rb +0 -12
- data/lib/strava/api/endpoints/segments.rb +0 -46
- data/lib/strava/api/pagination.rb +60 -0
- data/lib/strava/api/ratelimit.rb +159 -0
- data/lib/strava/deep_copyable.rb +16 -0
- data/lib/strava/models/achievement.rb +1 -1
- data/lib/strava/models/activity.rb +48 -2
- data/lib/strava/models/activity_stats.rb +1 -1
- data/lib/strava/models/activity_total.rb +1 -1
- data/lib/strava/models/activity_zone.rb +1 -1
- data/lib/strava/models/athlete.rb +1 -2
- data/lib/strava/models/authorization.rb +1 -1
- data/lib/strava/models/club.rb +1 -1
- data/lib/strava/models/club_admin.rb +1 -1
- data/lib/strava/models/club_event.rb +1 -1
- data/lib/strava/models/club_member.rb +1 -1
- data/lib/strava/models/comment.rb +1 -1
- data/lib/strava/models/explorer_segment.rb +1 -1
- data/lib/strava/models/gear.rb +1 -1
- data/lib/strava/models/heart_rate_zone_ranges.rb +1 -1
- data/lib/strava/models/kudoser.rb +1 -1
- data/lib/strava/models/lap.rb +1 -1
- data/lib/strava/models/map.rb +1 -1
- data/lib/strava/models/mixins/http_response.rb +15 -0
- data/lib/strava/models/photo.rb +1 -1
- data/lib/strava/models/photos.rb +1 -1
- data/lib/strava/models/power_zone_ranges.rb +1 -1
- data/lib/strava/models/response.rb +9 -0
- data/lib/strava/models/route.rb +1 -1
- data/lib/strava/models/running_race.rb +1 -1
- data/lib/strava/models/segment.rb +1 -1
- data/lib/strava/models/segment_effort.rb +1 -1
- data/lib/strava/models/segment_stats.rb +1 -1
- data/lib/strava/models/similar_activities.rb +1 -1
- data/lib/strava/models/split.rb +1 -1
- data/lib/strava/models/stream.rb +1 -1
- data/lib/strava/models/stream_set.rb +1 -1
- data/lib/strava/models/timed_zone_range.rb +1 -1
- data/lib/strava/models/token.rb +1 -1
- data/lib/strava/models/trend.rb +1 -1
- data/lib/strava/models/upload.rb +1 -1
- data/lib/strava/models/zone_range.rb +1 -1
- data/lib/strava/models/zones.rb +1 -1
- data/lib/strava/version.rb +1 -1
- data/lib/strava/web/api_response.rb +17 -0
- data/lib/strava/web/client.rb +2 -2
- data/lib/strava/web/connection.rb +4 -4
- data/lib/strava/web/raise_response_error.rb +29 -0
- data/lib/strava/web/request.rb +3 -2
- data/lib/strava/web/response.rb +92 -0
- data/lib/strava/webhooks/models/subscription.rb +1 -1
- data/lib/strava-ruby-client.rb +9 -4
- metadata +17 -12
- data/lib/strava/models/segment_leaderboard.rb +0 -12
- data/lib/strava/models/segment_leaderboard_entry.rb +0 -14
- data/lib/strava/web/raise_error.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b80a0bbc9fed0fa22baa2beaa23d59492d26766295539f05eaf7e38c6b6abed3
|
4
|
+
data.tar.gz: f118e373ce17c7add5a1919b7e1b0936836e268a2bcc0c3349a548dccbf16fa7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f6a9ed96fd697e3906afaea168495e2313dce12d9cb125e3ec63e72d007fbba42f424578482982606bcc0e94ae722fd4c22dd7a669ae0566838a8c08374ed3c
|
7
|
+
data.tar.gz: 8a7c832f863941ea132c0f3ef9d327b439038ac12334ebc87ac221ddf6a392371536eb59413cb6dfcac31ed1ecb6554085079d5c284059d0a51a5b74b3a3fd8c
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,19 @@
|
|
1
|
+
### 1.0.0 (2022/12/29)
|
2
|
+
|
3
|
+
* [#48](https://github.com/dblock/strava-ruby-client/pull/55): Removed `client.running_races` - [@simonneutert](https://github.com/simonneutert).
|
4
|
+
* [#56](https://github.com/dblock/strava-ruby-client/pull/56): Removed `client.segment_leaderboard` - [@simonneutert](https://github.com/simonneutert).
|
5
|
+
* [#58](https://github.com/dblock/strava-ruby-client/pull/58): Update Faraday to `>= 2.0` - [@schinery](https://github.com/schinery).
|
6
|
+
* [#58](https://github.com/dblock/strava-ruby-client/pull/58): Removed support for Ruby 2.5 and 2.6 - [@schinery](https://github.com/schinery).
|
7
|
+
* [#58](https://github.com/dblock/strava-ruby-client/pull/58): Upgraded Robocop to 1.3.0 - [@schinery](https://github.com/schinery).
|
8
|
+
* [#59](https://github.com/dblock/strava-ruby-client/pull/59): Removed deprecated `athlete.email` field - [@francordie](https://github.com/francordie).
|
9
|
+
* [#63](https://github.com/dblock/strava-ruby-client/pull/63): Added `activity.sport_type` for Strava API V3 specifications - [@simonneutert](https://github.com/simonneutert).
|
10
|
+
* [#61](https://github.com/dblock/strava-ruby-client/pull/61): Adds ratelimit as a property of model(s) - [@simonneutert](https://github.com/simonneutert), [@adamwolf](https://github.com/adamwolf).
|
11
|
+
|
1
12
|
### 0.4.3 (2022/03/21)
|
2
13
|
|
3
14
|
* [#51](https://github.com/dblock/strava-ruby-client/pull/51): Ensure support for large Integer IDs - [@simonneutert](https://github.com/simonneutert).
|
4
15
|
* [#53](https://github.com/dblock/strava-ruby-client/pull/53): Upgraded to RuboCop 1.26.0 - [@dblock](https://github.com/dblock).
|
5
|
-
* [#46](https://github.com/dblock/strava-ruby-client/pull/46):
|
16
|
+
* [#46](https://github.com/dblock/strava-ruby-client/pull/46): Added missing `activity:read` scope from `strava-oauth-token` - [@xaviershay](https://github.com/xaviershay).
|
6
17
|
|
7
18
|
### 0.4.2 (2021/10/03)
|
8
19
|
|
data/README.md
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
Strava Ruby Client
|
2
|
-
==================
|
1
|
+
# Strava Ruby Client
|
3
2
|
|
4
3
|
[](https://badge.fury.io/rb/strava-ruby-client)
|
5
4
|
[](https://github.com/dblock/strava-ruby-client/actions/workflows/test.yml)
|
@@ -43,13 +42,11 @@ Unlike other clients, including [strava-api-v3](https://github.com/jaredholdcrof
|
|
43
42
|
- [List Athlete Routes](#list-athlete-routes)
|
44
43
|
- [Running Races](#running-races)
|
45
44
|
- [Get Running Race](#get-running-race)
|
46
|
-
- [List Running Races](#list-running-races)
|
47
45
|
- [Segment Efforts](#segment-efforts)
|
48
46
|
- [List Segment Efforts](#list-segment-efforts)
|
49
47
|
- [Get Segment Effort](#get-segment-effort)
|
50
48
|
- [Segments](#segments)
|
51
49
|
- [Explore Segments](#explore-segments)
|
52
|
-
- [Get Segment Leaderboard](#get-segment-leaderboard)
|
53
50
|
- [List Starred Segments](#list-starred-segments)
|
54
51
|
- [Get Segment](#get-segment)
|
55
52
|
- [Star Segment](#star-segment)
|
@@ -66,6 +63,7 @@ Unlike other clients, including [strava-api-v3](https://github.com/jaredholdcrof
|
|
66
63
|
- [Deauthorize](#deauthorize)
|
67
64
|
- [Command Line OAuth Workflow](#command-line-oauth-workflow)
|
68
65
|
- [Webhooks](#webhooks)
|
66
|
+
- [Ratelimit](#ratelimit)
|
69
67
|
- [Configuration](#configuration)
|
70
68
|
- [Web Client Options](#web-client-options)
|
71
69
|
- [API Client Options](#api-client-options)
|
@@ -109,7 +107,7 @@ Creates a manual activity for an athlete.
|
|
109
107
|
```ruby
|
110
108
|
activity = client.create_activity(
|
111
109
|
name: 'Afternoon Run',
|
112
|
-
|
110
|
+
sport_type: 'Run',
|
113
111
|
start_date_local: Time.now,
|
114
112
|
elapsed_time: 1234, # in seconds
|
115
113
|
description: 'Test run.',
|
@@ -217,7 +215,6 @@ lap.name # => 'Lap 1'
|
|
217
215
|
|
218
216
|
See [Strava::Models::Lap](lib/strava/models/lap.rb) for all available properties.
|
219
217
|
|
220
|
-
|
221
218
|
#### List Athlete Activities
|
222
219
|
|
223
220
|
Returns the currently logged-in athlete's activities.
|
@@ -230,6 +227,7 @@ activity = activities.first # => Strava::Models::Activity
|
|
230
227
|
activity.name # => 'NYC TCS Marathon 2018'
|
231
228
|
activity.strava_url # => 'https://www.strava.com/activities/1477353766'
|
232
229
|
activity.type_emoji # => '🏃'
|
230
|
+
activity.sport_type_emoji # => '🏃'
|
233
231
|
activity.distance_s # => '42.2km'
|
234
232
|
activity.moving_time_in_hours_s # => '3h38m5s'
|
235
233
|
activity.elapsed_time_in_hours_s # => '3h42m13s'
|
@@ -272,7 +270,7 @@ Update an activity.
|
|
272
270
|
activity = client.update_activity(
|
273
271
|
id: 1982980795,
|
274
272
|
name: 'Afternoon Run (Updated)',
|
275
|
-
|
273
|
+
sport_type: 'Run',
|
276
274
|
description: 'It was cold.'
|
277
275
|
)
|
278
276
|
|
@@ -530,23 +528,6 @@ running_race.website_url # => 'https://www.rundisney.com/disneyworld-marathon/'
|
|
530
528
|
|
531
529
|
See [Strava::Models::RunningRace](lib/strava/models/running_race.rb) for all available properties.
|
532
530
|
|
533
|
-
#### List Running Races
|
534
|
-
|
535
|
-
Returns a list running races based on a set of search criteria.
|
536
|
-
|
537
|
-
```ruby
|
538
|
-
running_races = client.running_races
|
539
|
-
|
540
|
-
running_race = running_races.first # => Strava::Models::RunningRace
|
541
|
-
|
542
|
-
running_race.name # => 'Walt Disney World Half Marathon'
|
543
|
-
running_race.distance # => 21_097.0
|
544
|
-
running_race.measurement_preference # => 'feet'
|
545
|
-
running_race.distance_s # => '13.11mi'
|
546
|
-
```
|
547
|
-
|
548
|
-
See [Strava::Models::RunningRace](lib/strava/models/running_race.rb) for all available properties.
|
549
|
-
|
550
531
|
### Segment Efforts
|
551
532
|
|
552
533
|
#### List Segment Efforts
|
@@ -616,37 +597,6 @@ segment.elev_difference # => 9.6
|
|
616
597
|
|
617
598
|
See [Strava::Models::ExplorerSegment](lib/strava/models/explorer_segment.rb) for all available properties.
|
618
599
|
|
619
|
-
#### Get Segment Leaderboard
|
620
|
-
|
621
|
-
Returns the specified segment leaderboard.
|
622
|
-
|
623
|
-
```ruby
|
624
|
-
segment_leaderboard = client.segment_leaderboard(1109718) # => Strava::Models::SegmentLeaderboard
|
625
|
-
|
626
|
-
segment_leaderboard.effort_count # => 204
|
627
|
-
segment_leaderboard.entry_count # => 204
|
628
|
-
segment_leaderboard.kom_type # => 'kom'
|
629
|
-
segment_leaderboard.entries # => Enumerable
|
630
|
-
|
631
|
-
entry = segment_leaderboard.entries.first # => Strava::Models::SegmentLeaderboardEntry
|
632
|
-
entry.athlete_name # => 'Etan B.'
|
633
|
-
entry.moving_time_in_hours_s # => '1m32s'
|
634
|
-
entry.start_date # => Time
|
635
|
-
entry.start_date_local # => Time
|
636
|
-
entry.rank # => 1
|
637
|
-
```
|
638
|
-
|
639
|
-
This API supports pagination through the entire segment leaderboard but wraps entries into a [Strava::Models::SegmentLeaderboard](lib/strava/models/segment_leaderboard.rb) object.
|
640
|
-
|
641
|
-
```ruby
|
642
|
-
client.segment_leaderboard(1109718) do |row|
|
643
|
-
row # => Strava::Models::SegmentLeaderboard
|
644
|
-
row.entries # => Array[Strava::Models::SegmentLeaderboardEntry]
|
645
|
-
end
|
646
|
-
```
|
647
|
-
|
648
|
-
See [Strava::Models::SegmentLeaderboard](lib/strava/models/segment_leaderboard.rb) and [Strava::Models::SegmentLeaderboardEntry](lib/strava/models/segment_leaderboard_entry.rb) for all available properties.
|
649
|
-
|
650
600
|
#### List Starred Segments
|
651
601
|
|
652
602
|
List of the authenticated athlete's starred segments.
|
@@ -898,7 +848,7 @@ event # => Strava::Webhooks::Models::Event
|
|
898
848
|
event.object_type # => 'activity'
|
899
849
|
event.object_id # => 1991813808
|
900
850
|
event.aspect_type # => 'update'
|
901
|
-
event.updates # => { '
|
851
|
+
event.updates # => { 'sport_type' => 'Walk' }
|
902
852
|
event.owner_id # => 29323238
|
903
853
|
event.subscription_id # => 131302
|
904
854
|
event.event_time # => DateTime
|
@@ -945,6 +895,58 @@ Delete an existing subscription.
|
|
945
895
|
client.delete_push_subscription(131300) # => nil
|
946
896
|
```
|
947
897
|
|
898
|
+
### Ratelimit
|
899
|
+
|
900
|
+
Every API call's HTTP Reponse Content, be it a single Model or a list (via pagination), can be accessed by using `#http_response`.
|
901
|
+
|
902
|
+
`client.athlete` #=> `Strava::Models::Athlete#http_response`
|
903
|
+
|
904
|
+
`client.activity_comments(id: 1234567)` #=> `Array<Strava::Models::Comment>#http_response`
|
905
|
+
|
906
|
+
`http_response` itself is a `Strava::Web::ApiResponse` class. Ratelimits are accessed via this class using `Strava::Web::ApiResponse#ratelimit`. See the examples given below:
|
907
|
+
|
908
|
+
```ruby
|
909
|
+
comments = client.activity_comments(id: 123_456_789)
|
910
|
+
|
911
|
+
# comments == Array<Strava::Models::Comment>
|
912
|
+
comments.http_response.ratelimit.to_h
|
913
|
+
```
|
914
|
+
|
915
|
+
```ruby
|
916
|
+
athlete = client.athlete # => Strava::Models::Athlete
|
917
|
+
athlete.http_response.ratelimit
|
918
|
+
```
|
919
|
+
|
920
|
+
The following properties are available on Strava::Api::Ratelimit.
|
921
|
+
|
922
|
+
- `limit`
|
923
|
+
- `limit?`
|
924
|
+
- `usage`
|
925
|
+
- `fifteen_minutes`
|
926
|
+
- `fifteen_minutes_usage`
|
927
|
+
- `fifteen_minutes_remaining`
|
928
|
+
- `total_day`
|
929
|
+
- `total_day_usage`
|
930
|
+
- `total_day_remaining`
|
931
|
+
- `to_h`
|
932
|
+
- `to_s`
|
933
|
+
|
934
|
+
You can access the Hash containing all limits by calling `to_h`.
|
935
|
+
|
936
|
+
```ruby
|
937
|
+
# athlete.http_response.ratelimit.to_h
|
938
|
+
{
|
939
|
+
limit: limit,
|
940
|
+
usage: usage,
|
941
|
+
total_day: total_day,
|
942
|
+
total_day_usage: total_day_usage,
|
943
|
+
total_day_remaining: total_day_remaining,
|
944
|
+
fifteen_minutes: fifteen_minutes,
|
945
|
+
fifteen_minutes_usage: fifteen_minutes_usage,
|
946
|
+
fifteen_minutes_remaining: fifteen_minutes_remaining
|
947
|
+
}
|
948
|
+
```
|
949
|
+
|
948
950
|
## Configuration
|
949
951
|
|
950
952
|
### Web Client Options
|
@@ -959,15 +961,15 @@ end
|
|
959
961
|
|
960
962
|
The following settings are supported.
|
961
963
|
|
962
|
-
setting
|
963
|
-
|
964
|
-
user_agent
|
965
|
-
proxy
|
966
|
-
ca_path
|
967
|
-
ca_file
|
968
|
-
logger
|
969
|
-
timeout
|
970
|
-
open_timeout
|
964
|
+
| setting | description |
|
965
|
+
| ------------ | ----------------------------------------------------- |
|
966
|
+
| user_agent | User-agent, defaults to _Strava Ruby Client/version_. |
|
967
|
+
| proxy | Optional HTTP proxy. |
|
968
|
+
| ca_path | Optional SSL certificates path. |
|
969
|
+
| ca_file | Optional SSL certificates file. |
|
970
|
+
| logger | Optional `Logger` instance that logs HTTP requests. |
|
971
|
+
| timeout | Optional open/read timeout in seconds. |
|
972
|
+
| open_timeout | Optional connection open timeout in seconds. |
|
971
973
|
|
972
974
|
### API Client Options
|
973
975
|
|
@@ -988,10 +990,10 @@ client = Strava::API::Client.new(
|
|
988
990
|
|
989
991
|
The following settings are supported.
|
990
992
|
|
991
|
-
setting
|
992
|
-
|
993
|
-
access_token
|
994
|
-
endpoint
|
993
|
+
| setting | description |
|
994
|
+
| ------------ | --------------------------------------------------- |
|
995
|
+
| access_token | Access token to pass in the `Authorization` header. |
|
996
|
+
| endpoint | Defaults to `https://www.strava.com/api/v3`. |
|
995
997
|
|
996
998
|
### OAuth Client Options
|
997
999
|
|
@@ -1014,11 +1016,11 @@ client = Strava::OAuth::Client.new(
|
|
1014
1016
|
|
1015
1017
|
The following settings are supported.
|
1016
1018
|
|
1017
|
-
setting
|
1018
|
-
|
1019
|
-
client_id
|
1020
|
-
client_secret
|
1021
|
-
endpoint
|
1019
|
+
| setting | description |
|
1020
|
+
| ------------- | ------------------------------------------- |
|
1021
|
+
| client_id | Application client ID. |
|
1022
|
+
| client_secret | Application client secret. |
|
1023
|
+
| endpoint | Defaults to `https://www.strava.com/oauth`. |
|
1022
1024
|
|
1023
1025
|
### Webhooks Client Options
|
1024
1026
|
|
@@ -1041,11 +1043,11 @@ client = Strava::Webhooks::Client.new(
|
|
1041
1043
|
|
1042
1044
|
The following settings are supported.
|
1043
1045
|
|
1044
|
-
setting
|
1045
|
-
|
1046
|
-
client_id
|
1047
|
-
client_secret
|
1048
|
-
endpoint
|
1046
|
+
| setting | description |
|
1047
|
+
| ------------- | -------------------------------------------- |
|
1048
|
+
| client_id | Application client ID. |
|
1049
|
+
| client_secret | Application client secret. |
|
1050
|
+
| endpoint | Defaults to `https://www.strava.com/api/v3`. |
|
1049
1051
|
|
1050
1052
|
## Errors
|
1051
1053
|
|
@@ -1070,22 +1072,22 @@ For a complete set of command-line tools, check out [strava-ruby-cli](https://gi
|
|
1070
1072
|
Use [strava-oauth-token](bin/strava-oauth-token) to obtain a token from the command-line. This will open a new browser window, navigate to Strava, request the appropriate permissions, then handle OAuth in a local redirect. The token type, refresh token, access token and token expiration will be displayed in the browser.
|
1071
1073
|
|
1072
1074
|
```bash
|
1073
|
-
|
1075
|
+
STRAVA_CLIENT_ID=... STRAVA_CLIENT_SECRET=... strava-oauth-token
|
1074
1076
|
```
|
1075
1077
|
|
1076
1078
|
## Users
|
1077
1079
|
|
1078
|
-
|
1079
|
-
|
1080
|
-
|
1080
|
+
- [Slava: Strava integration with Slack](https://slava.playplay.io), [source](https://github.com/dblock/slack-strava).
|
1081
|
+
- [Jekyll Blog at run.dblock.org](https://run.dblock.org), [source](https://github.com/dblock/run.dblock.org)
|
1082
|
+
- [Secret Strava](https://steele.blue/secret-strava/), [source](https://github.com/mattdsteele/secret-strava)
|
1081
1083
|
|
1082
1084
|
## Resources
|
1083
1085
|
|
1084
|
-
|
1085
|
-
|
1086
|
-
|
1087
|
-
|
1088
|
-
|
1086
|
+
- [Strava API Documentation](https://developers.strava.com)
|
1087
|
+
- [Writing a New Strava API Ruby Client](https://code.dblock.org/2018/11/27/writing-a-new-strava-api-ruby-client.html)
|
1088
|
+
- [Dealing with Strava API OAuth Token Migration](https://code.dblock.org/2018/11/17/dealing-with-strava-api-token-migration.html)
|
1089
|
+
- [Auto-Publishing Strava Runs to Github Pages](https://code.dblock.org/2018/02/17/auto-publishing-strava-runs-to-github-pages.html)
|
1090
|
+
- [Strava Command-Line Client](https://github.com/dblock/strava-ruby-cli)
|
1089
1091
|
|
1090
1092
|
## Upgrading
|
1091
1093
|
|
data/bin/strava-oauth-token
CHANGED
@@ -12,8 +12,8 @@ trap 'INT' do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
client = Strava::OAuth::Client.new(
|
15
|
-
client_id: ENV
|
16
|
-
client_secret: ENV
|
15
|
+
client_id: ENV.fetch('STRAVA_CLIENT_ID', nil),
|
16
|
+
client_secret: ENV.fetch('STRAVA_CLIENT_SECRET', nil)
|
17
17
|
)
|
18
18
|
|
19
19
|
server.mount_proc '/' do |req, res|
|
data/bin/strava-webhooks
CHANGED
@@ -9,8 +9,8 @@ logger = ::Logger.new($stdout)
|
|
9
9
|
logger.level = Logger::INFO
|
10
10
|
|
11
11
|
client = Strava::Webhooks::Client.new(
|
12
|
-
client_id: ENV
|
13
|
-
client_secret: ENV
|
12
|
+
client_id: ENV.fetch('STRAVA_CLIENT_ID', nil),
|
13
|
+
client_secret: ENV.fetch('STRAVA_CLIENT_SECRET', nil),
|
14
14
|
logger: logger
|
15
15
|
)
|
16
16
|
|
data/lib/strava/api/client.rb
CHANGED
@@ -40,18 +40,37 @@ module Strava
|
|
40
40
|
|
41
41
|
private
|
42
42
|
|
43
|
+
#
|
44
|
+
# paginates requests
|
45
|
+
#
|
46
|
+
# @param [String] path url for request
|
47
|
+
# @param [Hash] options hash containing settings
|
48
|
+
# @param [Class] model by Class
|
49
|
+
#
|
50
|
+
# @example
|
51
|
+
# paginate("athlete/activities", {per_page: 72}, Strava::Models::Activity)
|
52
|
+
#
|
53
|
+
# @return [Strava::Api::Pagination]
|
54
|
+
#
|
43
55
|
def paginate(path, options, model)
|
56
|
+
collection = []
|
57
|
+
web_response = nil
|
44
58
|
if block_given?
|
45
59
|
Cursor.new(self, path, options).each do |page|
|
60
|
+
web_response = page # response of the last request made
|
46
61
|
page.each do |row|
|
47
|
-
|
62
|
+
m = model.new(row)
|
63
|
+
yield m
|
64
|
+
collection << m
|
48
65
|
end
|
49
66
|
end
|
50
67
|
else
|
51
|
-
get(path, options)
|
68
|
+
web_response = get(path, options)
|
69
|
+
collection = web_response.map do |row|
|
52
70
|
model.new(row)
|
53
71
|
end
|
54
72
|
end
|
73
|
+
Pagination.new(collection, web_response)
|
55
74
|
end
|
56
75
|
end
|
57
76
|
end
|
@@ -12,7 +12,7 @@ module Strava
|
|
12
12
|
#
|
13
13
|
def export_route_gpx(id_or_options, options = {})
|
14
14
|
id, options = parse_args(id_or_options, options)
|
15
|
-
get
|
15
|
+
get("routes/#{id}/export_gpx", options).response
|
16
16
|
end
|
17
17
|
|
18
18
|
#
|
@@ -23,7 +23,7 @@ module Strava
|
|
23
23
|
#
|
24
24
|
def export_route_tcx(id_or_options, options = {})
|
25
25
|
id, options = parse_args(id_or_options, options)
|
26
|
-
get
|
26
|
+
get("routes/#{id}/export_tcx", options).response
|
27
27
|
end
|
28
28
|
|
29
29
|
#
|
@@ -14,18 +14,6 @@ module Strava
|
|
14
14
|
id, options = parse_args(id_or_options, options)
|
15
15
|
Strava::Models::RunningRace.new(get("running_races/#{id}", options))
|
16
16
|
end
|
17
|
-
|
18
|
-
#
|
19
|
-
# Returns a list running races based on a set of search criteria.
|
20
|
-
#
|
21
|
-
# @option options [Integer] :year
|
22
|
-
# Filters the list by a given year.
|
23
|
-
#
|
24
|
-
def running_races(options = {})
|
25
|
-
get('running_races', options).map do |row|
|
26
|
-
Strava::Models::RunningRace.new(row)
|
27
|
-
end
|
28
|
-
end
|
29
17
|
end
|
30
18
|
end
|
31
19
|
end
|
@@ -25,52 +25,6 @@ module Strava
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
#
|
29
|
-
# Returns the specified segment leaderboard.
|
30
|
-
#
|
31
|
-
# @option options [Integer] :id
|
32
|
-
# The identifier of the segment leaderboard.
|
33
|
-
# @option options [String] :gender
|
34
|
-
# Filter by gender.
|
35
|
-
# @option options [String] :age_group
|
36
|
-
# Filter by age group.
|
37
|
-
# @option options [String] :weight_class
|
38
|
-
# Filter by weight class.
|
39
|
-
# @option options [Boolean] :following
|
40
|
-
# Filter by friends of the authenticated athlete.
|
41
|
-
# @option options [Integer] :club_id
|
42
|
-
# Filter by club.
|
43
|
-
# @option options [String] :date_range
|
44
|
-
# Filter by date range.
|
45
|
-
# @option options [Integer] :context_entries
|
46
|
-
# ?
|
47
|
-
# @option options [Integer] :page
|
48
|
-
# Page number.
|
49
|
-
# @option options [Integer] :per_page
|
50
|
-
# Number of items per page. Defaults to 30.
|
51
|
-
#
|
52
|
-
def segment_leaderboard(id_or_options, options = {})
|
53
|
-
id, options = parse_args(id_or_options, options)
|
54
|
-
|
55
|
-
if block_given?
|
56
|
-
next_page = 1
|
57
|
-
total_count = 0
|
58
|
-
loop do
|
59
|
-
query = options.merge(page: next_page)
|
60
|
-
response = Strava::Models::SegmentLeaderboard.new(get("segments/#{id}/leaderboard", query))
|
61
|
-
total_count += response.entries.count
|
62
|
-
break unless response.entries.any?
|
63
|
-
|
64
|
-
yield response
|
65
|
-
break if total_count >= response.entry_count
|
66
|
-
|
67
|
-
next_page += 1
|
68
|
-
end
|
69
|
-
else
|
70
|
-
Strava::Models::SegmentLeaderboard.new(get("segments/#{id}/leaderboard", options))
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
28
|
#
|
75
29
|
# List of the authenticated athlete's starred segments.
|
76
30
|
#
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Strava
|
4
|
+
module Api
|
5
|
+
#
|
6
|
+
# Wrapper Class around pagination results which are an Array of Models.
|
7
|
+
#
|
8
|
+
# This class exists to provide a way to provide a high-level abstraction, like
|
9
|
+
# access to API request/response data (i.e. ratelimits) for paginated results.
|
10
|
+
#
|
11
|
+
class Pagination
|
12
|
+
include Enumerable
|
13
|
+
include Strava::DeepCopyable
|
14
|
+
|
15
|
+
attr_reader :collection
|
16
|
+
|
17
|
+
#
|
18
|
+
# @param [Array<Strava::Models::>] collection of Models
|
19
|
+
# @param [Strava::Web::Response] web_response
|
20
|
+
#
|
21
|
+
def initialize(collection, web_response)
|
22
|
+
@collection = collection
|
23
|
+
@web_response = web_response
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# getter method that calculates on access
|
28
|
+
#
|
29
|
+
# @return [Strava::Web::ApiResponse]
|
30
|
+
#
|
31
|
+
def http_response
|
32
|
+
@http_response ||=
|
33
|
+
Strava::Web::ApiResponse.new(deep_copy(@web_response).http_response)
|
34
|
+
end
|
35
|
+
|
36
|
+
#
|
37
|
+
# delegates `size` to @collection
|
38
|
+
#
|
39
|
+
# @return [Integer]
|
40
|
+
#
|
41
|
+
def size
|
42
|
+
@collection.size
|
43
|
+
end
|
44
|
+
|
45
|
+
def each
|
46
|
+
@collection.each { |c| yield c if block_given? }
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def method_missing(method_symbol, *args, &block)
|
52
|
+
@collection.send(method_symbol, *args, &block)
|
53
|
+
end
|
54
|
+
|
55
|
+
def respond_to_missing?(method_name, include_private = false)
|
56
|
+
super
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|