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
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-MetaAthlete
6
+ class MetaAthlete < Strava::Models::Response
7
+ property 'id'
8
+ # undocumented
9
+ property 'resource_state'
10
+ property 'firstname'
11
+ property 'lastname'
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-MetaClub
6
+ class MetaClub < Strava::Models::Response
7
+ property 'id'
8
+ property 'resource_state'
9
+ property 'name'
10
+ end
11
+ end
12
+ end
@@ -3,26 +3,16 @@
3
3
  module Strava
4
4
  module Models
5
5
  module Mixins
6
- module Time
6
+ module AverageSpeed
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  included do
10
- property 'moving_time'
11
- property 'elapsed_time'
12
10
  property 'average_speed'
13
11
  end
14
12
 
15
13
  # always in meters per second, even in imperial splits
16
14
  def average_speed_meters_per_second
17
- elapsed_time
18
- end
19
-
20
- def moving_time_in_hours_s
21
- time_in_hours_s moving_time
22
- end
23
-
24
- def elapsed_time_in_hours_s
25
- time_in_hours_s elapsed_time
15
+ average_speed
26
16
  end
27
17
 
28
18
  def pace_per_mile_s
@@ -41,37 +31,24 @@ module Strava
41
31
  convert_meters_per_second_to_pace average_speed, :km
42
32
  end
43
33
 
44
- def kilometer_per_hour_s
34
+ def average_speed_kilometer_per_hour_s
45
35
  return unless average_speed&.positive?
46
36
 
47
37
  format('%.1fkm/h', average_speed * 3.6)
48
38
  end
49
39
 
50
- def miles_per_hour_s
40
+ def average_speed_miles_per_hour_s
51
41
  return unless average_speed&.positive?
52
42
 
53
43
  format('%.1fmph', average_speed * 2.23694)
54
44
  end
55
45
 
56
- def speed_s
57
- kilometer_per_hour_s
46
+ def average_speed_s
47
+ average_speed_kilometer_per_hour_s
58
48
  end
59
49
 
60
50
  private
61
51
 
62
- def time_in_hours_s(time)
63
- return unless time
64
-
65
- hours = time / 3600 % 24
66
- minutes = time / 60 % 60
67
- seconds = time % 60
68
- [
69
- hours.to_i.positive? ? format('%dh', hours) : nil,
70
- minutes.to_i.positive? ? format('%dm', minutes) : nil,
71
- seconds.to_i.positive? ? format('%ds', seconds) : nil
72
- ].compact.join
73
- end
74
-
75
52
  # Convert speed (m/s) to pace (min/mile or min/km) in the format of 'x:xx'
76
53
  # http://yizeng.me/2017/02/25/convert-speed-to-pace-programmatically-using-ruby
