strava-ruby-client 0.4.3 → 1.0.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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -1
  3. data/README.md +90 -88
  4. data/bin/strava-oauth-token +2 -2
  5. data/bin/strava-webhooks +2 -2
  6. data/lib/strava/api/client.rb +21 -2
  7. data/lib/strava/api/endpoints/routes.rb +2 -2
  8. data/lib/strava/api/endpoints/running_races.rb +0 -12
  9. data/lib/strava/api/endpoints/segments.rb +0 -46
  10. data/lib/strava/api/pagination.rb +60 -0
  11. data/lib/strava/api/ratelimit.rb +159 -0
  12. data/lib/strava/deep_copyable.rb +16 -0
  13. data/lib/strava/models/achievement.rb +1 -1
  14. data/lib/strava/models/activity.rb +48 -2
  15. data/lib/strava/models/activity_stats.rb +1 -1
  16. data/lib/strava/models/activity_total.rb +1 -1
  17. data/lib/strava/models/activity_zone.rb +1 -1
  18. data/lib/strava/models/athlete.rb +1 -2
  19. data/lib/strava/models/authorization.rb +1 -1
  20. data/lib/strava/models/club.rb +1 -1
  21. data/lib/strava/models/club_admin.rb +1 -1
  22. data/lib/strava/models/club_event.rb +1 -1
  23. data/lib/strava/models/club_member.rb +1 -1
  24. data/lib/strava/models/comment.rb +1 -1
  25. data/lib/strava/models/explorer_segment.rb +1 -1
  26. data/lib/strava/models/gear.rb +1 -1
  27. data/lib/strava/models/heart_rate_zone_ranges.rb +1 -1
  28. data/lib/strava/models/kudoser.rb +1 -1
  29. data/lib/strava/models/lap.rb +1 -1
  30. data/lib/strava/models/map.rb +1 -1
  31. data/lib/strava/models/mixins/http_response.rb +15 -0
  32. data/lib/strava/models/photo.rb +1 -1
  33. data/lib/strava/models/photos.rb +1 -1
  34. data/lib/strava/models/power_zone_ranges.rb +1 -1
  35. data/lib/strava/models/response.rb +9 -0
  36. data/lib/strava/models/route.rb +1 -1
  37. data/lib/strava/models/running_race.rb +1 -1
  38. data/lib/strava/models/segment.rb +1 -1
  39. data/lib/strava/models/segment_effort.rb +1 -1
  40. data/lib/strava/models/segment_stats.rb +1 -1
  41. data/lib/strava/models/similar_activities.rb +1 -1
  42. data/lib/strava/models/split.rb +1 -1
  43. data/lib/strava/models/stream.rb +1 -1
  44. data/lib/strava/models/stream_set.rb +1 -1
  45. data/lib/strava/models/timed_zone_range.rb +1 -1
  46. data/lib/strava/models/token.rb +1 -1
  47. data/lib/strava/models/trend.rb +1 -1
  48. data/lib/strava/models/upload.rb +1 -1
  49. data/lib/strava/models/zone_range.rb +1 -1
  50. data/lib/strava/models/zones.rb +1 -1
  51. data/lib/strava/version.rb +1 -1
  52. data/lib/strava/web/api_response.rb +17 -0
  53. data/lib/strava/web/client.rb +2 -2
  54. data/lib/strava/web/connection.rb +4 -4
  55. data/lib/strava/web/raise_response_error.rb +29 -0
  56. data/lib/strava/web/request.rb +3 -2
  57. data/lib/strava/web/response.rb +92 -0
  58. data/lib/strava/webhooks/models/subscription.rb +1 -1
  59. data/lib/strava-ruby-client.rb +9 -4
  60. metadata +17 -12
  61. data/lib/strava/models/segment_leaderboard.rb +0 -12
  62. data/lib/strava/models/segment_leaderboard_entry.rb +0 -14
  63. data/lib/strava/web/raise_error.rb +0 -31
@@ -3,8 +3,8 @@
3
3
  module Strava
4
4
  module Web
5
5
  class Client
6
- include Web::Connection
7
- include Web::Request
6
+ include Strava::Web::Connection
7
+ include Strava::Web::Request
8
8
 
9
9
  attr_accessor(*Config::ATTRIBUTES)
10
10
 
@@ -25,10 +25,10 @@ module Strava
25
25
  options[:request] = request_options if request_options.any?
