etcdv3 0.0.4 → 0.0.5

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
  SHA1:
3
- metadata.gz: b63b789cf1ebf2e909c4818190278aed694886f5
4
- data.tar.gz: d806b91ce19db3ee0c79d2c82e33648805f7de94
3
+ metadata.gz: 4e8425d9e034d0a1bab9cc37a5250694854807e8
4
+ data.tar.gz: b49869fe7b0fa100faccc29dd9d06806753c6a5d
5
5
  SHA512:
6
- metadata.gz: 2538de053cd4757926e2f3dd542c0cbeaa8d8709917f56e534a708bd2f0928e534784940b61b42dfd0176e9ba0b3ff39534969799bcdfe7960669233fb3c8ea3
7
- data.tar.gz: 325d9d8fa4692b1dfd57ae332ecb6e345519dc5ae400f57e4a502036c6f0a90903cdd2d60bd5ca597a36b8d0e1836f466fbf4f5551b73d78faf0c7c2561cb257
6
+ metadata.gz: '073189ecdbaa0c0719731731a4d2d05a0db0271855e7777f1c35d775d1196ea57554aa2cd8eaca7951e1a329dcf476d80f2024ee1aabe0ae540afe5ef024f5f7'
7
+ data.tar.gz: 0bdc23ddadaebb5827e3a241e5f7d7ec4a536d32196f1c1e64bbc3991433cd81fdbd05f664ea5cd1e776bede027b65da78754f1f1e8604a40295e63cdc83b920
data/.codeclimate.yml ADDED
@@ -0,0 +1,27 @@
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/.gitignore CHANGED
@@ -1,2 +1,8 @@
1
1
  Gemfile.lock
2
2
  *.sh
