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
@@ -2,142 +2,90 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- class Activity < Strava::Models::Response
6
- include Mixins::Time
7
- include Mixins::Distance
8
- include Mixins::Elevation
9
- include Mixins::StartDateLocal
10
-
11
- property 'id'
12
- property 'resource_state'
13
- property 'athlete', transform_with: ->(v) { Strava::Models::Athlete.new(v) }
14
- property 'name'
15
- property 'description'
16
- property 'sport_type'
17
- property 'workout_type'
5
+ # https://developers.strava.com/docs/reference/#api-models-DetailedActivity
6
+ class DetailedActivity < Strava::Models::Response
18
7
  property 'id'
19
8
  property 'external_id'
20
9
  property 'upload_id'
10
+ property 'athlete', transform_with: ->(v) { Strava::Models::MetaAthlete.new(v) }
11
+ property 'name'
12
+ include Mixins::Distance
13
+ include Mixins::MovingTime
14
+ include Mixins::ElapsedTime
15
+ include Mixins::AverageSpeed
16
+ include Mixins::TotalElevationGain
17
+ property 'elev_high'
18
+ property 'elev_low'
19
+ include Mixins::SportType
21
20
  property 'start_date', transform_with: ->(v) { Time.parse(v) }
21
+ include Mixins::StartDateLocal
22
22
  property 'timezone'
23
- property 'utc_offset'
24
- property 'start_latlng'
25
- property 'end_latlng'
26
- property 'location_city'
27
- property 'location_state'
28
- property 'location_country'
29
- property 'start_latitude'
30
- property 'start_longitude'
23
+ property 'start_latlng', transform_with: ->(v) { Strava::Models::LatLng.new(v) }
24
+ property 'end_latlng', transform_with: ->(v) { Strava::Models::LatLng.new(v) }
31
25
  property 'achievement_count'
32
26
  property 'kudos_count'
33
27
  property 'comment_count'
34
28
  property 'athlete_count'
35
29
  property 'photo_count'
30
+ property 'total_photo_count'
36
31
  property 'map', transform_with: ->(v) { Strava::Models::Map.new(v) }
37
32
  property 'trainer'
38
33
  property 'commute'
39
34
  property 'manual'
40
35
  property 'private'
41
- property 'visibility'
42
36
  property 'flagged'
43
- property 'gear_id'
44
- property 'from_accepted_tag'
37
+ property 'workout_type'
38
+ property 'upload_id_str'
45
39
  property 'average_speed'
46
40
  property 'max_speed'
41
+ property 'has_kudoed'
42
+ property 'hide_from_home'
43
+ property 'gear_id'
44
+ property 'kilojoules'
45
+ property 'average_watts'
46
+ property 'device_watts'
47
+ property 'max_watts'
48
+ property 'weighted_average_watts'
49
+ property 'description'
50
+ property 'photos', transform_with: ->(v) { Strava::Models::PhotosSummary.new(v) }
51
+ property 'gear', transform_with: ->(v) { Strava::Models::SummaryGear.new(v) }
52
+ property 'calories'
53
+ property 'segment_efforts', transform_with: ->(v) { v.map { |r| Strava::Models::DetailedSegmentEffort.new(r) } }
54
+ property 'device_name'
55
+ property 'embed_token'
56
+ property 'splits_metric', transform_with: ->(v) { v.map { |r| Strava::Models::Split.new(r) } }
57
+ property 'splits_standard', transform_with: ->(v) { v.map { |r| Strava::Models::Split.new(r) } }
58
+ property 'laps', transform_with: ->(v) { v.map { |r| Strava::Models::Lap.new(r) } }
59
+ property 'best_efforts', transform_with: ->(v) { v.map { |r| Strava::Models::DetailedSegmentEffort.new(r) } }
60
+ # undocumented
61
+ property 'resource_state'
62
+ property 'utc_offset'
63
+ property 'location_city'
64
+ property 'location_state'
65
+ property 'location_country'
66
+ property 'visibility'
67
+ property 'average_temp'
47
68
  property 'has_heartrate'
48
69
  property 'average_heartrate'
49
70
  property 'max_heartrate'