26
26
 
27
27
  ::Faraday::Connection.new(endpoint, options) do |connection|
28
- connection.use ::Faraday::Request::Multipart
29
- connection.use ::Faraday::Request::UrlEncoded
30
- connection.use ::Strava::Web::Response::RaiseError
31
- connection.use ::FaradayMiddleware::ParseJson, content_type: /\bjson$/
28
+ connection.request :multipart
29
+ connection.request :url_encoded
30
+ connection.use Strava::Web::RaiseResponseError
31
+ connection.response :json
32
32
  connection.response :logger, logger if logger
33
33
  connection.adapter ::Faraday.default_adapter
34
34
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Web
5
+ class RaiseResponseError < ::Faraday::Middleware
6
+ CLIENT_ERROR_STATUSES = (400...600).freeze
7
+
8
+ def on_complete(env)
9
+ case env[:status]
10
+ when 404
11
+ raise Faraday::ResourceNotFound, response_values(env)
12
+ when 407
13
+ # mimic the behavior that we get with proxy requests with HTTPS
14
+ raise Faraday::ConnectionFailed, %(407 "Proxy Authentication Required ")
15
+ when CLIENT_ERROR_STATUSES
16
+ raise Strava::Errors::Fault, response_values(env)
17
+ end
18
+ end
19
+
20
+ def response_values(env)
21
+ {
22
+ status: env.status,
23
+ headers: env.response_headers,
24
+ body: env.body
25
+ }
26
+ end
27
+ end
28
+ end
29
+ end
@@ -25,7 +25,7 @@ module Strava
25
25
  options = options.dup if options.key?(:request) || options.key?(:endpoint)
26
26
  root = options.delete(:endpoint) || endpoint
27
27
  path = [root, path].join('/')
28
- response = connection.send(method) do |request|
28
+ http_response = connection.send(method) do |request|
29
29
  case method
30
30
  when :get, :delete
31
31
  request.url(path, options)
@@ -35,7 +35,8 @@ module Strava
35
35
  end
36
36
  request.options.merge!(options.delete(:request)) if options.key?(:request)
37
37
  end
38
- response.body
38
+
39
+ Strava::Web::Response.new(http_response)
39
40
  end
40
41
  end
41
42
  end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Strava
4
+ module Web
5
+ #
6
+ # wrapper class as abstraction for API response returned from the Faraday Adapter
7
+ # working with a deep copy, in order to not mutate the original request itself
8
+ #
9
+ class Response
10
+ include Strava::DeepCopyable
11
+
12
+ attr_reader :http_response, :response
13
+
14
+ #
15
+ # @param [Faraday::Response] http_response
16
+ #
17
+ def initialize(http_response)
18
+ @http_response = deep_copy(http_response)
19
+ @response = conditional_response_upgrade!(http_response)
20
+ end
21
+
22
+ private
23
+
24
+ #
25
+ # returns a modified deep copy of the Faraday::Response
26
+ #
27
+ # @param [Faraday::Response] http_response
28
+ #
29
+ # @return [Array, Hash{String => any}]
30
+ #
31
+ def conditional_response_upgrade!(http_response)
32
+ response = deep_copy(http_response)
33
+
34
+ case response.body
35
+ when Array
36
+ upgrade_array_body!(response)
37
+ when Hash
38
+ response.body['http_response'] = response
39
+ else
40
+ response.body
41
+ end
42
+ end
43
+
44
+ #
45
+ # mutates the response when body is_a? Hash
46
+ #
47
+ # @param [Symbol] method_symbol
48
+ # @param [any] *args
49
+ # @param [Proc] &block
50
+ #
51
+ # @raise [NoMethodError]
52
+ # @return [any]
53
+ #
54
+ def operate_on_response_body!(method_symbol, *args, &block)
55
+ case @response.body
56
+ when Hash
57
+ @response.body.send(method_symbol, *args, &block)
58
+ else
59
+ raise NoMethodError
60
+ end
61
+ end
62
+
63
+ #
64
+ # mutates all responses in the body
65
+ #
66
+ # @param [Faraday::Response] response from the Strava API
67
+ #
68
+ # @return [Array<Faraday::Response>]
69
+ #
70
+ def upgrade_array_body!(response)
71
+ response.body.map! do |body_elem|
72
+ body_elem ||= {}
73
+ body_elem['http_response'] = response
74
+ body_elem
75
+ end
76
+ end
77
+
78
+ def method_missing(method_symbol, *args, &block)
79
+ case @response
80
+ when Array
81
+ @response.send(method_symbol, *args, &block)
82
+ else
83
+ operate_on_response_body!(method_symbol, *args, &block)
84
+ end
85
+ end
86
+
87
+ def respond_to_missing?(method_name, include_private = false)
88
+ super
89
+ end
90
+ end
91
+ end
92
+ end
@@ -3,7 +3,7 @@
3
3
  module Strava
