dbi-dbrc 1.3.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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