dbf 1.6.5 → 1.6.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,8 @@
1
+ # 1.6.6
2
+ - add binary data type support to ActiveRecord schema output
3
+
1
4
  # 1.6.5
2
- - experimental support for visual foxpro double (b) data type
5
+ - support for visual foxpro double (b) data type
3
6
 
4
7
  # 1.6.3
5
8
  - Replace invalid chars with 'unicode replacement character' (U+FFFD)
@@ -1,20 +1,74 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dbf (1.6.3)
4
+ dbf (1.6.5)
5
5
  fastercsv (~> 1.5.4)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
+ Saikuro (1.1.0)
11
+ activesupport (3.1.1)
12
+ multi_json (~> 1.0)
10
13
  archive-tar-minitar (0.5.2)
14
+ arrayfields (4.7.4)
15
+ chronic (0.3.0)
16
+ churn (0.0.13)
17
+ chronic (>= 0.2.3)
18
+ hirb
19
+ json_pure
20
+ main
21
+ ruby_parser (~> 2.0.4)
22
+ sexp_processor (~> 3.0.3)
23
+ colored (1.2)
11
24
  columnize (0.3.4)
12
25
  diff-lcs (1.1.3)
26
+ erubis (2.7.0)
13
27
  fastercsv (1.5.4)
28
+ fattr (2.2.0)
29
+ flay (1.4.3)
30
+ ruby_parser (~> 2.0)
31
+ sexp_processor (~> 3.0)
32
+ flog (2.5.3)
33
+ ruby_parser (~> 2.0)
34
+ sexp_processor (~> 3.0)
35
+ hirb (0.5.0)
36
+ i18n (0.6.0)
37
+ json_pure (1.6.1)
14
38
  linecache19 (0.5.12)
15
39
  ruby_core_source (>= 0.1.4)
40
+ main (4.7.1)
41
+ map (4.7.1)
42
+ metric_fu (2.1.1)
43
+ Saikuro (>= 1.1.0)
44
+ activesupport (>= 2.0.0)
45
+ chronic (~> 0.3.0)
46
+ churn (>= 0.0.7)
47
+ flay (>= 1.2.1)
48
+ flog (>= 2.3.0)
49
+ rails_best_practices (>= 0.6.4)
50
+ rcov (>= 0.8.3.3)
51
+ reek (>= 1.2.6)
52
+ roodi (>= 2.1.0)
53
+ syntax
54
+ multi_json (1.0.3)
55
+ progressbar (0.9.1)
56
+ rails_best_practices (1.2.0)
57
+ activesupport
58
+ colored
59
+ erubis
60
+ i18n
61
+ progressbar
62
+ sexp_processor
16
63
  rake (0.9.2)
64
+ rcov (0.9.11)
17
65
  rdoc (3.9.4)
66
+ reek (1.2.8)
67
+ ruby2ruby (~> 1.2)
68
+ ruby_parser (~> 2.0)
69
+ sexp_processor (~> 3.0)
70
+ roodi (2.1.0)
71
+ ruby_parser
18
72
  rspec (2.6.0)
19
73
  rspec-core (~> 2.6.0)
20
74
  rspec-expectations (~> 2.6.0)
@@ -31,14 +85,25 @@ GEM
31
85
  columnize (>= 0.3.1)
32
86
  linecache19 (>= 0.5.11)
33
87
  ruby-debug-base19 (>= 0.11.19)
88
+ ruby2ruby (1.3.1)
89
+ ruby_parser (~> 2.0)
90
+ sexp_processor (~> 3.0)
34
91
  ruby_core_source (0.1.5)
35
92
  archive-tar-minitar (>= 0.5.2)
93
+ ruby_parser (2.0.6)
94
+ sexp_processor (~> 3.0)
95
+ sexp_processor (3.0.7)
96
+ syntax (1.0.0)
36
97
 
37
98
  PLATFORMS
38
99
  ruby
39
100
 
40
101
  DEPENDENCIES
102
+ arrayfields
41
103
  dbf!
104
+ fattr
105
+ map
106
+ metric_fu
42
107
  rake (~> 0.9.2)
43
108
  rdoc (~> 3.9.0)
44
109
  rspec (~> 2.6.0)
data/Rakefile CHANGED
@@ -26,8 +26,8 @@ task :console do
26
26
  sh "irb -rubygems -I lib -r dbf.rb"
