strava-ruby-client 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/README.md +176 -15
- data/bin/strava-oauth-token.rb +47 -0
- data/lib/strava-ruby-client.rb +22 -1
- data/lib/strava/api/client.rb +150 -3
- data/lib/strava/api/cursor.rb +29 -0
- data/lib/strava/models/activity.rb +90 -4
- data/lib/strava/models/activity_zone.rb +13 -0
- data/lib/strava/models/athlete.rb +8 -0
- data/lib/strava/models/club.rb +26 -0
- data/lib/strava/models/comment.rb +12 -0
- data/lib/strava/models/gear.rb +11 -0
- data/lib/strava/models/lap.rb +26 -0
- data/lib/strava/models/map.rb +1 -0
- data/lib/strava/models/mixins/distance.rb +73 -0
- data/lib/strava/models/mixins/elevation.rb +46 -0
- data/lib/strava/models/mixins/time.rb +99 -0
- data/lib/strava/models/photo.rb +10 -0
- data/lib/strava/models/photos.rb +9 -0
- data/lib/strava/models/segment.rb +33 -0
- data/lib/strava/models/segment_effort.rb +24 -0
- data/lib/strava/models/similar_activities.rb +17 -0
- data/lib/strava/models/split.rb +29 -0
- data/lib/strava/models/timed_zone_range.rb +9 -0
- data/lib/strava/models/trend.rb +12 -0
- data/lib/strava/version.rb +1 -1
- metadata +35 -47
- data/.gitignore +0 -6
- data/.rspec +0 -2
- data/.rubocop.yml +0 -15
- data/.rubocop_todo.yml +0 -47
- data/.travis.yml +0 -9
- data/CONTRIBUTING.md +0 -125
- data/Dangerfile +0 -2
- data/Gemfile +0 -15
- data/RELEASING.md +0 -61
- data/Rakefile +0 -17
- data/bin/oauth-token.rb +0 -28
- data/spec/fixtures/strava/client_athlete.yml +0 -59
- data/spec/fixtures/strava/client_athlete_activities.yml +0 -121
- data/spec/fixtures/strava/oauth_token_authorization_code.yml +0 -53
- data/spec/fixtures/strava/oauth_token_invalid_client.yml +0 -50
- data/spec/fixtures/strava/oauth_token_invalid_code.yml +0 -50
- data/spec/fixtures/strava/oauth_token_refresh_token.yml +0 -52
- data/spec/spec_helper.rb +0 -10
- data/spec/strava/api/client_spec.rb +0 -36
- data/spec/strava/api/config_spec.rb +0 -22
- data/spec/strava/oauth/client_spec.rb +0 -120
- data/spec/strava/oauth/config_spec.rb +0 -24
- data/spec/strava/version_spec.rb +0 -7
- data/spec/strava/web/client_spec.rb +0 -9
- data/spec/strava/web/config_spec.rb +0 -4
- data/spec/support/shared/it_behaves_like_web_client.rb +0 -131
- data/spec/support/vcr.rb +0 -12
- data/strava-ruby-client.gemspec +0 -21
@@ -1,52 +0,0 @@
|
|
1
|
-
---
|
2
|
-
http_interactions:
|
3
|
-
- request:
|
4
|
-
method: post
|
5
|
-
uri: https://www.strava.com/oauth/token
|
6
|
-
body:
|
7
|
-
encoding: UTF-8
|
8
|
-
string: client_id=24523&client_secret=client-secret&grant_type=refresh_token&refresh_token=refresh-token
|
9
|
-
headers:
|
10
|
-
Accept:
|
11
|
-
- application/json; charset=utf-8
|
12
|
-
User-Agent:
|
13
|
-
- Strava Ruby Client/0.1.0
|
14
|
-
Content-Type:
|
15
|
-
- application/x-www-form-urlencoded
|
16
|
-
Accept-Encoding:
|
17
|
-
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
-
response:
|
19
|
-
status:
|
20
|
-
code: 200
|
21
|
-
message: OK
|
22
|
-
headers:
|
23
|
-
Date:
|
24
|
-
- Thu, 22 Nov 2018 22:31:57 GMT
|
25
|
-
Content-Type:
|
26
|
-
- application/json; charset=UTF-8
|
27
|
-
Transfer-Encoding:
|
28
|
-
- chunked
|
29
|
-
Connection:
|
30
|
-
- keep-alive
|
31
|
-
Cache-Control:
|
32
|
-
- max-age=0, private, must-revalidate
|
33
|
-
Via:
|
34
|
-
- 1.1 linkerd
|
35
|
-
Status:
|
36
|
-
- 200 OK
|
37
|
-
X-Request-Id:
|
38
|
-
- df1c7766-41ac-44e5-b2a1-fc96486b2c7c
|
39
|
-
Etag:
|
40
|
-
- W/"0f3eb115bd7d2ef9718c83ece058e3f9"
|
41
|
-
X-Frame-Options:
|
42
|
-
- SAMEORIGIN,DENY
|
43
|
-
X-Content-Type-Options:
|
44
|
-
- nosniff
|
45
|
-
X-Xss-Protection:
|
46
|
-
- 1; mode=block
|
47
|
-
body:
|
48
|
-
encoding: ASCII-8BIT
|
49
|
-
string: '{"token_type":"Bearer","access_token":"new-access-token","expires_at":1542940199,"expires_in":14282,"refresh_token":"new-refresh-token"}'
|
50
|
-
http_version:
|
51
|
-
recorded_at: Thu, 22 Nov 2018 22:31:57 GMT
|
52
|
-
recorded_with: VCR 4.0.0
|
data/spec/spec_helper.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe Strava::Api::Client do
|
4
|
-
before do
|
5
|
-
Strava::Api::Config.reset
|
6
|
-
end
|
7
|
-
it_behaves_like 'web client'
|
8
|
-
context 'with a token' do
|
9
|
-
let(:client) { Strava::Api::Client.new(access_token: ENV['STRAVA_ACCESS_TOKEN'] || 'access-token') }
|
10
|
-
describe '#athlete', vcr: { cassette_name: 'client_athlete' } do
|
11
|
-
let(:athlete) { client.athlete }
|
12
|
-
it 'returns athlete' do
|
13
|
-
expect(athlete).to be_a Strava::Models::Athlete
|
14
|
-
expect(athlete.id).to eq 26_462_176
|
15
|
-
expect(athlete.created_at).to eq Time.parse('2017-11-28 19:05:35 UTC')
|
16
|
-
expect(athlete.updated_at).to eq Time.parse('2018-11-19 01:44:15 UTC')
|
17
|
-
expect(athlete.firstname).to eq 'Daniel'
|
18
|
-
expect(athlete.lastname).to eq 'Block'
|
19
|
-
expect(athlete.city).to eq 'New York'
|
20
|
-
expect(athlete.email).to eq 'dblock@example.com'
|
21
|
-
end
|
22
|
-
end
|
23
|
-
describe '#athlete_activities', vcr: { cassette_name: 'client_athlete_activities' } do
|
24
|
-
let(:athlete_activities) { client.athlete_activities }
|
25
|
-
it 'returns athlete activities' do
|
26
|
-
expect(athlete_activities).to be_a Enumerable
|
27
|
-
expect(athlete_activities.count).to eq 30
|
28
|
-
activity = athlete_activities.first
|
29
|
-
expect(activity.id).to eq 1_972_463_847
|
30
|
-
expect(activity.athlete).to be_a Strava::Models::Athlete
|
31
|
-
expect(activity.map).to be_a Strava::Models::Map
|
32
|
-
expect(activity.start_date).to be_a Time
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Strava::Api::Config do
|
4
|
-
before do
|
5
|
-
Strava::Api.config.reset
|
6
|
-
end
|
7
|
-
describe '#defaults' do
|
8
|
-
it 'sets endpoint' do
|
9
|
-
expect(Strava::Api.config.endpoint).to eq 'https://www.strava.com/api/v3'
|
10
|
-
end
|
11
|
-
end
|
12
|
-
describe '#configure' do
|
13
|
-
before do
|
14
|
-
Strava::Api.configure do |config|
|
15
|
-
config.endpoint = 'updated'
|
16
|
-
end
|
17
|
-
end
|
18
|
-
it 'sets endpoint' do
|
19
|
-
expect(Strava::Api.config.endpoint).to eq 'updated'
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,120 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe Strava::OAuth::Client do
|
4
|
-
before do
|
5
|
-
Strava::OAuth::Config.reset
|
6
|
-
end
|
7
|
-
it_behaves_like 'web client'
|
8
|
-
context 'with defaults' do
|
9
|
-
let(:client) { Strava::OAuth::Client.new }
|
10
|
-
describe '#initialize' do
|
11
|
-
it 'sets endpoint' do
|
12
|
-
expect(client.endpoint).to eq 'https://www.strava.com/oauth'
|
13
|
-
end
|
14
|
-
Strava::OAuth::Config::ATTRIBUTES.each do |key|
|
15
|
-
it "sets #{key}" do
|
16
|
-
expect(client.send(key)).to eq Strava::OAuth::Config.send(key)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
context '#authorize_url' do
|
20
|
-
it 'requires client id' do
|
21
|
-
expect { client.authorize_url }.to raise_error ArgumentError, 'Missing Strava client id.'
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
context 'with custom settings' do
|
27
|
-
describe '#initialize' do
|
28
|
-
Strava::OAuth::Config::ATTRIBUTES.each do |key|
|
29
|
-
context key do
|
30
|
-
let(:client) { Strava::OAuth::Client.new(key => 'custom') }
|
31
|
-
it "sets #{key}" do
|
32
|
-
expect(client.send(key)).to_not eq Strava::OAuth::Config.send(key)
|
33
|
-
expect(client.send(key)).to eq 'custom'
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
context 'global config' do
|
40
|
-
after do
|
41
|
-
Strava::OAuth::Client.config.reset
|
42
|
-
end
|
43
|
-
let(:client) { Strava::OAuth::Client.new }
|
44
|
-
context 'client id and secret' do
|
45
|
-
before do
|
46
|
-
Strava::OAuth::Client.configure do |config|
|
47
|
-
config.client_id = 'custom client id'
|
48
|
-
config.client_secret = 'custom client secret'
|
49
|
-
end
|
50
|
-
end
|
51
|
-
describe '#initialize' do
|
52
|
-
it 'sets client id and secret' do
|
53
|
-
expect(client.client_id).to eq 'custom client id'
|
54
|
-
expect(client.client_secret).to eq 'custom client secret'
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
context 'with a client id and secret' do
|
60
|
-
let(:client) { Strava::OAuth::Client.new(client_id: '12345', client_secret: 'client-secret') }
|
61
|
-
context '#authorize_url' do
|
62
|
-
it 'returns url' do
|
63
|
-
expect(client.authorize_url).to eq 'https://www.strava.com/oauth/authorize?approval_prompt=auto&client_id=12345&redirect_uri=http%3A%2F%2Flocalhost&response_type=code&scope=read'
|
64
|
-
end
|
65
|
-
it 'returns url with custom options' do
|
66
|
-
expect(
|
67
|
-
client.authorize_url(
|
68
|
-
redirect_uri: 'https://example.com/oauth',
|
69
|
-
approval_prompt: 'force',
|
70
|
-
response_type: 'code',
|
71
|
-
scope: 'activity:read_all',
|
72
|
-
state: 'magic'
|
73
|
-
)
|
74
|
-
).to eq 'https://www.strava.com/oauth/authorize?approval_prompt=force&client_id=12345&redirect_uri=https%3A%2F%2Fexample.com%2Foauth&response_type=code&scope=activity%3Aread_all&state=magic'
|
75
|
-
end
|
76
|
-
end
|
77
|
-
context '#oauth_token' do
|
78
|
-
it 'errors with an invalid client id', vcr: { cassette_name: 'oauth_token_invalid_client' } do
|
79
|
-
expect { client.oauth_token(code: 'code') }.to raise_error Strava::Errors::Fault do |e|
|
80
|
-
expect(e.message).to eq 'Bad Request'
|
81
|
-
expect(e.errors).to eq([{ 'code' => 'invalid', 'field' => 'client_id', 'resource' => 'Application' }])
|
82
|
-
end
|
83
|
-
end
|
84
|
-
it 'errors with an invalid code', vcr: { cassette_name: 'oauth_token_invalid_code' } do
|
85
|
-
expect { client.oauth_token(code: 'code') }.to raise_error Faraday::ClientError do |e|
|
86
|
-
expect(e.message).to eq 'Bad Request'
|
87
|
-
expect(e.errors).to eq([{ 'code' => 'invalid', 'field' => 'code', 'resource' => 'RequestToken' }])
|
88
|
-
end
|
89
|
-
end
|
90
|
-
it 'performs the initial token exchange', vcr: { cassette_name: 'oauth_token_authorization_code' } do
|
91
|
-
token = client.oauth_token(code: 'deadbeef585a6edb1f00309d3e1e0fec74973fb0')
|
92
|
-
expect(token).to be_a Strava::Models::Token
|
93
|
-
expect(token.access_token).to eq 'deadbeefd7ab44704fb2a146bd98c7a349a2b43d'
|
94
|
-
expect(token.refresh_token).to eq 'deadbeef9d64b225d0c50db4854a8d6c8757702d'
|
95
|
-
expect(token.token_type).to eq 'Bearer'
|
96
|
-
expect(token.expires_in).to eq 21_600
|
97
|
-
expect(token.expires_at).to eq Time.at(1_542_940_199)
|
98
|
-
athlete = token.athlete
|
99
|
-
expect(athlete).to be_a Strava::Models::Athlete
|
100
|
-
expect(athlete.updated_at).to eq Time.parse('2018-11-19 01:44:15 UTC')
|
101
|
-
expect(athlete.firstname).to eq 'Daniel'
|
102
|
-
expect(athlete.lastname).to eq 'Block'
|
103
|
-
expect(athlete.city).to eq 'New York'
|
104
|
-
end
|
105
|
-
it 'refreshes the token', vcr: { cassette_name: 'oauth_token_refresh_token' } do
|
106
|
-
token = client.oauth_token(
|
107
|
-
refresh_token: '8b15b6bb9d64a225d0c50db4854a8d6c8757702d',
|
108
|
-
grant_type: 'refresh_token'
|
109
|
-
)
|
110
|
-
expect(token).to be_a Strava::Models::Token
|
111
|
-
expect(token.access_token).to eq 'new-access-token'
|
112
|
-
expect(token.refresh_token).to eq 'new-refresh-token'
|
113
|
-
expect(token.token_type).to eq 'Bearer'
|
114
|
-
expect(token.expires_in).to eq 14_282
|
115
|
-
expect(token.expires_at).to eq Time.at(1_542_940_199)
|
116
|
-
expect(token.athlete).to be nil
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Strava::OAuth::Config do
|
4
|
-
describe '#defaults' do
|
5
|
-
it 'sets endpoint' do
|
6
|
-
expect(Strava::OAuth.config.endpoint).to eq 'https://www.strava.com/oauth'
|
7
|
-
expect(Strava::OAuth.config.client_id).to be nil
|
8
|
-
expect(Strava::OAuth.config.client_secret).to be nil
|
9
|
-
end
|
10
|
-
end
|
11
|
-
describe '#configure' do
|
12
|
-
before do
|
13
|
-
Strava::OAuth.configure do |config|
|
14
|
-
config.client_id = 'client id'
|
15
|
-
config.client_secret = 'client secret'
|
16
|
-
end
|
17
|
-
end
|
18
|
-
it 'sets client id and secret' do
|
19
|
-
expect(Strava::OAuth.config.endpoint).to eq 'https://www.strava.com/oauth'
|
20
|
-
expect(Strava::OAuth.config.client_id).to eq 'client id'
|
21
|
-
expect(Strava::OAuth.config.client_secret).to eq 'client secret'
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/spec/strava/version_spec.rb
DELETED
@@ -1,131 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.shared_examples 'web client' do
|
4
|
-
before do
|
5
|
-
described_class.config.reset
|
6
|
-
Strava::Web::Config.reset
|
7
|
-
end
|
8
|
-
context 'with defaults' do
|
9
|
-
let(:client) { described_class.new }
|
10
|
-
context '#initialize' do
|
11
|
-
it 'implements endpoint' do
|
12
|
-
expect(client.endpoint).to_not be nil
|
13
|
-
end
|
14
|
-
it 'includes default http configuration' do
|
15
|
-
expect(client.user_agent).to eq 'Strava Ruby Client/0.1.0'
|
16
|
-
end
|
17
|
-
it 'sets user-agent' do
|
18
|
-
expect(client.user_agent).to eq Strava::Web::Config.user_agent
|
19
|
-
expect(client.user_agent).to include Strava::VERSION
|
20
|
-
end
|
21
|
-
(Strava::Web::Config::ATTRIBUTES - [:logger]).each do |key|
|
22
|
-
it "sets #{key}" do
|
23
|
-
expect(client.send(key)).to eq Strava::Web::Config.send(key)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
context 'with custom settings' do
|
29
|
-
context '#initialize' do
|
30
|
-
Strava::Web::Config::ATTRIBUTES.each do |key|
|
31
|
-
context key.to_s do
|
32
|
-
let(:client) { described_class.new(key => 'custom') }
|
33
|
-
it "sets #{key}" do
|
34
|
-
expect(client.send(key)).to_not eq Strava::Web::Config.send(key)
|
35
|
-
expect(client.send(key)).to eq 'custom'
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
context 'global config' do
|
42
|
-
let(:client) { described_class.new }
|
43
|
-
context 'user-agent' do
|
44
|
-
before do
|
45
|
-
Strava::Web::Client.configure do |config|
|
46
|
-
config.user_agent = 'custom/user-agent'
|
47
|
-
end
|
48
|
-
end
|
49
|
-
context '#initialize' do
|
50
|
-
it 'sets user-agent' do
|
51
|
-
expect(client.user_agent).to eq 'custom/user-agent'
|
52
|
-
end
|
53
|
-
it 'creates a connection with the custom user-agent' do
|
54
|
-
expect(client.send(:connection).headers).to include(
|
55
|
-
'Accept' => 'application/json; charset=utf-8',
|
56
|
-
'User-Agent' => 'custom/user-agent'
|
57
|
-
)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
context 'proxy' do
|
62
|
-
before do
|
63
|
-
Strava::Web::Client.configure do |config|
|
64
|
-
config.proxy = 'http://localhost:8080'
|
65
|
-
end
|
66
|
-
end
|
67
|
-
context '#initialize' do
|
68
|
-
it 'sets proxy' do
|
69
|
-
expect(client.proxy).to eq 'http://localhost:8080'
|
70
|
-
end
|
71
|
-
it 'creates a connection with the proxy' do
|
72
|
-
expect(client.send(:connection).proxy.uri.to_s).to eq 'http://localhost:8080'
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
context 'SSL options' do
|
77
|
-
before do
|
78
|
-
Strava::Web::Client.configure do |config|
|
79
|
-
config.ca_path = '/ca_path'
|
80
|
-
config.ca_file = '/ca_file'
|
81
|
-
end
|
82
|
-
end
|
83
|
-
context '#initialize' do
|
84
|
-
it 'sets ca_path and ca_file' do
|
85
|
-
expect(client.ca_path).to eq '/ca_path'
|
86
|
-
expect(client.ca_file).to eq '/ca_file'
|
87
|
-
end
|
88
|
-
it 'creates a connection with ssl options' do
|
89
|
-
ssl = client.send(:connection).ssl
|
90
|
-
expect(ssl.ca_path).to eq '/ca_path'
|
91
|
-
expect(ssl.ca_file).to eq '/ca_file'
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
context 'logger option' do
|
96
|
-
let(:logger) { Logger.new(STDOUT) }
|
97
|
-
before do
|
98
|
-
Strava::Web::Client.configure do |config|
|
99
|
-
config.logger = logger
|
100
|
-
end
|
101
|
-
end
|
102
|
-
context '#initialize' do
|
103
|
-
it 'sets logger' do
|
104
|
-
expect(client.logger).to eq logger
|
105
|
-
end
|
106
|
-
it 'creates a connection with a logger' do
|
107
|
-
expect(client.send(:connection).builder.handlers).to include ::Faraday::Response::Logger
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
context 'timeout options' do
|
112
|
-
before do
|
113
|
-
Strava::Web::Client.configure do |config|
|
114
|
-
config.timeout = 10
|
115
|
-
config.open_timeout = 15
|
116
|
-
end
|
117
|
-
end
|
118
|
-
context '#initialize' do
|
119
|
-
it 'sets timeout and open_timeout' do
|
120
|
-
expect(client.timeout).to eq 10
|
121
|
-
expect(client.open_timeout).to eq 15
|
122
|
-
end
|
123
|
-
it 'creates a connection with timeout options' do
|
124
|
-
conn = client.send(:connection)
|
125
|
-
expect(conn.options.timeout).to eq 10
|
126
|
-
expect(conn.options.open_timeout).to eq 15
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
data/spec/support/vcr.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
require 'vcr'
|
2
|
-
require 'webmock/rspec'
|
3
|
-
|
4
|
-
VCR.configure do |config|
|
5
|
-
config.cassette_library_dir = 'spec/fixtures/strava'
|
6
|
-
config.hook_into :webmock
|
7
|
-
config.default_cassette_options = { record: :new_episodes }
|
8
|
-
config.configure_rspec_metadata!
|
9
|
-
config.before_record do |i|
|
10
|
-
i.response.body.force_encoding('UTF-8')
|
11
|
-
end
|
12
|
-
end
|
data/strava-ruby-client.gemspec
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
$LOAD_PATH.push File.expand_path('lib', __dir__)
|
2
|
-
require 'strava/version'
|
3
|
-
|
4
|
-
Gem::Specification.new do |s|
|
5
|
-
s.name = 'strava-ruby-client'
|
6
|
-
s.bindir = 'bin'
|
7
|
-
s.version = Strava::VERSION
|
8
|
-
s.authors = ['Daniel Doubrovkine']
|
9
|
-
s.email = 'dblock@dblock.org'
|
10
|
-
s.platform = Gem::Platform::RUBY
|
11
|
-
s.required_rubygems_version = '>= 1.3.6'
|
12
|
-
s.files = `git ls-files`.split("\n")
|
13
|
-
s.test_files = `git ls-files -- spec/*`.split("\n")
|
14
|
-
s.require_paths = ['lib']
|
15
|
-
s.homepage = 'http://github.com/dblock/strava-ruby-client'
|
16
|
-
s.licenses = ['MIT']
|
17
|
-
s.summary = 'Strava API Ruby client.'
|
18
|
-
s.add_dependency 'faraday', '>= 0.9'
|
19
|
-
s.add_dependency 'faraday_middleware'
|
20
|
-
s.add_dependency 'hashie'
|
21
|
-
end
|