strava-ruby-client 3.0.0 → 3.1.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.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/README.md +41 -57
  4. data/lib/strava/api/client.rb +69 -0
  5. data/lib/strava/api/config.rb +40 -0
  6. data/lib/strava/api/cursor.rb +32 -1
  7. data/lib/strava/api/endpoints/activities.rb +197 -57
  8. data/lib/strava/api/endpoints/athletes.rb +64 -8
  9. data/lib/strava/api/endpoints/clubs.rb +24 -59
  10. data/lib/strava/api/endpoints/gears.rb +11 -2
  11. data/lib/strava/api/endpoints/oauth.rb +45 -0
  12. data/lib/strava/api/endpoints/routes.rb +20 -13
  13. data/lib/strava/api/endpoints/segment_efforts.rb +15 -8
  14. data/lib/strava/api/endpoints/segments.rb +74 -21
  15. data/lib/strava/api/endpoints/streams.rb +22 -18
  16. data/lib/strava/api/endpoints/uploads.rb +12 -2
  17. data/lib/strava/api/pagination.rb +25 -0
  18. data/lib/strava/api/ratelimit.rb +34 -0
  19. data/lib/strava/deep_copyable.rb +20 -1
  20. data/lib/strava/errors/fault.rb +32 -0
  21. data/lib/strava/errors/ratelimit_error.rb +35 -0
  22. data/lib/strava/errors/upload_error.rb +55 -0
  23. data/lib/strava/logger.rb +27 -0
  24. data/lib/strava/models/achievement.rb +28 -1
  25. data/lib/strava/models/activity_stats.rb +47 -1
  26. data/lib/strava/models/activity_total.rb +25 -1
  27. data/lib/strava/models/activity_zone.rb +39 -2
  28. data/lib/strava/models/authorization.rb +13 -0
  29. data/lib/strava/models/base_stream.rb +22 -1
  30. data/lib/strava/models/club_event.rb +64 -1
  31. data/lib/strava/models/comment.rb +39 -1
  32. data/lib/strava/models/destination.rb +28 -1
  33. data/lib/strava/models/detailed_activity.rb +203 -2
  34. data/lib/strava/models/detailed_athlete.rb +104 -2
  35. data/lib/strava/models/detailed_club.rb +76 -2
  36. data/lib/strava/models/detailed_gear.rb +45 -2
  37. data/lib/strava/models/detailed_photo.rb +61 -1
  38. data/lib/strava/models/detailed_photos.rb +29 -1
  39. data/lib/strava/models/detailed_segment.rb +89 -2
  40. data/lib/strava/models/detailed_segment_effort.rb +92 -3
  41. data/lib/strava/models/explorer_segment.rb +55 -2
  42. data/lib/strava/models/heart_rate_zone_ranges.rb +29 -1
  43. data/lib/strava/models/kudoser.rb +29 -1
  44. data/lib/strava/models/lap.rb +62 -2
  45. data/lib/strava/models/lat_lng.rb +42 -4
  46. data/lib/strava/models/local_legend.rb +41 -1
  47. data/lib/strava/models/map.rb +31 -0
  48. data/lib/strava/models/meta_activity.rb +15 -2
  49. data/lib/strava/models/meta_athlete.rb +17 -2
  50. data/lib/strava/models/meta_club.rb +15 -1
  51. data/lib/strava/models/mixins/average_speed.rb +81 -3
  52. data/lib/strava/models/mixins/distance.rb +25 -0
  53. data/lib/strava/models/mixins/elapsed_time.rb +18 -0
  54. data/lib/strava/models/mixins/elevation_difference.rb +42 -0
  55. data/lib/strava/models/mixins/elevation_gain.rb +39 -0
  56. data/lib/strava/models/mixins/estimated_moving_time.rb +18 -0
  57. data/lib/strava/models/mixins/http_response.rb +36 -0
  58. data/lib/strava/models/mixins/moving_time.rb +18 -0
  59. data/lib/strava/models/mixins/sport_type.rb +39 -1
  60. data/lib/strava/models/mixins/start_date_local.rb +40 -24
  61. data/lib/strava/models/mixins/time_in_hours.rb +23 -0
  62. data/lib/strava/models/mixins/total_elevation_gain.rb +42 -0
  63. data/lib/strava/models/model.rb +14 -0
  64. data/lib/strava/models/photos_summary.rb +26 -2
  65. data/lib/strava/models/photos_summary_primary.rb +28 -2
  66. data/lib/strava/models/power_zone_ranges.rb +23 -1
  67. data/lib/strava/models/response.rb +18 -0
  68. data/lib/strava/models/route.rb +63 -2
  69. data/lib/strava/models/similar_activities.rb +57 -1
  70. data/lib/strava/models/split.rb +27 -2
  71. data/lib/strava/models/stats_visibility.rb +24 -1
  72. data/lib/strava/models/stream.rb +107 -0
  73. data/lib/strava/models/stream_set.rb +52 -1
  74. data/lib/strava/models/summary_activity.rb +145 -2
  75. data/lib/strava/models/summary_athlete.rb +54 -1
  76. data/lib/strava/models/summary_club.rb +61 -2
  77. data/lib/strava/models/summary_gear.rb +31 -2
  78. data/lib/strava/models/summary_pr_segment_effort.rb +32 -2
  79. data/lib/strava/models/summary_segment.rb +80 -2
  80. data/lib/strava/models/summary_segment_effort.rb +32 -1
  81. data/lib/strava/models/timed_zone_range.rb +24 -1
  82. data/lib/strava/models/token.rb +31 -0
  83. data/lib/strava/models/trend.rb +38 -1
  84. data/lib/strava/models/updatable_activity.rb +36 -1
  85. data/lib/strava/models/upload.rb +50 -1
  86. data/lib/strava/models/waypoint.rb +31 -1
  87. data/lib/strava/models/xoms.rb +35 -1
  88. data/lib/strava/models/zone_range.rb +20 -1
  89. data/lib/strava/models/zones.rb +32 -1
  90. data/lib/strava/oauth/client.rb +107 -19
  91. data/lib/strava/oauth/config.rb +41 -0
  92. data/lib/strava/version.rb +1 -1
  93. data/lib/strava/web/api_response.rb +28 -2
  94. data/lib/strava/web/client.rb +72 -2
  95. data/lib/strava/web/config.rb +40 -0
  96. data/lib/strava/web/connection.rb +39 -0
  97. data/lib/strava/web/raise_response_error.rb +47 -0
  98. data/lib/strava/web/request.rb +56 -0
  99. data/lib/strava/web/response.rb +18 -0
  100. data/lib/strava/webhooks/client.rb +108 -7
  101. data/lib/strava/webhooks/config.rb +44 -0
  102. data/lib/strava/webhooks/models/challenge.rb +40 -0
  103. data/lib/strava/webhooks/models/event.rb +50 -0
  104. data/lib/strava/webhooks/models/subscription.rb +27 -0
  105. data/lib/strava-ruby-client.rb +0 -2
  106. metadata +2 -4
  107. data/lib/strava/models/club_activity.rb +0 -22
  108. data/lib/strava/models/club_athlete.rb +0 -21