27
27
  end
28
28
 
29
- # require 'metric_fu'
30
- # MetricFu::Configuration.run do |config|
31
- # config.rcov[:test_files] = ['spec/**/*_spec.rb']
32
- # config.rcov[:rcov_opts] << "-Ispec"
33
- # end
29
+ require 'metric_fu'
30
+ MetricFu::Configuration.run do |config|
31
+ config.rcov[:test_files] = ['spec/**/*_spec.rb']
32
+ config.rcov[:rcov_opts] << "-Ispec"
33
+ end
@@ -9,9 +9,9 @@
9
9
  +---------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
10
10
  | 05 | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - | - | - |
11
11
  +---------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
12
- | 30 | Y | Y | Y | Y | - | Y | N | N | N | N | N | Y | N | N | N | N | - |
12
+ | 30 | Y | Y | Y | Y | - | Y | Y | N | N | N | N | Y | N | N | N | N | - |
13
13
  +---------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
14
- | 31 | Y | Y | Y | Y | Y | Y | N | N | N | N | N | Y | N | N | N | N | N |
14
+ | 31 | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | Y | N | N | N | N | N |
15
15
  +---------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
16
16
  | 7b | Y | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | - | - | - |
17
17
  +---------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
@@ -19,7 +19,7 @@
19
19
  +---------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
20
20
  | 8e | Y | Y | Y | Y | Y | - | - | - | - | - | - | - | - | N | - | - | - |
21
21
  +---------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
22
- | f5 | Y | Y | Y | Y | Y | Y | N | N | N | N | N | Y | N | N | N | N | N |
22
+ | f5 | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | Y | N | N | N | N | N |
23
23
  +---------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
24
- | fb | Y | Y | Y | Y | - | Y | N | N | N | N | N | Y | N | N | N | N | N |
24
+ | fb | Y | Y | Y | Y | - | Y | Y | N | N | N | N | Y | N | N | N | N | N |
25
25
  +---------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
@@ -13,8 +13,8 @@ module DBF
13
13
  # @param [String] type
14
14
  # @param [Fixnum] length
15
15
  # @param [Fixnum] decimal
16
- def initialize(name, type, length, decimal, encoding=nil)
17
- @name, @type, @length, @decimal, @encoding = clean(name), type, length, decimal, encoding
16
+ def initialize(name, type, length, decimal, version, encoding=nil)
17
+ @name, @type, @length, @decimal, @version, @encoding = clean(name), type, length, decimal, version, encoding
18
18
 
19
19
  raise ColumnLengthError, "field length must be greater than 0" unless length > 0
20
20
  raise ColumnNameError, "column name cannot be empty" if @name.length == 0
@@ -100,15 +100,21 @@ module DBF
100
100
  ":boolean"
101
101
  when "M"
102
102
  ":text"
103
+ when "B"
104
+ if DBF::Table::FOXPRO_VERSIONS.include?(@version)
105
+ decimal > 0 ? ":float" : ":integer"
106
+ else
107
+ ":text"
108
+ end
103
109
  else
104
110
  ":string, :limit => #{length}"
105
111
  end
106
112
  end
107
113
 
108
- def clean(s) #nodoc
109
- first_null = s.index("\x00")
110
- s = s[0, first_null] if first_null
111
- s.gsub(/[^\x20-\x7E]/, "")
114
+ def clean(value) #nodoc
115
+ first_null = value.index("\x00")
116
+ value = value[0, first_null] if first_null
117
+ value.gsub(/[^\x20-\x7E]/, "")
112
118
  end
113
119
 
114
120
  end
@@ -46,10 +46,11 @@ module DBF
46
46
 
47
47
  def define_accessors #nodoc
48
48
  @columns.each do |column|
49
- unless self.class.method_defined? column.underscored_name
49
+ name = column.underscored_name
50
+ unless respond_to? name
50
51
  self.class.class_eval <<-END
51
- def #{column.underscored_name}
52
- @#{column.underscored_name} ||= attributes['#{column.underscored_name}']
52
+ def #{name}
53
+ @#{name} ||= attributes['#{name}']
53
54
  end
54
55
  END
55
56
  end
@@ -168,17 +168,13 @@ module DBF
168
168
 
169
169
  # Retrieves column information from the database
170
170
  def columns