77
54
  def convert_meters_per_second_to_pace(speed, unit = :mi)
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ module Mixins
6
+ module ElapsedTime
7
+ extend ActiveSupport::Concern
8
+ include TimeInHours
9
+
10
+ included do
11
+ property 'elapsed_time'
12
+ end
13
+
14
+ def elapsed_time_in_hours_s
15
+ time_in_hours_s elapsed_time
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ module Mixins
6
+ module ElevationDifference
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ property 'elevation_difference'
11
+ end
12
+
13
+ def elevation_difference_in_feet
14
+ elevation_difference * 3.28084
15
+ end
16
+
17
+ def elevation_difference_in_meters
18
+ elevation_difference
19
+ end
20
+
21
+ def elevation_difference_in_meters_s
22
+ return if elevation_difference.nil?
23
+
24
+ format('%gm', format('%.1f', elevation_difference_in_meters))
25
+ end
26
+
27
+ def elevation_difference_in_feet_s
28
+ return if elevation_difference.nil?
29
+
30
+ format('%gft', format('%.1f', elevation_difference_in_feet))
31
+ end
32
+
33
+ def elevation_difference_s
34
+ elevation_difference_in_meters_s
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ module Mixins
6
+ module ElevationGain
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ property 'elevation_gain'
11
+ end
12
+
13
+ def elevation_gain_in_feet
14
+ elevation_gain * 3.28084
15
+ end
16
+
17
+ def elevation_gain_in_meters
18
+ elevation_gain
19
+ end
20
+
21
+ def elevation_gain_in_meters_s
22
+ return if elevation_gain.nil?
23
+
24
+ format('%gm', format('%.1f', elevation_gain_in_meters))
25
+ end
26
+
27
+ def elevation_gain_in_feet_s
28
+ return if elevation_gain.nil?
29
+
30
+ format('%gft', format('%.1f', elevation_gain_in_feet))
31
+ end
32
+
33
+ def elevation_gain_s
34
+ elevation_gain_in_meters_s
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ module Mixins
6
+ module EstimatedMovingTime
7
+ extend ActiveSupport::Concern
8
+ include TimeInHours
9
+
10
+ included do
11
+ property 'estimated_moving_time'
12
+ end
13
+
14
+ def estimated_moving_time_in_hours_s
15
+ time_in_hours_s estimated_moving_time
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ module Mixins
6
+ module MovingTime
7
+ extend ActiveSupport::Concern
8
+ include TimeInHours
9
+
10
+ included do
11
+ property 'moving_time'
12
+ end
13
+
14
+ def moving_time_in_hours_s
15
+ time_in_hours_s moving_time
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ module Mixins
6
+ module SportType
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ # deprecated, property 'type'
11
+ property 'sport_type'
12
+ end
13
+
14
+ def distance_s
15
+ if sport_type == 'Swim'
16
+ distance_in_meters_s
17
+ else
18
+ distance_in_kilometers_s
19
+ end
20
+ end
21
+
22
+ def pace_s
23
+ case sport_type
24
+ when 'Swim'
25
+ pace_per_100_meters_s
26
+ else
27
+ pace_per_kilometer_s
28
+ end
29
+ end
30
+
31
+ def sport_type_emoji
32
+ case sport_type
33
+ when 'AlpineSki' then '⛷️'
34
+ when 'BackcountrySki' then '🎿️'
35
+ # when "Canoeing" then ''
36
+ # when "Crossfit" then ''
37
+ # when "Elliptical" then ''
38
+ when 'Golf' then '🏌️'
39
+ # when "Handcycle" then ''
40
+ when 'Hike' then '🥾'
41
+ when 'IceSkate' then '⛸'
42
+ when 'InlineSkate' then "\u{1F6FC}"
43
+ # when "Kayaking" then ''
44
+ # when "Kitesurf" then ''
45
+ when 'MountainBikeRide', 'EMountainBikeRide' then '🚵'
46
+ # when "NordicSki" then ''
47
+ when 'Ride', 'EBikeRide', 'VirtualRide', 'GravelRide' then '🚴'
48
+ when 'RockClimbing' then '🧗'
49
+ # when 'RollerSki' then ''
50
+ when 'Rowing' then '🚣'
51
+ when 'Run', 'VirtualRun', 'TrailRun' then '🏃'
52
+ when 'Sail' then '⛵️'
53
+ when 'Skateboard' then '🛹'
54
+ when 'Snowboard' then '🏂'
55
+ # when 'Snowshoe' then ''
56
+ when 'Soccer' then '⚽️'
57
+ # when 'StairStepper' then ''
58
+ # when 'StandUpPaddling' then ''
59
+ when 'Surfing' then '🏄'
60
+ when 'Swim' then '🏊'
61
+ # when 'Velomobile' then ''
62
+ when 'Walk' then '🚶'
63
+ when 'WeightTraining' then '🏋️'
64
+ when 'Wheelchair' then '♿'
65
+ # when 'Windsurf' then ''
66
+ # when 'Workout' then ''
67
+ when 'Yoga' then '🧘'
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ module Mixins
6
+ module TimeInHours
7
+ extend ActiveSupport::Concern
8
+
9
+ private
10
+
11
+ def time_in_hours_s(time)
12
+ return unless time
13
+
14
+ hours = time / 3600 % 24
15
+ minutes = time / 60 % 60
16
+ seconds = time % 60
17
+ [
18
+ hours.to_i.positive? ? format('%dh', hours) : nil,
19
+ minutes.to_i.positive? ? format('%dm', minutes) : nil,
20
+ seconds.to_i.positive? ? format('%ds', seconds) : nil
21
+ ].compact.join
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -3,7 +3,7 @@
3
3
  module Strava
4
4
  module Models
5
5
  module Mixins
6
- module Elevation
6
+ module TotalElevationGain
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  included do
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-PhotosSummary
6
+ class PhotosSummary < Strava::Models::Response
7
+ property 'count'
8
+ property 'use_primary_photo' # undocumented
9
+ property 'primary', transform_with: ->(v) { Strava::Models::PhotosSummaryPrimary.new(v) }
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-PhotosSummary_primary
6
+ class PhotosSummaryPrimary < Strava::Models::Response
7
+ property 'id'
8
+ property 'source'
9
+ property 'unique_id'
10
+ property 'urls'
11
+ # undocumented
12
+ property 'media_type'
13
+ end
14
+ end
15
+ end
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-PowerZoneRanges
5
6
  class PowerZoneRanges < Strava::Models::Response