@@ -2,10 +2,37 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- # Undocumented
5
+ #
6
+ # Represents an achievement earned during a segment effort.
7
+ #
8
+ # Achievements include overall rank on a segment, yearly/monthly/weekly records,
9
+ # and PR (personal record) designations. This model is not documented in the
10
+ # official Strava API reference.
11
+ #
12
+ # @note This model is not documented by Strava API documentation. Properties
13
+ # are inferred from API responses.
14
+ #
15
+ # @see Strava::Models::DetailedSegmentEffort
16
+ #
17
+ # @example Accessing achievements from a segment effort
18
+ # activity = client.activity(1234567890)
19
+ # activity.segment_efforts.each do |effort|
20
+ # effort.achievements.each do |achievement|
21
+ # puts "#{achievement.type}: Rank #{achievement.rank}"
22
+ # end
23
+ # end
24
+ #
6
25
  class Achievement < Strava::Models::Response
26
+ # @return [Integer, nil] Rank or position for this achievement (e.g., 1 for first place)
27
+ # @note Not documented by Strava API
7
28
  property 'rank'
29
+
30
+ # @return [String, nil] Type of achievement (e.g., "overall", "pr", "year_pr")
31
+ # @note Not documented by Strava API
8
32
  property 'type'
33
+
34
+ # @return [Integer, nil] Numeric identifier for the achievement type
35
+ # @note Not documented by Strava API
9
36
  property 'type_id'
