dbf 0.5.2 → 0.5.3
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.
- data/.DS_Store +0 -0
- data/History.txt +4 -0
- data/Manifest.txt +23 -16
- data/Rakefile +8 -11
- data/bin/dbf +40 -0
- data/spec/.DS_Store +0 -0
- data/spec/fixtures/.DS_Store +0 -0
- data/{test/databases/dbase_iii.dbf → spec/fixtures/dbase_03.dbf} +0 -0
- data/{test/databases/visual_foxpro.dbf → spec/fixtures/dbase_30.dbf} +0 -0
- data/{test/databases/visual_foxpro.fpt → spec/fixtures/dbase_30.fpt} +0 -0
- data/{test/databases/dbase_iii_memo.dbf → spec/fixtures/dbase_83.dbf} +0 -0
- data/{test/databases/dbase_iii_memo.dbt → spec/fixtures/dbase_83.dbt} +0 -0
- data/spec/fixtures/{dbase_iii_memo_schema.rb → dbase_83_schema.txt} +1 -1
- data/spec/fixtures/dbase_8b.dbf +0 -0
- data/spec/fixtures/dbase_8b.dbt +0 -0
- data/{test/databases/foxpro.dbf → spec/fixtures/dbase_f5.dbf} +0 -0
- data/{test/databases/foxpro.fpt → spec/fixtures/dbase_f5.fpt} +0 -0
- data/spec/functional/dbf_shared.rb +42 -0
- data/spec/functional/format_03_spec.rb +23 -0
- data/spec/functional/format_30_spec.rb +23 -0
- data/spec/functional/format_83_spec.rb +23 -0
- data/spec/functional/format_8b_spec.rb +23 -0
- data/spec/functional/format_f5_spec.rb +23 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/{field_spec.rb → unit/field_spec.rb} +1 -1
- data/spec/{reader_spec.rb → unit/reader_spec.rb} +10 -10
- data/spec/unit/record_spec.rb +31 -0
- metadata +28 -20
- data/spec/record_spec.rb +0 -32
- data/test/common.rb +0 -95
- data/test/dbase_iii_memo_read_test.rb +0 -27
- data/test/dbase_iii_read_test.rb +0 -27
- data/test/foxpro_read_test.rb +0 -33
- data/test/visual_foxpro_read_test.rb +0 -27
data/.DS_Store
ADDED
Binary file
|
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -1,28 +1,35 @@
|
|
1
|
+
.DS_Store
|
1
2
|
History.txt
|
2
3
|
Manifest.txt
|
3
4
|
README.txt
|
4
5
|
Rakefile
|
5
6
|
benchmarks/performance.rb
|
6
7
|
benchmarks/seek_benchmark.rb
|
8
|
+
bin/dbf
|
7
9
|
lib/dbf.rb
|
8
10
|
lib/dbf/field.rb
|
9
11
|
lib/dbf/globals.rb
|
10
12
|
lib/dbf/reader.rb
|
11
13
|
lib/dbf/record.rb
|
12
|
-
spec
|
13
|
-
spec/fixtures
|
14
|
-
spec/
|
15
|
-
spec/
|
14
|
+
spec/.DS_Store
|
15
|
+
spec/fixtures/.DS_Store
|
16
|
+
spec/fixtures/dbase_03.dbf
|
17
|
+
spec/fixtures/dbase_30.dbf
|
18
|
+
spec/fixtures/dbase_30.fpt
|
19
|
+
spec/fixtures/dbase_83.dbf
|
20
|
+
spec/fixtures/dbase_83.dbt
|
21
|
+
spec/fixtures/dbase_83_schema.txt
|
22
|
+
spec/fixtures/dbase_8b.dbf
|
23
|
+
spec/fixtures/dbase_8b.dbt
|
24
|
+
spec/fixtures/dbase_f5.dbf
|
25
|
+
spec/fixtures/dbase_f5.fpt
|
26
|
+
spec/functional/dbf_shared.rb
|
27
|
+
spec/functional/format_03_spec.rb
|
28
|
+
spec/functional/format_30_spec.rb
|
29
|
+
spec/functional/format_83_spec.rb
|
30
|
+
spec/functional/format_8b_spec.rb
|
31
|
+
spec/functional/format_f5_spec.rb
|
16
32
|
spec/spec_helper.rb
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
test/databases/dbase_iii_memo.dbt
|
21
|
-
test/databases/foxpro.dbf
|
22
|
-
test/databases/foxpro.fpt
|
23
|
-
test/databases/visual_foxpro.dbf
|
24
|
-
test/databases/visual_foxpro.fpt
|
25
|
-
test/dbase_iii_memo_read_test.rb
|
26
|
-
test/dbase_iii_read_test.rb
|
27
|
-
test/foxpro_read_test.rb
|
28
|
-
test/visual_foxpro_read_test.rb
|
33
|
+
spec/unit/field_spec.rb
|
34
|
+
spec/unit/reader_spec.rb
|
35
|
+
spec/unit/record_spec.rb
|
data/Rakefile
CHANGED
@@ -2,7 +2,7 @@ require 'hoe'
|
|
2
2
|
require 'spec/rake/spectask'
|
3
3
|
|
4
4
|
PKG_NAME = "dbf"
|
5
|
-
PKG_VERSION = "0.5.
|
5
|
+
PKG_VERSION = "0.5.3"
|
6
6
|
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
7
7
|
|
8
8
|
Hoe.new PKG_NAME, PKG_VERSION do |p|
|
@@ -16,18 +16,15 @@ Hoe.new PKG_NAME, PKG_VERSION do |p|
|
|
16
16
|
p.need_zip = true
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
task :default => [:spec, :test]
|
21
|
-
|
22
|
-
desc 'Run tests'
|
23
|
-
Rake::TestTask.new :test do |t|
|
24
|
-
t.libs << "test"
|
25
|
-
t.pattern = 'test/*_test.rb'
|
26
|
-
t.verbose = true
|
27
|
-
end
|
19
|
+
task :default => [:spec]
|
28
20
|
|
29
21
|
desc "Run specs"
|
30
22
|
Spec::Rake::SpecTask.new :spec do |t|
|
31
|
-
# t.spec_opts = ["-f specdoc"]
|
32
23
|
t.spec_files = FileList['spec/**/*spec.rb']
|
33
24
|
end
|
25
|
+
|
26
|
+
desc "Run spec docs"
|
27
|
+
Spec::Rake::SpecTask.new :specdoc do |t|
|
28
|
+
t.spec_opts = ["-f specdoc"]
|
29
|
+
t.spec_files = FileList['spec/**/*spec.rb']
|
30
|
+
end
|
data/bin/dbf
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/env ruby -ws
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'dbf'
|
5
|
+
|
6
|
+
$a ||= false
|
7
|
+
$s ||= false
|
8
|
+
|
9
|
+
if defined? $h then
|
10
|
+
puts "usage: #{File.basename(__FILE__)} [-h|-s|-a] filename"
|
11
|
+
puts " -h = print this message"
|
12
|
+
puts " -s = print summary information"
|
13
|
+
puts " -a = create an ActiveRecord::Schema"
|
14
|
+
else
|
15
|
+
|
16
|
+
filename = ARGV.shift
|
17
|
+
abort "You must supply a filename on the command line" unless filename
|
18
|
+
|
19
|
+
# create an ActiveRecord::Schema
|
20
|
+
if $a
|
21
|
+
reader = DBF::Reader.new filename
|
22
|
+
puts reader.schema
|
23
|
+
end
|
24
|
+
|
25
|
+
if $s
|
26
|
+
reader = DBF::Reader.new filename
|
27
|
+
puts
|
28
|
+
puts "Database: #{filename}"
|
29
|
+
puts "Type: (#{reader.version}) #{reader.version_description}"
|
30
|
+
puts "Memo Type: #{reader.memo_file_format}" if reader.has_memo_file?
|
31
|
+
puts "Records: #{reader.record_count}"
|
32
|
+
|
33
|
+
puts "\nFields:"
|
34
|
+
puts "Name Type Length Decimal"
|
35
|
+
puts "-" * 78
|
36
|
+
reader.fields.each do |f|
|
37
|
+
puts "%-16s %-10s %-10s %-10s" % [f.name, f.type, f.length, f.decimal]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/spec/.DS_Store
ADDED
Binary file
|
Binary file
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
Binary file
|
Binary file
|
File without changes
|
File without changes
|
@@ -0,0 +1,42 @@
|
|
1
|
+
describe DBF, :shared => true do
|
2
|
+
specify "number of records found should equal number of records calculated from the header information" do
|
3
|
+
@reader.record_count.should == @reader.records.size
|
4
|
+
end
|
5
|
+
|
6
|
+
specify "sum of field lengths should equal record length specified in header" do
|
7
|
+
header_record_length = @reader.instance_eval {@record_length}
|
8
|
+
sum_of_field_lengths = @reader.fields.inject(1) {|sum, field| sum + field.length}
|
9
|
+
|
10
|
+
header_record_length.should == sum_of_field_lengths
|
11
|
+
end
|
12
|
+
|
13
|
+
specify "records should be instances of DBF::Record" do
|
14
|
+
@reader.records.all? {|record| record.should be_an_instance_of(DBF::Record)}
|
15
|
+
end
|
16
|
+
|
17
|
+
specify "fields should be instances of DBF::Field" do
|
18
|
+
@reader.fields.all? {|field| field.should be_an_instance_of(DBF::Field)}
|
19
|
+
end
|
20
|
+
|
21
|
+
specify "field names should not be blank" do
|
22
|
+
@reader.fields.all? {|field| field.name.should_not be_empty}
|
23
|
+
end
|
24
|
+
|
25
|
+
specify "field types should be valid" do
|
26
|
+
valid_field_types = %w(C N L D M F B G P Y T I V X @ O +)
|
27
|
+
@reader.fields.all? {|field| valid_field_types.should include(field.type)}
|
28
|
+
end
|
29
|
+
|
30
|
+
specify "field lengths should be instances of Fixnum" do
|
31
|
+
@reader.fields.all? {|field| field.length.should be_an_instance_of(Fixnum)}
|
32
|
+
end
|
33
|
+
|
34
|
+
specify "field lengths should be larger than 0" do
|
35
|
+
@reader.fields.all? {|field| field.length.should > 0}
|
36
|
+
end
|
37
|
+
|
38
|
+
specify "field decimals should be instances of Fixnum" do
|
39
|
+
@reader.fields.all? {|field| field.decimal.should be_an_instance_of(Fixnum)}
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
require File.dirname(__FILE__) + "/dbf_shared"
|
3
|
+
|
4
|
+
describe DBF, "of type 03 (dBase III without memo file)" do
|
5
|
+
before(:each) do
|
6
|
+
@reader = DBF::Reader.new "#{DB_PATH}/dbase_03.dbf"
|
7
|
+
end
|
8
|
+
|
9
|
+
it_should_behave_like "DBF"
|
10
|
+
|
11
|
+
it "should report the correct version number" do
|
12
|
+
@reader.version.should == "03"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should have a memo file" do
|
16
|
+
@reader.should_not have_memo_file
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should report the correct memo type" do
|
20
|
+
@reader.memo_file_format.should be_nil
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
require File.dirname(__FILE__) + "/dbf_shared"
|
3
|
+
|
4
|
+
describe DBF, "of type 30 (Visual FoxPro)" do
|
5
|
+
before(:each) do
|
6
|
+
@reader = DBF::Reader.new "#{DB_PATH}/dbase_30.dbf"
|
7
|
+
end
|
8
|
+
|
9
|
+
it_should_behave_like "DBF"
|
10
|
+
|
11
|
+
it "should report the correct version number" do
|
12
|
+
@reader.version.should == "30"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should have a memo file" do
|
16
|
+
@reader.should have_memo_file
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should report the correct memo type" do
|
20
|
+
@reader.memo_file_format.should == :fpt
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
require File.dirname(__FILE__) + "/dbf_shared"
|
3
|
+
|
4
|
+
describe DBF, "of type 83 (dBase III with memo file)" do
|
5
|
+
before(:each) do
|
6
|
+
@reader = DBF::Reader.new "#{DB_PATH}/dbase_83.dbf"
|
7
|
+
end
|
8
|
+
|
9
|
+
it_should_behave_like "DBF"
|
10
|
+
|
11
|
+
it "should report the correct version number" do
|
12
|
+
@reader.version.should == "83"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should have a memo file" do
|
16
|
+
@reader.should have_memo_file
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should report the correct memo type" do
|
20
|
+
@reader.memo_file_format.should == :dbt
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
require File.dirname(__FILE__) + "/dbf_shared"
|
3
|
+
|
4
|
+
describe DBF, "of type 8b (dBase IV with memo file)" do
|
5
|
+
before(:each) do
|
6
|
+
@reader = DBF::Reader.new "#{DB_PATH}/dbase_8b.dbf"
|
7
|
+
end
|
8
|
+
|
9
|
+
it_should_behave_like "DBF"
|
10
|
+
|
11
|
+
it "should report the correct version number" do
|
12
|
+
@reader.version.should == "8b"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should have a memo file" do
|
16
|
+
@reader.should have_memo_file
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should report the correct memo type" do
|
20
|
+
@reader.memo_file_format.should == :dbt
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
require File.dirname(__FILE__) + "/dbf_shared"
|
3
|
+
|
4
|
+
describe DBF, "of type f5 (FoxPro with memo file)" do
|
5
|
+
before(:each) do
|
6
|
+
@reader = DBF::Reader.new "#{DB_PATH}/dbase_f5.dbf"
|
7
|
+
end
|
8
|
+
|
9
|
+
it_should_behave_like "DBF"
|
10
|
+
|
11
|
+
it "should report the correct version number" do
|
12
|
+
@reader.version.should == "f5"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should have a memo file" do
|
16
|
+
@reader.should have_memo_file
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should report the correct memo type" do
|
20
|
+
@reader.memo_file_format.should == :fpt
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
require File.dirname(__FILE__) + "
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
2
|
|
3
3
|
describe DBF::Reader, "when initialized" do
|
4
4
|
|
5
5
|
before(:all) do
|
6
|
-
@reader = DBF::Reader.new
|
6
|
+
@reader = DBF::Reader.new "#{DB_PATH}/dbase_83.dbf"
|
7
7
|
end
|
8
8
|
|
9
9
|
it "should load the data file" do
|
@@ -44,7 +44,7 @@ end
|
|
44
44
|
describe DBF::Reader, "when the in_memory flag is true" do
|
45
45
|
|
46
46
|
before(:each) do
|
47
|
-
@reader = DBF::Reader.new
|
47
|
+
@reader = DBF::Reader.new "#{DB_PATH}/dbase_83.dbf"
|
48
48
|
end
|
49
49
|
|
50
50
|
it "should build the records array from disk only on the first request" do
|
@@ -65,7 +65,7 @@ end
|
|
65
65
|
describe DBF::Reader, "when the in_memory flag is false" do
|
66
66
|
|
67
67
|
before(:each) do
|
68
|
-
@reader = DBF::Reader.new
|
68
|
+
@reader = DBF::Reader.new "#{DB_PATH}/dbase_83.dbf"
|
69
69
|
end
|
70
70
|
|
71
71
|
it "should read the records from disk on every request" do
|
@@ -78,8 +78,8 @@ end
|
|
78
78
|
describe DBF::Reader, "schema" do
|
79
79
|
|
80
80
|
it "should match test schema " do
|
81
|
-
reader = DBF::Reader.new
|
82
|
-
control_schema = File.read(File.dirname(__FILE__) + '
|
81
|
+
reader = DBF::Reader.new "#{DB_PATH}/dbase_83.dbf"
|
82
|
+
control_schema = File.read(File.dirname(__FILE__) + '/../fixtures/dbase_83_schema.txt')
|
83
83
|
|
84
84
|
reader.schema.should == control_schema
|
85
85
|
end
|
@@ -89,7 +89,7 @@ end
|
|
89
89
|
describe DBF::Reader, "find(index)" do
|
90
90
|
|
91
91
|
before(:all) do
|
92
|
-
@reader = DBF::Reader.new
|
92
|
+
@reader = DBF::Reader.new "#{DB_PATH}/dbase_83.dbf"
|
93
93
|
end
|
94
94
|
|
95
95
|
it "should return the correct record" do
|
@@ -105,7 +105,7 @@ end
|
|
105
105
|
describe DBF::Reader, "find(:all)" do
|
106
106
|
|
107
107
|
before(:all) do
|
108
|
-
@reader = DBF::Reader.new
|
108
|
+
@reader = DBF::Reader.new "#{DB_PATH}/dbase_83.dbf"
|
109
109
|
end
|
110
110
|
|
111
111
|
it "should return all records if options are empty" do
|
@@ -124,7 +124,7 @@ end
|
|
124
124
|
describe DBF::Reader, "find(:first)" do
|
125
125
|
|
126
126
|
before(:all) do
|
127
|
-
@reader = DBF::Reader.new
|
127
|
+
@reader = DBF::Reader.new "#{DB_PATH}/dbase_83.dbf"
|
128
128
|
end
|
129
129
|
|
130
130
|
it "should return the first record if options are empty" do
|
@@ -143,7 +143,7 @@ end
|
|
143
143
|
describe DBF::Reader do
|
144
144
|
|
145
145
|
before(:each) do
|
146
|
-
@reader = DBF::Reader.new
|
146
|
+
@reader = DBF::Reader.new "#{DB_PATH}/dbase_83.dbf"
|
147
147
|
end
|
148
148
|
|
149
149
|
it "should reload all data when sent #reload!" do
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
|
3
|
+
describe DBF::Record, "when initialized" do
|
4
|
+
|
5
|
+
it "should typecast number fields with decimals == 0 to Integer" do
|
6
|
+
reader = DBF::Reader.new "#{DB_PATH}/dbase_83.dbf"
|
7
|
+
reader.field("ID").type.should == "N"
|
8
|
+
reader.field("ID").decimal.should == 0
|
9
|
+
reader.records.all? {|record| record["ID"].should be_kind_of(Integer)}
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should typecast number fields with decimals > 0 to Float" do
|
13
|
+
reader = DBF::Reader.new "#{DB_PATH}/dbase_83.dbf"
|
14
|
+
reader.field("ID").type.should == "N"
|
15
|
+
reader.field("COST").decimal.should == 2
|
16
|
+
reader.records.all? {|record| record["COST"].should be_kind_of(Float)}
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should typecast memo fields to String" do
|
20
|
+
reader = DBF::Reader.new "#{DB_PATH}/dbase_83.dbf"
|
21
|
+
reader.field("DESC").type.should == "M"
|
22
|
+
reader.records.all? {|record| record["DESC"].should be_kind_of(String)}
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should typecast logical fields to True or False" do
|
26
|
+
reader = DBF::Reader.new "#{DB_PATH}/dbase_30.dbf"
|
27
|
+
reader.field("WEBINCLUDE").type.should == "L"
|
28
|
+
reader.records.all? {|record| record["WEBINCLUDE"].should satisfy {|v| v == true || v == false}}
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: dbf
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.5.
|
7
|
-
date: 2007-06-
|
6
|
+
version: 0.5.3
|
7
|
+
date: 2007-06-16 00:00:00 -07:00
|
8
8
|
summary: A small fast library for reading dBase, xBase, Clipper and FoxPro database files.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -29,34 +29,41 @@ post_install_message:
|
|
29
29
|
authors:
|
30
30
|
- Keith Morrison
|
31
31
|
files:
|
32
|
+
- .DS_Store
|
32
33
|
- History.txt
|
33
34
|
- Manifest.txt
|
34
35
|
- README.txt
|
35
36
|
- Rakefile
|
36
37
|
- benchmarks/performance.rb
|
37
38
|
- benchmarks/seek_benchmark.rb
|
39
|
+
- bin/dbf
|
38
40
|
- lib/dbf.rb
|
39
41
|
- lib/dbf/field.rb
|
40
42
|
- lib/dbf/globals.rb
|
41
43
|
- lib/dbf/reader.rb
|
42
44
|
- lib/dbf/record.rb
|
43
|
-
- spec
|
44
|
-
- spec/fixtures
|
45
|
-
- spec/
|
46
|
-
- spec/
|
45
|
+
- spec/.DS_Store
|
46
|
+
- spec/fixtures/.DS_Store
|
47
|
+
- spec/fixtures/dbase_03.dbf
|
48
|
+
- spec/fixtures/dbase_30.dbf
|
49
|
+
- spec/fixtures/dbase_30.fpt
|
50
|
+
- spec/fixtures/dbase_83.dbf
|
51
|
+
- spec/fixtures/dbase_83.dbt
|
52
|
+
- spec/fixtures/dbase_83_schema.txt
|
53
|
+
- spec/fixtures/dbase_8b.dbf
|
54
|
+
- spec/fixtures/dbase_8b.dbt
|
55
|
+
- spec/fixtures/dbase_f5.dbf
|
56
|
+
- spec/fixtures/dbase_f5.fpt
|
57
|
+
- spec/functional/dbf_shared.rb
|
58
|
+
- spec/functional/format_03_spec.rb
|
59
|
+
- spec/functional/format_30_spec.rb
|
60
|
+
- spec/functional/format_83_spec.rb
|
61
|
+
- spec/functional/format_8b_spec.rb
|
62
|
+
- spec/functional/format_f5_spec.rb
|
47
63
|
- spec/spec_helper.rb
|
48
|
-
-
|
49
|
-
-
|
50
|
-
-
|
51
|
-
- test/databases/dbase_iii_memo.dbt
|
52
|
-
- test/databases/foxpro.dbf
|
53
|
-
- test/databases/foxpro.fpt
|
54
|
-
- test/databases/visual_foxpro.dbf
|
55
|
-
- test/databases/visual_foxpro.fpt
|
56
|
-
- test/dbase_iii_memo_read_test.rb
|
57
|
-
- test/dbase_iii_read_test.rb
|
58
|
-
- test/foxpro_read_test.rb
|
59
|
-
- test/visual_foxpro_read_test.rb
|
64
|
+
- spec/unit/field_spec.rb
|
65
|
+
- spec/unit/reader_spec.rb
|
66
|
+
- spec/unit/record_spec.rb
|
60
67
|
test_files: []
|
61
68
|
|
62
69
|
rdoc_options:
|
@@ -66,8 +73,9 @@ extra_rdoc_files:
|
|
66
73
|
- History.txt
|
67
74
|
- Manifest.txt
|
68
75
|
- README.txt
|
69
|
-
|
70
|
-
|
76
|
+
- spec/fixtures/dbase_83_schema.txt
|
77
|
+
executables:
|
78
|
+
- dbf
|
71
79
|
extensions: []
|
72
80
|
|
73
81
|
requirements: []
|
data/spec/record_spec.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + "/spec_helper"
|
2
|
-
|
3
|
-
describe DBF::Record, "when initialized" do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
@reader = DBF::Reader.new File.dirname(__FILE__) + '/../test/databases/dbase_iii_memo.dbf'
|
7
|
-
@record = @reader.record(5)
|
8
|
-
end
|
9
|
-
|
10
|
-
it "should typecast number fields with decimals == 0 to Integer" do
|
11
|
-
@reader.field("ID").type == "N"
|
12
|
-
@reader.field("ID").decimal.should == 0
|
13
|
-
@record["ID"].should be_kind_of(Integer)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should typecast number fields with decimals > 0 to Float" do
|
17
|
-
@reader.field("ID").type == "N"
|
18
|
-
@reader.field("COST").decimal.should == 2
|
19
|
-
@record["COST"].should be_kind_of(Float)
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should typecast memo fields to String" do
|
23
|
-
@reader.field("DESC").type == "M"
|
24
|
-
@record["DESC"].should be_kind_of(String)
|
25
|
-
end
|
26
|
-
|
27
|
-
it "should typecast logical fields to True or False" do
|
28
|
-
@reader.field("TAXABLE").type == "L"
|
29
|
-
@record["TAXABLE"].should be_kind_of(FalseClass)
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
data/test/common.rb
DELETED
@@ -1,95 +0,0 @@
|
|
1
|
-
module CommonTests
|
2
|
-
module Read
|
3
|
-
|
4
|
-
def test_version
|
5
|
-
assert_equal @controls[:version], @dbf.version
|
6
|
-
assert_equal @dbf.instance_eval("DBF::VERSION_DESCRIPTIONS['#{@dbf.version}']"), @dbf.version_description
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_has_memo_file
|
10
|
-
assert_equal @controls[:has_memo_file], @dbf.has_memo_file?
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_memo_file_format
|
14
|
-
assert_equal @controls[:memo_file_format], @dbf.memo_file_format
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_records
|
18
|
-
assert_kind_of Array, @dbf.records
|
19
|
-
assert_kind_of Array, @dbf.rows
|
20
|
-
assert(@dbf.records.all? {|record| record.is_a?(DBF::Record)})
|
21
|
-
end
|
22
|
-
|
23
|
-
# Does the header info match the actual fields found?
|
24
|
-
def test_field_count
|
25
|
-
assert_equal @controls[:field_count], @dbf.field_count
|
26
|
-
assert_equal @dbf.field_count, @dbf.fields.size, "header field_count does not equal actual field count"
|
27
|
-
end
|
28
|
-
|
29
|
-
# Does the header info match the actual number of records found?
|
30
|
-
def test_record_count
|
31
|
-
assert_equal @controls[:record_count], @dbf.record_count
|
32
|
-
assert_equal @dbf.record_count, @dbf.records.size, "header record_count does not equal actual record count"
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_record_length
|
36
|
-
assert_equal @controls[:record_length], @dbf.instance_eval {@record_length}
|
37
|
-
assert_equal @controls[:record_length], @dbf.fields.inject(1) {|sum, field| sum + field.length}
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_field_attributes
|
41
|
-
@dbf.fields.each do |field|
|
42
|
-
assert_kind_of DBF::Field, field
|
43
|
-
assert field.name.is_a?(String) && !field.name.empty?
|
44
|
-
assert %w(C N L D M F B G P Y T I V X @ O +).include?(field.type)
|
45
|
-
assert_kind_of Fixnum, field.length
|
46
|
-
assert field.length > 0
|
47
|
-
assert_kind_of Fixnum, field.decimal
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def test_random_records
|
52
|
-
10.times do
|
53
|
-
record_num = rand(@controls[:record_count])
|
54
|
-
assert_equal @dbf.records[record_num], @dbf.record(record_num)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_character_fields
|
59
|
-
@controls[:testable_character_field_names].each do |name|
|
60
|
-
assert(@dbf.records.any? {|record| record[name].is_a?(String)})
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_date_fields
|
65
|
-
@controls[:testable_date_field_names].each do |name|
|
66
|
-
assert(@dbf.records.any? {|record| record[name].is_a?(Date) || record[name].is_a?(Time)})
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_integer_numeric_fields
|
71
|
-
@controls[:testable_integer_field_names].each do |name|
|
72
|
-
assert(@dbf.records.any? {|record| record[name].is_a?(Fixnum)})
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def test_float_numeric_fields
|
77
|
-
@controls[:testable_float_field_names].each do |name|
|
78
|
-
assert(@dbf.records.any? {|record| record[name].is_a?(Float)})
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_logical_fields
|
83
|
-
# need a test database that has a logical field
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_memo_fields
|
87
|
-
@controls[:testable_memo_field_names].each do |name|
|
88
|
-
assert(@dbf.records.any? {|record| record[name].is_a?(String)}, "expected a String")
|
89
|
-
assert(@dbf.records.any? {|record| record[name].is_a?(String) && record[name].size > 1})
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
end
|
94
|
-
|
95
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
$:.unshift(File.dirname(__FILE__) + "/../lib/")
|
2
|
-
require 'test/unit'
|
3
|
-
require 'dbf'
|
4
|
-
require 'common'
|
5
|
-
|
6
|
-
class DBaseIIIWithMemoReadTest < Test::Unit::TestCase
|
7
|
-
include CommonTests::Read
|
8
|
-
|
9
|
-
def setup
|
10
|
-
@controls = {
|
11
|
-
:version => "83",
|
12
|
-
:has_memo_file => true,
|
13
|
-
:memo_file_format => :dbt,
|
14
|
-
:field_count => 15,
|
15
|
-
:record_count => 67,
|
16
|
-
:record_length => 805,
|
17
|
-
:testable_character_field_names => ["CODE"],
|
18
|
-
:testable_date_field_names => [],
|
19
|
-
:testable_integer_field_names => ["AGRPCOUNT"],
|
20
|
-
:testable_float_field_names => ["PRICE"],
|
21
|
-
:testable_logical_field_names => ["TAXABLE"],
|
22
|
-
:testable_memo_field_names => ["DESC"]
|
23
|
-
}
|
24
|
-
@dbf = DBF::Reader.new(File.join(File.dirname(__FILE__),'databases', 'dbase_iii_memo.dbf'))
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
data/test/dbase_iii_read_test.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
$:.unshift(File.dirname(__FILE__) + "/../lib/")
|
2
|
-
require 'test/unit'
|
3
|
-
require 'dbf'
|
4
|
-
require 'common'
|
5
|
-
|
6
|
-
class DBaseIIIReadTest < Test::Unit::TestCase
|
7
|
-
include CommonTests::Read
|
8
|
-
|
9
|
-
def setup
|
10
|
-
@controls = {
|
11
|
-
:version => "03",
|
12
|
-
:has_memo_file => false,
|
13
|
-
:memo_file_format => nil,
|
14
|
-
:field_count => 31,
|
15
|
-
:record_count => 14,
|
16
|
-
:record_length => 590,
|
17
|
-
:testable_character_field_names => ["Shape"],
|
18
|
-
:testable_date_field_names => ["Date_Visit"],
|
19
|
-
:testable_integer_field_names => ["Filt_Pos"],
|
20
|
-
:testable_float_field_names => ["Max_PDOP"],
|
21
|
-
:testable_logical_field_names => [],
|
22
|
-
:testable_memo_field_names => []
|
23
|
-
}
|
24
|
-
@dbf = DBF::Reader.new "#{File.dirname(__FILE__)}/databases/dbase_iii.dbf"
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
data/test/foxpro_read_test.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
$:.unshift(File.dirname(__FILE__) + "/../lib/")
|
2
|
-
require 'test/unit'
|
3
|
-
require 'dbf'
|
4
|
-
require 'common'
|
5
|
-
|
6
|
-
class FoxproReadTest < Test::Unit::TestCase
|
7
|
-
include CommonTests::Read
|
8
|
-
|
9
|
-
def setup
|
10
|
-
@controls = {
|
11
|
-
:version => "f5",
|
12
|
-
:has_memo_file => true,
|
13
|
-
:memo_file_format => :fpt,
|
14
|
-
:field_count => 59,
|
15
|
-
:record_count => 975,
|
16
|
-
:record_length => 969,
|
17
|
-
:testable_character_field_names => ["NOM"],
|
18
|
-
:testable_date_field_names => ["DATN"],
|
19
|
-
:testable_integer_field_names => ["NF"],
|
20
|
-
:testable_float_field_names => [],
|
21
|
-
:testable_logical_field_names => [],
|
22
|
-
:testable_memo_field_names => ["OBSE"]
|
23
|
-
}
|
24
|
-
@dbf = DBF::Reader.new "#{File.dirname(__FILE__)}/databases/foxpro.dbf"
|
25
|
-
end
|
26
|
-
|
27
|
-
# make sure we're grabbing the correct memo
|
28
|
-
def test_memo_contents
|
29
|
-
assert_equal "jos\202 vicente salvador\r\ncapell\205: salvador vidal\r\nen n\202ixer, les castellers li van fer un pilar i el van entregar al seu pare.",
|
30
|
-
@dbf.records[3]['OBSE']
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
$:.unshift(File.dirname(__FILE__) + "/../lib/")
|
2
|
-
require 'test/unit'
|
3
|
-
require 'dbf'
|
4
|
-
require 'common'
|
5
|
-
|
6
|
-
class VisualFoxproReadTest < Test::Unit::TestCase
|
7
|
-
include CommonTests::Read
|
8
|
-
|
9
|
-
def setup
|
10
|
-
@controls = {
|
11
|
-
:version => "30",
|
12
|
-
:has_memo_file => true,
|
13
|
-
:memo_file_format => :fpt,
|
14
|
-
:field_count => 145,
|
15
|
-
:record_count => 34,
|
16
|
-
:record_length => 3907,
|
17
|
-
:testable_character_field_names => [],
|
18
|
-
:testable_date_field_names => [],
|
19
|
-
:testable_integer_field_names => ["IMAGENO"],
|
20
|
-
:testable_float_field_names => [],
|
21
|
-
:testable_logical_field_names => [],
|
22
|
-
:testable_memo_field_names => ["CREDIT"]
|
23
|
-
}
|
24
|
-
@dbf = DBF::Reader.new(File.join(File.dirname(__FILE__),'databases', 'visual_foxpro.dbf'))
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|