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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +60 -48
- data/LICENSE.md +1 -1
- data/README.md +100 -80
- data/bin/strava-activities.rb +2 -0
- data/bin/strava-oauth-token +43 -35
- data/bin/strava-refresh-token +32 -0
- data/lib/strava/api/client.rb +46 -6
- data/lib/strava/api/cursor.rb +26 -2
- data/lib/strava/api/endpoints/activities.rb +10 -7
- data/lib/strava/api/endpoints/athletes.rb +2 -2
- data/lib/strava/api/endpoints/clubs.rb +5 -5
- data/lib/strava/api/endpoints/gears.rb +1 -1
- data/lib/strava/api/endpoints/segment_efforts.rb +2 -2
- data/lib/strava/api/endpoints/segments.rb +3 -3
- data/lib/strava/api/pagination.rb +1 -2
- data/lib/strava/models/achievement.rb +1 -0
- data/lib/strava/models/activity_stats.rb +1 -0
- data/lib/strava/models/activity_total.rb +5 -9
- data/lib/strava/models/activity_zone.rb +4 -1
- data/lib/strava/models/base_stream.rb +12 -0
- data/lib/strava/models/club_activity.rb +22 -0
- data/lib/strava/models/{club_member.rb → club_athlete.rb} +5 -2
- data/lib/strava/models/club_event.rb +6 -4
- data/lib/strava/models/comment.rb +7 -2
- data/lib/strava/models/destination.rb +12 -0
- data/lib/strava/models/{activity.rb → detailed_activity.rb} +51 -103
- data/lib/strava/models/{athlete.rb → detailed_athlete.rb} +20 -14
- data/lib/strava/models/{club.rb → detailed_club.rb} +10 -3
- data/lib/strava/models/{gear.rb → detailed_gear.rb} +10 -7
- data/lib/strava/models/{photo.rb → detailed_photo.rb} +13 -5
- data/lib/strava/models/{photos.rb → detailed_photos.rb} +2 -1
- data/lib/strava/models/{segment.rb → detailed_segment.rb} +18 -24
- data/lib/strava/models/{segment_effort.rb → detailed_segment_effort.rb} +23 -17
- data/lib/strava/models/explorer_segment.rb +8 -5
- data/lib/strava/models/heart_rate_zone_ranges.rb +1 -0
- data/lib/strava/models/kudoser.rb +1 -0
- data/lib/strava/models/lap.rb +18 -16
- data/lib/strava/models/lat_lng.rb +46 -0
- data/lib/strava/models/local_legend.rb +16 -0
- data/lib/strava/models/meta_activity.rb +13 -0
- data/lib/strava/models/meta_athlete.rb +14 -0
- data/lib/strava/models/meta_club.rb +12 -0
- data/lib/strava/models/mixins/{time.rb → average_speed.rb} +6 -29
- data/lib/strava/models/mixins/elapsed_time.rb +20 -0
- data/lib/strava/models/mixins/elevation_difference.rb +39 -0
- data/lib/strava/models/mixins/elevation_gain.rb +39 -0
- data/lib/strava/models/mixins/estimated_moving_time.rb +20 -0
- data/lib/strava/models/mixins/moving_time.rb +20 -0
- data/lib/strava/models/mixins/sport_type.rb +73 -0
- data/lib/strava/models/mixins/time_in_hours.rb +26 -0
- data/lib/strava/models/mixins/{elevation.rb → total_elevation_gain.rb} +1 -1
- data/lib/strava/models/photos_summary.rb +12 -0
- data/lib/strava/models/photos_summary_primary.rb +15 -0
- data/lib/strava/models/power_zone_ranges.rb +1 -0
- data/lib/strava/models/route.rb +14 -13
- data/lib/strava/models/similar_activities.rb +2 -0
- data/lib/strava/models/split.rb +8 -6
- data/lib/strava/models/stats_visibility.rb +11 -0
- data/lib/strava/models/stream_set.rb +2 -1
- data/lib/strava/models/summary_activity.rb +71 -0
- data/lib/strava/models/summary_athlete.rb +31 -0
- data/lib/strava/models/summary_club.rb +34 -0
- data/lib/strava/models/summary_gear.rb +18 -0
- data/lib/strava/models/summary_pr_segment_effort.rb +16 -0
- data/lib/strava/models/summary_segment.rb +34 -0
- data/lib/strava/models/summary_segment_effort.rb +16 -0
- data/lib/strava/models/timed_zone_range.rb +1 -0
- data/lib/strava/models/token.rb +1 -1
- data/lib/strava/models/trend.rb +1 -0
- data/lib/strava/models/updatable_activity.rb +16 -0
- data/lib/strava/models/upload.rb +2 -0
- data/lib/strava/models/waypoint.rb +15 -0
- data/lib/strava/models/xoms.rb +13 -0
- data/lib/strava/models/zone_range.rb +1 -0
- data/lib/strava/models/zones.rb +1 -0
- data/lib/strava/version.rb +1 -1
- data/lib/strava/webhooks/models/event.rb +1 -1
- data/lib/strava-ruby-client.rb +55 -30
- metadata +47 -18
- data/lib/strava/api/endpoints/running_races.rb +0 -20
- data/lib/strava/models/club_admin.rb +0 -15
- data/lib/strava/models/running_race.rb +0 -35
- 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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
57
|
-
|
|
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
|
|
@@ -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
|
data/lib/strava/models/route.rb
CHANGED
|
@@ -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::
|
|
8
|
-
include Mixins::Time
|
|
9
|
-
|
|
10
|
+
include Mixins::ElevationGain
|
|
10
11
|
property 'id'
|
|
11
|
-
property '
|
|
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
|
-
|
|
24
|
-
property '
|
|
25
|
-
property '
|
|
26
|
-
|
|
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
|
data/lib/strava/models/split.rb
CHANGED
|
@@ -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::
|
|
8
|
-
include Mixins::
|
|
9
|
-
|
|
10
|
-
|
|
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
|
|
@@ -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
|