dbf 4.1.2 → 4.1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +30 -27
- data/Guardfile +1 -1
- data/LICENSE +1 -1
- data/README.md +8 -6
- data/bin/dbf +1 -1
- data/lib/dbf/column_type.rb +2 -7
- data/lib/dbf/table.rb +7 -1
- data/lib/dbf/version.rb +1 -1
- data/spec/dbf/column_spec.rb +10 -10
- data/spec/dbf/{database_spec.rb → database/foxpro_spec.rb} +0 -0
- data/spec/dbf/file_formats_spec.rb +4 -6
- data/spec/dbf/record_spec.rb +2 -2
- data/spec/dbf/table_spec.rb +8 -0
- data/spec/fixtures/polygon.dbf +0 -0
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c2ff24f150ee6567de0532c773695f8b47c0db811660e0f5f3be3d53a7cc053
|
4
|
+
data.tar.gz: 7006275aff71326833452546657bb07520d53024b6846b0c982121a488cd8235
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2d4bffa8201a8fa07abf642e721523e7ed59bb2b3e9a0fae31fe5ce6a4a3078f1520eb09e350d979dd88a68801c7c52d3236c402f83a41da1e5e6c4bca39911
|
7
|
+
data.tar.gz: fddf6622338b52b4bb6006513a92d9fd44c8f1e864738fd597d7e9f3fc21bcd86707f5e68e76216bd4c6d3be7dad9a48e5e19d55a6728691f6d90d86ec6db25e
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
@@ -4,11 +4,13 @@ source 'https://rubygems.org'
|
|
4
4
|
group :development, :test do
|
5
5
|
gem 'awesome_print'
|
6
6
|
gem 'byebug'
|
7
|
+
gem 'e2mmap'
|
7
8
|
gem 'guard'
|
8
9
|
gem 'guard-rspec'
|
9
10
|
gem 'irb'
|
10
11
|
gem 'rake'
|
11
12
|
gem 'rspec'
|
12
13
|
gem 'rubocop'
|
14
|
+
gem 'rubocop-performance'
|
13
15
|
gem 'rubocop-rspec'
|
14
16
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
dbf (4.1.
|
4
|
+
dbf (4.1.3)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
9
|
ast (2.4.0)
|
10
10
|
awesome_print (1.8.0)
|
11
|
-
byebug (
|
11
|
+
byebug (11.0.1)
|
12
12
|
coderay (1.1.2)
|
13
13
|
diff-lcs (1.3)
|
14
|
-
|
14
|
+
e2mmap (0.1.0)
|
15
|
+
ffi (1.11.1)
|
15
16
|
formatador (0.2.5)
|
16
|
-
guard (2.
|
17
|
+
guard (2.15.0)
|
17
18
|
formatador (>= 0.2.4)
|
18
19
|
listen (>= 2.7, < 4.0)
|
19
20
|
lumberjack (>= 1.0.12, < 2.0)
|
@@ -28,57 +29,57 @@ GEM
|
|
28
29
|
guard-compat (~> 1.1)
|
29
30
|
rspec (>= 2.99.0, < 4.0)
|
30
31
|
irb (1.0.0)
|
31
|
-
jaro_winkler (1.5.
|
32
|
+
jaro_winkler (1.5.3)
|
32
33
|
listen (3.1.5)
|
33
34
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
34
35
|
rb-inotify (~> 0.9, >= 0.9.7)
|
35
36
|
ruby_dep (~> 1.2)
|
36
37
|
lumberjack (1.0.13)
|
37
|
-
method_source (0.9.
|
38
|
+
method_source (0.9.2)
|
38
39
|
nenv (0.3.0)
|
39
40
|
notiffany (0.1.1)
|
40
41
|
nenv (~> 0.1)
|
41
42
|
shellany (~> 0.0)
|
42
|
-
parallel (1.
|
43
|
-
parser (2.
|
43
|
+
parallel (1.17.0)
|
44
|
+
parser (2.6.3.0)
|
44
45
|
ast (~> 2.4.0)
|
45
|
-
|
46
|
-
pry (0.11.3)
|
46
|
+
pry (0.12.2)
|
47
47
|
coderay (~> 1.1.0)
|
48
48
|
method_source (~> 0.9.0)
|
49
49
|
rainbow (3.0.0)
|
50
|
-
rake (12.3.
|
50
|
+
rake (12.3.2)
|
51
51
|
rb-fsevent (0.10.3)
|
52
|
-
rb-inotify (0.
|
53
|
-
ffi (
|
52
|
+
rb-inotify (0.10.0)
|
53
|
+
ffi (~> 1.0)
|
54
54
|
rspec (3.8.0)
|
55
55
|
rspec-core (~> 3.8.0)
|
56
56
|
rspec-expectations (~> 3.8.0)
|
57
57
|
rspec-mocks (~> 3.8.0)
|
58
|
-
rspec-core (3.8.
|
58
|
+
rspec-core (3.8.2)
|
59
59
|
rspec-support (~> 3.8.0)
|
60
|
-
rspec-expectations (3.8.
|
60
|
+
rspec-expectations (3.8.4)
|
61
61
|
diff-lcs (>= 1.2.0, < 2.0)
|
62
62
|
rspec-support (~> 3.8.0)
|
63
|
-
rspec-mocks (3.8.
|
63
|
+
rspec-mocks (3.8.1)
|
64
64
|
diff-lcs (>= 1.2.0, < 2.0)
|
65
65
|
rspec-support (~> 3.8.0)
|
66
|
-
rspec-support (3.8.
|
67
|
-
rubocop (0.
|
66
|
+
rspec-support (3.8.2)
|
67
|
+
rubocop (0.73.0)
|
68
68
|
jaro_winkler (~> 1.5.1)
|
69
69
|
parallel (~> 1.10)
|
70
|
-
parser (>= 2.
|
71
|
-
powerpack (~> 0.1)
|
70
|
+
parser (>= 2.6)
|
72
71
|
rainbow (>= 2.2.2, < 4.0)
|
73
72
|
ruby-progressbar (~> 1.7)
|
74
|
-
unicode-display_width (
|
75
|
-
rubocop-
|
76
|
-
rubocop (>= 0.
|
77
|
-
|
73
|
+
unicode-display_width (>= 1.4.0, < 1.7)
|
74
|
+
rubocop-performance (1.4.0)
|
75
|
+
rubocop (>= 0.71.0)
|
76
|
+
rubocop-rspec (1.33.0)
|
77
|
+
rubocop (>= 0.60.0)
|
78
|
+
ruby-progressbar (1.10.1)
|
78
79
|
ruby_dep (1.5.0)
|
79
80
|
shellany (0.0.1)
|
80
|
-
thor (0.20.
|
81
|
-
unicode-display_width (1.
|
81
|
+
thor (0.20.3)
|
82
|
+
unicode-display_width (1.6.0)
|
82
83
|
|
83
84
|
PLATFORMS
|
84
85
|
ruby
|
@@ -87,13 +88,15 @@ DEPENDENCIES
|
|
87
88
|
awesome_print
|
88
89
|
byebug
|
89
90
|
dbf!
|
91
|
+
e2mmap
|
90
92
|
guard
|
91
93
|
guard-rspec
|
92
94
|
irb
|
93
95
|
rake
|
94
96
|
rspec
|
95
97
|
rubocop
|
98
|
+
rubocop-performance
|
96
99
|
rubocop-rspec
|
97
100
|
|
98
101
|
BUNDLED WITH
|
99
|
-
1.
|
102
|
+
2.1.4
|
data/Guardfile
CHANGED
@@ -6,6 +6,6 @@ guard :rspec, cmd: 'bundle exec rspec' do
|
|
6
6
|
# watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
7
7
|
watch(%r{^lib/(.+)\.rb$}) { 'spec' }
|
8
8
|
watch('spec/spec_helper.rb') { 'spec' }
|
9
|
-
watch(/
|
9
|
+
watch(%r{spec/fixtures/(.+)}) { 'spec' }
|
10
10
|
watch('Guardfile') { 'spec' }
|
11
11
|
end
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -16,15 +16,17 @@ database files
|
|
16
16
|
subject line
|
17
17
|
* Change log: <https://github.com/infused/dbf/blob/master/CHANGELOG.md>
|
18
18
|
|
19
|
-
NOTE: Beginning with version 4 we have dropped support for Ruby 2.0, 2.1, 2.2, and 2.3. If you need support for these older Rubies,
|
19
|
+
NOTE: Beginning with version 4 we have dropped support for Ruby 2.0, 2.1, 2.2, and 2.3. If you need support for these older Rubies,
|
20
|
+
please use 3.0.x (https://github.com/infused.org/dbf/tree/3_stable)
|
20
21
|
|
21
|
-
NOTE: Beginning with version 3 we have dropped support for Ruby 1.8 and 1.9. If you need support for older Rubies,
|
22
|
+
NOTE: Beginning with version 3 we have dropped support for Ruby 1.8 and 1.9. If you need support for older Rubies,
|
23
|
+
please use 2.0.x (https://github.com/infused/dbf/tree/2_stable)
|
22
24
|
|
23
25
|
## Compatibility
|
24
26
|
|
25
27
|
DBF is tested to work with the following versions of Ruby:
|
26
28
|
|
27
|
-
* Ruby 2.4.x, 2.5.x, 2.6.x
|
29
|
+
* Ruby 2.4.x, 2.5.x, 2.6.x, 2.7.x
|
28
30
|
|
29
31
|
## Installation
|
30
32
|
|
@@ -209,7 +211,7 @@ Sequel.migration do
|
|
209
211
|
end
|
210
212
|
```
|
211
213
|
|
212
|
-
If you have
|
214
|
+
If you have initialized the DBF::Table with raw data, you will need to set the
|
213
215
|
exported table name manually:
|
214
216
|
|
215
217
|
```ruby
|
@@ -227,7 +229,7 @@ A small command-line utility called dbf is installed along with the gem.
|
|
227
229
|
-s = print summary information
|
228
230
|
-a = create an ActiveRecord::Schema
|
229
231
|
-r = create a Sequel Migration
|
230
|
-
-c =
|
232
|
+
-c = export as CSV
|
231
233
|
|
232
234
|
Create an executable ActiveRecord schema:
|
233
235
|
|
@@ -273,7 +275,7 @@ for a full list of supported column types.
|
|
273
275
|
|
274
276
|
## License
|
275
277
|
|
276
|
-
Copyright (c) 2006-
|
278
|
+
Copyright (c) 2006-2020 Keith Morrison <<keithm@infused.org>>
|
277
279
|
|
278
280
|
Permission is hereby granted, free of charge, to any person
|
279
281
|
obtaining a copy of this software and associated documentation
|
data/bin/dbf
CHANGED
data/lib/dbf/column_type.rb
CHANGED
@@ -1,11 +1,6 @@
|
|
1
1
|
module DBF
|
2
2
|
module ColumnType
|
3
3
|
class Base
|
4
|
-
ENCODING_ARGS = [
|
5
|
-
Encoding.default_external,
|
6
|
-
{undef: :replace, invalid: :replace}
|
7
|
-
].freeze
|
8
|
-
|
9
4
|
attr_reader :decimal, :encoding
|
10
5
|
|
11
6
|
def initialize(decimal, encoding)
|
@@ -79,7 +74,7 @@ module DBF
|
|
79
74
|
class Memo < Base
|
80
75
|
def type_cast(value)
|
81
76
|
if encoding && !value.nil?
|
82
|
-
value.force_encoding(@encoding).encode(
|
77
|
+
value.force_encoding(@encoding).encode(Encoding.default_external, undef: :replace, invalid: :replace)
|
83
78
|
else
|
84
79
|
value
|
85
80
|
end
|
@@ -95,7 +90,7 @@ module DBF
|
|
95
90
|
class String < Base
|
96
91
|
def type_cast(value)
|
97
92
|
value = value.strip
|
98
|
-
@encoding ? value.force_encoding(@encoding).encode(
|
93
|
+
@encoding ? value.force_encoding(@encoding).encode(Encoding.default_external, undef: :replace, invalid: :replace) : value
|
99
94
|
end
|
100
95
|
end
|
101
96
|
end
|
data/lib/dbf/table.rb
CHANGED
@@ -2,6 +2,9 @@ module DBF
|
|
2
2
|
class FileNotFoundError < StandardError
|
3
3
|
end
|
4
4
|
|
5
|
+
class NoColumnsDefined < StandardError
|
6
|
+
end
|
7
|
+
|
5
8
|
# DBF::Table is the primary interface to a single DBF file and provides
|
6
9
|
# methods for enumerating and searching the records.
|
7
10
|
class Table
|
@@ -175,10 +178,13 @@ module DBF
|
|
175
178
|
# @param [Integer] index
|
176
179
|
# @return [DBF::Record, NilClass]
|
177
180
|
def record(index)
|
181
|
+
raise DBF::NoColumnsDefined, 'The DBF file has no columns defined' if columns.empty?
|
182
|
+
|
178
183
|
seek_to_record(index)
|
179
184
|
return nil if deleted_record?
|
180
185
|
|
181
|
-
|
186
|
+
record_data = @data.read(record_length)
|
187
|
+
DBF::Record.new(record_data, columns, version, @memo)
|
182
188
|
end
|
183
189
|
|
184
190
|
alias row record
|
data/lib/dbf/version.rb
CHANGED
data/spec/dbf/column_spec.rb
CHANGED
@@ -52,14 +52,14 @@ RSpec.describe DBF::Column do
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
-
context '
|
55
|
+
context 'with 0 length' do
|
56
56
|
it 'returns nil' do
|
57
57
|
column = DBF::Column.new table, 'ColumnName', 'N', 0, 0
|
58
58
|
expect(column.type_cast('')).to be_nil
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
context '
|
62
|
+
context 'with 0 decimals' do
|
63
63
|
it 'casts value to Integer' do
|
64
64
|
value = '135'
|
65
65
|
column = DBF::Column.new table, 'ColumnName', 'N', 3, 0
|
@@ -73,7 +73,7 @@ RSpec.describe DBF::Column do
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
-
context '
|
76
|
+
context 'with more than 0 decimals' do
|
77
77
|
it 'casts value to Float' do
|
78
78
|
value = '13.5'
|
79
79
|
column = DBF::Column.new table, 'ColumnName', 'N', 2, 1
|
@@ -89,7 +89,7 @@ RSpec.describe DBF::Column do
|
|
89
89
|
end
|
90
90
|
|
91
91
|
context 'with type F (float)' do
|
92
|
-
context '
|
92
|
+
context 'with 0 length' do
|
93
93
|
it 'returns nil' do
|
94
94
|
column = DBF::Column.new table, 'ColumnName', 'F', 0, 0
|
95
95
|
expect(column.type_cast('')).to be_nil
|
@@ -132,7 +132,7 @@ RSpec.describe DBF::Column do
|
|
132
132
|
end
|
133
133
|
|
134
134
|
context 'with type I (integer)' do
|
135
|
-
context '
|
135
|
+
context 'with 0 length' do
|
136
136
|
it 'returns nil' do
|
137
137
|
column = DBF::Column.new table, 'ColumnName', 'I', 0, 0
|
138
138
|
expect(column.type_cast('')).to be_nil
|
@@ -167,7 +167,7 @@ RSpec.describe DBF::Column do
|
|
167
167
|
expect(column.type_cast('n')).to be false
|
168
168
|
end
|
169
169
|
|
170
|
-
context '
|
170
|
+
context 'with 0 length' do
|
171
171
|
it 'returns nil' do
|
172
172
|
column = DBF::Column.new table, 'ColumnName', 'L', 0, 0
|
173
173
|
expect(column.type_cast('')).to be_nil
|
@@ -232,7 +232,7 @@ RSpec.describe DBF::Column do
|
|
232
232
|
expect(column.type_cast(nil)).to be_nil
|
233
233
|
end
|
234
234
|
|
235
|
-
context '
|
235
|
+
context 'with 0 length' do
|
236
236
|
it 'returns nil' do
|
237
237
|
column = DBF::Column.new table, 'ColumnName', 'M', 0, 0
|
238
238
|
expect(column.type_cast('')).to be_nil
|
@@ -252,7 +252,7 @@ RSpec.describe DBF::Column do
|
|
252
252
|
expect(column.type_cast(nil)).to be_nil
|
253
253
|
end
|
254
254
|
|
255
|
-
context '
|
255
|
+
context 'with 0 length' do
|
256
256
|
it 'returns nil' do
|
257
257
|
column = DBF::Column.new table, 'ColumnName', 'G', 0, 0
|
258
258
|
expect(column.type_cast('')).to be_nil
|
@@ -276,7 +276,7 @@ RSpec.describe DBF::Column do
|
|
276
276
|
expect(column.type_cast("pN'9\xFF\xFF\xFF\xFF")).to eq(-333_609.0)
|
277
277
|
end
|
278
278
|
|
279
|
-
context '
|
279
|
+
context 'with 0 length' do
|
280
280
|
it 'returns nil' do
|
281
281
|
column = DBF::Column.new table, 'ColumnName', 'Y', 0, 0
|
282
282
|
expect(column.type_cast('')).to be_nil
|
@@ -284,7 +284,7 @@ RSpec.describe DBF::Column do
|
|
284
284
|
end
|
285
285
|
end
|
286
286
|
|
287
|
-
|
287
|
+
describe '#name' do
|
288
288
|
it 'contains only ASCII characters' do
|
289
289
|
column = DBF::Column.new table, "--\x1F-\x68\x65\x6C\x6C\x6F world-\x80--", 'N', 1, 0
|
290
290
|
expect(column.name).to eq '---hello world---'
|
File without changes
|
@@ -1,17 +1,15 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.shared_examples_for 'DBF' do
|
4
|
-
|
5
|
-
|
6
|
-
sum_of_column_lengths = table.columns.inject(1) { |sum, column| sum += column.length }
|
4
|
+
let(:header_record_length) { table.instance_eval { header.record_length } }
|
5
|
+
let(:sum_of_column_lengths) { table.columns.inject(1) { |sum, column| sum + column.length } }
|
7
6
|
|
7
|
+
specify 'sum of column lengths should equal record length specified in header plus one' do
|
8
8
|
expect(header_record_length).to eq sum_of_column_lengths
|
9
9
|
end
|
10
10
|
|
11
11
|
specify 'records should be instances of DBF::Record' do
|
12
|
-
table.
|
13
|
-
expect(record).to be_kind_of(DBF::Record)
|
14
|
-
end
|
12
|
+
expect(table).to all be_kind_of(DBF::Record)
|
15
13
|
end
|
16
14
|
|
17
15
|
specify 'record count should be the same as reported in the header' do
|
data/spec/dbf/record_spec.rb
CHANGED
@@ -44,13 +44,13 @@ RSpec.describe DBF::Record do
|
|
44
44
|
|
45
45
|
describe 'when other does not have attributes' do
|
46
46
|
it 'returns false' do
|
47
|
-
expect((record ==
|
47
|
+
expect((record == instance_double('DBF::Record'))).to be_falsey
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
51
|
describe 'if other attributes match' do
|
52
52
|
let(:attributes) { {x: 1, y: 2} }
|
53
|
-
let(:other) {
|
53
|
+
let(:other) { instance_double('DBF::Record', attributes: attributes) }
|
54
54
|
|
55
55
|
before do
|
56
56
|
allow(record).to receive(:attributes).and_return(attributes)
|
data/spec/dbf/table_spec.rb
CHANGED
@@ -147,6 +147,14 @@ RSpec.describe DBF::Table do
|
|
147
147
|
allow(table).to receive(:deleted_record?).and_return(true)
|
148
148
|
expect(table.record(5)).to be_nil
|
149
149
|
end
|
150
|
+
|
151
|
+
describe 'when dbf has no column definitions' do
|
152
|
+
let(:dbf_path) { fixture('polygon.dbf') }
|
153
|
+
|
154
|
+
it 'raises a DBF::NoColumnsDefined error' do
|
155
|
+
expect { DBF::Table.new(dbf_path).record(1) }.to raise_error(DBF::NoColumnsDefined, 'The DBF file has no columns defined')
|
156
|
+
end
|
157
|
+
end
|
150
158
|
end
|
151
159
|
|
152
160
|
describe '#current_record' do
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dbf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.1.
|
4
|
+
version: 4.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keith Morrison
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A small fast library for reading dBase, xBase, Clipper and FoxPro database
|
14
14
|
files.
|
@@ -48,7 +48,7 @@ files:
|
|
48
48
|
- lib/dbf/table.rb
|
49
49
|
- lib/dbf/version.rb
|
50
50
|
- spec/dbf/column_spec.rb
|
51
|
-
- spec/dbf/
|
51
|
+
- spec/dbf/database/foxpro_spec.rb
|
52
52
|
- spec/dbf/file_formats_spec.rb
|
53
53
|
- spec/dbf/record_spec.rb
|
54
54
|
- spec/dbf/table_spec.rb
|
@@ -90,12 +90,13 @@ files:
|
|
90
90
|
- spec/fixtures/foxprodb/setup.dbf
|
91
91
|
- spec/fixtures/foxprodb/types.CDX
|
92
92
|
- spec/fixtures/foxprodb/types.dbf
|
93
|
+
- spec/fixtures/polygon.dbf
|
93
94
|
- spec/spec_helper.rb
|
94
95
|
homepage: http://github.com/infused/dbf
|
95
96
|
licenses:
|
96
97
|
- MIT
|
97
98
|
metadata: {}
|
98
|
-
post_install_message:
|
99
|
+
post_install_message:
|
99
100
|
rdoc_options:
|
100
101
|
- "--charset=UTF-8"
|
101
102
|
require_paths:
|
@@ -111,13 +112,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
112
|
- !ruby/object:Gem::Version
|
112
113
|
version: 1.3.0
|
113
114
|
requirements: []
|
114
|
-
rubygems_version: 3.
|
115
|
-
signing_key:
|
115
|
+
rubygems_version: 3.1.2
|
116
|
+
signing_key:
|
116
117
|
specification_version: 4
|
117
118
|
summary: Read xBase files
|
118
119
|
test_files:
|
120
|
+
- spec/dbf/database/foxpro_spec.rb
|
119
121
|
- spec/dbf/file_formats_spec.rb
|
120
|
-
- spec/dbf/database_spec.rb
|
121
122
|
- spec/dbf/column_spec.rb
|
122
123
|
- spec/dbf/record_spec.rb
|
123
124
|
- spec/dbf/table_spec.rb
|