50
71
  property 'heartrate_opt_out'
51
72
  property 'display_hide_heartrate_option'
52
- property 'elev_high'
53
- property 'elev_low'
73
+ property 'from_accepted_tag'
54
74
  property 'pr_count'
55
- property 'total_photo_count'
56
- property 'has_kudoed'
57
75
  property 'suffer_score'
58
- property 'calories'
59
- property 'segment_efforts', transform_with: ->(v) { v.map { |r| Strava::Models::SegmentEffort.new(r) } }
60
- property 'best_efforts', transform_with: ->(v) { v.map { |r| Strava::Models::SegmentEffort.new(r) } }
61
- property 'photos', transform_with: ->(v) { Strava::Models::Photos.new(v) }
62
- property 'similar_activities', transform_with: ->(v) { Strava::Models::SimilarActivities.new(v) }
63
- property 'embed_token'
76
+ property 'perceived_exertion'
77
+ property 'prefer_perceived_exertion'
78
+ property 'stats_visibility', transform_with: ->(v) { v.map { |r| Strava::Models::StatsVisibility.new(r) } }
64
79
  property 'available_zones'
65
- property 'splits_metric', transform_with: ->(v) { v.map { |r| Strava::Models::Split.new(r) } }
66
- property 'splits_standard', transform_with: ->(v) { v.map { |r| Strava::Models::Split.new(r) } }
67
- property 'laps', transform_with: ->(v) { v.map { |r| Strava::Models::Lap.new(r) } }
68
- property 'gear', transform_with: ->(v) { Strava::Models::Gear.new(v) }
69
- property 'device_name'
80
+ property 'similar_activities', transform_with: ->(v) { Strava::Models::SimilarActivities.new(v) }
70
81
  property 'average_cadence'
71
- property 'average_temp'
72
- property 'average_watts'
73
- property 'weighted_average_watts'
74
- property 'kilojoules'
75
- property 'device_watts'
76
- property 'max_watts'
77
- property 'highlighted_kudosers', transform_with: ->(v) { v.map { |r| Strava::Models::Kudoser.new(r) } }
82
+ property 'highlighted_kudosers'
78
83
  property 'segment_leaderboard_opt_out'
79
84
  property 'leaderboard_opt_out'
80
85
 
81
- def distance_s
82
- if sport_type == 'Swim'
83
- distance_in_meters_s
84
- else
85
- distance_in_kilometers_s
86
- end
87
- end
88
-
89
- def pace_s
90
- case sport_type
91
- when 'Swim'
92
- pace_per_100_meters_s
93
- else
94
- pace_per_kilometer_s
95
- end
96
- end
97
-
98
86
  def strava_url
99
87
  "https://www.strava.com/activities/#{id}"
100
88
  end
101
-
102
- def sport_type_emoji
103
- case sport_type
104
- when 'AlpineSki' then '⛷️'
105
- when 'BackcountrySki' then '🎿️'
106
- # when "Canoeing" then ''
107
- # when "Crossfit" then ''
108
- # when "Elliptical" then ''
109
- when 'Golf' then '🏌️'
110
- # when "Handcycle" then ''
111
- when 'Hike' then '🥾'
112
- when 'IceSkate' then '⛸'
113
- when 'InlineSkate' then "\u{1F6FC}"
114
- # when "Kayaking" then ''
115
- # when "Kitesurf" then ''
116
- when 'MountainBikeRide', 'EMountainBikeRide' then '🚵'
117
- # when "NordicSki" then ''
118
- when 'Ride', 'EBikeRide', 'VirtualRide', 'GravelRide' then '🚴'
119
- when 'RockClimbing' then '🧗'
120
- # when 'RollerSki' then ''
121
- when 'Rowing' then '🚣'
122
- when 'Run', 'VirtualRun', 'TrailRun' then '🏃'
123
- when 'Sail' then '⛵️'
124
- when 'Skateboard' then '🛹'
125
- when 'Snowboard' then '🏂'
126
- # when 'Snowshoe' then ''
127
- when 'Soccer' then '⚽️'
128
- # when 'StairStepper' then ''
129
- # when 'StandUpPaddling' then ''
130
- when 'Surfing' then '🏄'
131
- when 'Swim' then '🏊'
132
- # when 'Velomobile' then ''
133
- when 'Walk' then '🚶'
134
- when 'WeightTraining' then '🏋️'
135
- when 'Wheelchair' then '♿'
136
- # when 'Windsurf' then ''
137
- # when 'Workout' then ''
138
- when 'Yoga' then '🧘'
139
- end
140
- end
141
89
  end