4
4
  module Webhooks
5
5
  module Models
6
- class Subscription < Hashie::Trash
6
+ class Subscription < Strava::Models::Response
7
7
  property 'id'
8
8
  property 'application_id'
9
9
  property 'callback_url'
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'faraday'
4
- require 'faraday_middleware'
4
+ require 'faraday/multipart'
5
5
  require 'json'
6
6
  require 'logger'
7
7
  require 'hashie'
@@ -14,15 +14,18 @@ require 'active_support/concern'
14
14
 
15
15
  require_relative 'strava/version'
16
16
  require_relative 'strava/logger'
17
+ require_relative 'strava/deep_copyable'
17
18
 
18
19
  require_relative 'strava/errors/fault'
19
20
 
21
+ require_relative 'strava/models/mixins/http_response'
20
22
  require_relative 'strava/models/mixins/distance'
21
23
  require_relative 'strava/models/mixins/elevation'
22
24
  require_relative 'strava/models/mixins/time'
23
25
  require_relative 'strava/models/mixins/start_date_local'
24
26
 
25
27
  require_relative 'strava/models/model'
28
+ require_relative 'strava/models/response'
26
29
  require_relative 'strava/models/token'
27
30
  require_relative 'strava/models/athlete'
28
31
  require_relative 'strava/models/map'
@@ -54,19 +57,19 @@ require_relative 'strava/models/kudoser'
54
57
  require_relative 'strava/models/running_race'
55
58
  require_relative 'strava/models/achievement'
56
59
  require_relative 'strava/models/segment_stats'
57
- require_relative 'strava/models/segment_leaderboard'
58
- require_relative 'strava/models/segment_leaderboard_entry'
59
60
  require_relative 'strava/models/explorer_segment'
60
61
  require_relative 'strava/models/stream_set'
61
62
  require_relative 'strava/models/stream'
62
63
  require_relative 'strava/models/upload'
63
64
  require_relative 'strava/models/authorization'
64
65
 
65
- require_relative 'strava/web/raise_error'
66
+ require_relative 'strava/web/raise_response_error'
66
67
  require_relative 'strava/web/connection'
68
+ require_relative 'strava/web/api_response'
67
69
  require_relative 'strava/web/request'
68
70
  require_relative 'strava/web/config'
69
71
  require_relative 'strava/web/client'
72
+ require_relative 'strava/web/response'
70
73
 
71
74
  require_relative 'strava/oauth/config'
72
75
  require_relative 'strava/oauth/client'
@@ -79,6 +82,7 @@ require_relative 'strava/webhooks/models/event'
79
82
 
80
83
  require_relative 'strava/api/config'
81
84
  require_relative 'strava/api/cursor'
85
+ require_relative 'strava/api/ratelimit'
82
86
 
83
87
  require_relative 'strava/api/endpoints/activities'
84
88
  require_relative 'strava/api/endpoints/athletes'
@@ -92,4 +96,5 @@ require_relative 'strava/api/endpoints/streams'
92
96
  require_relative 'strava/api/endpoints/uploads'
93
97
  require_relative 'strava/api/endpoints/oauth'
94
98
 
99
+ require_relative 'strava/api/pagination'
95
100
  require_relative 'strava/api/client'
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: 0.4.3
4
+ version: 1.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: 2022-03-21 00:00:00.000000000 Z
11
+ date: 2022-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.0.0
33
+ version: '2.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.0.0
40
+ version: '2.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: faraday_middleware
42
+ name: faraday-multipart
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '1.0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '1.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: hashie
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +94,9 @@ files:
94
94
  - lib/strava/api/endpoints/segments.rb
95
95
  - lib/strava/api/endpoints/streams.rb
96
96
  - lib/strava/api/endpoints/uploads.rb
