Skip to content

Commit d0cc188

Browse files
authored
Merge pull request #94 from dblock/video-fields
Added video fields.
2 parents 46a9fb6 + 9198862 commit d0cc188

File tree

10 files changed

+128
-132
lines changed

10 files changed

+128
-132
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
### 3.0.0 (Next)
22

3-
* [#93](https://github.com/dblock/strava-ruby-client/pull/93): Updates GitHub Actions workflows - [@simonneutert](https://github.com/simonneutert).
3+
* [#94](https://github.com/dblock/strava-ruby-client/pull/94): Adds video fields to `Strava::Models::Photo` - [@dblock](https://github.com/dblock).
44
* [#92](https://github.com/dblock/strava-ruby-client/pull/92): Fixes `Hashie::Trash` serialization warning for `object_id` of `Strava::Webhooks::Models::Event` - [@simonneutert](https://github.com/simonneutert).
5+
* [#93](https://github.com/dblock/strava-ruby-client/pull/93): Updates GitHub Actions workflows - [@simonneutert](https://github.com/simonneutert).
56
* Your contribution here.
67

78
### 2.3.0 (2025/10/16)

CONTRIBUTING.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,25 @@ bundle exec rake
2727

2828
## Contribute Code
2929

30+
### Obtain a Strava Token
31+
32+
The token from the Strava website does not have enough permissions to retrieve your own activities.
33+
Use the [strava-oauth-token tool](#strava-oauth-token) to obtain a short lived with more access scopes.
34+
35+
Obtain `STRAVA_CLIENT_ID` and `STRAVA_CLIENT_SECRET` from [My API Application](https://www.strava.com/settings/api).
36+
37+
```bash
38+
export STRAVA_CLIENT_ID=...
39+
export STRAVA_CLIENT_SECRET=...
40+
bundle exec ruby bin/strava-oauth-token
41+
```
42+
43+
This will open a browser window. Complete the OAuth workflow and note `access_token`.
44+
45+
```
46+
export STRAVA_ACCESS_TOKEN=...
47+
```
48+
3049
### Create a Topic Branch
3150

3251
Make sure your fork is up-to-date and create a topic branch for your feature or bug fix.

UPGRADING.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
### Upgrading to >= 3.0.0
44

5+
#### Removed `id` from `Strava::Models::Photo`
6+
7+
The Strava Photos API returns `unique_id` and does not return `id`. The latter has been removed.
8+
9+
See [#94](https://github.com/dblock/strava-ruby-client/pull/94) for details.
10+
11+
#### Renamed `object_id` to `id` in `Strava::Webhooks::Models::Event`
12+
513
The `Strava::Webhooks::Models::Event` model has been refactored to map the `object_id` field to `id` for consistency and to resolve `Hashie::Trash` serialization warnings.
614

715
**Breaking Change**: If you're using webhooks and accessing the `object_id` property, you must now use `id` instead.

lib/strava/models/photo.rb

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,27 @@
33
module Strava
44
module Models
55
class Photo < Strava::Models::Response
6-
property 'id'
76
property 'unique_id'
8-
property 'urls'
9-
property 'source'
107
property 'athlete_id'
118
property 'activity_id'
129
property 'activity_name'
10+
property 'post_id'
1311
property 'resource_state'
1412
property 'caption'
13+
property 'type'
14+
property 'source'
15+
property 'status'
16+
property 'uploaded_at', transform_with: ->(v) { Time.parse(v) }
1517
property 'created_at', transform_with: ->(v) { Time.parse(v) }
1618
property 'created_at_local', transform_with: ->(v) { Time.parse(v) }
17-
property 'uploaded_at', transform_with: ->(v) { Time.parse(v) }
19+
property 'urls'
20+
property 'placeholder_image'
1821
property 'sizes'
1922
property 'default_photo'
23+
property 'cursor'
24+
property 'duration'
25+
property 'video_url'
26+
property 'location'
2027
end
2128
end
2229
end

spec/fixtures/strava/client/activity_photos.yml

Lines changed: 29 additions & 102 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

spec/strava/api/client/endpoints/activities/activity_photos_spec.rb

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,66 @@
44

55
RSpec.describe 'Strava::Api::Client#activity_photos', vcr: { cassette_name: 'client/activity_photos' } do
66
include_context 'with API client'
7-
it 'returns activity photos' do
8-
activity_photos = client.activity_photos(id: 7_287_327_028)
9-
expect(activity_photos).to be_a Enumerable
10-
expect(activity_photos.count).to eq 2
11-
activity_photo = activity_photos.first
12-
expect(activity_photo.id).to be_nil
13-
expect(activity_photo.unique_id).to eq 'f5ebd6e7-8c87-4478-86ce-ce5cf31cf519'
14-
expect(activity_photo.urls).to eq('5000' => 'https://dgtzuqphqg23d.cloudfront.net/3wt2DyGHKHX6gJSXzpAcVdEI1QE2luP9xoDLD0CX2w4-2048x1536.jpg')
15-
expect(activity_photo.source).to eq 1
16-
expect(activity_photo.athlete_id).to eq 24_776_507
17-
expect(activity_photo.activity_id).to eq 7_287_327_028
18-
expect(activity_photo.activity_name).to eq 'Die Rückkehr der Cornichons! 🥒'
19-
expect(activity_photo.resource_state).to eq 2
20-
expect(activity_photo.caption).to eq ''
21-
expect(activity_photo.created_at).to be_a Time
22-
expect(activity_photo.created_at_local).to be_a Time
23-
expect(activity_photo.uploaded_at).to be_a Time
24-
expect(activity_photo.sizes).to eq('5000' => [2048, 1536])
25-
expect(activity_photo.default_photo).to be true
7+
8+
context 'with activity photos' do
9+
let(:activity_photos) { client.activity_photos(id: 16_181_809_559) }
10+
11+
it 'returns activity photos' do
12+
expect(activity_photos).to be_a Enumerable
13+
expect(activity_photos.count).to eq 4
14+
end
15+
16+
context 'when photo' do
17+
let(:activity_photo) { activity_photos.first }
18+
19+
it 'returns all fields' do
20+
expect(activity_photo.unique_id).to eq '6D1E4A0B-0A46-406A-874A-C3ED694DDE55'
21+
expect(activity_photo.urls).to eq('5000' => 'https://dgtzuqphqg23d.cloudfront.net/gskSZVRgkpQ-O9HOdMXpYLEfDvRkZBNs_hGKBKbsmds-1536x2048.jpg')
22+
expect(activity_photo.source).to eq 1
23+
expect(activity_photo.status).to eq 3
24+
expect(activity_photo.cursor).to be_nil
25+
expect(activity_photo.athlete_id).to eq 26_462_176
26+
expect(activity_photo.activity_id).to eq 16_181_809_559
27+
expect(activity_photo.activity_name).to eq 'Run with Artyom'
28+
expect(activity_photo.resource_state).to eq 2
29+
expect(activity_photo.caption).to eq ''
30+
expect(activity_photo.created_at).to be_a Time
31+
expect(activity_photo.created_at_local).to be_a Time
32+
expect(activity_photo.uploaded_at).to be_a Time
33+
expect(activity_photo.sizes).to eq('5000' => [1536, 2048])
34+
expect(activity_photo.default_photo).to be true
35+
end
36+
end
37+
38+
context 'when video' do
39+
let(:activity_video) { activity_photos[3] }
40+
41+
it 'returns all fields' do
42+
expect(activity_video.unique_id).to eq '077BE6E7-DDA8-4F38-BB4A-DF0F4640C2D5'
43+
expect(activity_video.urls).to eq('5000' => 'https://d35tn3x5zm6xrc.cloudfront.net/LEpTlUieI8wxuKwsdTd_CAHz0i2BccppnSXEfVV5_p4/thumbnails/LEpTlUieI8wxuKwsdTd_CAHz0i2BccppnSXEfVV5_p4_1080x1920.jpg')
44+
expect(activity_video.source).to eq 1
45+
expect(activity_video.status).to eq 3
46+
expect(activity_video.cursor).to be_nil
47+
expect(activity_video.athlete_id).to eq 26_462_176
48+
expect(activity_video.activity_id).to eq 16_181_809_559
49+
expect(activity_video.activity_name).to eq 'Run with Artyom'
50+
expect(activity_video.resource_state).to eq 2
51+
expect(activity_video.caption).to eq ''
52+
expect(activity_video.created_at).to be_a Time
53+
expect(activity_video.created_at_local).to be_a Time
54+
expect(activity_video.uploaded_at).to be_a Time
55+
expect(activity_video.sizes).to eq('5000' => [1080, 1920])
56+
expect(activity_video.default_photo).to be false
57+
expect(activity_video.video_url).to eq 'https://d35tn3x5zm6xrc.cloudfront.net/LEpTlUieI8wxuKwsdTd_CAHz0i2BccppnSXEfVV5_p4/hls/LEpTlUieI8wxuKwsdTd_CAHz0i2BccppnSXEfVV5_p4.m3u8'
58+
expect(activity_video.duration).to eq 4
59+
expect(activity_video.location).to eq([40.7557, -73.9966])
60+
end
61+
end
2662
end
2763

2864
it 'returns activity photos by id' do
29-
activity_photos = client.activity_photos(3_958_491_750)
65+
activity_photos = client.activity_photos(16_181_809_559)
3066
expect(activity_photos).to be_a Enumerable
31-
expect(activity_photos.count).to eq 1
67+
expect(activity_photos.count).to eq 4
3268
end
3369
end

spec/strava/api/client/endpoints/activities/activity_ride_spec.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,6 @@
227227
expect(photos.count).to eq 1
228228
photo = photos.primary
229229
expect(photo).to be_a Strava::Models::Photo
230-
expect(photo.id).to be_nil
231230
expect(photo.unique_id).to eq 'F775717B-D1C1-443A-AD99-3D9A80FF11C9'
232231
expect(photo.urls).to eq(
233232
'100' => 'https://dgtzuqphqg23d.cloudfront.net/BO0H-YeNRZOfFhc0PctUheAKchsY2ll4vsagU58MNKg-128x96.jpg',

spec/strava/api/client/endpoints/activities/activity_spec.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,6 @@
244244
expect(photos.count).to eq 9
245245
photo = photos.primary
246246
expect(photo).to be_a Strava::Models::Photo
247-
expect(photo.id).to be_nil
248247
expect(photo.unique_id).to eq '5e8006d0-8349-40ad-a4ef-72b5e6e82dfe'
249248
expect(photo.urls).to eq(
250249
'100' => 'https://dgtzuqphqg23d.cloudfront.net/mo8thQ4Z5qAylUaRZHOWAR1sp16Bo-pp0ggYQKSWiZE-90x128.jpg',

spec/strava/webhooks/client_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
end
6565

6666
context 'with a client id and secret' do
67-
let(:client) { described_class.new(client_id: ENV.fetch('STRAVA_CLIENT_ID', '24523'), client_secret: ENV.fetch('STRAVA_CLIENT_SECRET', 'client-secret')) }
67+
let(:client) { described_class.new(client_id: '24523', client_secret: 'client-secret') }
6868

6969
describe '#push_subscriptions' do
7070
it 'gets an empty set of push subscriptions', vcr: { cassette_name: 'webhooks/no_push_subscriptions' } do

spec/support/vcr.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
VCR.configure do |config|
77
config.cassette_library_dir = 'spec/fixtures/strava'
88
config.hook_into :webmock
9-
# config.default_cassette_options = { record: :new_episodes }
9+
config.default_cassette_options = { record: :new_episodes }
1010
config.configure_rspec_metadata!
1111
config.before_record do |i|
1212
i.request.headers['Authorization'] = ['Bearer access-token'] if ENV.key?('STRAVA_ACCESS_TOKEN')

0 commit comments

Comments
 (0)