142
90
  end
143
91
  end
@@ -2,36 +2,42 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- class Athlete < Strava::Models::Response
5
+ # https://developers.strava.com/docs/reference/#api-models-DetailedAthlete
6
+ class DetailedAthlete < Strava::Models::Response
6
7
  property 'id'
7
- property 'username'
8
8
  property 'resource_state'
9
9
  property 'firstname'
10
10
  property 'lastname'
11
+ property 'profile_medium'
12
+ property 'profile'
11
13
  property 'city'
12
14
  property 'state'
13
15
  property 'country'
14
16
  property 'sex'
15
17
  property 'premium'
18
+ property 'summit'
16
19
  property 'created_at', transform_with: ->(v) { Time.parse(v) }
17
20
  property 'updated_at', transform_with: ->(v) { Time.parse(v) }
18
- property 'badge_type_id'
19
- property 'profile'
20
- property 'profile_medium'
21
- property 'follower'
22
- property 'friend'
23
- property 'summit'
24
21
  property 'follower_count'
25
22
  property 'friend_count'
26
- property 'mutual_friend_count'
27
- property 'athlete_type'
28
- property 'date_preference'
29
23
  property 'measurement_preference'
30
- property 'clubs', transform_with: ->(v) { v.map { |r| Strava::Models::Club.new(r) } }
31
24
  property 'ftp'
32
25
  property 'weight'
33
- property 'bikes', transform_with: ->(v) { v.map { |r| Strava::Models::Gear.new(r) } }
34
- property 'shoes', transform_with: ->(v) { v.map { |r| Strava::Models::Gear.new(r) } }
26
+ property 'clubs', transform_with: ->(v) { v.map { |r| Strava::Models::SummaryClub.new(r) } }
27
+ property 'bikes', transform_with: ->(v) { v.map { |r| Strava::Models::SummaryGear.new(r) } }
28
+ property 'shoes', transform_with: ->(v) { v.map { |r| Strava::Models::SummaryGear.new(r) } }
29
+ # undocumented
30
+ property 'username'
31
+ property 'bio'
32
+ property 'badge_type_id'
33
+ property 'friend'
34
+ property 'follower'
35
+ property 'blocked'
36
+ property 'can_follow'
37
+ property 'mutual_friend_count'
38
+ property 'athlete_type'
39
+ property 'date_preference'
40
+ property 'postable_clubs_count'
35
41
 
36
42
  def name
37
43
  [firstname, lastname].compact.join(' ') if firstname || lastname
@@ -2,15 +2,16 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- class Club < Strava::Models::Response
5
+ # https://developers.strava.com/docs/reference/#api-models-DetailedClub
6
+ class DetailedClub < Strava::Models::Response
6
7
  property 'id'
7
8
  property 'resource_state'
8
9
  property 'name'
9
10
  property 'profile_medium'
10
- property 'profile'
11
11
  property 'cover_photo'
12
12
  property 'cover_photo_small'
13
13
  property 'sport_type'
14
+ property 'activity_types'
14
15
  property 'city'
15
16
  property 'state'
16
17
  property 'country'
@@ -22,9 +23,15 @@ module Strava
22
23
  property 'membership'
23
24
  property 'admin'
24
25
  property 'owner'
25
- property 'description'
26
26
  property 'club_type'
27
27
  property 'following_count'
28
+ # undocumented
29
+ property 'profile'
30
+ property 'activity_types_icon'
31
+ property 'dimensions'
32
+ property 'localized_sport_type'
33
+ property 'description'
34
+ property 'website'
28
35
 
29
36
  def strava_url
30
37
  "https://www.strava.com/clubs/#{url || id}"
