dbf 1.0.6 → 1.0.7
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/History.txt +4 -0
- data/README.txt +8 -6
- data/Rakefile +2 -1
- data/dbf.gemspec +9 -6
- data/lib/dbf.rb +1 -0
- data/lib/dbf/column.rb +1 -1
- data/lib/dbf/globals.rb +7 -7
- data/lib/dbf/record.rb +26 -31
- data/lib/dbf/table.rb +1 -1
- data/spec/unit/record_spec.rb +29 -5
- data/spec/unit/table_spec.rb +1 -1
- metadata +13 -3
data/History.txt
CHANGED
data/README.txt
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
DBF is a small fast library for reading dBase, xBase, Clipper and FoxPro database files. It is written completely in Ruby and has no external dependencies.
|
4
4
|
|
5
|
-
Copyright (c) 2006-
|
5
|
+
Copyright (c) 2006-2008 Keith Morrison <keithm@infused.org, www.infused.org>
|
6
6
|
|
7
7
|
* Official project page: http://rubyforge.org/projects/dbf
|
8
8
|
* API Documentation: http://dbf.rubyforge.org/docs
|
@@ -14,11 +14,8 @@ Copyright (c) 2006-2007 Keith Morrison <keithm@infused.org, www.infused.org>
|
|
14
14
|
|
15
15
|
* No external dependencies
|
16
16
|
* Fields are type cast to the appropriate Ruby types
|
17
|
-
* Date/Time fields are returned as either a Time or Date object. Date
|
18
|
-
will only be used if the date is out of range for Ruby's built in Time
|
19
|
-
class.
|
20
17
|
* Ability to dump the database schema in the portable ActiveRecord::Schema
|
21
|
-
format
|
18
|
+
format
|
22
19
|
|
23
20
|
== Installation
|
24
21
|
|
@@ -29,7 +26,12 @@ Copyright (c) 2006-2007 Keith Morrison <keithm@infused.org, www.infused.org>
|
|
29
26
|
require 'rubygems'
|
30
27
|
require 'dbf'
|
31
28
|
|
32
|
-
table = DBF::Table.new("
|
29
|
+
table = DBF::Table.new("widgets.dbf")
|
30
|
+
|
31
|
+
# Tables are enumerable
|
32
|
+
widget_ids = table.map { |row| row.id }
|
33
|
+
abc_names = table.select { |row| row.name =~ /^[a-cA-C] }
|
34
|
+
sorted = table.sort_by { |row| row.name }
|
33
35
|
|
34
36
|
# Print the 'name' field from record number 4
|
35
37
|
puts table.record(4).name
|
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 = "1.0.
|
5
|
+
PKG_VERSION = "1.0.7"
|
6
6
|
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
7
7
|
|
8
8
|
Hoe.new PKG_NAME, PKG_VERSION do |p|
|
@@ -15,6 +15,7 @@ Hoe.new PKG_NAME, PKG_VERSION do |p|
|
|
15
15
|
p.url = "http://github.com/infused/dm-dbf/tree/master"
|
16
16
|
p.need_tar = true
|
17
17
|
p.need_zip = true
|
18
|
+
p.extra_deps << ['activesupport', '>= 2.1.0']
|
18
19
|
end
|
19
20
|
|
20
21
|
task :default => :spec
|
data/dbf.gemspec
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
(in /Users/keithm/projects/dbf)
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = %q{dbf}
|
4
|
-
s.version = "1.0.
|
4
|
+
s.version = "1.0.7"
|
5
5
|
|
6
6
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
7
7
|
s.authors = ["Keith Morrison"]
|
8
|
-
s.date = %q{2008-
|
8
|
+
s.date = %q{2008-09-02}
|
9
9
|
s.default_executable = %q{dbf}
|
10
|
-
s.description = %q{DBF is a small fast library for reading dBase, xBase, Clipper and FoxPro database files. It is written completely in Ruby and has no external dependencies. Copyright (c) 2006-
|
10
|
+
s.description = %q{DBF is a small fast library for reading dBase, xBase, Clipper and FoxPro database files. It is written completely in Ruby and has no external dependencies. Copyright (c) 2006-2008 Keith Morrison <keithm@infused.org, www.infused.org> * Official project page: http://rubyforge.org/projects/dbf * API Documentation: http://dbf.rubyforge.org/docs * To report bugs: http://www.rubyforge.org/tracker/?group_id=2009 * Questions: Email keithm@infused.org and put DBF somewhere in the subject line}
|
11
11
|
s.email = %q{keithm@infused.org}
|
12
12
|
s.executables = ["dbf"]
|
13
13
|
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.txt", "spec/fixtures/dbase_83_schema.txt"]
|
@@ -25,11 +25,14 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.specification_version = 2
|
26
26
|
|
27
27
|
if current_version >= 3 then
|
28
|
-
s.add_runtime_dependency(%q<
|
28
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 2.1.0"])
|
29
|
+
s.add_development_dependency(%q<hoe>, [">= 1.7.0"])
|
29
30
|
else
|
30
|
-
s.add_dependency(%q<
|
31
|
+
s.add_dependency(%q<activesupport>, [">= 2.1.0"])
|
32
|
+
s.add_dependency(%q<hoe>, [">= 1.7.0"])
|
31
33
|
end
|
32
34
|
else
|
33
|
-
s.add_dependency(%q<
|
35
|
+
s.add_dependency(%q<activesupport>, [">= 2.1.0"])
|
36
|
+
s.add_dependency(%q<hoe>, [">= 1.7.0"])
|
34
37
|
end
|
35
38
|
end
|
data/lib/dbf.rb
CHANGED
data/lib/dbf/column.rb
CHANGED
data/lib/dbf/globals.rb
CHANGED
@@ -25,12 +25,12 @@ module DBF
|
|
25
25
|
class DBFError < StandardError; end
|
26
26
|
|
27
27
|
module Helpers
|
28
|
-
def underscore(camel_cased_word)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
28
|
+
# def underscore(camel_cased_word)
|
29
|
+
# camel_cased_word.to_s.gsub(/::/, '/').
|
30
|
+
# gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
31
|
+
# gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
32
|
+
# tr("-", "_").
|
33
|
+
# downcase
|
34
|
+
# end
|
35
35
|
end
|
36
36
|
end
|
data/lib/dbf/record.rb
CHANGED
@@ -18,45 +18,40 @@ module DBF
|
|
18
18
|
|
19
19
|
def define_accessors
|
20
20
|
@table.columns.each do |column|
|
21
|
-
underscored_column_name =
|
21
|
+
underscored_column_name = column.name.underscore
|
22
22
|
unless respond_to?(underscored_column_name)
|
23
23
|
self.class.send :define_method, underscored_column_name do
|
24
|
-
@attributes[column.name]
|
24
|
+
@attributes[column.name.underscore]
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
def initialize_values(columns)
|
31
|
-
@attributes = {}
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
else
|
56
|
-
unpack_string(column).strip
|
57
|
-
end
|
58
|
-
@attributes[underscore(column.name)] = @attributes[column.name]
|
59
|
-
@attributes
|
31
|
+
@attributes = columns.inject({}) do |hash, column|
|
32
|
+
hash[column.name.underscore] = typecast_column(column)
|
33
|
+
hash
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def typecast_column(column)
|
38
|
+
case column.type
|
39
|
+
when 'N' # number
|
40
|
+
column.decimal.zero? ? unpack_string(column).to_i : unpack_string(column).to_f
|
41
|
+
when 'D' # date
|
42
|
+
raw = unpack_string(column).strip
|
43
|
+
raw.to_time unless raw.blank?
|
44
|
+
when 'M' # memo
|
45
|
+
starting_block = unpack_string(column).to_i
|
46
|
+
read_memo(starting_block)
|
47
|
+
when 'L' # logical
|
48
|
+
unpack_string(column) =~ /^(y|t)$/i ? true : false
|
49
|
+
when 'I' # integer
|
50
|
+
unpack_integer(column)
|
51
|
+
when 'T' # datetime
|
52
|
+
unpack_datetime(column)
|
53
|
+
else
|
54
|
+
unpack_string(column).strip
|
60
55
|
end
|
61
56
|
end
|
62
57
|
|
data/lib/dbf/table.rb
CHANGED
data/spec/unit/record_spec.rb
CHANGED
@@ -22,26 +22,26 @@ describe DBF::Record do
|
|
22
22
|
table = DBF::Table.new "#{DB_PATH}/dbase_83.dbf"
|
23
23
|
table.column("ID").type.should == "N"
|
24
24
|
table.column("ID").decimal.should == 0
|
25
|
-
table.records.all? {|record| record.attributes['
|
25
|
+
table.records.all? {|record| record.attributes['id'].should be_kind_of(Integer)}
|
26
26
|
end
|
27
27
|
|
28
28
|
it "should typecast number columns with decimals > 0 to Float" do
|
29
29
|
table = DBF::Table.new "#{DB_PATH}/dbase_83.dbf"
|
30
30
|
table.column("ID").type.should == "N"
|
31
31
|
table.column("COST").decimal.should == 2
|
32
|
-
table.records.all? {|record| record.attributes['
|
32
|
+
table.records.all? {|record| record.attributes['cost'].should be_kind_of(Float)}
|
33
33
|
end
|
34
34
|
|
35
35
|
it "should typecast memo columns to String" do
|
36
36
|
table = DBF::Table.new "#{DB_PATH}/dbase_83.dbf"
|
37
37
|
table.column("DESC").type.should == "M"
|
38
|
-
table.records.all? {|record| record.attributes['
|
38
|
+
table.records.all? {|record| record.attributes['desc'].should be_kind_of(String)}
|
39
39
|
end
|
40
40
|
|
41
41
|
it "should typecast logical columns to True or False" do
|
42
42
|
table = DBF::Table.new "#{DB_PATH}/dbase_30.dbf"
|
43
43
|
table.column("WEBINCLUDE").type.should == "L"
|
44
|
-
table.records.all? {|record| record.attributes["
|
44
|
+
table.records.all? {|record| record.attributes["webinclude"].should satisfy {|v| v == true || v == false}}
|
45
45
|
end
|
46
46
|
|
47
47
|
it "should typecast datetime columns to DateTime" do
|
@@ -94,7 +94,31 @@ describe DBF::Record do
|
|
94
94
|
|
95
95
|
record.send(:read_memo, 5).should be_nil
|
96
96
|
end
|
97
|
-
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "#typecase_column" do
|
100
|
+
before do
|
101
|
+
@table = mock_table
|
102
|
+
@column = mock('column')
|
103
|
+
@column.stub!(:name).and_return('created')
|
104
|
+
@column.stub!(:length).and_return(8)
|
105
|
+
@column.stub!(:type).and_return('D')
|
106
|
+
@table.stub!(:columns).and_return([@column])
|
107
|
+
@record = DBF::Record.new(@table)
|
108
|
+
end
|
109
|
+
|
110
|
+
describe 'when column is type D' do
|
111
|
+
it 'should return Time' do
|
112
|
+
@record.stub!(:unpack_string).and_return('20080606')
|
113
|
+
@record.send(:typecast_column, @column).should == Time.gm(2008, 6, 6)
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'should return Date if Time is out of range' do
|
117
|
+
@record.stub!(:unpack_string).and_return('19440606')
|
118
|
+
@record.send(:typecast_column, @column).should == Date.new(1944, 6, 6)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
98
122
|
end
|
99
123
|
|
100
124
|
end
|
data/spec/unit/table_spec.rb
CHANGED
@@ -56,7 +56,7 @@ describe DBF::Table do
|
|
56
56
|
end
|
57
57
|
|
58
58
|
it "should return matching records when used with options" do
|
59
|
-
@table.find(:all, "WEIGHT" => 0.0).should == @table.select {|r| r.attributes["
|
59
|
+
@table.find(:all, "WEIGHT" => 0.0).should == @table.select {|r| r.attributes["weight"] == 0.0}
|
60
60
|
end
|
61
61
|
|
62
62
|
it "with multiple options should search for all search terms as if using AND" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dbf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keith Morrison
|
@@ -9,9 +9,19 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-09-02 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: activesupport
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 2.1.0
|
24
|
+
version:
|
15
25
|
- !ruby/object:Gem::Dependency
|
16
26
|
name: hoe
|
17
27
|
type: :development
|
@@ -22,7 +32,7 @@ dependencies:
|
|
22
32
|
- !ruby/object:Gem::Version
|
23
33
|
version: 1.7.0
|
24
34
|
version:
|
25
|
-
description: "DBF is a small fast library for reading dBase, xBase, Clipper and FoxPro database files. It is written completely in Ruby and has no external dependencies. Copyright (c) 2006-
|
35
|
+
description: "DBF is a small fast library for reading dBase, xBase, Clipper and FoxPro database files. It is written completely in Ruby and has no external dependencies. Copyright (c) 2006-2008 Keith Morrison <keithm@infused.org, www.infused.org> * Official project page: http://rubyforge.org/projects/dbf * API Documentation: http://dbf.rubyforge.org/docs * To report bugs: http://www.rubyforge.org/tracker/?group_id=2009 * Questions: Email keithm@infused.org and put DBF somewhere in the subject line"
|
26
36
|
email: keithm@infused.org
|
27
37
|
executables:
|
28
38
|
- dbf
|