dbf 1.6.5 → 1.6.6

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