@@ -2,20 +2,23 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- class Gear < Strava::Models::Response
6
- include Mixins::Distance
7
-
5
+ # https://developers.strava.com/docs/reference/#api-models-DetailedGear
6
+ class DetailedGear < Strava::Models::Response
8
7
  property 'id'
9
8
  property 'resource_state'
10
- property 'distance'
11
- property 'name'
12
9
  property 'primary'
10
+ property 'name'
11
+ include Mixins::Distance
13
12
  property 'brand_name'
14
13
  property 'model_name'
15
- property 'description'
16
14
  property 'frame_type'
17
- property 'weight'
15
+ property 'description'
16
+ # undocumented
17
+ property 'nickname'
18
18
  property 'retired'
19
+ property 'converted_distance'
20
+ property 'notification_distance'
21
+ property 'weight'
19
22
  end
20
23
  end
21
24
  end
@@ -2,21 +2,29 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- class Photo < Strava::Models::Response
6
- property 'id'
5
+ # Undocumented
6
+ class DetailedPhoto < Strava::Models::Response
7
7
  property 'unique_id'
8
- property 'urls'
9
- property 'source'
10
8
  property 'athlete_id'
11
9
  property 'activity_id'
12
10
  property 'activity_name'
11
+ property 'post_id'
13
12
  property 'resource_state'
14
13
  property 'caption'
14
+ property 'type'
15
+ property 'source'
16
+ property 'status'
17
+ property 'uploaded_at', transform_with: ->(v) { Time.parse(v) }
15
18
  property 'created_at', transform_with: ->(v) { Time.parse(v) }
16
19
  property 'created_at_local', transform_with: ->(v) { Time.parse(v) }
17
- property 'uploaded_at', transform_with: ->(v) { Time.parse(v) }
20
+ property 'urls'
21
+ property 'placeholder_image'
18
22
  property 'sizes'
19
23
  property 'default_photo'
24
+ property 'cursor'
25
+ property 'duration'
26
+ property 'video_url'
27
+ property 'location'
20
28
  end
21
29
  end
22
30
  end
@@ -2,7 +2,8 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- class Photos < Strava::Models::Response
5
+ # undocumented
6
+ class DetailedPhotos < Strava::Models::Response
6
7
  property 'primary', transform_with: ->(v) { Strava::Models::Photo.new(v) }
7
8
  property 'use_primary_photo'
8
9
  property 'count'
@@ -2,46 +2,40 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- class Segment < Strava::Models::Response
6
- include Mixins::Distance
7
- include Mixins::Elevation
8
- include Mixins::Time
9
-
5
+ # https://developers.strava.com/docs/reference/#api-models-DetailedSegment
6
+ class DetailedSegment < Strava::Models::Response
10
7
  property 'id'
11
- property 'resource_state'
12
8
  property 'name'
9
+ property 'activity_type'
10
+ include Mixins::Distance
11
+ property 'average_grade'
13
12
  property 'maximum_grade'
14
13
  property 'elevation_high'
15
14
  property 'elevation_low'
16
- property 'activity_type'
17
- property 'average_grade'
15
+ property 'start_latlng', transform_with: ->(v) { Strava::Models::LatLng.new(v) }
16
+ property 'end_latlng', transform_with: ->(v) { Strava::Models::LatLng.new(v) }
18
17
  property 'climb_category'
19
18
  property 'city'
20
19
  property 'state'
21
20
  property 'country'
22
- property 'start_latlng'
23
- property 'end_latlng'
24
- property 'start_latitude'
25
- property 'start_longitude'
26
- property 'end_latitude'
27
- property 'end_longitude'
28
21
  property 'private'
29
- property 'hazardous'
30
- property 'starred'
22
+ property 'athlete_pr_effort', transform_with: ->(v) { Strava::Models::SummaryPRSegmentEffort.new(v) }
23
+ property 'athlete_segment_stats', transform_with: ->(v) { Strava::Models::SummarySegmentEffort.new(v) }
31
24
  property 'created_at', transform_with: ->(v) { Time.parse(v) }
32
25
  property 'updated_at', transform_with: ->(v) { Time.parse(v) }