10
37
  end
11
38
  end
@@ -2,18 +2,64 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- # https://developers.strava.com/docs/reference/#api-models-ActivityStats
5
+ #
6
+ # Represents aggregated activity statistics for an athlete.
7
+ #
8
+ # Contains totals broken down by activity type (ride, run, swim) and time period
9
+ # (recent, year-to-date, all-time). Recent totals cover the last 4 weeks.
10
+ #
11
+ # @example Get athlete statistics
12
+ # stats = client.athlete_stats(12345)
13
+ #
14
+ # # Recent activity
15
+ # recent = stats.recent_run_totals
16
+ # puts "Recent runs: #{recent.count} activities"
17
+ # puts "Distance: #{recent.distance_s}"
18
+ # puts "Time: #{recent.moving_time_in_hours_s}"
19
+ #
20
+ # # Year-to-date
21
+ # ytd = stats.ytd_ride_totals
22
+ # puts "YTD rides: #{ytd.count} totaling #{ytd.distance_s}"
23
+ #
24
+ # # All-time records
25
+ # puts "Biggest ride: #{stats.biggest_ride_distance}m"
26
+ # puts "Biggest climb: #{stats.biggest_climb_elevation_gain}m"
27
+ #
28
+ # @see ActivityTotal
29
+ # @see https://developers.strava.com/docs/reference/#api-models-ActivityStats
30
+ #
6
31
  class ActivityStats < Strava::Models::Response
32
+ # @return [Float] Longest ride distance in meters
7
33
  property 'biggest_ride_distance'
34
+
35
+ # @return [Float] Most elevation gain in a single activity (meters)
8
36
  property 'biggest_climb_elevation_gain'
37
+
38
+ # @return [ActivityTotal] Recent ride totals (last 4 weeks)
9
39
  property 'recent_ride_totals', transform_with: ->(v) { Strava::Models::ActivityTotal.new(v) }
40
+
41
+ # @return [ActivityTotal] Recent run totals (last 4 weeks)
10
42
  property 'recent_run_totals', transform_with: ->(v) { Strava::Models::ActivityTotal.new(v) }
43
+
44
+ # @return [ActivityTotal] Recent swim totals (last 4 weeks)
11
45
  property 'recent_swim_totals', transform_with: ->(v) { Strava::Models::ActivityTotal.new(v) }
46
+
47
+ # @return [ActivityTotal] Year-to-date ride totals
12
48
  property 'ytd_ride_totals', transform_with: ->(v) { Strava::Models::ActivityTotal.new(v) }
49
+
50
+ # @return [ActivityTotal] Year-to-date run totals
13
51
  property 'ytd_run_totals', transform_with: ->(v) { Strava::Models::ActivityTotal.new(v) }
52
+
53
+ # @return [ActivityTotal] Year-to-date swim totals
14
54
  property 'ytd_swim_totals', transform_with: ->(v) { Strava::Models::ActivityTotal.new(v) }
55
+
56
+ # @return [ActivityTotal] All-time ride totals
15
57
  property 'all_ride_totals', transform_with: ->(v) { Strava::Models::ActivityTotal.new(v) }
58
+
59
+ # @return [ActivityTotal] All-time run totals
16
60
  property 'all_run_totals', transform_with: ->(v) { Strava::Models::ActivityTotal.new(v) }
61
+
62
+ # @return [ActivityTotal] All-time swim totals
17
63
  property 'all_swim_totals', transform_with: ->(v) { Strava::Models::ActivityTotal.new(v) }
18
64
  end
19
65
  end