3
+ *.gem
4
+ /tmp/
5
+ /.idea
6
+ /coverage/*
7
+ /doc/
8
+ *.swp
data/.travis.yml ADDED
@@ -0,0 +1,14 @@
1
+ language: ruby
2
+ python: 2.4
3
+
4
+ env:
5
+ global:
6
+ - ETCD_VERSION=v3.1.4
7
+
8
+ install:
9
+ - bundle install
10
+ - wget https://github.com/coreos/etcd/releases/download/$ETCD_VERSION/etcd-$ETCD_VERSION-linux-amd64.tar.gz -O etcd.tar.gz --no-check-certificate
11
+ - tar zxvf etcd.tar.gz
12
+ - export PATH=$PATH:etcd-$ETCD_VERSION-linux-amd64
13
+
14
+ script: bundle exec rspec
data/README.md CHANGED
@@ -1,36 +1,61 @@
1
- # etcdv3-ruby
1
+ # etcdv3-ruby [![Build Status](https://travis-ci.org/davissp14/etcdv3-ruby.svg?branch=master)](https://travis-ci.org/davissp14/etcdv3-ruby)
2
2
 
3
3
  Ruby client for Etcd V3
4
4
 
5
5
  **WARNING: This is very much a work in progress and should be considered unstable.**
6
6
 
7
- ## Usage
7
+ ## Getting Started
8
8
 
9
- # Initialize insecure Client
10
- conn = Etcd.new(url: 'http://127.0.0.1:2379')
9
+ To install etcdv3, run the following command:
10
+ ```
11
+ gem install etcdv3
12
+ ```
11
13
 
12
- # Initialize secure connection using default certificates
13
- conn = Etcd.new(url: 'https://hostname:port')
14
+ You can connect to Etcd by instantiating the Etcd class:
14
15
 
15
- # Initialize secure connection with auth
16
- conn = Etcd.new(url: 'https://hostname:port', user: "gary", password: "secret")
16
+ ```
17
+ require 'etcdv3'
18
+
19
+ # Insecure connection
20
+ conn = Etcd.new(url: 'http://127.0.0.1:2379')
21
+
22
+ # Secure connection using default certificates
23
+ conn = Etcd.new(url: 'https://hostname:port')
24
+
25
+ # Secure connection with Auth
26
+ conn = Etcd.new(url: 'https://hostname:port', user: "gary", password: "secret")
27
+
28
+ # Secure connection specifying own certificates
29
+ # Coming soon...
30
+ ```
17
31
 
18
32
  **Adding and Fetching Keys**
19
-
33
+
20
34
  # Put
21
35
  conn.put("my", "value")
22
36
 
23
37
  # Range
24
38
  conn.range("my")
25
-
39
+
26
40
  **User Managment**
27
-
41
+
28
42
  # Add User
29
43
  conn.add_user('admin', 'secret')
30
-
44
+
31
45
  # Delete User
32
46
  conn.delete_user('admin')
33
-
47
+
34
48
  # List users
35
49
  conn.user_list
36
-
50
+
51
+ # Add Role
52
+ conn.add_role('rolename', 'readwrite', 'a', 'Z')
53
+
54
+ # Enable Authentication
55
+ conn.add_user('root', "secret")
56
+ conn.grant_role_to_user('root', 'root')
57
+ conn.enable_auth
58
+
59
+ # Disable Authentication
60
+ conn = Etcd.new(url: 'http://127.0.0.1:2379', user: 'root', password: 'secret')
61
+ conn.disable_auth
data/lib/etcdv3.rb CHANGED
@@ -8,9 +8,7 @@ require 'etcdv3/kv'
8
8
 
9
9
  class Etcd
10
10
 
11
- def options
12
- Marshal.load(Martial.dump(@options))
13
- end
11
+ attr_reader :credentials, :options
14
12
 
15
13
  def uri
16
14
  URI(@options[:url])
@@ -28,6 +26,10 @@ class Etcd
28
26
  uri.hostname
29
27
  end
30
28
 
29
+ def token
30
+ @metadata[:token]
31
+ end
32
+
31
33
  def user
32
34
  @options[:user]
33
35
  end
@@ -36,21 +38,11 @@ class Etcd
36
38
  @options[:password]
37
39
  end
38
40
 
39
- def token
40
- @metadata[:token]
41
- end
42
-
43
- def credentials
44
- @credentials
45
- end
46
-
47
- def initialize(options={})
41
+ def initialize(options = {})
48
42
  @options = options
49
43
  @credentials = resolve_credentials
50
44
  @metadata = {}
51
- unless user.nil?
52
- @metadata[:token] = auth.generate_token(user, password)
53
- end
45
+ @metadata[:token] = auth.generate_token(user, password) unless user.nil?
54
46
  end
55
47
 
56
48
  def put(key, value)
@@ -61,7 +53,6 @@ class Etcd
61
53
  kv.range(key, range_end, @metadata)
62
54
  end
63
55
 
64
-
65
56
  def add_user(user, password)
66
57
  auth.add_user(user, password, @metadata)
67
58
  end
@@ -74,6 +65,30 @@ class Etcd
74
65
  auth.user_list(@metadata)
75
66
  end
76
67
 
68
+ def role_list
69
+ auth.role_list(@metadata)
70
+ end
71
+
72
+ def add_role(name, permission, key, range_end='')
73
+ auth.add_role(name, permission, key, range_end, @metadata)
74
+ end
75
+
76
+ def delete_role(name)
77
+ auth.delete_role(name, @metadata)
78
+ end
79
+
80
+ def grant_role_to_user(user, role)
81
+ auth.grant_role_to_user(user, role, @metadata)
82
+ end
83
+
84
+ def enable_auth
85
+ auth.enable_auth
86
+ end
87
+
88
+ def disable_auth
89
+ auth.disable_auth(@metadata)
90
+ end
91
+
77
92
  private
78
93
 
79
94
  def auth
@@ -86,9 +101,9 @@ class Etcd
86
101
 
87
102
  def resolve_credentials
88
103
  case scheme
89
- when "http"
104
+ when 'http'
90
105
  :this_channel_is_insecure
91
- when "https"
106
+ when 'https'
92
107
  # Use default certs for now.
93
108
  GRPC::Core::ChannelCredentials.new
94
109
  else
data/lib/etcdv3/auth.rb CHANGED
@@ -2,29 +2,84 @@
2
2
  class Etcd
3
3
  class Auth
4
4
 
5
+ PERMISSIONS = {
6
+ 'read' => Authpb::Permission::Type::READ,
7
+ 'write' => Authpb::Permission::Type::WRITE,
8
+ 'readwrite' => Authpb::Permission::Type::READWRITE
9
+ }
10
+
5
11
  def initialize(hostname, port, credentials)
6
12
  @stub = Etcdserverpb::Auth::Stub.new("#{hostname}:#{port}", credentials)
7
13
  end
8
14
 
9
15
  def generate_token(user, password)
10
- response = @stub.authenticate(Authpb::User.new(name: user, password: password))
16
+ response = @stub.authenticate(
17
+ Authpb::User.new(name: user, password: password)
18
+ )
11
19
  response.token
20
+ rescue GRPC::FailedPrecondition => exception
21
+ puts exception.message
12
22
  end
13
23
 
14
- def user_list(metadata={})
24
+ def user_list(metadata = {})
15
25
  @stub.user_list(Authpb::User.new, metadata: metadata).users
26
+ rescue GRPC::FailedPrecondition => exception
27
+ puts exception.message
16
28
  end
17
29
 
18
- def add_user(user, password, metadata={})
19
- @stub.user_add(Authpb::User.new(name: user, password: password), metadata: metadata)
20
-
30
+ def add_user(user, password, metadata = {})
31
+ @stub.user_add(
32
+ Authpb::User.new(name: user, password: password), metadata: metadata
33
+ )
21
34
  rescue GRPC::FailedPrecondition => exception
22
35
  puts exception.message
23
36
  end
24
37
 
25
- def delete_user(user, metadata={})
38
+ def delete_user(user, metadata = {})
26
39
  @stub.user_delete(Authpb::User.new(name: user), metadata: metadata)
40
+ rescue GRPC::FailedPrecondition => exception
41
+ puts exception.message
42
+ end
43
+
44
+ def add_role(name, permission, key, range_end, metadata = {})
45
+ permission = Authpb::Permission.new(
46
+ permType: Etcd::Auth::PERMISSIONS[permission], key: key, range_end: range_end
47
+ )
48
+ @stub.role_add(
49
+ Authpb::Role.new(name: name, keyPermission: [permission]),
50
+ metadata: metadata
51
+ )
52
+ rescue GRPC::FailedPrecondition => exception
53
+ puts exception.message
54
+ end
55
+
56
+ def delete_role(name, metadata = {})
57
+ @stub.role_delete(Authpb::Role.new(name: name), metadata: metadata)
58
+ rescue GRPC::FailedPrecondition => exception
59
+ puts exception.message
60
+ end
61
+
62
+ def grant_role_to_user(user, role, metadata = {})
63
+ request = Etcdserverpb::AuthUserGrantRoleRequest.new(user: user, role: role)
64
+ @stub.user_grant_role(request)
65
+ rescue GRPC::FailedPrecondition => exception
66
+ puts exception.message
67
+ end
68
+
69
+ def role_list(metadata = {})
70
+ @stub.role_list(Authpb::Role.new, metadata: metadata)
71
+ rescue GRPC::FailedPrecondition => exception
72
+ puts exception.message
73
+ end
74
+
75
+ def enable_auth
76
+ @stub.auth_enable(Authpb::User.new)
77
+ rescue GRPC::FailedPrecondition => exception
78
+ puts exception.message
79
+ end
27
80
 
81
+ def disable_auth(metadata = {})
82
+ @stub.auth_disable(Authpb::User.new, metadata: metadata)
28
83
  rescue GRPC::FailedPrecondition => exception
29
84
  puts exception.message
30
85
  end
data/lib/etcdv3/kv.rb CHANGED
@@ -1,21 +1,19 @@
1
1
 
2
2
  class Etcd
3
3
  class KV
4
-
5
4
  def initialize(hostname, port, credentials)
6
5
  @stub = Etcdserverpb::KV::Stub.new("#{hostname}:#{port}", credentials)
7
6
  end
8
7
 
9
- def put(key, value, metadata)
8
+ def put(key, value, metadata = {})
10
9
  kv = Etcdserverpb::PutRequest.new(key: key, value: value)
11
10
  @stub.put(kv, metadata: metadata)
12
11
  end
13
12
 
14
- def range(key, range_end, metadata)
13
+ def range(key, range_end, metadata = {})
15
14
  kv = Etcdserverpb::RangeRequest.new(key: key, range_end: range_end)
16
15
  result = @stub.range(kv, metadata: metadata)
17
16
  result.kvs
18
17
  end
19
-
20
18
  end
21
19
  end
@@ -1,3 +1,3 @@
1
1
  class Etcd
2
- VERSION = "0.0.4"
2
+ VERSION = '0.0.5'
3
3
  end
data/spec/etcd_spec.rb CHANGED
@@ -1,15 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Etcd do
4
-
5
4
  context 'Insecure connection without Auth' do
6
-
7
- let(:conn){ Etcd.new(
8
- url: 'http://127.0.0.1:2379'
9
- )}
10
-
5
+ let(:conn) do
6
+ Etcd.new(url: 'http://127.0.0.1:2379')
7
+ end
11
8
  describe '#initialize' do
12
-
13
9
  it 'assigns scheme' do
14
10
  expect(conn.scheme).to eq('http')
15
11
  end
@@ -30,23 +26,5 @@ describe Etcd do
30
26
  expect(conn.credentials).to eq(:this_channel_is_insecure)
31
27
  end
32
28
  end
33
-
34
- describe "#put" do
35
- it 'issues put request' do
36
- expect(conn.put('test', 'test')).to be_an_instance_of(Etcdserverpb::PutResponse)
37
- end
38
- end
39
-
40
- describe "#range" do
41
- it 'returns protobuf' do
42
- expect(conn.range('test', '')).to be_an_instance_of(Google::Protobuf::RepeatedField)
43
- end
44
-
45
- it 'returns correct result' do
46
- expect(conn.range('test', '').first.key).to eq('test')
47
- end
48
- end
49
-
50
29
  end
51
-
52
30
  end
@@ -1,38 +1,103 @@
1
- # require 'spec_helper'
2
- # require 'securerandom'
3
- #
4
- # describe Etcd::Auth do
5
- #
6
- # context "User managment without Auth" do
7
- #
8
- # let(:stub){ Etcd::Auth.new("127.0.0.1", 2379, :this_channel_is_insecure)}
9
- # let(:rando) { SecureRandom.hex(10) }
10
- #
11
- # describe "#add_user" do
12
- # it 'adds user' do
13
- # expect(stub.add_user(rando, 'test')).to be_an_instance_of(Etcdserverpb::AuthUserAddResponse)
14
- # end
15
- # end
16
- #
17
- # describe "#user_list" do
18
- # it 'has correct data type' do
19
- # expect(stub.user_list).to be_an_instance_of(Google::Protobuf::RepeatedField)
20
- # end
21
- #
22
- # it 'contains user testy' do
23
- # puts stub.user_list
24
- # expect(stub.user_list).to eq(rando)
25
- # end
26
- # end
27
- #
28
- # describe "#delete_user" do
29
- #
30
- # it 'deletes user' do
31
- # expect(stub.delete_user(rando)).to be_an_instance_of(Etcdserverpb::AuthUserDeleteResponse)
32
- # end
33
- #
34
- # end
35
- #
36
- # end
37
- #
38
- # end
1
+ require 'spec_helper'
2
+
3
+ describe Etcd::Auth do
4
+
5
+ let(:stub) do
6
+ Etcd::Auth.new('127.0.0.1', 2379, :this_channel_is_insecure)
7
+ end
8
+
9
+ describe '#add_user' do
10
+ it 'returns AuthUserAddResponse' do
11
+ expect(stub.add_user("boom", 'test')).to \
12
+ be_an_instance_of(Etcdserverpb::AuthUserAddResponse)
13
+ end
14
+ end
15
+
16
+ describe '#user_list' do
17
+
18
+ it 'returns Protobuf' do
19
+ expect(stub.user_list).to \
20
+ be_an_instance_of(Google::Protobuf::RepeatedField)
21
+ end
22
+
23
+ it 'returns listme user' do
24
+ stub.add_user('listme', 'test')
25
+ expect(stub.user_list).to include('listme')
26
+ end
27
+ end
28
+
29
+ describe '#delete_user' do
30
+ before do
31
+ stub.add_user('testuser', 'test')
32
+ end
33
+ it 'returns AuthUserDeleteResponse' do
34
+ expect(stub.delete_user('testuser')).to \
35
+ be_an_instance_of(Etcdserverpb::AuthUserDeleteResponse)
36
+ end
37
+ end
38
+
39
+ describe '#grant_role_to_user' do
40
+ before do
41
+ stub.add_user('root', 'password')
42
+ end
43
+ after do
44
+ stub.delete_user('root')
45
+ end
46
+ it 'returns AuthUserGrantRoleResponse' do
47
+ expect(stub.grant_role_to_user("root", 'root')).to \
48
+ be_an_instance_of(Etcdserverpb::AuthUserGrantRoleResponse)
49
+ end
50
+ end
51
+
52
+ describe '#add_role' do
53
+ it 'returns AuthRoleAddResponse' do
54
+ expect(stub.add_role('testRole', 'readwrite', 'a', 'Z')).to \
55
+ be_an_instance_of(Etcdserverpb::AuthRoleAddResponse)
56
+ end
57
+ end
58
+
59
+ describe '#add_delete' do
60
+ it 'returns AuthRoleAddResponse' do
61
+ expect(stub.delete_role('testRole')).to \
62
+ be_an_instance_of(Etcdserverpb::AuthRoleDeleteResponse)
63
+ end
64
+ end
65
+
66
+ describe '#role_list' do
67
+ it 'returns AuthRoleListResponse' do
68
+ expect(stub.role_list).to \
69
+ be_an_instance_of(Etcdserverpb::AuthRoleListResponse)
70
+ end
71
+ end
72
+
73
+ describe '#disable_auth' do
74
+ before do
75
+ stub.add_user('root', 'test')
76
+ stub.grant_role_to_user('root', 'root')
77
+ stub.enable_auth
78
+ end
79
+ after do
80
+ stub.delete_user('root')
81
+ end
82
+ it 'returns AuthDisableResponse' do
83
+ token = stub.generate_token('root', 'test')
84
+ expect(stub.disable_auth(token: token)).to \
85
+ be_an_instance_of(Etcdserverpb::AuthDisableResponse)
86
+ end
87
+ end
88
+
89
+ describe '#enable_auth' do
90
+ before do
91
+ stub.add_user('root', 'test')
92
+ stub.grant_role_to_user('root', 'root')
93
+ end
94
+ after do
95
+ token = stub.generate_token('root', 'test')
96
+ stub.disable_auth(token: token)
97
+ stub.delete_user('root')
98
+ end
99
+ it 'returns AuthEnableResponse' do
100
+ expect(stub.enable_auth).to be_an_instance_of(Etcdserverpb::AuthEnableResponse)
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Etcd::KV do
4
+
5
+ let(:stub) do
6
+ Etcd::KV.new('127.0.0.1', 2379, :this_channel_is_insecure)
7
+ end
8
+
9
+ describe '#put' do
10
+ it 'returns PutResponse' do
11
+ expect(stub.put('test', 'test')).to \
12
+ be_an_instance_of(Etcdserverpb::PutResponse)
13
+ end
14
+ end
15
+
16
+ describe '#range' do
17
+ before do
18
+ stub.put('test', "zoom")
19
+ end
20
+ it 'returns protobuf' do
21
+ expect(stub.range('test', '')).to \
22
+ be_an_instance_of(Google::Protobuf::RepeatedField)
23
+ end
24
+
25
+ it 'returns correct result' do
26
+ expect(stub.range('test', '').first.key).to eq('test')
27
+ end
28
+ end
29
+
30
+
31
+ end
@@ -0,0 +1,59 @@
1
+ require 'fileutils'
2
+ require 'tmpdir'
3
+
4
+ module Helpers
5
+ class TestInstance
6
+ MINIMUM_VERSION = Gem::Version.new('3.0.0')
7
+
8
+ def initialize
9
+ @pids = []
10
+ @tmpdir = Dir.mktmpdir
11
+ @bin = discover_binary_path
12
+ @version = discover_binary_version
13
+
14
+ raise "Invalid Etcd Version: #{@version}. Must be running 3.0+" \
15
+ if @version < MINIMUM_VERSION
16
+ end
17
+
18
+ def start
19
+ raise "Already running etcd servers(#{@pids.inspect})" unless @pids.empty?
20
+ puts 'Starting up testing environment...'
21
+ @pids << spawn_etcd_instance
22
+ sleep(5)
23
+ end
24
+
25
+ def spawn_etcd_instance
26
+ peer_url = 'http://127.0.0.1:2380'
27
+ client_url = 'http://127.0.0.1:2379'
28
+ cluster_url = 'node=http://127.0.0.1:2380'
29
+ flags = ' --name=node'
30
+ flags << " --initial-advertise-peer-urls=#{peer_url}"
31
+ flags << " --listen-peer-urls=#{peer_url}"
32
+ flags << " --listen-client-urls=#{client_url}"
33
+ flags << " --advertise-client-urls=#{client_url}"
34
+ flags << " --initial-cluster=#{cluster_url}"
35
+ flags << " --data-dir=#{@tmpdir} "
36
+
37
+ # Assumes etcd is in PATH
38
+ command = "ETCDCTL_API=3 #{@bin} " + flags
39
+ pid = spawn(command, out: '/dev/null', err: '/dev/null')
40
+ Process.detach(pid)
41
+ pid
42
+ end
43
+
44
+ def stop
45
+ @pids.each { |pid| Process.kill('TERM', pid) }
46
+ FileUtils.remove_entry_secure(@tmpdir, true)
47
+ @pids.clear
48
+ end
49
+
50
+ def discover_binary_path
51
+ 'etcd'
52
+ end
53
+
54
+ def discover_binary_version
55
+ result = `#{@bin} --version | grep "etcd Version"`
56
+ Gem::Version.new(result.split(':').last.strip)
57
+ end
58
+ end
59
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,14 +1,22 @@
1
- lib = File.expand_path('../lib', __FILE__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
1
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift File.expand_path('./helpers', __FILE__)
3
3
 
4
4
  require 'etcdv3'
5
+ require 'helpers/test_instance'
6
+
5
7
  RSpec.configure do |config|
6
8
  config.expect_with :rspec do |expectations|
7
9
  expectations.include_chain_clauses_in_custom_matcher_descriptions = true
8
10
  end
9
-
10
11
  config.mock_with :rspec do |mocks|
11
12
  mocks.verify_partial_doubles = true
12
13
  end
13
14
  config.shared_context_metadata_behavior = :apply_to_host_groups
15
+ instance = Helpers::TestInstance.new
16
+ config.before(:suite) do
17
+ instance.start
18
+ end
19
+ config.after(:suite) do
20
+ instance.stop
21
+ end
14
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: etcdv3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shaun Davis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-30 00:00:00.000000000 Z
11
+ date: 2017-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grpc
@@ -44,9 +44,11 @@ executables: []
44
44
  extensions: []
45
45
  extra_rdoc_files: []
46
46
  files:
47
+ - ".codeclimate.yml"
47
48
  - ".gitignore"
48
49
  - ".rspec"
49
50
  - ".ruby-version"
51
+ - ".travis.yml"
50
52
  - Gemfile
51
53
  - README.md
52
54
  - etcdv3.gemspec
@@ -67,6 +69,8 @@ files:
67
69
  - lib/etcdv3/version.rb
68
70
  - spec/etcd_spec.rb
69
71
  - spec/etcdv3/auth_spec.rb
72
+ - spec/etcdv3/kv_spec.rb
73
+ - spec/helpers/test_instance.rb
70
74
  - spec/spec_helper.rb
71
75
  homepage: https://github.com/davissp14/etcdv3-ruby
72
76
  licenses:
@@ -95,4 +99,6 @@ summary: A Etcd client library for Version 3
95
99
  test_files:
96
100
  - spec/etcd_spec.rb
97
101
  - spec/etcdv3/auth_spec.rb
102
+ - spec/etcdv3/kv_spec.rb
103
+ - spec/helpers/test_instance.rb
98
104
  - spec/spec_helper.rb