97
+ - lib/strava/api/pagination.rb
98
+ - lib/strava/api/ratelimit.rb
99
+ - lib/strava/deep_copyable.rb
97
100
  - lib/strava/errors/fault.rb
98
101
  - lib/strava/logger.rb
99
102
  - lib/strava/models/achievement.rb
@@ -116,18 +119,18 @@ files:
116
119
  - lib/strava/models/map.rb
117
120
  - lib/strava/models/mixins/distance.rb
118
121
  - lib/strava/models/mixins/elevation.rb
122
+ - lib/strava/models/mixins/http_response.rb
119
123
  - lib/strava/models/mixins/start_date_local.rb
120
124
  - lib/strava/models/mixins/time.rb
121
125
  - lib/strava/models/model.rb
122
126
  - lib/strava/models/photo.rb
123
127
  - lib/strava/models/photos.rb
124
128
  - lib/strava/models/power_zone_ranges.rb
129
+ - lib/strava/models/response.rb
125
130
  - lib/strava/models/route.rb
126
131
  - lib/strava/models/running_race.rb
127
132
  - lib/strava/models/segment.rb
128
133
  - lib/strava/models/segment_effort.rb
129
- - lib/strava/models/segment_leaderboard.rb
130
- - lib/strava/models/segment_leaderboard_entry.rb
131
134
  - lib/strava/models/segment_stats.rb
132
135
  - lib/strava/models/similar_activities.rb
133
136
  - lib/strava/models/split.rb
@@ -142,11 +145,13 @@ files:
142
145
  - lib/strava/oauth/client.rb
143
146
  - lib/strava/oauth/config.rb
144
147
  - lib/strava/version.rb
148
+ - lib/strava/web/api_response.rb
145
149
  - lib/strava/web/client.rb
146
150
  - lib/strava/web/config.rb
147
151
  - lib/strava/web/connection.rb
148
- - lib/strava/web/raise_error.rb
152
+ - lib/strava/web/raise_response_error.rb
149
153
  - lib/strava/web/request.rb
154
+ - lib/strava/web/response.rb
150
155
  - lib/strava/webhooks/client.rb
151
156
  - lib/strava/webhooks/config.rb
152
157
  - lib/strava/webhooks/models/challenge.rb
@@ -165,14 +170,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
165
170
  requirements:
166
171
  - - ">="
167
172
  - !ruby/object:Gem::Version
168
- version: '2.5'
173
+ version: '2.7'
169
174
  required_rubygems_version: !ruby/object:Gem::Requirement
170
175
  requirements:
171
176
  - - ">="
172
177
  - !ruby/object:Gem::Version
173
178
  version: 1.3.6
174
179
  requirements: []
175
- rubygems_version: 3.1.3
180
+ rubygems_version: 3.2.33
176
181
  signing_key:
177
182
  specification_version: 4
178
183
  summary: Strava API Ruby client.
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Strava
4
- module Models
5
- class SegmentLeaderboard < Model
6
- property 'effort_count'
7
- property 'entry_count'
8
- property 'kom_type'
9
- property 'entries', transform_with: ->(v) { v.map { |r| SegmentLeaderboardEntry.new(r) } }
10
- end
11
- end
12
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Strava
4
- module Models
5
- class SegmentLeaderboardEntry < Model
6
- include Mixins::Time
7
- include Mixins::StartDateLocal
8
-
9
- property 'athlete_name'
10
- property 'start_date', transform_with: ->(v) { Time.parse(v) }
11
- property 'rank'
12
- end
13
- end
14
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Strava
4
- module Web
5
- module Response
6
- class RaiseError < ::Faraday::Response::Middleware
7
- CLIENT_ERROR_STATUSES = (400...600).freeze
8
-
9
- def on_complete(env)
10
- case env[:status]
11
- when 404
12
- raise Faraday::ResourceNotFound, response_values(env)
13
- when 407
14
- # mimic the behavior that we get with proxy requests with HTTPS
15
- raise Faraday::ConnectionFailed, %(407 "Proxy Authentication Required ")
16
- when CLIENT_ERROR_STATUSES
17
- raise Strava::Errors::Fault, response_values(env)
18
- end
19
- end
20
-
21
- def response_values(env)
22
- {
23
- status: env.status,
24
- headers: env.response_headers,
25
- body: env.body
26
- }
27
- end
28
- end
29
- end
30
- end
31
- end