6
7
  property 'zones', transform_with: ->(v) { v.map { |r| Strava::Models::ZoneRange.new(r) } }
7
8
  end
@@ -2,28 +2,29 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-Route
5
6
  class Route < Strava::Models::Response
7
+ property 'athlete', transform_with: ->(v) { Strava::Models::SummaryAthlete.new(v) }
8
+ property 'description'
6
9
  include Mixins::Distance
7
- include Mixins::Elevation
8
- include Mixins::Time
9
-
10
+ include Mixins::ElevationGain
10
11
  property 'id'
11
- property 'athlete', transform_with: ->(v) { Strava::Models::Athlete.new(v) }
12
- property 'name'
13
- property 'description'
14
- property 'total_elevation_gain', from: 'elevation_gain'
12
+ property 'id_str'
15
13
  property 'map', transform_with: ->(v) { Strava::Models::Map.new(v) }
14
+ property 'name'
16
15
  property 'private'
17
- property 'resource_state'
18
16
  property 'starred'
19
- property 'sub_type'
20
17
  property 'timestamp', transform_with: ->(v) { Time.at(v) }
18
+ property 'type'
19
+ property 'sub_type'
21
20
  property 'created_at', transform_with: ->(v) { Time.parse(v) }
22
21
  property 'updated_at', transform_with: ->(v) { Time.parse(v) }
23
- property 'type'
24
- property 'estimated_moving_time'
25
- property 'moving_time', from: 'estimated_moving_time'
26
- property 'segments', transform_with: ->(v) { v.map { |r| Strava::Models::Segment.new(r) } }
22
+ include Mixins::EstimatedMovingTime
23
+ property 'segments', transform_with: ->(v) { v.map { |r| Strava::Models::SummarySegment.new(r) } }
24
+ property 'waypoints', transform_with: ->(v) { v.map { |r| Strava::Models::Waypoint.new(r) } }
25
+ # undocumented
26
+ property 'map_urls'
27
+ property 'resource_state'
27
28
  end
28
29
  end
29
30
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
+ # Undocumented
5
6
  class SimilarActivities < Strava::Models::Response
6
7
  property 'average_speed'
7
8
  property 'resource_state'
@@ -14,6 +15,7 @@ module Strava
14
15
  property 'min_speed'
15
16
  property 'speeds'
16
17
  property 'trend', transform_with: ->(v) { Strava::Models::Trend.new(v) }
18
+ property 'pr_rank'
17
19
  end
18
20
  end
19
21
  end
@@ -2,16 +2,18 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-Split
5
6
  class Split < Strava::Models::Response
7
+ include Mixins::AverageSpeed
6
8
  include Mixins::Distance
7
- include Mixins::Time
8
- include Mixins::Elevation
9
-
10
- property 'elevation_difference'
11
- property 'total_elevation_gain', from: 'elevation_difference'
9
+ include Mixins::ElapsedTime
10
+ include Mixins::ElevationDifference
11
+ property 'pace_zone'
12
+ include Mixins::MovingTime
12
13
  property 'split'
14
+ # undocumented
15
+ property 'average_grade_adjusted_speed'
13
16
  property 'average_heartrate'
14
- property 'pace_zone'
15
17
  end
16
18
  end
17
19
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ # Undocumented
6
+ class StatsVisibility < Strava::Models::Response
7
+ property 'type'
8
+ property 'visibility'
9
+ end
10
+ end
11
+ end
@@ -2,9 +2,10 @@
2
2
 
3
3
  module Strava
4
4
  module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-StreamSet
5
6
  class StreamSet < Strava::Models::Response
6
- property 'distance', transform_with: ->(v) { Strava::Models::Stream.new(v) }
7
7
  property 'time', transform_with: ->(v) { Strava::Models::Stream.new(v) }
8
+ property 'distance', transform_with: ->(v) { Strava::Models::Stream.new(v) }
8
9
  property 'latlng', transform_with: ->(v) { Strava::Models::Stream.new(v) }
9
10
  property 'altitude', transform_with: ->(v) { Strava::Models::Stream.new(v) }