@@ -2,13 +2,37 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- # https://developers.strava.com/docs/reference/#api-models-ActivityTotal
5
+ #
6
+ # Represents totals for a specific activity type and time period.
7
+ #
8
+ # Contains aggregated counts, distance, time, and elevation for activities.
9
+ # Used within ActivityStats to break down statistics by activity type
10
+ # (ride, run, swim) and period (recent, YTD, all-time).
11
+ #
12
+ # Includes helper mixins for formatting distance, time, and elevation.
13
+ #
14
+ # @example Access activity totals
15
+ # stats = client.athlete_stats(12345)
16
+ # totals = stats.recent_run_totals
17
+ # puts "#{totals.count} runs"
18
+ # puts "Total distance: #{totals.distance_s}"
19
+ # puts "Moving time: #{totals.moving_time_in_hours_s}"
20
+ # puts "Elevation: #{totals.elevation_gain_s}"
21
+ # puts "Achievements: #{totals.achievement_count}"
22
+ #
23
+ # @see ActivityStats
24
+ # @see https://developers.strava.com/docs/reference/#api-models-ActivityTotal
25
+ #
6
26
  class ActivityTotal < Strava::Models::Response
27
+ # @return [Integer] Number of activities
7
28
  property 'count'
29
+
8
30
  include Mixins::Distance
9
31
  include Mixins::MovingTime
10
32
  include Mixins::ElapsedTime
11
33
  include Mixins::ElevationGain
34
+
35
+ # @return [Integer] Total number of achievements/trophies earned
12
36
  property 'achievement_count'
13
37
  end
14
38
  end
@@ -2,16 +2,53 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- # https://developers.strava.com/docs/reference/#api-models-ActivityZone
5
+ #
6
+ # Represents time spent in heart rate or power zones during an activity.
7
+ #
8
+ # Activity zones show how much time was spent at different intensity levels,
9
+ # which helps analyze training load and effort distribution. Each zone bucket
10
+ # contains the time spent in that zone range.
11
+ #
12
+ # @see https://developers.strava.com/docs/reference/#api-models-ActivityZone Strava API ActivityZone reference
13
+ # @see Strava::Models::TimedZoneRange
14
+ # @see Strava::Api::Client#activity_zones
15
+ #
16
+ # @example Analyzing time in heart rate zones
17
+ # zones = client.activity_zones(1234567890)
18
+ # hr_zone = zones.find { |z| z.type == 'heartrate' }
19
+ #
20
+ # if hr_zone
21
+ # puts "Max HR: #{hr_zone.max}"
22
+ # puts "Sensor-based: #{hr_zone.sensor_based}"
23
+ # hr_zone.distribution_buckets.each_with_index do |bucket, i|
24
+ # puts "Zone #{i + 1}: #{bucket.time} seconds (#{bucket.min}-#{bucket.max} bpm)"
25
+ # end
26
+ # end
27
+ #
6
28
  class ActivityZone < Strava::Models::Response
29
+ # @return [Integer, nil] Relative effort score for this activity
7
30
  property 'score'
31
+
32
+ # @return [Array<TimedZoneRange>] Array of time spent in each zone bucket
8
33
  property 'distribution_buckets', transform_with: ->(v) { v.map { |r| Strava::Models::TimedZoneRange.new(r) } }
34
+
35
+ # @return [String] Type of zone data ("heartrate" or "power")
9
36
  property 'type'
37
+
38
+ # @return [Boolean] Whether data comes from a sensor (vs. estimated)
10
39
  property 'sensor_based'
40
+
41
+ # @return [Integer, nil] Points or score accumulated in this zone
11
42
  property 'points'
43
+
44
+ # @return [Boolean] Whether custom zones are being used
12
45
  property 'custom_zones'
46
+
47
+ # @return [Integer, nil] Maximum value recorded (e.g., max heart rate in bpm)
13
48
  property 'max'
14
- # undocumented
49
+
50
+ # @return [Integer] Resource state indicator
51
+ # @note Not documented by Strava API
15
52
  property 'resource_state'
16
53
  end
17
54
  end
@@ -2,7 +2,20 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
+ #
6
+ # Represents an authorization deauthorization response.
7
+ #
8
+ # This model is returned when revoking access to an athlete's data.
9
+ # It contains the access token that was revoked.
10
+ #
11
+ # @example Deauthorize an athlete
12
+ # authorization = client.deauthorize
13
+ # puts "Revoked token: #{authorization.access_token}"
14
+ #
15
+ # @see Strava::Api::Client#deauthorize
16
+ #
5
17
  class Authorization < Strava::Models::Response
18
+ # @return [String] The access token that was revoked
6
19
  property 'access_token'
7
20
  end
8
21
  end
