strava-ruby-client 1.0.1 β†’ 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a5e44d1ea369bd76dcb67ad565ca9fcec2d08ec9b23d36fc4fa0adb7778e1369
4
- data.tar.gz: 3ac1ef728ebab982443e70ed8952bbd4c23f9e4e1b1669a05aca7382e600c98e
3
+ metadata.gz: dce678ec9f5b6b9bfca53c7c40f11557a4f779949ccf1bcc08b0aab2c5dff911
4
+ data.tar.gz: 656ed8118cd0983e7f259f509d756e80bcc8fe40da7396e2b8be443cd794191b
5
5
  SHA512:
6
- metadata.gz: 5ca82022fa51f2b3426b86fc3479f81f57bb64bebafa61390797094579528ee8e071ffb23b8407591109ee5091aaa09cfb151216b9e080d9087fecd3e3fc3a20
7
- data.tar.gz: c1ef1cce00c099c33b77b74981d3d7121c8577ad15f5dc135a56eb7da7ba1543356001efc2285a474ab66c15486d5a6bab898b6ca602857530f540dcbfcf5907
6
+ metadata.gz: 1674b1059b314e60baa3b404df1f37d9c968e340985b00385b4ee33a66730b55f55ca096263498e438101deaefe218e7146ab3ac83b1931c48c59619064375f7
7
+ data.tar.gz: 5292d8c10f1a41128dc746df559fb8d3ec2fc62920710acea8b402a8160b701441e36a51b3bfb81471ddf06489d4437016ab7ff30382fb8952cdd4d9518cabe5
data/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
- ### 1.0.1 (2023/02/11)
2
-
3
- * [#73](https://github.com/dblock/strava-ruby-client/pull/73): Fixes serialization causing `stack level too deep` - [@simonneutert](https://github.com/simonneutert).
1
+ ### 2.0.0 (2023/6/22)
2
+
3
+ * [#77](https://github.com/dblock/strava-ruby-client/pull/77): Drops unsupported endpoint/method `activity_photos` - [@simonneutert](https://github.com/simonneutert).
4
+ * [#62](https://github.com/dblock/strava-ruby-client/pull/68): Drops `Activity#type` attribute as it is being deprecated by Strava, dropping `Activity#type_emoji` with it - [@simonneutert](https://github.com/simonneutert).
5
+ * [#23](https://github.com/dblock/strava-ruby-client/pull/23): Failed uploads raise Strava::Errors::UploadError - [@ylecuyer](https://github.com/ylecuyer), [@simonneutert](https://github.com/simonneutert).
6
+ * [#69](https://github.com/dblock/strava-ruby-client/pull/69): Raises `Strava::Api::RatelimitError`, when API ratelimit exceeded - [@simonneutert](https://github.com/simonneutert).
7
+ * [#74](https://github.com/dblock/strava-ruby-client/pull/74): Fixes serialization causing `stack level too deep` - [@simonneutert](https://github.com/simonneutert).
8
+ * [#75](https://github.com/dblock/strava-ruby-client/pull/75): Fixes DangerBot deprecation warning for `check` of TOC - [@simonneutert](https://github.com/simonneutert).
4
9
 
5
10
  ### 1.0.0 (2022/12/29)
6
11
 
data/README.md CHANGED
@@ -14,7 +14,6 @@ Unlike other clients, including [strava-api-v3](https://github.com/jaredholdcrof
14
14
  - [Activities](#activities)
15
15
  - [Create an Activity](#create-an-activity)
16
16
  - [Get Activity](#get-activity)
17
- - [List Activity Photos](#list-activity-photos)
18
17
  - [List Activity Comments](#list-activity-comments)
19
18
  - [List Activity Kudoers](#list-activity-kudoers)
20
19
  - [List Activity Laps](#list-activity-laps)
@@ -64,6 +63,7 @@ Unlike other clients, including [strava-api-v3](https://github.com/jaredholdcrof
64
63
  - [Command Line OAuth Workflow](#command-line-oauth-workflow)
65
64
  - [Webhooks](#webhooks)
66
65
  - [Ratelimit](#ratelimit)
66
+ - [Exceeded Ratelimit](#exceeded-ratelimit)
67
67
  - [Configuration](#configuration)
68
68
  - [Web Client Options](#web-client-options)
69
69
  - [API Client Options](#api-client-options)
@@ -149,29 +149,6 @@ google_image_url = "https://maps.googleapis.com/maps/api/staticmap?maptype=roadm
149
149
 
150
150
  See [Strava::Models::Map](lib/strava/models/map.rb) for all available properties.
151
151
 
152
- #### List Activity Photos
153
-
154
- Returns the photos on the given activity. This API is undocumented.
155
-
156
- ```ruby
157
- photos = client.activity_photos(1982980795) # => Array[Strava::Models::Photo]
158
-
159
- photo = photos.first # => Strava::Models::Photo
160
-
161
- photo.id # => nil
162
- photo.unique_id # => '65889142-538D-4EE5-96F5-3DC3B773B1E3'
163
- photo.urls # => { '0' => 'https://dgtzuqphqg23d.cloudfront.net/eb4DMJ2hJW3k_g9URZEMfaJ8rZfHagrNlZRuEZz0osU-29x64.jpg' }
164
- photo.athlete_id # => 26_462_176
165
- photo.activity_id # => 1_946_417_534
166
- photo.activity_name # => 'TCS NYC Marathon 2018'
167
- photo.created_at # => Time
168
- photo.uploaded_at # => Time
169
- photo.sizes # => { '0' => [29, 64] }
170
- photo.default_photo # => false
171
- ```
172
-
173
- See [Strava::Models::Photo](lib/strava/models/photo.rb) for all available properties.
174
-
175
152
  #### List Activity Comments
176
153
 
177
154
  Returns the comments on the given activity.
@@ -226,7 +203,6 @@ activity = activities.first # => Strava::Models::Activity
226
203
 
227
204
  activity.name # => 'NYC TCS Marathon 2018'
228
205
  activity.strava_url # => 'https://www.strava.com/activities/1477353766'
229
- activity.type_emoji # => 'πŸƒ'
230
206
  activity.sport_type_emoji # => 'πŸƒ'
231
207
  activity.distance_s # => '42.2km'
232
208
  activity.moving_time_in_hours_s # => '3h38m5s'
@@ -711,7 +687,7 @@ See [Strava::Models::StreamSet](lib/strava/models/stream_set.rb) and [Strava::Mo
711
687
 
712
688
  #### Upload Activity
713
689
 
714
- Uploads a new data file to create an activity from.
690
+ Uploads a new data file to create an activity from. To check the processing status of the uploaded file, see [Get Upload](#get-upload).
715
691
 
716
692
  ```ruby
717
693
  upload = client.create_upload(
@@ -733,9 +709,10 @@ See [Strava::Models::Upload](lib/strava/models/upload.rb) for all available prop
733
709
 
734
710
  #### Get Upload
735
711
 
736
- Returns an upload for a given identifier.
712
+ Returns an upload for a given identifier. Raises `Strava::Errors::UploadError` if the upload was faulty and did not result in a created activity. `Strava::Errors::UploadError#upload` contains `Strava::Models::Upload` for further inspection.
737
713
 
738
714
  ```ruby
715
+ # happy path
739
716
  upload = client.upload(2136460097) # => Strava::Models::Upload
740
717
 
741
718
  upload.id # => 2_136_460_097
@@ -745,7 +722,29 @@ upload.status # => 'Your activity is ready.'
745
722
  upload.activity_id # => 1_998_557_443
746
723
  ```
747
724
 
748
- See [Strava::Models::Upload](lib/strava/models/upload.rb) for all available properties.
725
+ ```ruby
726
+ # with error after upload
727
+ upload = client.upload(2136460097)
728
+ begin
729
+ while upload.processing?
730
+ sleep 1
731
+ upload = client.upload(2136460097)
732
+ end
733
+ rescue Strava::Errors::UploadError => upload_error
734
+ upload_error.status # => 200
735
+ upload_error.error_status # => 'There was an error processing your activity.'
736
+ upload_error.message # => '17611540601.tcx duplicate of activity 8309312818'
737
+
738
+ upload_error.upload.external_id # => nil
739
+ upload_error.upload.activity_id # => nil
740
+ upload_error.upload.status # => 'There was an error processing your activity.'
741
+ upload_error.upload.error # => '17611540601.tcx duplicate of activity 8309312818'
742
+ upload_error.upload.class # => Strava::Models::UploadFailed
743
+ end
744
+ ```
745
+
746
+ See [Strava::Models::Upload](lib/strava/models/upload.rb) for all available properties.
747
+ See [Strava::Errors::UploadError](lib/strava/errors/upload_failed_error.rb) for all available properties.
749
748
 
750
749
  ### Pagination
751
750
 
@@ -947,6 +946,16 @@ You can access the Hash containing all limits by calling `to_h`.
947
946
  }
948
947
  ```
949
948
 
949
+ #### Exceeded Ratelimit
950
+
951
+ Strava answers with HTTP status code 429, when ratelimits are exceeded. This will in return raise `Strava::Errors::RatelimitError`.
952
+
953
+ ```ruby
954
+ error.is_a?(Strava::Errors::RatelimitError) #=> true
955
+ error.ratelimit.is_a?(Strava::Api::Ratelimit) #=> true
956
+ # see Strava::Api::Ratelimit
957
+ ```
958
+
950
959
  ## Configuration
951
960
 
952
961
  ### Web Client Options
@@ -2,8 +2,8 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'dotenv/load'
5
- require 'strava-ruby-client'
6
5
  require 'webrick'
6
+ require 'strava-ruby-client'
7
7
 
8
8
  server = WEBrick::HTTPServer.new(Port: 4242)
9
9
 
data/bin/strava-webhooks CHANGED
@@ -2,8 +2,8 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'dotenv/load'
5
- require 'strava-ruby-client'
6
5
  require 'webrick'
6
+ require 'strava-ruby-client'
7
7
 
8
8
  logger = ::Logger.new($stdout)
9
9
  logger.level = Logger::INFO
@@ -37,21 +37,6 @@ module Strava
37
37
  paginate "activities/#{id}/comments", options, Strava::Models::Comment, &block
38
38
  end
39
39
 
40
- #
41
- # List activity photos.
42
- #
43
- # @option options [String] :id
44
- # Activity id.
45
- # @option options [Integer] :page
46
- # Page number.
47
- # @option options [Integer] :per_page
48
- # Number of items per page. Defaults to 30.
49
- #
50
- def activity_photos(id_or_options, options = {}, &block)
51
- id, options = parse_args(id_or_options, options)
52
- paginate "activities/#{id}/photos", options, Strava::Models::Photo, &block
53
- end
54
-
55
40
  #
56
41
  # List activity kudoers.
57
42
  #
@@ -125,7 +110,7 @@ module Strava
125
110
  # The description of the activity.
126
111
  # @option options [String] :name
127
112
  # The name of the activity.
128
- # @option options [String] :type
113
+ # @option options [String] :sport_type
129
114
  # Activity type.
130
115
  # @option options [String] :gear_id
131
116
  # Identifier for the gear associated with the activity. Specifying "none" clears gear from activity.
@@ -9,6 +9,20 @@ module Strava
9
9
  @body = response.body
10
10
  end
11
11
 
12
+ def exceeded
13
+ return false unless limit?
14
+
15
+ @exceeded ||= if fifteen_minutes_remaining && fifteen_minutes_remaining <= 0
16
+ { fifteen_minutes_remaining: fifteen_minutes_remaining }
17
+ elsif total_day_remaining && total_day_remaining <= 0
18
+ { total_day_remaining: total_day_remaining }
19
+ end
20
+ end
21
+
22
+ def exceeded?
23
+ !!exceeded
24
+ end
25
+
12
26
  def to_s
13
27
  to_h.map do |k, v|
14
28
  "#{k}: #{v}"
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Errors
5
+ class RatelimitError < ::Faraday::ClientError
6
+ attr_reader :http_response, :ratelimit, :error_message
7
+
8
+ def initialize(http_response, error_message = nil)
9
+ @response = http_response.response
10
+ @ratelimit = Strava::Api::Ratelimit.new(@response)
11
+ @error_message = error_message || message
12
+ super({
13
+ status: http_response.status,
14
+ headers: http_response.response_headers,
15
+ body: http_response.body
16
+ })
17
+ end
18
+
19
+ def message
20
+ response[:body]['message'] || super
21
+ end
22
+
23
+ def headers
24
+ response[:headers]
25
+ end
26
+
27
+ def errors
28
+ response[:body]['errors']
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Errors
5
+ class UploadError < ::Faraday::ClientError
6
+ def status
7
+ response[:status]
8
+ end
9
+
10
+ def headers
11
+ response[:headers]
12
+ end
13
+
14
+ def message
15
+ body[:error] || super
16
+ end
17
+
18
+ def error_status
19
+ body[:status]
20
+ end
21
+
22
+ def upload
23
+ @upload ||= Strava::Models::Upload.new(body)
24
+ end
25
+
26
+ private
27
+
28
+ def body
29
+ (response[:body] || {}).with_indifferent_access
30
+ end
31
+ end
32
+ end
33
+ end
@@ -13,7 +13,6 @@ module Strava
13
13
  property 'athlete', transform_with: ->(v) { Strava::Models::Athlete.new(v) }
14
14
  property 'name'
15
15
  property 'description'
16
- property 'type' # deprecated
17
16
  property 'sport_type'
18
17
  property 'workout_type'
19
18
  property 'id'
@@ -80,7 +79,7 @@ module Strava
80
79
  property 'leaderboard_opt_out'
81
80
 
82
81
  def distance_s
83
- if type == 'Swim'
82
+ if sport_type == 'Swim'
84
83
  distance_in_meters_s
85
84
  else
86
85
  distance_in_kilometers_s
@@ -88,7 +87,7 @@ module Strava
88
87
  end
89
88
 
90
89
  def pace_s
91
- case type
90
+ case sport_type
92
91
  when 'Swim'
93
92
  pace_per_100_meters_s
94
93
  else
@@ -139,44 +138,6 @@ module Strava
139
138
  when 'Yoga' then '🧘'
140
139
  end
141
140
  end
142
-
143
- #
144
- # @deprecated Use {#sport_type_emoji} instead.
145
- #
146
- # @return [String] precisely an emoji
147
- #
148
- def type_emoji
149
- case type
150
- when 'Run', 'VirtualRun' then 'πŸƒ'
151
- when 'Ride', 'EBikeRide', 'VirtualRide' then '🚴'
152
- when 'Swim' then '🏊'
153
- when 'Walk' then '🚢'
154
- when 'AlpineSki' then '⛷️'
155
- when 'BackcountrySki' then '🎿️'
156
- # when 'Canoeing' then ''
157
- # when 'Crossfit' then ''
158
- # when 'Elliptical' then ''
159
- # when 'Hike' then ''
160
- when 'IceSkate' then '⛸️'
161
- # when 'InlineSkate' then ''
162
- # when 'Kayaking' then ''
163
- # when 'Kitesurf' then ''
164
- # when 'NordicSki' then ''
165
- when 'RockClimbing' then 'πŸ§—'
166
- when 'RollerSki' then ''
167
- when 'Rowing' then '🚣'
168
- when 'Snowboard' then 'πŸ‚'
169
- # when 'Snowshoe' then ''
170
- # when 'StairStepper' then ''
171
- # when 'StandUpPaddling' then ''
172
- when 'Surfing' then 'πŸ„'
173
- when 'WeightTraining' then 'πŸ‹οΈ'
174
- # when 'Windsurf' then ''
175
- when 'Wheelchair' then 'β™Ώ'
176
- # when 'Workout' then ''
177
- # when 'Yoga'' then ''
178
- end
179
- end
180
141
  end
181
142
  end
182
143
  end
@@ -8,6 +8,40 @@ module Strava
8
8
  property 'error'
9
9
  property 'status'
10
10
  property 'activity_id'
11
+
12
+ def processing?
13
+ validate!
14
+ activity_id.nil?
15
+ end
16
+
17
+ def processed?
18
+ !processing?
19
+ end
20
+
21
+ private
22
+
23
+ def validate!
24
+ raise_when_background_job_failed!
25
+ end
26
+
27
+ def raise_when_background_job_failed!
28
+ response = http_response.response
29
+ return unless response_contains_error_message?(response)
30
+
31
+ raise Strava::Errors::UploadError, response_values(response)
32
+ end
33
+
34
+ def response_contains_error_message?(response)
35
+ response.status == 200 && response.body['error'].present?
36
+ end
37
+
38
+ def response_values(response)
39
+ {
40
+ status: response.status,
41
+ headers: response.headers,
42
+ body: response.body
43
+ }
44
+ end
11
45
  end
12
46
  end
13
47
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Strava
4
- VERSION = '1.0.1'
4
+ VERSION = '2.0.0'
5
5
  end
@@ -12,6 +12,8 @@ module Strava
12
12
  when 407
13
13
  # mimic the behavior that we get with proxy requests with HTTPS
14
14
  raise Faraday::ConnectionFailed, %(407 "Proxy Authentication Required ")
15
+ when 429
16
+ raise Strava::Errors::RatelimitError.new(env, 'Too Many Requests')
15
17
  when CLIENT_ERROR_STATUSES
16
18
  raise Strava::Errors::Fault, response_values(env)
17
19
  end
@@ -17,11 +17,13 @@ require_relative 'strava/logger'
17
17
  require_relative 'strava/deep_copyable'
18
18
 
19
19
  require_relative 'strava/errors/fault'
20
+ require_relative 'strava/errors/upload_error'
21
+ require_relative 'strava/errors/ratelimit_error'
20
22
 
21
- require_relative 'strava/models/mixins/http_response'
23
+ require_relative 'strava/models/mixins/time'
22
24
  require_relative 'strava/models/mixins/distance'
23
25
  require_relative 'strava/models/mixins/elevation'
24
- require_relative 'strava/models/mixins/time'
26
+ require_relative 'strava/models/mixins/http_response'
25
27
  require_relative 'strava/models/mixins/start_date_local'
26
28
 
27
29
  require_relative 'strava/models/model'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strava-ruby-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Doubrovkine
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-11 00:00:00.000000000 Z
11
+ date: 2023-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -98,6 +98,8 @@ files:
98
98
  - lib/strava/api/ratelimit.rb
99
99
  - lib/strava/deep_copyable.rb
100
100
  - lib/strava/errors/fault.rb
101
+ - lib/strava/errors/ratelimit_error.rb
102
+ - lib/strava/errors/upload_error.rb
101
103
  - lib/strava/logger.rb
102
104
  - lib/strava/models/achievement.rb
103
105
  - lib/strava/models/activity.rb
@@ -177,7 +179,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
177
179
  - !ruby/object:Gem::Version
178
180
  version: 1.3.6
179
181
  requirements: []
180
- rubygems_version: 3.3.26
182
+ rubygems_version: 3.4.12
181
183
  signing_key:
182
184
  specification_version: 4
183
185
  summary: Strava API Ruby client.