171
- column_class = FOXPRO_VERSIONS.include?(version) ? FoxproColumn : Column
172
-
173
171
  @columns ||= begin
174
- column_count = (@header_length - DBF_HEADER_SIZE + 1) / DBF_HEADER_SIZE
175
-
176
172
  @data.seek(DBF_HEADER_SIZE)
177
173
  columns = []
178
174
  column_count.times do
179
175
  name, type, length, decimal = @data.read(32).unpack('a10 x a x4 C2')
180
176
  if length > 0
181
- columns << column_class.new(name.strip, type, length, decimal, @encoding)
177
+ columns << column_class.new(name.strip, type, length, decimal, version, @encoding)
182
178
  end
183
179
  end
184
180
  columns
@@ -190,6 +186,14 @@ module DBF
190
186
  end
191
187
 
192
188
  private
189
+
190
+ def column_class
191
+ @column_class ||= FOXPRO_VERSIONS.include?(version) ? FoxproColumn : Column
192
+ end
193
+
194
+ def column_count
195
+ @column_count ||= (@header_length - DBF_HEADER_SIZE + 1) / DBF_HEADER_SIZE
196
+ end
193
197
 
194
198
  def open_memo(path) #nodoc
195
199
  files = Dir.glob("#{File.dirname(path)}/#{File.basename(path, '.*')}*.{fpt,FPT,dbt,DBT}")
@@ -1,3 +1,3 @@
1
1
  module DBF
2
- VERSION = '1.6.5'
2
+ VERSION = '1.6.6'
3
3
  end
@@ -3,7 +3,7 @@ require "spec_helper"
3
3
  describe DBF::Column do
4
4
 
5
5
  context "when initialized" do
6
- let(:column) { DBF::Column.new "ColumnName", "N", 1, 0 }
6
+ let(:column) { DBF::Column.new "ColumnName", "N", 1, 0, "30" }
7
7
 
8
8
  it "sets the #name accessor" do
9
9
  column.name.should == "ColumnName"
@@ -22,15 +22,15 @@ describe DBF::Column do
22
22
  end
23
23
 
24
24
  describe 'with length of 0' do
25
- specify { lambda { DBF::Column.new "ColumnName", "N", 0, 0 }.should raise_error(DBF::ColumnLengthError) }
25
+ specify { lambda { DBF::Column.new "ColumnName", "N", 0, 0, "30" }.should raise_error(DBF::ColumnLengthError) }
26
26
  end
27
27
 
28
28
  describe 'with length less than 0' do
29
- specify { lambda { DBF::Column.new "ColumnName", "N", -1, 0 }.should raise_error(DBF::ColumnLengthError) }
29
+ specify { lambda { DBF::Column.new "ColumnName", "N", -1, 0, "30" }.should raise_error(DBF::ColumnLengthError) }
30
30
  end
31
31
 
32
32
  describe 'with empty column name' do
33
- specify { lambda { DBF::Column.new "\xFF\xFC", "N", 1, 0 }.should raise_error(DBF::ColumnNameError) }
33
+ specify { lambda { DBF::Column.new "\xFF\xFC", "N", 1, 0, "30" }.should raise_error(DBF::ColumnNameError) }
34
34
  end
35
35
  end
36
36
 
@@ -39,7 +39,7 @@ describe DBF::Column do
39
39
  context 'and 0 decimals' do
40
40
  it 'casts value to Fixnum' do
41
41
  value = '135'
42
- column = DBF::Column.new "ColumnName", "N", 3, 0
42
+ column = DBF::Column.new "ColumnName", "N", 3, 0, "30"
43
43
  column.type_cast(value).should be_a Fixnum
44
44
  column.type_cast(value).should == 135
45
45
  end
@@ -48,7 +48,7 @@ describe DBF::Column do
48
48
  context 'and more than 0 decimals' do
49
49
  it 'casts value to Float' do
50
50
  value = '13.5'
51
- column = DBF::Column.new "ColumnName", "N", 2, 1
51
+ column = DBF::Column.new "ColumnName", "N", 2, 1, "30"
52
52
  column.type_cast(value).should be_a Float
53
53
  column.type_cast(value).should == 13.5
54
54
  end
@@ -58,7 +58,7 @@ describe DBF::Column do
58
58
  context 'with type F (float)' do
59
59
  it 'casts value to Float' do
