dbf 4.1.5 → 4.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +164 -108
  3. data/Gemfile.lock +43 -40
  4. data/README.md +18 -17
  5. data/Rakefile +1 -1
  6. data/ci_A.dbf +0 -0
  7. data/lib/dbf/column.rb +3 -3
  8. data/lib/dbf/column_type.rb +9 -12
  9. data/lib/dbf/table.rb +17 -8
  10. data/lib/dbf/version.rb +1 -1
  11. data/nBOOKS.DBF +0 -0
  12. data/spec/dbf/column_spec.rb +3 -3
  13. data/spec/dbf/file_formats_spec.rb +36 -0
  14. data/spec/fixtures/dbase_02_summary.txt +23 -0
  15. data/spec/fixtures/dbase_32.dbf +0 -0
  16. data/spec/fixtures/dbase_32_summary.txt +11 -0
  17. data/spec/fixtures/dbase_8c.dbf +0 -0
  18. metadata +10 -52
  19. data/Gemfile.travis +0 -8
  20. data/docs/CNAME +0 -1
  21. data/docs/DBF/Column/LengthError.html +0 -124
  22. data/docs/DBF/Column/NameError.html +0 -124
  23. data/docs/DBF/Column.html +0 -947
  24. data/docs/DBF/ColumnType/Base.html +0 -389
  25. data/docs/DBF/ColumnType/Boolean.html +0 -238
  26. data/docs/DBF/ColumnType/Currency.html +0 -238
  27. data/docs/DBF/ColumnType/Date.html +0 -242
  28. data/docs/DBF/ColumnType/DateTime.html +0 -246
  29. data/docs/DBF/ColumnType/Double.html +0 -238
  30. data/docs/DBF/ColumnType/Float.html +0 -238
  31. data/docs/DBF/ColumnType/General.html +0 -238
  32. data/docs/DBF/ColumnType/Memo.html +0 -246
  33. data/docs/DBF/ColumnType/Nil.html +0 -238
  34. data/docs/DBF/ColumnType/Number.html +0 -242
  35. data/docs/DBF/ColumnType/SignedLong.html +0 -238
  36. data/docs/DBF/ColumnType/String.html +0 -240
  37. data/docs/DBF/ColumnType.html +0 -115
  38. data/docs/DBF/Database/Foxpro.html +0 -653
  39. data/docs/DBF/Database/Table.html +0 -346
  40. data/docs/DBF/Database.html +0 -126
  41. data/docs/DBF/FileNotFoundError.html +0 -124
  42. data/docs/DBF/Header.html +0 -723
  43. data/docs/DBF/Memo/Base.html +0 -485
  44. data/docs/DBF/Memo/Dbase3.html +0 -242
  45. data/docs/DBF/Memo/Dbase4.html +0 -230
  46. data/docs/DBF/Memo/Foxpro.html +0 -268
  47. data/docs/DBF/Memo.html +0 -117
  48. data/docs/DBF/NoColumnsDefined.html +0 -124
  49. data/docs/DBF/Record.html +0 -773
  50. data/docs/DBF/Schema.html +0 -980
  51. data/docs/DBF/Table.html +0 -1571
  52. data/docs/DBF.html +0 -200
  53. data/docs/_index.html +0 -415
  54. data/docs/class_list.html +0 -51
  55. data/docs/css/common.css +0 -1
  56. data/docs/css/full_list.css +0 -58
  57. data/docs/css/style.css +0 -497
  58. data/docs/file.README.html +0 -359
  59. data/docs/file_list.html +0 -56
  60. data/docs/frames.html +0 -17
  61. data/docs/index.html +0 -359
  62. data/docs/js/app.js +0 -314
  63. data/docs/js/full_list.js +0 -216
  64. data/docs/js/jquery.js +0 -4
  65. data/docs/method_list.html +0 -675
  66. data/docs/top-level-namespace.html +0 -110
data/lib/dbf/table.rb CHANGED
@@ -14,6 +14,7 @@ module DBF
14
14
 
15
15
  DBASE2_HEADER_SIZE = 8
16
16
  DBASE3_HEADER_SIZE = 32
17
+ DBASE7_HEADER_SIZE = 68
17
18
 
