strava-ruby-client 3.0.0.pre.2 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -2
- data/README.md +47 -58
- data/lib/strava/api/client.rb +69 -0
- data/lib/strava/api/config.rb +40 -0
- data/lib/strava/api/cursor.rb +32 -1
- data/lib/strava/api/endpoints/activities.rb +197 -57
- data/lib/strava/api/endpoints/athletes.rb +64 -8
- data/lib/strava/api/endpoints/clubs.rb +24 -59
- data/lib/strava/api/endpoints/gears.rb +11 -2
- data/lib/strava/api/endpoints/oauth.rb +45 -0
- data/lib/strava/api/endpoints/routes.rb +20 -13
- data/lib/strava/api/endpoints/segment_efforts.rb +15 -8
- data/lib/strava/api/endpoints/segments.rb +74 -21
- data/lib/strava/api/endpoints/streams.rb +22 -18
- data/lib/strava/api/endpoints/uploads.rb +12 -2
- data/lib/strava/api/pagination.rb +25 -0
- data/lib/strava/api/ratelimit.rb +34 -0
- data/lib/strava/deep_copyable.rb +20 -1
- data/lib/strava/errors/fault.rb +32 -0
- data/lib/strava/errors/ratelimit_error.rb +35 -0
- data/lib/strava/errors/upload_error.rb +55 -0
- data/lib/strava/logger.rb +27 -0
- data/lib/strava/models/achievement.rb +28 -1
- data/lib/strava/models/activity_stats.rb +47 -1
- data/lib/strava/models/activity_total.rb +25 -1
- data/lib/strava/models/activity_zone.rb +39 -2
- data/lib/strava/models/authorization.rb +13 -0
- data/lib/strava/models/base_stream.rb +22 -1
- data/lib/strava/models/club_event.rb +64 -1
- data/lib/strava/models/comment.rb +39 -1
- data/lib/strava/models/destination.rb +28 -1
- data/lib/strava/models/detailed_activity.rb +203 -2
- data/lib/strava/models/detailed_athlete.rb +104 -2
- data/lib/strava/models/detailed_club.rb +76 -2
- data/lib/strava/models/detailed_gear.rb +45 -2
- data/lib/strava/models/detailed_photo.rb +61 -1
- data/lib/strava/models/detailed_photos.rb +29 -1
- data/lib/strava/models/detailed_segment.rb +89 -2
- data/lib/strava/models/detailed_segment_effort.rb +92 -3
- data/lib/strava/models/explorer_segment.rb +55 -2
- data/lib/strava/models/heart_rate_zone_ranges.rb +29 -1
- data/lib/strava/models/kudoser.rb +29 -1
- data/lib/strava/models/lap.rb +62 -2
- data/lib/strava/models/lat_lng.rb +42 -4
- data/lib/strava/models/local_legend.rb +41 -1
- data/lib/strava/models/map.rb +31 -0
- data/lib/strava/models/meta_activity.rb +15 -2
- data/lib/strava/models/meta_athlete.rb +17 -2
- data/lib/strava/models/meta_club.rb +15 -1
- data/lib/strava/models/mixins/average_speed.rb +81 -3
- data/lib/strava/models/mixins/distance.rb +25 -0
- data/lib/strava/models/mixins/elapsed_time.rb +18 -0
- data/lib/strava/models/mixins/elevation_difference.rb +42 -0
- data/lib/strava/models/mixins/elevation_gain.rb +39 -0
- data/lib/strava/models/mixins/estimated_moving_time.rb +18 -0
- data/lib/strava/models/mixins/http_response.rb +36 -0
- data/lib/strava/models/mixins/moving_time.rb +18 -0
- data/lib/strava/models/mixins/sport_type.rb +39 -1
- data/lib/strava/models/mixins/start_date_local.rb +40 -24
- data/lib/strava/models/mixins/time_in_hours.rb +23 -0
- data/lib/strava/models/mixins/total_elevation_gain.rb +42 -0
- data/lib/strava/models/model.rb +14 -0
- data/lib/strava/models/photos_summary.rb +26 -2
- data/lib/strava/models/photos_summary_primary.rb +28 -2
- data/lib/strava/models/power_zone_ranges.rb +23 -1
- data/lib/strava/models/response.rb +18 -0
- data/lib/strava/models/route.rb +63 -2
- data/lib/strava/models/similar_activities.rb +57 -1
- data/lib/strava/models/split.rb +27 -2
- data/lib/strava/models/stats_visibility.rb +24 -1
- data/lib/strava/models/stream.rb +107 -0
- data/lib/strava/models/stream_set.rb +52 -1
- data/lib/strava/models/summary_activity.rb +145 -2
- data/lib/strava/models/summary_athlete.rb +54 -1
- data/lib/strava/models/summary_club.rb +61 -2
- data/lib/strava/models/summary_gear.rb +31 -2
- data/lib/strava/models/summary_pr_segment_effort.rb +32 -2
- data/lib/strava/models/summary_segment.rb +80 -2
- data/lib/strava/models/summary_segment_effort.rb +32 -1
- data/lib/strava/models/timed_zone_range.rb +24 -1
- data/lib/strava/models/token.rb +31 -0
- data/lib/strava/models/trend.rb +38 -1
- data/lib/strava/models/updatable_activity.rb +36 -1
- data/lib/strava/models/upload.rb +50 -1
- data/lib/strava/models/waypoint.rb +31 -1
- data/lib/strava/models/xoms.rb +35 -1
- data/lib/strava/models/zone_range.rb +20 -1
- data/lib/strava/models/zones.rb +32 -1
- data/lib/strava/oauth/client.rb +107 -19
- data/lib/strava/oauth/config.rb +41 -0
- data/lib/strava/version.rb +1 -1
- data/lib/strava/web/api_response.rb +28 -2
- data/lib/strava/web/client.rb +72 -2
- data/lib/strava/web/config.rb +40 -0
- data/lib/strava/web/connection.rb +39 -0
- data/lib/strava/web/raise_response_error.rb +47 -0
- data/lib/strava/web/request.rb +56 -0
- data/lib/strava/web/response.rb +18 -0
- data/lib/strava/webhooks/client.rb +108 -7
- data/lib/strava/webhooks/config.rb +44 -0
- data/lib/strava/webhooks/models/challenge.rb +40 -0
- data/lib/strava/webhooks/models/event.rb +50 -0
- data/lib/strava/webhooks/models/subscription.rb +27 -0
- data/lib/strava-ruby-client.rb +0 -2
- metadata +2 -4
- data/lib/strava/models/club_activity.rb +0 -22
- data/lib/strava/models/club_athlete.rb +0 -21
|
@@ -2,10 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
module Strava
|
|
4
4
|
module Models
|
|
5
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
-
#
|
|
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
|