60
60
  value = '135'
61
- column = DBF::Column.new "ColumnName", "F", 3, 0
61
+ column = DBF::Column.new "ColumnName", "F", 3, 0, "30"
62
62
  column.type_cast(value).should be_a Float
63
63
  column.type_cast(value).should == 135.0
64
64
  end
@@ -67,13 +67,13 @@ describe DBF::Column do
67
67
  context 'with type I (integer)' do
68
68
  it "casts value to Fixnum" do
69
69
  value = "\203\171\001\000"
70
- column = DBF::Column.new "ColumnName", "I", 3, 0
70
+ column = DBF::Column.new "ColumnName", "I", 3, 0, "30"
71
71
  column.type_cast(value).should == 96643
72
72
  end
73
73
  end
74
74
 
75
75
  context 'with type L (logical/boolean)' do
76
- let(:column) { DBF::Column.new "ColumnName", "L", 1, 0 }
76
+ let(:column) { DBF::Column.new "ColumnName", "L", 1, 0, "30" }
77
77
 
78
78
  it "casts 'y' to true" do
79
79
  column.type_cast('y').should == true
@@ -89,7 +89,7 @@ describe DBF::Column do
89
89
  end
90
90
 
91
91
  context 'with type T (datetime)' do
92
- let(:column) { DBF::Column.new "ColumnName", "T", 16, 0 }
92
+ let(:column) { DBF::Column.new "ColumnName", "T", 16, 0, "30" }
93
93
 
94
94
  context 'with valid datetime' do
95
95
  it "casts to DateTime" do
@@ -105,7 +105,7 @@ describe DBF::Column do
105
105
  end
106
106
 
107
107
  context 'with type D (date)' do
108
- let(:column) { DBF::Column.new "ColumnName", "D", 8, 0 }
108
+ let(:column) { DBF::Column.new "ColumnName", "D", 8, 0, "30" }
109
109
 
110
110
  context 'with valid date' do
111
111
  it "casts to Date" do
@@ -122,7 +122,7 @@ describe DBF::Column do
122
122
 
123
123
  context 'with type M (memo)' do
124
124
  it "casts to string" do
125
- column = DBF::Column.new "ColumnName", "M", 3, 0
125
+ column = DBF::Column.new "ColumnName", "M", 3, 0, "30"
126
126
  column.type_cast('abc').should be_a String
127
127
  end
128
128
  end
@@ -131,56 +131,78 @@ describe DBF::Column do
131
131
  context "#schema_definition" do
132
132
  context 'with type N (number)' do
133
133
  it "outputs an integer column" do
134
- column = DBF::Column.new "ColumnName", "N", 1, 0
134
+ column = DBF::Column.new "ColumnName", "N", 1, 0, "30"
135
135
  column.schema_definition.should == "\"column_name\", :integer\n"
136
136
  end
137
137
  end
138
138
 
139
+ context "with type B (binary)" do
140
+ context "with Foxpro dbf" do
141
+ context "when decimal is greater than 0" do
142
+ it "outputs an float column" do
143
+ column = DBF::Column.new "ColumnName", "B", 1, 2, "f5"
144
+ column.schema_definition.should == "\"column_name\", :float\n"
145
+ end
146
+ end
147
+
148
+ context "when decimal is 0" do
149
+ column = DBF::Column.new "ColumnName", "B", 1, 0, "f5"
150
+ column.schema_definition.should == "\"column_name\", :integer\n"
151
+ end
152
+ end
153
+
154
+ context "when non-Foxpro dbf" do
155
+ it "outputs a text column" do
156
+
157
+ end
158
+ end
159
+ end
160
+
139
161
  it "defines a float colmn if type is (N)umber with more than 0 decimals" do
140
- column = DBF::Column.new "ColumnName", "N", 1, 2
162
+ column = DBF::Column.new "ColumnName", "N", 1, 2, "30"
141
163
  column.schema_definition.should == "\"column_name\", :float\n"
142
164
  end
143
165
 
144
166
  it "defines a date column if type is (D)ate" do
145
- column = DBF::Column.new "ColumnName", "D", 8, 0
167
+ column = DBF::Column.new "ColumnName", "D", 8, 0, "30"
146
168
  column.schema_definition.should == "\"column_name\", :date\n"
147
169
  end
148
170
 