26
+ include Mixins::TotalElevationGain
33
27
  property 'map', transform_with: ->(v) { Strava::Models::Map.new(v) }
34
28
  property 'effort_count'
35
29
  property 'athlete_count'
30
+ property 'hazardous'
36
31
  property 'star_count'
37
- property 'athlete_segment_stats', transform_with: ->(v) { Strava::Models::SegmentStats.new(v) }
38
- property 'pr_time'
39
- property 'athlete_pr_effort', transform_with: ->(v) { Strava::Models::SegmentEffort.new(v) }
40
- property 'starred_date', transform_with: ->(v) { Time.parse(v) }
41
-
42
- def elapsed_time
43
- pr_time
44
- end
32
+ # undocumented
33
+ property 'resource_state'
34
+ property 'elevation_profile'
35
+ property 'elevation_profiles'
36
+ property 'starred'
37
+ property 'xoms', transform_with: ->(v) { Strava::Models::Xoms.new(v) }
38
+ property 'local_legend', transform_with: ->(v) { Strava::Models::LocalLegend.new(v) }
45
39
  end
46
40
  end
47
41
  end
@@ -2,30 +2,36 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- class SegmentEffort < Strava::Models::Response
6
- include Mixins::Distance
7
- include Mixins::Time
8
- include Mixins::StartDateLocal
9
-
5
+ # https://developers.strava.com/docs/reference/#api-models-DetailedSegmentEffort
6
+ class DetailedSegmentEffort < Strava::Models::Response
10
7
  property 'id'
11
- property 'resource_state'
12
- property 'name'
13
- property 'activity', transform_with: ->(v) { Strava::Models::Activity.new(v) }
14
- property 'athlete', transform_with: ->(v) { Strava::Models::Athlete.new(v) }
8
+ property 'activity_id'
9
+ include Mixins::ElapsedTime
15
10
  property 'start_date', transform_with: ->(v) { Time.parse(v) }
11
+ include Mixins::StartDateLocal
12
+ include Mixins::Distance
13
+ property 'is_kom'
14
+ property 'name'
15
+ # documented as MetaActivity and MetaAthlete
16
+ property 'activity', transform_with: ->(v) { Strava::Models::MetaActivity.new(v) }
17
+ property 'athlete', transform_with: ->(v) { Strava::Models::MetaAthlete.new(v) }
18
+ include Mixins::MovingTime
16
19
  property 'start_index'
17
20
  property 'end_index'
21
+ property 'average_cadence'
22
+ property 'average_watts'
23
+ property 'device_watts'
18
24
  property 'average_heartrate'
19
25
  property 'max_heartrate'
20
- property 'segment', transform_with: ->(v) { Strava::Models::Segment.new(v) }
21
- property 'achievements', transform_with: ->(v) { v.map { |r| Strava::Models::Achievement.new(r) } }
22
- property 'hidden'
26
+ property 'segment', transform_with: ->(v) { Strava::Models::SummarySegment.new(v) }
27
+ property 'kom_rank'
23
28
  property 'pr_rank'
24
- property 'average_cadence'
25
- property 'device_watts'
26
- property 'average_watts'
27
- property 'athlete_segment_stats', transform_with: ->(v) { Strava::Models::SegmentStats.new(v) }
28
- property 'is_kom'
29
+ property 'hidden'
30
+ # undocumented
31
+ property 'resource_state'
32
+ property 'achievements', transform_with: ->(v) { v.map { |r| Strava::Models::Achievement.new(r) } }
33
+ property 'visibility'
34
+ property 'athlete_segment_stats', transform_with: ->(v) { Strava::Models::SummaryPRSegmentEffort.new(v) }
29
35
  end
30
36
  end
31
37
  end
@@ -2,20 +2,23 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-ExplorerSegment
5
6
  class ExplorerSegment < Strava::Models::Response
6
- include Mixins::Distance
7
-
8
7
  property 'id'
9
- property 'resource_state'
10
8
  property 'name'
11
9
  property 'climb_category'
12
10
  property 'climb_category_desc'
13
11
  property 'avg_grade'
