etcdv3 0.0.5 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -1
- data/README.md +45 -20
- data/lib/etcdv3/auth.rb +24 -35
- data/lib/etcdv3/kv.rb +6 -6
- data/lib/etcdv3/version.rb +1 -1
- data/lib/etcdv3.rb +36 -13
- data/spec/etcdv3/auth_spec.rb +66 -26
- data/spec/etcdv3/kv_spec.rb +7 -9
- metadata +2 -4
- data/.codeclimate.yml +0 -27
- data/.ruby-version +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a62664451e058e0837e78b5ea583944532f596e
|
4
|
+
data.tar.gz: df7954ad160f76a260d297a8c13357f50ef15474
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af31ea39606da03fed56cbfb723d1958feaec6507c1f13ee60dba9ab9c870bcdeaead2cec21ea79ea373a3eb9a4ece179684a3a9688ab86d659cfe9918b4fc8e
|
7
|
+
data.tar.gz: 1037364a45050545ab05b6dca88661fe9ecd6d6824a29ef9fcfe53abcd8a55044550f89a4e407708c558fbd57fe865735adc78349f57001238c1ae6527e185de
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Ruby client for Etcd V3
|
4
4
|
|
5
|
-
**
|
5
|
+
**Note: This is under active development and is not feature complete**
|
6
6
|
|
7
7
|
## Getting Started
|
8
8
|
|
@@ -11,7 +11,7 @@ To install etcdv3, run the following command:
|
|
11
11
|
gem install etcdv3
|
12
12
|
```
|
13
13
|
|
14
|
-
|
14
|
+
**Establishing a connection**
|
15
15
|
|
16
16
|
```
|
17
17
|
require 'etcdv3'
|
@@ -34,28 +34,53 @@ conn = Etcd.new(url: 'https://hostname:port', user: "gary", password: "secret")
|
|
34
34
|
# Put
|
35
35
|
conn.put("my", "value")
|
36
36
|
|
37
|
-
#
|
38
|
-
conn.
|
37
|
+
# Get
|
38
|
+
conn.get("my")
|
39
39
|
|
40
|
-
|
40
|
+
# Get Key Range
|
41
|
+
conn.get('my', 'myyyy')
|
41
42
|
|
42
|
-
|
43
|
-
|
43
|
+
**User Management**
|
44
|
+
```
|
45
|
+
# Add User
|
46
|
+
conn.add_user('admin', 'secret')
|
47
|
+
|
48
|
+
# Delete User
|
49
|
+
conn.delete_user('admin')
|
44
50
|
|
45
|
-
|
46
|
-
|
51
|
+
# List users
|
52
|
+
conn.user_list
|
53
|
+
```
|
47
54
|
|
48
|
-
|
49
|
-
|
55
|
+
**Role Management**
|
56
|
+
```
|
57
|
+
# Add Role
|
58
|
+
conn.add_role('rolename', 'readwrite', 'a', 'Z')
|
50
59
|
|
51
|
-
|
52
|
-
|
60
|
+
# Delete Role
|
61
|
+
conn.delete_role('rolename')
|
53
62
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
63
|
+
# List Roles
|
64
|
+
conn.role_list
|
65
|
+
```
|
66
|
+
|
67
|
+
**Authentication Management**
|
68
|
+
```
|
69
|
+
# Configure a root user
|
70
|
+
conn.add_user('root', 'mysecretpassword')
|
58
71
|
|
59
|
-
|
60
|
-
|
61
|
-
|
72
|
+
# Grant root user the root role
|
73
|
+
conn.grant_role_to_user('root', 'root')
|
74
|
+
|
75
|
+
# Enable Authentication
|
76
|
+
conn.enable_auth
|
77
|
+
```
|
78
|
+
After you enable authentication, you must authenticate.
|
79
|
+
```
|
80
|
+
# This will generate and assign an auth token that will be used in future requests.
|
81
|
+
conn.authenticate('root', 'mysecretpassword')
|
82
|
+
```
|
83
|
+
Disabling auth will clear the auth token and all previously attached user information
|
84
|
+
```
|
85
|
+
conn.disable_auth
|
86
|
+
```
|
data/lib/etcdv3/auth.rb
CHANGED
@@ -8,8 +8,9 @@ class Etcd
|
|
8
8
|
'readwrite' => Authpb::Permission::Type::READWRITE
|
9
9
|
}
|
10
10
|
|
11
|
-
def initialize(hostname, port, credentials)
|
11
|
+
def initialize(hostname, port, credentials, metadata = {})
|
12
12
|
@stub = Etcdserverpb::Auth::Stub.new("#{hostname}:#{port}", credentials)
|
13
|
+
@metadata = metadata
|
13
14
|
end
|
14
15
|
|
15
16
|
def generate_token(user, password)
|
@@ -19,69 +20,57 @@ class Etcd
|
|
19
20
|
response.token
|
20
21
|
rescue GRPC::FailedPrecondition => exception
|
21
22
|
puts exception.message
|
23
|
+
false
|
22
24
|
end
|
23
25
|
|
24
|
-
def user_list
|
25
|
-
@stub.user_list(Authpb::User.new, metadata: metadata).users
|
26
|
-
rescue GRPC::FailedPrecondition => exception
|
27
|
-
puts exception.message
|
26
|
+
def user_list
|
27
|
+
@stub.user_list(Authpb::User.new, metadata: @metadata).users
|
28
28
|
end
|
29
29
|
|
30
|
-
def add_user(user, password
|
30
|
+
def add_user(user, password)
|
31
31
|
@stub.user_add(
|
32
|
-
Authpb::User.new(name: user, password: password), metadata: metadata
|
32
|
+
Authpb::User.new(name: user, password: password), metadata: @metadata
|
33
33
|
)
|
34
|
-
rescue GRPC::FailedPrecondition => exception
|
35
|
-
puts exception.message
|
36
34
|
end
|
37
35
|
|
38
|
-
def delete_user(user
|
39
|
-
@stub.user_delete(Authpb::User.new(name: user)
|
40
|
-
rescue GRPC::FailedPrecondition => exception
|
41
|
-
puts exception.message
|
36
|
+
def delete_user(user)
|
37
|
+
@stub.user_delete(Authpb::User.new(name: user))
|
42
38
|
end
|
43
39
|
|
44
|
-
def add_role(name, permission, key, range_end
|
40
|
+
def add_role(name, permission, key, range_end)
|
45
41
|
permission = Authpb::Permission.new(
|
46
42
|
permType: Etcd::Auth::PERMISSIONS[permission], key: key, range_end: range_end
|
47
43
|
)
|
48
44
|
@stub.role_add(
|
49
45
|
Authpb::Role.new(name: name, keyPermission: [permission]),
|
50
|
-
metadata: metadata
|
46
|
+
metadata: @metadata
|
51
47
|
)
|
52
|
-
rescue GRPC::FailedPrecondition => exception
|
53
|
-
puts exception.message
|
54
48
|
end
|
55
49
|
|
56
|
-
def delete_role(name
|
57
|
-
@stub.role_delete(Authpb::Role.new(name: name), metadata: metadata)
|
58
|
-
rescue GRPC::FailedPrecondition => exception
|
59
|
-
puts exception.message
|
50
|
+
def delete_role(name)
|
51
|
+
@stub.role_delete(Authpb::Role.new(name: name), metadata: @metadata)
|
60
52
|
end
|
61
53
|
|
62
|
-
def grant_role_to_user(user, role
|
54
|
+
def grant_role_to_user(user, role)
|
63
55
|
request = Etcdserverpb::AuthUserGrantRoleRequest.new(user: user, role: role)
|
64
|
-
@stub.user_grant_role(request)
|
65
|
-
rescue GRPC::FailedPrecondition => exception
|
66
|
-
puts exception.message
|
56
|
+
@stub.user_grant_role(request, metadata: @metadata)
|
67
57
|
end
|
68
58
|
|
69
|
-
def
|
70
|
-
|
71
|
-
|
72
|
-
|
59
|
+
def revoke_role_from_user(user, role)
|
60
|
+
request = Etcdserverpb::AuthUserRevokeRoleRequest.new(name: user, role: role)
|
61
|
+
@stub.user_revoke_role(request, metadata: @metadata)
|
62
|
+
end
|
63
|
+
|
64
|
+
def role_list
|
65
|
+
@stub.role_list(Authpb::Role.new, metadata: @metadata)
|
73
66
|
end
|
74
67
|
|
75
68
|
def enable_auth
|
76
69
|
@stub.auth_enable(Authpb::User.new)
|
77
|
-
rescue GRPC::FailedPrecondition => exception
|
78
|
-
puts exception.message
|
79
70
|
end
|
80
71
|
|
81
|
-
def disable_auth
|
82
|
-
@stub.auth_disable(Authpb::User.new, metadata: metadata)
|
83
|
-
rescue GRPC::FailedPrecondition => exception
|
84
|
-
puts exception.message
|
72
|
+
def disable_auth
|
73
|
+
@stub.auth_disable(Authpb::User.new, metadata: @metadata)
|
85
74
|
end
|
86
75
|
|
87
76
|
end
|
data/lib/etcdv3/kv.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
|
2
2
|
class Etcd
|
3
3
|
class KV
|
4
|
-
def initialize(hostname, port, credentials)
|
4
|
+
def initialize(hostname, port, credentials, metadata={})
|
5
5
|
@stub = Etcdserverpb::KV::Stub.new("#{hostname}:#{port}", credentials)
|
6
|
+
@metadata = metadata
|
6
7
|
end
|
7
8
|
|
8
|
-
def put(key, value
|
9
|
+
def put(key, value)
|
9
10
|
kv = Etcdserverpb::PutRequest.new(key: key, value: value)
|
10
|
-
@stub.put(kv, metadata: metadata)
|
11
|
+
@stub.put(kv, metadata: @metadata)
|
11
12
|
end
|
12
13
|
|
13
|
-
def
|
14
|
+
def get(key, range_end="")
|
14
15
|
kv = Etcdserverpb::RangeRequest.new(key: key, range_end: range_end)
|
15
|
-
|
16
|
-
result.kvs
|
16
|
+
@stub.range(kv, metadata: @metadata).kvs
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
data/lib/etcdv3/version.rb
CHANGED
data/lib/etcdv3.rb
CHANGED
@@ -46,39 +46,56 @@ class Etcd
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def put(key, value)
|
49
|
-
kv.put(key, value
|
49
|
+
kv.put(key, value)
|
50
50
|
end
|
51
51
|
|
52
|
-
def
|
53
|
-
kv.
|
52
|
+
def get(key, range_end='')
|
53
|
+
kv.get(key, range_end)
|
54
54
|
end
|
55
55
|
|
56
56
|
def add_user(user, password)
|
57
|
-
auth.add_user(user, password
|
57
|
+
auth.add_user(user, password)
|
58
58
|
end
|
59
59
|
|
60
60
|
def delete_user(user)
|
61
|
-
auth.delete_user(user
|
61
|
+
auth.delete_user(user)
|
62
62
|
end
|
63
63
|
|
64
64
|
def user_list
|
65
|
-
auth.user_list
|
65
|
+
auth.user_list
|
66
|
+
end
|
67
|
+
|
68
|
+
def authenticate(user, password)
|
69
|
+
token = auth.generate_token(user, password)
|
70
|
+
if token
|
71
|
+
@metadata[:token] = token
|
72
|
+
@options[:user] = user
|
73
|
+
@options[:password] = password
|
74
|
+
return true
|
75
|
+
end
|
76
|
+
rescue GRPC::InvalidArgument => exception
|
77
|
+
print exception.message
|
78
|
+
return false
|
66
79
|
end
|
67
80
|
|
68
81
|
def role_list
|
69
|
-
auth.role_list
|
82
|
+
auth.role_list
|
70
83
|
end
|
71
84
|
|
72
85
|
def add_role(name, permission, key, range_end='')
|
73
|
-
auth.add_role(name, permission, key, range_end
|
86
|
+
auth.add_role(name, permission, key, range_end)
|
74
87
|
end
|
75
88
|
|
76
89
|
def delete_role(name)
|
77
|
-
auth.delete_role(name
|
90
|
+
auth.delete_role(name)
|
78
91
|
end
|
79
92
|
|
80
93
|
def grant_role_to_user(user, role)
|
81
|
-
auth.grant_role_to_user(user, role
|
94
|
+
auth.grant_role_to_user(user, role)
|
95
|
+
end
|
96
|
+
|
97
|
+
def revoke_role_from_user(user, role)
|
98
|
+
auth.revoke_role_from_user(user, role)
|
82
99
|
end
|
83
100
|
|
84
101
|
def enable_auth
|
@@ -86,17 +103,23 @@ class Etcd
|
|
86
103
|
end
|
87
104
|
|
88
105
|
def disable_auth
|
89
|
-
auth.disable_auth
|
106
|
+
response = auth.disable_auth
|
107
|
+
if response
|
108
|
+
@metadata.delete(:token)
|
109
|
+
@options[:user] = nil
|
110
|
+
@options[:password] = nil
|
111
|
+
end
|
112
|
+
response
|
90
113
|
end
|
91
114
|
|
92
115
|
private
|
93
116
|
|
94
117
|
def auth
|
95
|
-
Etcd::Auth.new(hostname, port, @credentials)
|
118
|
+
Etcd::Auth.new(hostname, port, @credentials, @metadata)
|
96
119
|
end
|
97
120
|
|
98
121
|
def kv
|
99
|
-
Etcd::KV.new(hostname, port, @credentials)
|
122
|
+
Etcd::KV.new(hostname, port, @credentials, @metadata)
|
100
123
|
end
|
101
124
|
|
102
125
|
def resolve_credentials
|
data/spec/etcdv3/auth_spec.rb
CHANGED
@@ -2,13 +2,13 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Etcd::Auth do
|
4
4
|
|
5
|
-
let(:
|
6
|
-
Etcd
|
5
|
+
let(:conn) do
|
6
|
+
Etcd.new(url: 'http://127.0.0.1:2379')
|
7
7
|
end
|
8
8
|
|
9
9
|
describe '#add_user' do
|
10
10
|
it 'returns AuthUserAddResponse' do
|
11
|
-
expect(
|
11
|
+
expect(conn.add_user("boom", 'test')).to \
|
12
12
|
be_an_instance_of(Etcdserverpb::AuthUserAddResponse)
|
13
13
|
end
|
14
14
|
end
|
@@ -16,88 +16,128 @@ describe Etcd::Auth do
|
|
16
16
|
describe '#user_list' do
|
17
17
|
|
18
18
|
it 'returns Protobuf' do
|
19
|
-
expect(
|
19
|
+
expect(conn.user_list).to \
|
20
20
|
be_an_instance_of(Google::Protobuf::RepeatedField)
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'returns listme user' do
|
24
|
-
|
25
|
-
expect(
|
24
|
+
conn.add_user('listme', 'test')
|
25
|
+
expect(conn.user_list).to include('listme')
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
describe '#delete_user' do
|
30
30
|
before do
|
31
|
-
|
31
|
+
conn.add_user('testuser', 'test')
|
32
32
|
end
|
33
33
|
it 'returns AuthUserDeleteResponse' do
|
34
|
-
expect(
|
34
|
+
expect(conn.delete_user('testuser')).to \
|
35
35
|
be_an_instance_of(Etcdserverpb::AuthUserDeleteResponse)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
describe '#grant_role_to_user' do
|
40
40
|
before do
|
41
|
-
|
41
|
+
conn.add_user('root', 'password')
|
42
42
|
end
|
43
43
|
after do
|
44
|
-
|
44
|
+
conn.delete_user('root')
|
45
45
|
end
|
46
46
|
it 'returns AuthUserGrantRoleResponse' do
|
47
|
-
expect(
|
47
|
+
expect(conn.grant_role_to_user("root", 'root')).to \
|
48
48
|
be_an_instance_of(Etcdserverpb::AuthUserGrantRoleResponse)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
describe '#revoke_role_from_user' do
|
53
|
+
before do
|
54
|
+
conn.add_user('test_user', 'password')
|
55
|
+
conn.grant_role_to_user('test_user', 'root')
|
56
|
+
end
|
57
|
+
after do
|
58
|
+
conn.delete_user('test_user')
|
59
|
+
end
|
60
|
+
it 'returns AuthUserGrantRoleResponse' do
|
61
|
+
expect(conn.revoke_role_from_user("test_user", 'root')).to \
|
62
|
+
be_an_instance_of(Etcdserverpb::AuthUserRevokeRoleResponse)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
52
66
|
describe '#add_role' do
|
53
67
|
it 'returns AuthRoleAddResponse' do
|
54
|
-
expect(
|
68
|
+
expect(conn.add_role('testRole', 'readwrite', 'a', 'Z')).to \
|
55
69
|
be_an_instance_of(Etcdserverpb::AuthRoleAddResponse)
|
56
70
|
end
|
57
71
|
end
|
58
72
|
|
59
73
|
describe '#add_delete' do
|
60
74
|
it 'returns AuthRoleAddResponse' do
|
61
|
-
expect(
|
75
|
+
expect(conn.delete_role('testRole')).to \
|
62
76
|
be_an_instance_of(Etcdserverpb::AuthRoleDeleteResponse)
|
63
77
|
end
|
64
78
|
end
|
65
79
|
|
66
80
|
describe '#role_list' do
|
67
81
|
it 'returns AuthRoleListResponse' do
|
68
|
-
expect(
|
82
|
+
expect(conn.role_list).to \
|
69
83
|
be_an_instance_of(Etcdserverpb::AuthRoleListResponse)
|
70
84
|
end
|
71
85
|
end
|
72
86
|
|
73
87
|
describe '#disable_auth' do
|
74
88
|
before do
|
75
|
-
|
76
|
-
|
77
|
-
|
89
|
+
conn.add_user('root', 'test')
|
90
|
+
conn.grant_role_to_user('root', 'root')
|
91
|
+
conn.enable_auth
|
92
|
+
conn.authenticate('root', 'test')
|
78
93
|
end
|
79
94
|
after do
|
80
|
-
|
95
|
+
conn.delete_user('root')
|
81
96
|
end
|
82
97
|
it 'returns AuthDisableResponse' do
|
83
|
-
|
84
|
-
expect(stub.disable_auth(token: token)).to \
|
98
|
+
expect(conn.disable_auth).to \
|
85
99
|
be_an_instance_of(Etcdserverpb::AuthDisableResponse)
|
86
100
|
end
|
87
101
|
end
|
88
102
|
|
89
103
|
describe '#enable_auth' do
|
90
104
|
before do
|
91
|
-
|
92
|
-
|
105
|
+
conn.add_user('root', 'test')
|
106
|
+
conn.grant_role_to_user('root', 'root')
|
93
107
|
end
|
94
108
|
after do
|
95
|
-
|
96
|
-
|
97
|
-
|
109
|
+
conn.authenticate('root', 'test')
|
110
|
+
conn.disable_auth
|
111
|
+
conn.delete_user('root')
|
98
112
|
end
|
99
113
|
it 'returns AuthEnableResponse' do
|
100
|
-
expect(
|
114
|
+
expect(conn.enable_auth).to be_an_instance_of(Etcdserverpb::AuthEnableResponse)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "#authenticate" do
|
119
|
+
context "auth enabled" do
|
120
|
+
before do
|
121
|
+
conn.add_user('root', 'test')
|
122
|
+
conn.grant_role_to_user('root', 'root')
|
123
|
+
conn.enable_auth
|
124
|
+
conn.authenticate('root', 'test')
|
125
|
+
end
|
126
|
+
after do
|
127
|
+
conn.disable_auth
|
128
|
+
conn.delete_user('root')
|
129
|
+
end
|
130
|
+
it 'properly reconfigures token + user + password' do
|
131
|
+
expect(conn.token).to_not be_nil
|
132
|
+
expect(conn.user).to eq('root')
|
133
|
+
expect(conn.password).to eq('test')
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
context 'auth disabled' do
|
138
|
+
it 'returns false when authenticating with auth disabled' do
|
139
|
+
expect(conn.authenticate('root', 'root')).to eq(false)
|
140
|
+
end
|
101
141
|
end
|
102
142
|
end
|
103
143
|
end
|
data/spec/etcdv3/kv_spec.rb
CHANGED
@@ -2,30 +2,28 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Etcd::KV do
|
4
4
|
|
5
|
-
let(:
|
6
|
-
Etcd
|
5
|
+
let(:conn) do
|
6
|
+
Etcd.new(url: 'http://127.0.0.1:2379')
|
7
7
|
end
|
8
8
|
|
9
9
|
describe '#put' do
|
10
10
|
it 'returns PutResponse' do
|
11
|
-
expect(
|
11
|
+
expect(conn.put('test', 'test')).to \
|
12
12
|
be_an_instance_of(Etcdserverpb::PutResponse)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
describe '#
|
16
|
+
describe '#get' do
|
17
17
|
before do
|
18
|
-
|
18
|
+
conn.put('test', "zoom")
|
19
19
|
end
|
20
20
|
it 'returns protobuf' do
|
21
|
-
expect(
|
21
|
+
expect(conn.get('test')).to \
|
22
22
|
be_an_instance_of(Google::Protobuf::RepeatedField)
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'returns correct result' do
|
26
|
-
expect(
|
26
|
+
expect(conn.get('test').first.key).to eq('test')
|
27
27
|
end
|
28
28
|
end
|
29
|
-
|
30
|
-
|
31
29
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: etcdv3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shaun Davis
|
@@ -44,10 +44,8 @@ executables: []
|
|
44
44
|
extensions: []
|
45
45
|
extra_rdoc_files: []
|
46
46
|
files:
|
47
|
-
- ".codeclimate.yml"
|
48
47
|
- ".gitignore"
|
49
48
|
- ".rspec"
|
50
|
-
- ".ruby-version"
|
51
49
|
- ".travis.yml"
|
52
50
|
- Gemfile
|
53
51
|
- README.md
|
@@ -92,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
90
|
version: '0'
|
93
91
|
requirements: []
|
94
92
|
rubyforge_project:
|
95
|
-
rubygems_version: 2.6.
|
93
|
+
rubygems_version: 2.6.8
|
96
94
|
signing_key:
|
97
95
|
specification_version: 4
|
98
96
|
summary: A Etcd client library for Version 3
|
data/.codeclimate.yml
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
engines:
|
2
|
-
duplication:
|
3
|
-
enabled: true
|
4
|
-
config:
|
5
|
-
languages:
|
6
|
-
- ruby
|
7
|
-
fixme:
|
8
|
-
enabled: true
|
9
|
-
rubocop:
|
10
|
-
enabled: true
|
11
|
-
ratings:
|
12
|
-
paths:
|
13
|
-
- "**.rb"
|
14
|
-
exclude_paths:
|
15
|
-
- spec/
|
16
|
-
engines:
|
17
|
-
rubocop:
|
18
|
-
enabled: true
|
19
|
-
duplication:
|
20
|
-
enabled: true
|
21
|
-
ratings:
|
22
|
-
paths:
|
23
|
-
- lib/**
|
24
|
-
- "**.rb"
|
25
|
-
exclude_paths:
|
26
|
-
- "lib/etcdv3/protos/*"
|
27
|
-
- "lib/etcdv3/etcdrpc/*"
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.4.1
|