18
19
  VERSIONS = {
19
20
  '02' => 'FoxBase',
@@ -22,6 +23,7 @@ module DBF
22
23
  '05' => 'dBase V without memo file',
23
24
  '07' => 'Visual Objects 1.x',
24
25
  '30' => 'Visual FoxPro',
26
+ '32' => 'Visual FoxPro with field type Varchar or Varbinary',
25
27
  '31' => 'Visual FoxPro with AutoIncrement field',
26
28
  '43' => 'dBASE IV SQL table files, no memo',
27
29
  '63' => 'dBASE IV SQL system files, no memo',
@@ -29,6 +31,7 @@ module DBF
29
31
  '83' => 'dBase III with memo file',
30
32
  '87' => 'Visual Objects 1.x with memo file',
31
33
  '8b' => 'dBase IV with memo file',
34
+ '8c' => 'dBase 7',
32
35
  '8e' => 'dBase IV with SQL table',
33
36
  'cb' => 'dBASE IV SQL table files, with memo',
34
37
  'f5' => 'FoxPro with memo file',
@@ -215,23 +218,29 @@ module DBF
215
218
  @data.seek(header_size)
216
219
  [].tap do |columns|
217
220
  until end_of_record?
218
- case version
221
+ args = case version
219
222
  when '02'
220
- column_data = @data.read(header_size * 2)
221
- columns << Column.new(self, *column_data.unpack('A11 a C'), 0)
223
+ [self, *@data.read(header_size * 2).unpack('A11 a C'), 0]
224
+ when '04', '8c'
225
+ [self, *@data.read(48).unpack('A32 a C C x13')]
222
226
  else
223
- column_data = @data.read(header_size)
224
- columns << Column.new(self, *column_data.unpack('A11 a x4 C2'))
227
+ [self, *@data.read(header_size).unpack('A11 a x4 C2')]
225
228
  end
229
+
230
+ columns << Column.new(*args)
226
231
  end
227
232
  end
228
233
  end
229
234
  end
230
235
 
231
236
  def header_size
232
- header_size = case version
233
- when '02' then DBASE2_HEADER_SIZE
234
- else DBASE3_HEADER_SIZE
237
+ case version
238
+ when '02'
239
+ DBASE2_HEADER_SIZE
240
+ when '04', '8c'
241
+ DBASE7_HEADER_SIZE
242
+ else
243
+ DBASE3_HEADER_SIZE
235
244
  end
236
245
  end
237
246
 
data/lib/dbf/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module DBF
2
- VERSION = '4.1.5'.freeze
2
+ VERSION = '4.2.1'.freeze
3
3
  end
data/nBOOKS.DBF ADDED
Binary file
@@ -286,13 +286,13 @@ RSpec.describe DBF::Column do
286
286
 
287
287
  describe '#name' do
288
288
  it 'contains only ASCII characters' do
289
- column = DBF::Column.new table, "--\x1F-\x68\x65\x6C\x6C\x6F world-\x80--", 'N', 1, 0
289
+ column = DBF::Column.new table, "--\x1F-\x68\x65\x6C\x6C\x6F \x00world-\x80--", 'N', 1, 0
290
290
  expect(column.name).to eq '---hello world---'
291
291
  end
292
292
 
293
293
  it 'is truncated at the null character' do
294
- column = DBF::Column.new table, "--\x1F-\x68\x65\x6C\x6C\x6F \x00 world-\x80--", 'N', 1, 0
295
- expect(column.name).to eq '---hello '
294
+ column = DBF::Column.new table, "--\x1F-\x68\x65\x6C\x6C\x6F \x00world-\x80--", 'N', 1, 0
295
+ expect(column.name).to eq '---hello world---'
296
296
  end
297
297
  end
298
298
  end
@@ -124,6 +124,24 @@ RSpec.describe DBF, 'of type 31 (Visual FoxPro with AutoIncrement field)' do
124
124
  end
125
125
  end
126
126
 
127
+ RSpec.describe DBF, 'of type 32 (Visual FoxPro with field type Varchar or Varbinary)' do
128
+ let(:table) { DBF::Table.new fixture('dbase_32.dbf') }
129
+
130
+ it_behaves_like 'DBF'
131
+
132
+ it 'has a dBase version of 32' do
133
+ expect(table.version).to eq '32'
134
+ end
135
+
136
+ it 'reports the correct version description' do
137
+ expect(table.version_description).to eq 'Visual FoxPro with field type Varchar or Varbinary'
138
+ end
139
+
140
+ it 'determines the number of records' do
141
+ expect(table.record_count).to eq 1
142
+ end
143
+ end
144
+
127
145
  RSpec.describe DBF, 'of type 83 (dBase III with memo file)' do
128
146
  let(:table) { DBF::Table.new fixture('dbase_83.dbf') }
129
147
 
@@ -160,6 +178,24 @@ RSpec.describe DBF, 'of type 8b (dBase IV with memo file)' do
160
178
  end
161
179
  end
162
180
 
181
+ RSpec.describe DBF, 'of type 8c (unknown)' do
182
+ let(:table) { DBF::Table.new fixture('dbase_8c.dbf') }
183
+
184
+ it_behaves_like 'DBF'
185
+
186
+ it 'reports the correct version number' do
187
+ expect(table.version).to eq '8c'
188
+ end
189
+
190
+ it 'reports the correct version description' do
191
+ expect(table.version_description).to eq 'dBase 7'
192
+ end
193
+
194
+ it 'determines the number of records' do
195
+ expect(table.record_count).to eq 10
196
+ end
197
+ end
198
+
163
199
  RSpec.describe DBF, 'of type f5 (FoxPro with memo file)' do
164
200
  let(:table) { DBF::Table.new fixture('dbase_f5.dbf') }
165
201
 
@@ -0,0 +1,23 @@
1
+
2
+ Database: dbase_02.dbf
3
+ Type: (02) FoxBase
4
+ Memo File: false
5
+ Records: 9
6
+
7
+ Fields:
8
+ Name Type Length Decimal
9
+ ------------------------------------------------------------------------------
10
+ EMP:NMBR N 3 0
11
+ LAST C 10 0
12
+ FIRST C 10 0
13
+ ADDR C 20 0
14
+ CITY C 15 0
15
+ ZIP:CODE C 10 0
16
+ PHONE C 9 0
17
+ SSN C 11 0
18
+ HIREDATE C 8 0
19
+ TERMDATE C 8 0
20
+ CLASS C 3 0
21
+ DEPT C 3 0
22
+ PAYRATE N 8 0
23
+ START:PAY N 8 0
Binary file
@@ -0,0 +1,11 @@
1
+
2
+ Database: dbase_32.dbf
3
+ Type: (32) Visual FoxPro with field type Varchar or Varbinary
4
+ Memo File: false
5
+ Records: 1
6
+
7
+ Fields:
8
+ Name Type Length Decimal
9
+ ------------------------------------------------------------------------------
10
+ NAME V 250 0
11
+ _NullFlags 0 1 0
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.5
4
+ version: 4.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keith Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-09 00:00:00.000000000 Z
11
+ date: 2022-07-18 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.
@@ -24,60 +24,13 @@ files:
24
24
  - CHANGELOG.md
25
25
  - Gemfile
26
26
  - Gemfile.lock
27
- - Gemfile.travis
28
27
  - Guardfile
29
28
  - LICENSE
30
29
  - README.md
31
30
  - Rakefile
32
31
  - bin/dbf
32
+ - ci_A.dbf
33
33
  - dbf.gemspec
34
- - docs/CNAME
35
- - docs/DBF.html
36
- - docs/DBF/Column.html
37
- - docs/DBF/Column/LengthError.html
38
- - docs/DBF/Column/NameError.html
39
- - docs/DBF/ColumnType.html
40
- - docs/DBF/ColumnType/Base.html
41
- - docs/DBF/ColumnType/Boolean.html
42
- - docs/DBF/ColumnType/Currency.html
43
- - docs/DBF/ColumnType/Date.html
44
- - docs/DBF/ColumnType/DateTime.html
45
- - docs/DBF/ColumnType/Double.html
46
- - docs/DBF/ColumnType/Float.html
47
- - docs/DBF/ColumnType/General.html
48
- - docs/DBF/ColumnType/Memo.html
49
- - docs/DBF/ColumnType/Nil.html
50
- - docs/DBF/ColumnType/Number.html
51
- - docs/DBF/ColumnType/SignedLong.html
52
- - docs/DBF/ColumnType/String.html
53
- - docs/DBF/Database.html
54
- - docs/DBF/Database/Foxpro.html
55
- - docs/DBF/Database/Table.html
56
- - docs/DBF/FileNotFoundError.html
57
- - docs/DBF/Header.html
58
- - docs/DBF/Memo.html
59
- - docs/DBF/Memo/Base.html
60
- - docs/DBF/Memo/Dbase3.html
61
- - docs/DBF/Memo/Dbase4.html
62
- - docs/DBF/Memo/Foxpro.html
63
- - docs/DBF/NoColumnsDefined.html
64
- - docs/DBF/Record.html
65
- - docs/DBF/Schema.html
66
- - docs/DBF/Table.html
67
- - docs/_index.html
68
- - docs/class_list.html
69
- - docs/css/common.css
70
- - docs/css/full_list.css
71
- - docs/css/style.css
72
- - docs/file.README.html
73
- - docs/file_list.html
74
- - docs/frames.html
75
- - docs/index.html
76
- - docs/js/app.js
77
- - docs/js/full_list.js
78
- - docs/js/jquery.js
79
- - docs/method_list.html
80
- - docs/top-level-namespace.html
81
34
  - lib/dbf.rb
82
35
  - lib/dbf/column.rb
83
36
  - lib/dbf/column_type.rb
@@ -92,6 +45,7 @@ files:
92
45
  - lib/dbf/schema.rb
93
46
  - lib/dbf/table.rb
94
47
  - lib/dbf/version.rb
48
+ - nBOOKS.DBF
95
49
  - spec/dbf/column_spec.rb
96
50
  - spec/dbf/database/foxpro_spec.rb
97
51
  - spec/dbf/file_formats_spec.rb
@@ -100,6 +54,7 @@ files:
100
54
  - spec/fixtures/cp1251.dbf
101
55
  - spec/fixtures/cp1251_summary.txt
102
56
  - spec/fixtures/dbase_02.dbf
57
+ - spec/fixtures/dbase_02_summary.txt
103
58
  - spec/fixtures/dbase_03.dbf
104
59
  - spec/fixtures/dbase_03_summary.txt
105
60
  - spec/fixtures/dbase_30.dbf
@@ -107,6 +62,8 @@ files:
107
62
  - spec/fixtures/dbase_30_summary.txt
108
63
  - spec/fixtures/dbase_31.dbf
109
64
  - spec/fixtures/dbase_31_summary.txt
65
+ - spec/fixtures/dbase_32.dbf
66
+ - spec/fixtures/dbase_32_summary.txt
110
67
  - spec/fixtures/dbase_83.dbf
111
68
  - spec/fixtures/dbase_83.dbt
112
69
  - spec/fixtures/dbase_83_missing_memo.dbf
@@ -120,6 +77,7 @@ files:
120
77
  - spec/fixtures/dbase_8b.dbf
121
78
  - spec/fixtures/dbase_8b.dbt
122
79
  - spec/fixtures/dbase_8b_summary.txt
80
+ - spec/fixtures/dbase_8c.dbf
123
81
  - spec/fixtures/dbase_f5.dbf
124
82
  - spec/fixtures/dbase_f5.fpt
125
83
  - spec/fixtures/dbase_f5_summary.txt
@@ -158,13 +116,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
116
  - !ruby/object:Gem::Version
159
117
  version: 1.3.0
160
118
  requirements: []
161
- rubygems_version: 3.0.9
119
+ rubygems_version: 3.3.7
162
120
  signing_key:
163
121
  specification_version: 4
164
122
  summary: Read xBase files
165
123
  test_files:
124
+ - spec/dbf/column_spec.rb
166
125
  - spec/dbf/database/foxpro_spec.rb
167
126
  - spec/dbf/file_formats_spec.rb
168
- - spec/dbf/column_spec.rb
169
127
  - spec/dbf/record_spec.rb
170
128
  - spec/dbf/table_spec.rb
data/Gemfile.travis DELETED
@@ -1,8 +0,0 @@
1
- gemspec
2
- source 'https://rubygems.org'
3
-
4
- group :test do
5
- gem 'rspec'
6
- gem 'simplecov', platform: :ruby
7
- gem 'codeclimate-test-reporter'
8
- end
data/docs/CNAME DELETED
@@ -1 +0,0 @@
1
- dbf.infused.org
@@ -1,124 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>
7
- Exception: DBF::Column::LengthError
8
-
9
- &mdash; Documentation by YARD 0.9.26
10
-
11
- </title>
12
-
13
- <link rel="stylesheet" href="../../css/style.css" type="text/css" />
14
-
15
- <link rel="stylesheet" href="../../css/common.css" type="text/css" />
16
-
17
- <script type="text/javascript">
18
- pathId = "DBF::Column::LengthError";
19
- relpath = '../../';
20
- </script>
21
-
22
-
23
- <script type="text/javascript" charset="utf-8" src="../../js/jquery.js"></script>
24
-
25
- <script type="text/javascript" charset="utf-8" src="../../js/app.js"></script>
26
-
27
-
28
- </head>
29
- <body>
30
- <div class="nav_wrap">
31
- <iframe id="nav" src="../../class_list.html?1"></iframe>
32
- <div id="resizer"></div>
33
- </div>
34
-
35
- <div id="main" tabindex="-1">
36
- <div id="header">
37
- <div id="menu">
38
-
39
- <a href="../../_index.html">Index (L)</a> &raquo;
40
- <span class='title'><span class='object_link'><a href="../../DBF.html" title="DBF (module)">DBF</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../Column.html" title="DBF::Column (class)">Column</a></span></span>
41
- &raquo;
42
- <span class="title">LengthError</span>
43
-
44
- </div>
45
-
46
- <div id="search">
47
-
48
- <a class="full_list_link" id="class_list_link"
49
- href="../../class_list.html">
50
-
51
- <svg width="24" height="24">
52
- <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
53
- <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
54
- <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
55
- </svg>
56
- </a>
57
-
58
- </div>
59
- <div class="clear"></div>
60
- </div>
61
-
62
- <div id="content"><h1>Exception: DBF::Column::LengthError
63
-
64
-
65
-
66
- </h1>
67
- <div class="box_info">
68
-
69
- <dl>
70
- <dt>Inherits:</dt>
71
- <dd>
72
- <span class="inheritName">StandardError</span>
73
-
74
- <ul class="fullTree">
75
- <li>Object</li>
76
-
77
- <li class="next">StandardError</li>
78
-
79
- <li class="next">DBF::Column::LengthError</li>
80
-
81
- </ul>
82
- <a href="#" class="inheritanceTree">show all</a>
83
-
84
- </dd>
85
- </dl>
86
-
87
-
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
-
96
-
97
- <dl>
98
- <dt>Defined in:</dt>
99
- <dd>lib/dbf/column.rb</dd>
100
- </dl>
101
-
102
- </div>
103
-
104
-
105
-
106
-
107
-
108
-
109
-
110
-
111
-
112
-
113
-
114
- </div>
115
-
116
- <div id="footer">
117
- Generated on Sun Aug 8 16:19:08 2021 by
118
- <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
119
- 0.9.26 (ruby-3.0.1).
120
- </div>
121
-
122
- </div>
123
- </body>
124
- </html>
@@ -1,124 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>
7
- Exception: DBF::Column::NameError
8
-
9
- &mdash; Documentation by YARD 0.9.26
10
-
11
- </title>
12
-
13
- <link rel="stylesheet" href="../../css/style.css" type="text/css" />
14
-
15
- <link rel="stylesheet" href="../../css/common.css" type="text/css" />
16
-
17
- <script type="text/javascript">
18
- pathId = "DBF::Column::NameError";
19
- relpath = '../../';
20
- </script>
21
-
22
-
23
- <script type="text/javascript" charset="utf-8" src="../../js/jquery.js"></script>
24
-
25
- <script type="text/javascript" charset="utf-8" src="../../js/app.js"></script>
26
-
27
-
28
- </head>
29
- <body>
30
- <div class="nav_wrap">
31
- <iframe id="nav" src="../../class_list.html?1"></iframe>
32
- <div id="resizer"></div>
33
- </div>
34
-
35
- <div id="main" tabindex="-1">
36
- <div id="header">
37
- <div id="menu">
38
-
39
- <a href="../../_index.html">Index (N)</a> &raquo;
40
- <span class='title'><span class='object_link'><a href="../../DBF.html" title="DBF (module)">DBF</a></span></span> &raquo; <span class='title'><span class='object_link'><a href="../Column.html" title="DBF::Column (class)">Column</a></span></span>
41
- &raquo;
42
- <span class="title">NameError</span>
43
-
44
- </div>
45
-
46
- <div id="search">
47
-
48
- <a class="full_list_link" id="class_list_link"
49
- href="../../class_list.html">
50
-
51
- <svg width="24" height="24">
52
- <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
53
- <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
54
- <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
55
- </svg>
56
- </a>
57
-
58
- </div>
59
- <div class="clear"></div>
60
- </div>
61
-
62
- <div id="content"><h1>Exception: DBF::Column::NameError
63
-
64
-
65
-
66
- </h1>
67
- <div class="box_info">
68
-
69
- <dl>
70
- <dt>Inherits:</dt>
71
- <dd>
72
- <span class="inheritName">StandardError</span>
73
-
74
- <ul class="fullTree">
75
- <li>Object</li>
76
-
77
- <li class="next">StandardError</li>
78
-
79
- <li class="next">DBF::Column::NameError</li>
80
-
81
- </ul>
82
- <a href="#" class="inheritanceTree">show all</a>
83
-
84
- </dd>
85
- </dl>
86
-
87
-
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
-
96
-
97
- <dl>
98
- <dt>Defined in:</dt>
99
- <dd>lib/dbf/column.rb</dd>
100
- </dl>
101
-
102
- </div>
103
-
104
-
105
-
106
-
107
-
108
-
109
-
110
-
111
-
112
-
113
-
114
- </div>
115
-
116
- <div id="footer">
117
- Generated on Sun Aug 8 16:19:08 2021 by
118
- <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
119
- 0.9.26 (ruby-3.0.1).
120
- </div>
121
-
122
- </div>
123
- </body>
124
- </html>