@@ -2,10 +2,31 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- # https://developers.strava.com/docs/reference/#api-models-BaseStream
5
+ #
6
+ # Represents base stream metadata from the Strava API.
7
+ #
8
+ # Streams are time-series data for activities such as GPS coordinates, heart rate,
9
+ # power, cadence, etc. The BaseStream provides metadata about how the stream data
10
+ # was sampled and processed.
11
+ #
12
+ # @see https://developers.strava.com/docs/reference/#api-models-BaseStream Strava API BaseStream reference
13
+ # @see Strava::Models::Stream
14
+ # @see Strava::Models::StreamSet
15
+ #
16
+ # @example Accessing stream metadata
17
+ # streams = client.activity_streams(1234567890, keys: 'heartrate,watts')
18
+ # puts streams.heartrate.original_size # => 3600
19
+ # puts streams.heartrate.resolution # => "high"
20
+ # puts streams.heartrate.series_type # => "distance"
21
+ #
6
22
  class BaseStream < Strava::Models::Response
23
+ # @return [Integer] Total number of data points in the original stream before any resampling
7
24
  property 'original_size'
25
+
26
+ # @return [String] Resolution of the stream data ("low", "medium", or "high")
8
27
  property 'resolution'
28
+
29
+ # @return [String] Type of series - how data points are indexed ("time" or "distance")
9
30
  property 'series_type'
10
31
  end
11
32
  end
@@ -2,29 +2,92 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- # Unodcumented
5
+ #
6
+ # Represents a club group event or ride.
7
+ #
8
+ # Club events are organized group activities where club members can join
9
+ # to ride, run, or participate together. Events can be recurring and may
10
+ # include a specific route.
11
+ #
12
+ # @example List club events
13
+ # events = client.club_events(12345)
14
+ # events.each do |event|
15
+ # puts event.title
16
+ # puts event.description
17
+ # puts "Organized by: #{event.organizing_athlete.name}"
18
+ # puts "Activity type: #{event.activity_type}"
19
+ # puts "Next occurrence: #{event.upcoming_occurrences.first}"
20
+ # puts event.strava_url
21
+ # end
22
+ #
23
+ # @see Strava::Api::Client#club_events
24
+ #
6
25
  class ClubEvent < Strava::Models::Response
26
+ # @return [Integer] Event identifier
7
27
  property 'id'
28
+
29
+ # @return [Integer] Resource state indicator
8
30
  property 'resource_state'
31
+
32
+ # @return [String] Event title
9
33
  property 'title'
34
+
35
+ # @return [String] Event description
10
36
  property 'description'
37
+
38
+ # @return [Integer] Club identifier
11
39
  property 'club_id'
40
+
41
+ # @return [SummaryClub] The club hosting this event
12
42
  property 'club', transform_with: ->(c) { Strava::Models::SummaryClub.new(c) }
43
+
44
+ # @return [SummaryAthlete] Athlete organizing the event
13
45
  property 'organizing_athlete', transform_with: ->(oa) { Strava::Models::SummaryAthlete.new(oa) }
46
+
47
+ # @return [String] Type of activity (e.g., "Ride", "Run")
14
48
  property 'activity_type'
49
+
50
+ # @return [Time] When the event was created
15
51
  property 'created_at', transform_with: ->(v) { Time.parse(v) if v&.length&.positive? }
52
+
53
+ # @return [Integer, nil] Associated route identifier
16
54
  property 'route_id'
55
+
56
+ # @return [Route, nil] Associated route details
17
57
  property 'route', transform_with: ->(r) { Strava::Models::Route.new(r) }
58
+
59
+ # @return [Boolean] Whether event is for women only
18
60
  property 'women_only'
61
+
62
+ # @return [Boolean] Whether event is private
19
63
  property 'private'
64
+
65
+ # @return [Array<Integer>] Skill levels for participants (0-5 scale)
20
66
  property 'skill_levels'
67
+
68
+ # @return [Array<Integer>] Terrain types (e.g., road, trail, mixed)
21
69
  property 'terrain'
70
+
71
+ # @return [Array<Time>] Upcoming scheduled occurrences of this event
22
72
  property 'upcoming_occurrences', transform_with: ->(upcoming) { upcoming.map { |o| Time.parse(o) } }
