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.
@@ -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