10
11
  property 'velocity_smooth', transform_with: ->(v) { Strava::Models::Stream.new(v) }
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-SummaryActivity
6
+ class SummaryActivity < Strava::Models::Response
7
+ property 'id'
8
+ property 'external_id'
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::TotalElevationGain
16
+ property 'elev_high'
17
+ property 'elev_low'
18
+ include Mixins::SportType
19
+ property 'start_date', transform_with: ->(v) { Time.parse(v) }
20
+ include Mixins::StartDateLocal
21
+ property 'timezone'
22
+ property 'start_latlng', transform_with: ->(v) { Strava::Models::LatLng.new(v) }
23
+ property 'end_latlng', transform_with: ->(v) { Strava::Models::LatLng.new(v) }
24
+ property 'achievement_count'
25
+ property 'kudos_count'
26
+ property 'comment_count'
27
+ property 'athlete_count'
28
+ property 'photo_count'
29
+ property 'total_photo_count'
30
+ property 'map', transform_with: ->(v) { Strava::Models::Map.new(v) }
31
+ property 'trainer'
32
+ property 'commute'
33
+ property 'manual'
34
+ property 'private'
35
+ property 'flagged'
36
+ property 'workout_type'
37
+ property 'upload_id_str'
38
+ property 'average_speed'
39
+ property 'max_speed'
40
+ property 'has_kudoed'
41
+ property 'hide_from_home'
42
+ property 'gear_id'
43
+ property 'kilojoules'
44
+ property 'average_watts'
45
+ property 'device_watts'
46
+ property 'max_watts'
47
+ property 'weighted_average_watts'
48
+ # undocumented
49
+ property 'resource_state'
50
+ property 'visibility'
51
+ property 'utc_offset'
52
+ property 'location_city'
53
+ property 'location_state'
54
+ property 'location_country'
55
+ property 'average_cadence'
56
+ property 'average_temp'
57
+ property 'has_heartrate'
58
+ property 'average_heartrate'
59
+ property 'max_heartrate'
60
+ property 'heartrate_opt_out'
61
+ property 'display_hide_heartrate_option'
62
+ property 'from_accepted_tag'
63
+ property 'pr_count'
64
+ property 'suffer_score'
65
+
66
+ def strava_url
67
+ "https://www.strava.com/activities/#{id}"
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-SummaryAthlete
6
+ class SummaryAthlete < Strava::Models::Response
7
+ property 'id'
8
+ property 'resource_state'
9
+ property 'firstname'
10
+ property 'lastname'
11
+ property 'profile_medium'
12
+ property 'profile'
13
+ property 'city'
14
+ property 'state'
15
+ property 'country'
16
+ property 'sex'
17
+ property 'premium'
18
+ property 'summit'
19
+ property 'created_at', transform_with: ->(v) { Time.parse(v) }
20
+ property 'updated_at', transform_with: ->(v) { Time.parse(v) }
21
+
22
+ def name
23
+ [firstname, lastname].compact.join(' ') if firstname || lastname
24
+ end
25
+
26
+ def strava_url
27
+ "https://www.strava.com/athletes/#{id}"
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-SummaryClub
6
+ class SummaryClub < Strava::Models::Response
7
+ property 'id'
8
+ property 'resource_state'
9
+ property 'name'
10
+ property 'profile_medium'
11
+ property 'cover_photo'
12
+ property 'cover_photo_small'
13
+ property 'sport_type'
14
+ property 'activity_types'
15
+ property 'city'
16
+ property 'state'
17
+ property 'country'
18
+ property 'private'
19
+ property 'member_count'
20
+ property 'featured'
21
+ property 'verified'
22
+ property 'url'
23
+ # undocumented
24
+ property 'profile'
25
+ property 'activity_types_icon'
26
+ property 'dimensions'
27
+ property 'localized_sport_type'
28
+
29
+ def strava_url
30
+ "https://www.strava.com/clubs/#{url || id}"
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-SummaryGear
6
+ class SummaryGear < Strava::Models::Response
7
+ property 'id'
8
+ property 'resource_state'
9
+ property 'primary'
10
+ property 'name'
11
+ include Mixins::Distance
12
+ # undocumented
13
+ property 'nickname'
14
+ property 'retired'
15
+ property 'converted_distance'
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Models
5
+ # https://developers.strava.com/docs/reference/#api-models-SummaryPRSegmentEffort
6
+ class SummaryPRSegmentEffort < Strava::Models::Response
7
+ property 'pr_activity_id'
8
+ property 'pr_elapsed_time'
9
+ property 'pr_date', transform_with: ->(v) { Date.parse(v) }
10
+ property 'effort_count'
11
+ # undocumented
12
+ property 'pr_visibility'
13
+ property 'pr_activity_visibility'
14
+ end
15
+ end
16
+ end