73
+
74
+ # @return [String] Timezone for the event
23
75
  property 'zone'
76
+
77
+ # @return [String] Event meeting address
24
78
  property 'address'
79
+
80
+ # @return [Boolean] Whether authenticated athlete has joined this event
25
81
  property 'joined'
82
+
83
+ # @return [LatLng] Starting location coordinates
26
84
  property 'start_latlng', transform_with: ->(v) { Strava::Models::LatLng.new(v) }
27
85
 
86
+ #
87
+ # Returns the Strava web URL for this event.
88
+ #
89
+ # @return [String] Full URL to view the event on Strava.com
90
+ #
28
91
  def strava_url
29
92
  "https://www.strava.com/clubs/#{club_id}/group_events/#{id}"
30
93
  end
@@ -2,17 +2,55 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
+ #
6
+ # Represents a comment on a Strava activity.
7
+ #
8
+ # Comments are text messages left by athletes on activities. Each comment
9
+ # includes the text content, the athlete who made the comment, and timestamp.
10
+ #
11
+ # @example List activity comments
12
+ # comments = client.activity_comments(1234567890)
13
+ # comments.each do |comment|
14
+ # puts "#{comment.athlete.name}: #{comment.text}"
15
+ # puts "Posted at: #{comment.created_at}"
16
+ # end
17
+ #
18
+ # @see Strava::Api::Client#activity_comments
19
+ #
5
20
  class Comment < Strava::Models::Response
21
+ # @return [Integer] Comment ID
6
22
  property 'id'
23
+
24
+ # @return [Integer] ID of the activity this comment is on
7
25
  property 'activity_id'
26
+
27
+ # @return [String] The comment text
8
28
  property 'text'
29
+
30
+ # @return [Time] When the comment was created
9
31
  property 'created_at', transform_with: ->(v) { Time.parse(v) }
32
+
33
+ # @return [SummaryAthlete] The athlete who made the comment
10
34
  property 'athlete', transform_with: ->(v) { Strava::Models::SummaryAthlete.new(v) }
11
- # undocumented
35
+
36
+ # @note Undocumented in official API
37
+ # @return [Integer, nil] Associated post ID
12
38
  property 'post_id'
39
+
40
+ # @note Undocumented in official API
41
+ # @return [Integer, nil] Resource state indicator
13
42
  property 'resource_state'
43
+
44
+ # @note Undocumented in official API
45
+ # @return [Hash, nil] Metadata about @mentions in the comment
14
46
  property 'mentions_metadata'
47
+
48
+ # @note Undocumented in official API
49
+ # @return [Integer, nil] Number of reactions on this comment
15
50
  property 'reaction_count'
51
+
52
+ # @note Undocumented in official API
53
+ # @return [Boolean, nil] Whether the authenticated athlete has reacted to this comment
16
54
  property 'has_reacted'
17
55
  end
18
56
  end
@@ -2,10 +2,37 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
- # Undocumented
5
+ #
6
+ # Represents a destination or link reference.
7
+ #
8
+ # Used to provide navigation links to related resources or pages.
9
+ # This model is not documented in the official Strava API reference.
10
+ #
11
+ # @note This model is not documented by Strava API documentation. Properties
12
+ # are inferred from API responses.
13
+ #
14
+ # @see Strava::Models::Xoms
15
+ # @see Strava::Models::LocalLegend
16
+ #
17
+ # @example Accessing destination information
18
+ # # From XOMs or local legend data
19
+ # if xoms.destination
20
+ # puts "Name: #{xoms.destination.name}"
21
+ # puts "Type: #{xoms.destination.type}"
22
+ # puts "Link: #{xoms.destination.href}"
23
+ # end
24
+ #
6
25
  class Destination < Strava::Models::Response
26
+ # @return [String, nil] URL or path to the destination resource
27
+ # @note Not documented by Strava API
7
28
  property 'href'
29
+
30
+ # @return [String, nil] Type of destination (e.g., "segment")
31
+ # @note Not documented by Strava API
8
32
  property 'type'
33
+
34
+ # @return [String, nil] Display name of the destination
35
+ # @note Not documented by Strava API
9
36
  property 'name'
10
37
  end
11
38
  end