14
- property 'start_latlng'
15
- property 'end_latlng'
12
+ property 'start_latlng', transform_with: ->(v) { Strava::Models::LatLng.new(v) }
13
+ property 'end_latlng', transform_with: ->(v) { Strava::Models::LatLng.new(v) }
16
14
  property 'elev_difference'
15
+ include Mixins::Distance
17
16
  property 'points'
17
+ # undocumented
18
+ property 'resource_state'
18
19
  property 'starred'
20
+ property 'elevation_profile'
21
+ property 'local_legend_enabled'
19
22
  end
20
23
  end
21
24
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-HeartRateZoneRanges
5
6
  class HeartRateZoneRanges < Strava::Models::Response
6
7
  property 'custom_zones'
7
8
  property 'zones', transform_with: ->(v) { v.map { |r| Strava::Models::ZoneRange.new(r) } }
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
+ # undocumented
5
6
  class Kudoser < Strava::Models::Response
6
7
  property 'destination_url'
7
8
  property 'display_name'
@@ -2,30 +2,32 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-Lap
5
6
  class Lap < Strava::Models::Response
6
- include Mixins::Time
7
- include Mixins::Distance
8
- include Mixins::Elevation
9
- include Mixins::StartDateLocal
10
-
11
7
  property 'id'
12
- property 'resource_state'
13
- property 'name'
14
- property 'activity', transform_with: ->(v) { Strava::Models::Activity.new(v) }
15
- property 'athlete', transform_with: ->(v) { Strava::Models::Athlete.new(v) }
16
- property 'start_date', transform_with: ->(v) { Time.parse(v) }
8
+ property 'activity', transform_with: ->(v) { Strava::Models::MetaActivity.new(v) }
9
+ property 'athlete', transform_with: ->(v) { Strava::Models::MetaAthlete.new(v) }
10
+ property 'average_cadence'
11
+ property 'average_speed'
12
+ include Mixins::Distance
13
+ include Mixins::MovingTime
14
+ include Mixins::ElapsedTime
17
15
  property 'start_index'
18
16
  property 'end_index'
19
- property 'average_speed'
20
- property 'max_speed'
21
- property 'average_heartrate'
22
- property 'max_heartrate'
23
17
  property 'lap_index'
24
- property 'split'
18
+ property 'max_speed'
19
+ property 'name'
25
20
  property 'pace_zone'
26
- property 'average_cadence'
21
+ property 'split'
22
+ property 'start_date', transform_with: ->(v) { Time.parse(v) }
23
+ include Mixins::StartDateLocal
24
+ include Mixins::TotalElevationGain
25
+ # undocumented
26
+ property 'resource_state'
27
27
  property 'device_watts'
28
28
  property 'average_watts'
29
+ property 'average_heartrate'
30
+ property 'max_heartrate'
29
31
  end
30
32
  end
31
33
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ class LatLng
6
+ attr_accessor :latlng
7
+
8
+ def lat
9
+ @latlng[0]
10
+ end
11
+
12
+ def lng
13
+ @latlng[1]
14
+ end
15
+
16
+ def lat=(value)
17
+ @latlng ||= [nil, nil]
18
+ @latlng[0] = value
19
+ end
20
+
21
+ def lng=(value)
22
+ @latlng ||= [nil, nil]
23
+ @latlng[1] = value
24
+ end
25
+
26
+ def ==(other)
27
+ case other
28
+ when LatLng
29
+ @latlng == other.to_a
30
+ when Array
31
+ @latlng == other
32
+ else
33
+ false
34
+ end
35
+ end
36
+
37
+ def to_a
38
+ @latlng
39
+ end
40
+
41
+ def initialize(latlng = nil)
42
+ @latlng = latlng
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ # Undocumented
6
+ class LocalLegend < Strava::Models::Response
7
+ property 'athlete_id'
8
+ property 'title'
9
+ property 'profile'
10
+ property 'effort_description'
11
+ property 'effort_count'
12
+ property 'effort_counts'
13
+ property 'destination'
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-MetaActivity
6
+ class MetaActivity < Strava::Models::Response
7
+ property 'id'
8
+ # undocumented
9
+ property 'resource_state'
10
+ property 'visibility'
11
+ end
12
+ end
13
+ end