149
171
  it "defines a datetime column if type is (D)ate" do
150
- column = DBF::Column.new "ColumnName", "T", 16, 0
172
+ column = DBF::Column.new "ColumnName", "T", 16, 0, "30"
151
173
  column.schema_definition.should == "\"column_name\", :datetime\n"
152
174
  end
153
175
 
154
176
  it "defines a boolean column if type is (L)ogical" do
155
- column = DBF::Column.new "ColumnName", "L", 1, 0
177
+ column = DBF::Column.new "ColumnName", "L", 1, 0, "30"
156
178
  column.schema_definition.should == "\"column_name\", :boolean\n"
157
179
  end
158
180
 
159
181
  it "defines a text column if type is (M)emo" do
160
- column = DBF::Column.new "ColumnName", "M", 1, 0
182
+ column = DBF::Column.new "ColumnName", "M", 1, 0, "30"
161
183
  column.schema_definition.should == "\"column_name\", :text\n"
162
184
  end
163
185
 
164
186
  it "defines a string column with length for any other data types" do
165
- column = DBF::Column.new "ColumnName", "X", 20, 0
187
+ column = DBF::Column.new "ColumnName", "X", 20, 0, "30"
166
188
  column.schema_definition.should == "\"column_name\", :string, :limit => 20\n"
167
189
  end
168
190
  end
169
191
 
170
192
  context "#name" do
171
193
  it "contains only ASCII characters" do
172
- column = DBF::Column.new "--\x1F-\x68\x65\x6C\x6C\x6F world-\x80--", "N", 1, 0
194
+ column = DBF::Column.new "--\x1F-\x68\x65\x6C\x6C\x6F world-\x80--", "N", 1, 0, "30"
173
195
  column.name.should == "---hello world---"
174
196
  end
175
197
 
176
198
  it "is truncated at the null character" do
177
- column = DBF::Column.new "--\x1F-\x68\x65\x6C\x6C\x6F \x00 world-\x80--", "N", 1, 0
199
+ column = DBF::Column.new "--\x1F-\x68\x65\x6C\x6C\x6F \x00 world-\x80--", "N", 1, 0, "30"
178
200
  column.name.should == "---hello "
179
201
  end
180
202
  end
181
203
 
182
204
  context '#decode_date' do
183
- let(:column) { DBF::Column.new "ColumnName", "N", 1, 0 }
205
+ let(:column) { DBF::Column.new "ColumnName", "N", 1, 0, "30" }
184
206
 
185
207
  it 'is nil if value is blank' do
186
208
  column.send(:decode_date, '').should be_nil
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.6.5
4
+ version: 1.6.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-28 00:00:00.000000000Z
12
+ date: 2011-10-30 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fastercsv
16
- requirement: &70356603269760 !ruby/object:Gem::Requirement
16
+ requirement: &70121607557520 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.5.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70356603269760
24
+ version_requirements: *70121607557520
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &70356603269300 !ruby/object:Gem::Requirement
27
+ requirement: &70121607556660 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 2.6.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70356603269300
35
+ version_requirements: *70121607556660
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &70356603268820 !ruby/object:Gem::Requirement
38
+ requirement: &70121607555460 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.9.2
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70356603268820
46
+ version_requirements: *70121607555460
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rdoc
49
- requirement: &70356603268320 !ruby/object:Gem::Requirement
49
+ requirement: &70121607554600 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 3.9.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70356603268320
57
+ version_requirements: *70121607554600
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: ruby-debug19
60
- requirement: &70356603267840 !ruby/object:Gem::Requirement
60
+ requirement: &70121607553520 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,51 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70356603267840
68
+ version_requirements: *70121607553520
69
+ - !ruby/object:Gem::Dependency
70
+ name: metric_fu
71
+ requirement: &70121607552460 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70121607552460
80
+ - !ruby/object:Gem::Dependency
81
+ name: fattr
82
+ requirement: &70121607551860 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *70121607551860
91
+ - !ruby/object:Gem::Dependency
92
+ name: arrayfields
93
+ requirement: &70121607551280 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *70121607551280
102
+ - !ruby/object:Gem::Dependency
103
+ name: map
104
+ requirement: &70121607550460 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *70121607550460
69
113
  description: A small fast library for reading dBase, xBase, Clipper and FoxPro database
70
114
  files.
71
115
  email: keithm@infused.org