dbi-dbrc 1.3.0 → 1.7.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.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/{CHANGES → CHANGES.md} +57 -23
- data/Gemfile +3 -0
- data/{MANIFEST → MANIFEST.md} +10 -6
- data/README.md +307 -0
- data/Rakefile +6 -22
- data/certs/djberg96_pub.pem +22 -17
- data/dbi-dbrc.gemspec +17 -6
- data/examples/yml/test_yml.rb +5 -5
- data/lib/dbi-dbrc.rb +3 -0
- data/lib/dbi/dbrc.rb +78 -133
- data/lib/dbi/dbrc/json.rb +38 -0
- data/lib/dbi/dbrc/xml.rb +35 -0
- data/lib/dbi/dbrc/yaml.rb +37 -0
- data/spec/dbi_dbrc_json_spec.rb +109 -0
- data/spec/dbi_dbrc_spec.rb +247 -0
- data/spec/dbi_dbrc_xml_spec.rb +101 -0
- data/spec/dbi_dbrc_yml_spec.rb +95 -0
- data/spec/spec_helper.rb +6 -0
- metadata +85 -46
- metadata.gz.sig +0 -0
- data/README +0 -260
- data/test/test_dbi_dbrc.rb +0 -198
- data/test/test_dbi_dbrc_xml.rb +0 -159
- data/test/test_dbi_dbrc_yml.rb +0 -157
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../dbrc'
|
4
|
+
|
5
|
+
# The DBI module serves as namespace only.
|
6
|
+
module DBI
|
7
|
+
# A subclass of DBRC designed to handle .dbrc files in JSON format. The
|
8
|
+
# public methods of this class are identical to DBRC.
|
9
|
+
class DBRC::JSON < DBRC
|
10
|
+
require 'json'
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def parse_dbrc_config_file(file = @dbrc_file)
|
15
|
+
begin
|
16
|
+
fh = file.is_a?(StringIO) ? file : File.open(file)
|
17
|
+
config = ::JSON.parse(fh.read)
|
18
|
+
|
19
|
+
config.each do |hash|
|
20
|
+
db = hash.keys.first
|
21
|
+
next unless db == @database
|
22
|
+
next if @user && @user != hash[db]['user']
|
23
|
+
@user = hash[db]['user']
|
24
|
+
@password = hash[db]['password']
|
25
|
+
@driver = hash[db]['driver']
|
26
|
+
@interval = hash[db]['interval']
|
27
|
+
@timeout = hash[db]['timeout']
|
28
|
+
@maximum_reconnects = hash[db]['maximum_reconnects']
|
29
|
+
break
|
30
|
+
end
|
31
|
+
ensure
|
32
|
+
fh.close if fh && fh.respond_to?(:close)
|
33
|
+
end
|
34
|
+
|
35
|
+
raise Error, "No entry found for #{@user}@#{@database}" unless @user && @database
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/dbi/dbrc/xml.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../dbrc'
|
4
|
+
|
5
|
+
# The DBI module serves as a namespace only.
|
6
|
+
module DBI
|
7
|
+
# A subclass of DBRC designed to handle .dbrc files in XML format. The
|
8
|
+
# public methods of this class are identical to DBRC.
|
9
|
+
class DBRC::XML < DBRC
|
10
|
+
require 'rexml/document' # Good enough for small files
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def parse_dbrc_config_file(file = @dbrc_file)
|
15
|
+
file = file.is_a?(StringIO) ? file : File.new(file)
|
16
|
+
doc = REXML::Document.new(file)
|
17
|
+
|
18
|
+
fields = %w[user password driver interval timeout maximum_reconnects]
|
19
|
+
|
20
|
+
doc.elements.each('/dbrc/database') do |element|
|
21
|
+
next unless element.attributes['name'] == database
|
22
|
+
next if @user && @user != element.elements['user'].text
|
23
|
+
|
24
|
+
fields.each do |field|
|
25
|
+
val = element.elements[field]
|
26
|
+
send("#{field}=", val.text) unless val.nil?
|
27
|
+
end
|
28
|
+
|
29
|
+
break
|
30
|
+
end
|
31
|
+
|
32
|
+
raise Error, "No record found for #{@user}@#{@database}" unless @user && @database
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../dbrc'
|
4
|
+
|
5
|
+
# The DBI module serves as namespace only.
|
6
|
+
module DBI
|
7
|
+
# A subclass of DBRC designed to handle .dbrc files in YAML format. The
|
8
|
+
# public methods of this class are identical to DBRC.
|
9
|
+
class DBRC::YML < DBRC
|
10
|
+
require 'yaml'
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def parse_dbrc_config_file(file = @dbrc_file)
|
15
|
+
fh = file.is_a?(StringIO) ? file : File.open(file)
|
16
|
+
config = ::YAML.safe_load(fh)
|
17
|
+
|
18
|
+
config.each do |hash|
|
19
|
+
hash.each do |db, info|
|
20
|
+
next unless db == @database
|
21
|
+
next if @user && @user != info['user']
|
22
|
+
@user = info['user']
|
23
|
+
@password = info['password']
|
24
|
+
@driver = info['driver']
|
25
|
+
@interval = info['interval']
|
26
|
+
@timeout = info['timeout']
|
27
|
+
@maximum_reconnects = info['maximum_reconnects']
|
28
|
+
break
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
raise Error, "No entry found for #{@user}@#{@database}" unless @user && @database
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
DBI::DBRC::YAML = DBI::DBRC::YML # Alias
|
@@ -0,0 +1,109 @@
|
|
1
|
+
########################################################################
|
2
|
+
# dbi_dbrc_json_spec.rb
|
3
|
+
#
|
4
|
+
# Test suite for the JSON specific version of DBI::DBRC. This test case
|
5
|
+
# should be run via the 'rake test' task.
|
6
|
+
########################################################################
|
7
|
+
require 'dbi/dbrc'
|
8
|
+
require 'rspec'
|
9
|
+
require 'pp' # Need this to avoid fakefs error
|
10
|
+
require 'fakefs/spec_helpers'
|
11
|
+
|
12
|
+
RSpec.describe DBI::DBRC::JSON, :json => true do
|
13
|
+
include FakeFS::SpecHelpers
|
14
|
+
|
15
|
+
let(:home) { File.join(Dir.pwd, 'home', 'someone') }
|
16
|
+
let(:dbrc) { File.join(home, '.dbrc') }
|
17
|
+
|
18
|
+
let(:db_foo){ 'foo' }
|
19
|
+
let(:user1) { 'user1' }
|
20
|
+
|
21
|
+
let(:json){
|
22
|
+
%q{
|
23
|
+
[
|
24
|
+
{
|
25
|
+
"foo": {
|
26
|
+
"user": "user1",
|
27
|
+
"password": "pwd1",
|
28
|
+
"driver": "Oracle",
|
29
|
+
"interval": 60,
|
30
|
+
"timeout": 40,
|
31
|
+
"maximum_reconnects": 3
|
32
|
+
}
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"foo": {
|
36
|
+
"user": "user2",
|
37
|
+
"password": "pwd2",
|
38
|
+
"driver": "OCI8",
|
39
|
+
"interval": 60,
|
40
|
+
"timeout": 60,
|
41
|
+
"maximum_reconnects": 4
|
42
|
+
}
|
43
|
+
},
|
44
|
+
{
|
45
|
+
"bar": {
|
46
|
+
"user": "user1",
|
47
|
+
"password": "pwd3",
|
48
|
+
"driver": "Oracle",
|
49
|
+
"interval": 30,
|
50
|
+
"timeout": 30,
|
51
|
+
"maximum_reconnects": 2
|
52
|
+
}
|
53
|
+
},
|
54
|
+
{
|
55
|
+
"baz": {
|
56
|
+
"user": "user3",
|
57
|
+
"password": "pwd4"
|
58
|
+
}
|
59
|
+
}
|
60
|
+
]
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
before do
|
65
|
+
allow(Dir).to receive(:home).and_return(home)
|
66
|
+
|
67
|
+
if File::ALT_SEPARATOR
|
68
|
+
allow(FakeFS::File).to receive(:hidden?).and_return(true)
|
69
|
+
allow(FakeFS::File).to receive(:encrypted?).and_return(false)
|
70
|
+
end
|
71
|
+
|
72
|
+
FileUtils.mkdir_p(home)
|
73
|
+
File.open(dbrc, 'w'){ |fh| fh.write(json) }
|
74
|
+
File.chmod(0600, dbrc)
|
75
|
+
|
76
|
+
# FakeFS doesn't implement this yet
|
77
|
+
allow_any_instance_of(FakeFS::File::Stat).to receive(:owned?).and_return(true)
|
78
|
+
end
|
79
|
+
|
80
|
+
context "instance methods" do
|
81
|
+
before do
|
82
|
+
@dbrc = described_class.new(db_foo, user1)
|
83
|
+
end
|
84
|
+
|
85
|
+
example "database method returns expected value" do
|
86
|
+
expect(@dbrc.database).to eq('foo')
|
87
|
+
end
|
88
|
+
|
89
|
+
example "password method returns expected value" do
|
90
|
+
expect(@dbrc.password).to eq('pwd1')
|
91
|
+
end
|
92
|
+
|
93
|
+
example "driver method returns expected value" do
|
94
|
+
expect(@dbrc.driver).to eq('Oracle')
|
95
|
+
end
|
96
|
+
|
97
|
+
example "interval method returns expected value" do
|
98
|
+
expect(@dbrc.interval).to eq(60)
|
99
|
+
end
|
100
|
+
|
101
|
+
example "timeout method returns expected value" do
|
102
|
+
expect(@dbrc.timeout).to eq(40)
|
103
|
+
end
|
104
|
+
|
105
|
+
example "maximum_reconnects method returns expected value" do
|
106
|
+
expect(@dbrc.maximum_reconnects).to eq(3)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,247 @@
|
|
1
|
+
#########################################################################
|
2
|
+
# dbi_dbrc_spec.rb
|
3
|
+
#
|
4
|
+
# Specs for the base class of DBI::DBRC. This test case should be
|
5
|
+
# run via the 'rake spec' task.
|
6
|
+
#########################################################################
|
7
|
+
require 'dbi/dbrc'
|
8
|
+
require 'fileutils'
|
9
|
+
require 'spec_helper'
|
10
|
+
require 'pp' # Requiring this ahead of fakefs to address a superclass issue.
|
11
|
+
require 'fakefs/spec_helpers'
|
12
|
+
|
13
|
+
RSpec.describe DBI::DBRC do
|
14
|
+
include FakeFS::SpecHelpers
|
15
|
+
|
16
|
+
let(:windows) { File::ALT_SEPARATOR }
|
17
|
+
let(:home) { File.join(Dir.pwd, 'home', 'someone') }
|
18
|
+
let(:dbrc) { File.join(home, '.dbrc') }
|
19
|
+
|
20
|
+
let(:plain) {
|
21
|
+
%q{
|
22
|
+
foo user1 pwd1 Oracle 40 3 60
|
23
|
+
foo user2 pwd2 OCI8 60 4 60
|
24
|
+
bar user1 pwd3 Oracle 30 2 30
|
25
|
+
baz user3 pwd4
|
26
|
+
}.lstrip
|
27
|
+
}
|
28
|
+
|
29
|
+
let(:db_foo){ 'foo' }
|
30
|
+
let(:db_bar){ 'bar' }
|
31
|
+
let(:db_baz){ 'baz' }
|
32
|
+
let(:user1) { 'user1' }
|
33
|
+
let(:user2) { 'user2' }
|
34
|
+
|
35
|
+
before do
|
36
|
+
allow(Dir).to receive(:home).and_return(home)
|
37
|
+
FileUtils.mkdir_p(home)
|
38
|
+
File.open(dbrc, 'w'){ |fh| fh.write(plain) }
|
39
|
+
File.chmod(0600, dbrc)
|
40
|
+
|
41
|
+
# FakeFS doesn't implement this yet
|
42
|
+
allow_any_instance_of(FakeFS::File::Stat).to receive(:owned?).and_return(true)
|
43
|
+
end
|
44
|
+
|
45
|
+
example "version" do
|
46
|
+
expect(described_class::VERSION).to eq('1.7.0')
|
47
|
+
expect(described_class::VERSION).to be_frozen
|
48
|
+
end
|
49
|
+
|
50
|
+
context "windows", :windows => true do
|
51
|
+
example "constructor raises an error unless the .dbrc file is hidden" do
|
52
|
+
allow(FakeFS::File).to receive(:hidden?).and_return(false)
|
53
|
+
expect{ described_class.new(db_foo, user1) }.to raise_error(described_class::Error)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "constructor" do
|
58
|
+
before do
|
59
|
+
if File::ALT_SEPARATOR
|
60
|
+
allow(FakeFS::File).to receive(:hidden?).and_return(true)
|
61
|
+
allow(FakeFS::File).to receive(:encrypted?).and_return(false)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
example "constructor raises an error if the permissions are invalid", :unix => true do
|
66
|
+
File.chmod(0555, dbrc)
|
67
|
+
expect{ described_class.new(db_foo, user1) }.to raise_error(described_class::Error)
|
68
|
+
end
|
69
|
+
|
70
|
+
example "constructor raises an error if no database is provided" do
|
71
|
+
expect{ described_class.new }.to raise_error(ArgumentError)
|
72
|
+
end
|
73
|
+
|
74
|
+
example "constructor works as expected with or without user" do
|
75
|
+
expect{ described_class.new(db_foo, user1) }.not_to raise_error
|
76
|
+
expect{ described_class.new(db_foo, nil) }.not_to raise_error
|
77
|
+
end
|
78
|
+
|
79
|
+
example "constructor fails if the database entry doesn't exist" do
|
80
|
+
expect{ described_class.new('bogus', user1) }.to raise_error(DBI::DBRC::Error)
|
81
|
+
end
|
82
|
+
|
83
|
+
example "constructor fails if the user entry doesn't exist" do
|
84
|
+
expect{ described_class.new(db_foo, 'nobody') }.to raise_error(DBI::DBRC::Error)
|
85
|
+
end
|
86
|
+
|
87
|
+
example "constructor fails if the .dbrc file isn't found in the specified directory" do
|
88
|
+
expect{ described_class.new(db_foo, user1, '/bogusXX') }.to raise_error(DBI::DBRC::Error)
|
89
|
+
end
|
90
|
+
|
91
|
+
example "constructor returns expected values for the same database with different users" do
|
92
|
+
dbrc1 = described_class.new(db_foo, user1)
|
93
|
+
dbrc2 = described_class.new(db_foo, user2)
|
94
|
+
expect(dbrc1.database).to eq(dbrc2.database)
|
95
|
+
expect(dbrc1.user).to eq('user1')
|
96
|
+
expect(dbrc2.user).to eq('user2')
|
97
|
+
end
|
98
|
+
|
99
|
+
example "constructor returns expected values for the same user with different database" do
|
100
|
+
dbrc1 = described_class.new(db_foo, user1)
|
101
|
+
dbrc2 = described_class.new(db_bar, user1)
|
102
|
+
expect(dbrc1.user).to eq(dbrc2.user)
|
103
|
+
expect(dbrc1.database).to eq('foo')
|
104
|
+
expect(dbrc2.database).to eq('bar')
|
105
|
+
end
|
106
|
+
|
107
|
+
example "constructor works as expected if some optional fields are not defined" do
|
108
|
+
dbrc = described_class.new(db_baz)
|
109
|
+
expect(dbrc.user).to eq("user3")
|
110
|
+
expect(dbrc.passwd).to eq("pwd4")
|
111
|
+
expect(dbrc.driver).to be_nil
|
112
|
+
expect(dbrc.interval).to be_nil
|
113
|
+
expect(dbrc.timeout).to be_nil
|
114
|
+
expect(dbrc.max_reconn).to be_nil
|
115
|
+
expect(dbrc.dsn).to be_nil
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context "instance methods" do
|
120
|
+
before do
|
121
|
+
if File::ALT_SEPARATOR
|
122
|
+
allow(FakeFS::File).to receive(:hidden?).and_return(true)
|
123
|
+
allow(FakeFS::File).to receive(:encrypted?).and_return(false)
|
124
|
+
end
|
125
|
+
@dbrc = DBI::DBRC.new(db_foo)
|
126
|
+
end
|
127
|
+
|
128
|
+
example "basic database getter method and aliases" do
|
129
|
+
expect(@dbrc).to respond_to(:database)
|
130
|
+
expect(@dbrc.method(:database)).to eq(@dbrc.method(:db))
|
131
|
+
expect(@dbrc.method(:database)).to eq(@dbrc.method(:host))
|
132
|
+
end
|
133
|
+
|
134
|
+
example "basic database setter method and alias" do
|
135
|
+
expect(@dbrc).to respond_to(:database=)
|
136
|
+
expect(@dbrc.method(:database=)).to eq(@dbrc.method(:db=))
|
137
|
+
end
|
138
|
+
|
139
|
+
example "database method returns expected value" do
|
140
|
+
expect(@dbrc.database).to eq('foo')
|
141
|
+
end
|
142
|
+
|
143
|
+
example "basic dbrc_dir check" do
|
144
|
+
expect(@dbrc).to respond_to(:dbrc_dir)
|
145
|
+
end
|
146
|
+
|
147
|
+
example "dbrc_dir returns the expected value" do
|
148
|
+
expect(@dbrc.dbrc_dir).to eq(home)
|
149
|
+
end
|
150
|
+
|
151
|
+
example "basic dbrc_file check" do
|
152
|
+
expect(@dbrc).to respond_to(:dbrc_file)
|
153
|
+
end
|
154
|
+
|
155
|
+
example "dbrc_file returns the expected value" do
|
156
|
+
expect(File.basename(@dbrc.dbrc_file)).to eq('.dbrc')
|
157
|
+
end
|
158
|
+
|
159
|
+
example "basic dsn getter check" do
|
160
|
+
expect(@dbrc).to respond_to(:dsn)
|
161
|
+
end
|
162
|
+
|
163
|
+
example "dsn method returns the expected value" do
|
164
|
+
expect(@dbrc.dsn).to eq('dbi:Oracle:foo')
|
165
|
+
end
|
166
|
+
|
167
|
+
example "basic dsn setter check" do
|
168
|
+
expect(@dbrc).to respond_to(:dsn=)
|
169
|
+
end
|
170
|
+
|
171
|
+
example "user getter basic check" do
|
172
|
+
expect(@dbrc).to respond_to(:user)
|
173
|
+
end
|
174
|
+
|
175
|
+
example "user method returns expected value" do
|
176
|
+
expect(@dbrc.user).to eq('user1')
|
177
|
+
end
|
178
|
+
|
179
|
+
example "user setter basic check" do
|
180
|
+
expect(@dbrc).to respond_to(:user=)
|
181
|
+
end
|
182
|
+
|
183
|
+
example "password getter basic check and alias" do
|
184
|
+
expect(@dbrc).to respond_to(:password)
|
185
|
+
expect(@dbrc.method(:password)).to eq(@dbrc.method(:passwd))
|
186
|
+
end
|
187
|
+
|
188
|
+
example "password method returns expected value" do
|
189
|
+
expect(@dbrc.password).to eq("pwd1")
|
190
|
+
end
|
191
|
+
|
192
|
+
example "password setter basic check and alias" do
|
193
|
+
expect(@dbrc).to respond_to(:password=)
|
194
|
+
expect(@dbrc.method(:password=)).to eq(@dbrc.method(:passwd=))
|
195
|
+
end
|
196
|
+
|
197
|
+
example "driver getter basic check" do
|
198
|
+
expect(@dbrc).to respond_to(:driver)
|
199
|
+
end
|
200
|
+
|
201
|
+
example "driver method returns expected value" do
|
202
|
+
expect(@dbrc.driver).to eq("Oracle")
|
203
|
+
end
|
204
|
+
|
205
|
+
example "driver setter basic check" do
|
206
|
+
expect(@dbrc).to respond_to(:driver=)
|
207
|
+
end
|
208
|
+
|
209
|
+
example "interval getter basic check" do
|
210
|
+
expect(@dbrc).to respond_to(:interval)
|
211
|
+
end
|
212
|
+
|
213
|
+
example "interval method returns expected value" do
|
214
|
+
expect(@dbrc.interval).to eq(60)
|
215
|
+
end
|
216
|
+
|
217
|
+
example "interval setter basic check" do
|
218
|
+
expect(@dbrc).to respond_to(:interval=)
|
219
|
+
end
|
220
|
+
|
221
|
+
example "timeout getter basic check" do
|
222
|
+
expect(@dbrc).to respond_to(:timeout)
|
223
|
+
expect(@dbrc.method(:timeout)).to eq(@dbrc.method(:time_out))
|
224
|
+
end
|
225
|
+
|
226
|
+
example "timeout method returns expected value" do
|
227
|
+
expect(@dbrc.timeout).to eq(40)
|
228
|
+
end
|
229
|
+
|
230
|
+
example "timeout setter basic check" do
|
231
|
+
expect(@dbrc).to respond_to(:timeout=)
|
232
|
+
end
|
233
|
+
|
234
|
+
example "max_reconn getter basic check" do
|
235
|
+
expect(@dbrc).to respond_to(:max_reconn)
|
236
|
+
expect(@dbrc.method(:max_reconn)).to eq(@dbrc.method(:maximum_reconnects))
|
237
|
+
end
|
238
|
+
|
239
|
+
example "max_reconn method returns expected value" do
|
240
|
+
expect(@dbrc.max_reconn).to eq(3)
|
241
|
+
end
|
242
|
+
|
243
|
+
example "max_reconn setter basic check" do
|
244
|
+
expect(@dbrc).to respond_to(:max_reconn=)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|