simple-data 0.1.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -5
- data/lib/simple-data/compression.rb +5 -4
- data/lib/simple-data/version.rb +1 -1
- data/lib/simple-data.rb +43 -13
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3db7d6e8e14e9b8b814f77983389421167fe6cb903f0fe36903131bec7aef040
|
4
|
+
data.tar.gz: 2a902b19246723a3d6ac2f854e8813074efc4ff59e9619bde4a2b31d775a1920
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f67761bd5036a3c394c2e0d7502b8ca4450fdd82a453e9fa5d41a4eb86874aa686f9c8f97453d994c4672d69109ba239f0cdfa1f364f90f99f838a88e302030
|
7
|
+
data.tar.gz: 654bf8bccd261d9c3b62a53131ebdbc4492d4ea5d048b624a31869ac522f5999d61615007546f19a0200a43f6934e7cd8704b1721dc97f57dfbaa4bb8c63db99
|
data/README.md
CHANGED
@@ -6,11 +6,11 @@ This is the ruby implementation of the [simple-data spec][sda]
|
|
6
6
|
require 'simple-data'
|
7
7
|
|
8
8
|
SimpleData.generate('spacecraft.sda',
|
9
|
-
[ [ :cstr, 'name', 'spacecraft' ],
|
10
|
-
[ :cstr, 'origin', 'serie or movie' ],
|
11
|
-
[ :f64, 'x'
|
12
|
-
[ :f64, 'y'
|
13
|
-
[ :f64, 'z'
|
9
|
+
[ [ :cstr, 'name', nil, 'spacecraft' ],
|
10
|
+
[ :cstr, 'origin', nil, 'serie or movie' ],
|
11
|
+
[ :f64, 'x', 'm' ],
|
12
|
+
[ :f64, 'y', 'm' ],
|
13
|
+
[ :f64, 'z', 'm' ] ],
|
14
14
|
tags: { author: "Stephane D'Alu",
|
15
15
|
url: "http://www.sdalu.com/",
|
16
16
|
license: "MIT" }) do |sda|
|
@@ -21,6 +21,7 @@ SimpleData.generate('spacecraft.sda',
|
|
21
21
|
end
|
22
22
|
|
23
23
|
SimpleData.open('spacecraft.sda') do |sda|
|
24
|
+
puts sda.fields.inspect
|
24
25
|
while row = sda.get do
|
25
26
|
puts row.inspect
|
26
27
|
end
|
@@ -29,11 +29,12 @@ class SimpleData
|
|
29
29
|
|
30
30
|
def write(data)
|
31
31
|
@written += data.size
|
32
|
-
if (@written
|
32
|
+
if (@written > @write_size)
|
33
33
|
@io.write(@zstd.flush)
|
34
|
-
|
35
|
-
@
|
34
|
+
@io.flush
|
35
|
+
@written = 0
|
36
36
|
end
|
37
|
+
@io.write(@zstd.compress(data))
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
@@ -53,7 +54,7 @@ class SimpleData
|
|
53
54
|
type = MAGIC.find {|k, v| str.start_with?(k) }&.last
|
54
55
|
|
55
56
|
# Sanity check
|
56
|
-
|
57
|
+
raise "data is not Zstd compressed" if type != :zstd
|
57
58
|
|
58
59
|
# Decoder
|
59
60
|
zstd = Zstd::StreamingDecompress.new
|
data/lib/simple-data/version.rb
CHANGED
data/lib/simple-data.rb
CHANGED
@@ -5,9 +5,10 @@ class SimpleData
|
|
5
5
|
# Various regex
|
6
6
|
REGEX_MAGIC = /\A# simple-data:(?<version>\d+)\s*\z/
|
7
7
|
REGEX_SECTION = /\A# --<(?<section>[^>:]+)(?::(?<extra>[^>]+))?>--+\s*\z/
|
8
|
-
REGEX_FIELD = /\A\#\s* (?<type>\w+
|
9
|
-
|
10
|
-
|
8
|
+
REGEX_FIELD = /\A\#\s* (?<type>\w+ ) \s*:\s*
|
9
|
+
(?<name>[\w\-.:]+)
|
10
|
+
\s* (?:\[(?<unit>.*? )\])?
|
11
|
+
\s* (?:\((?<desc>.* )\))? \s*\z
|
11
12
|
/ix
|
12
13
|
REGEX_TAG = /\A@(?<tag>\w+)\s+(?<value>.*?)\s*\z/
|
13
14
|
REGEX_EMPTY = /\A#\s*\z/
|
@@ -116,7 +117,8 @@ class SimpleData
|
|
116
117
|
when :f64 then @io.read(8).unpack1('E' )
|
117
118
|
when :cstr then @io.each_byte.lazy.take_while {|b| !b.zero? }
|
118
119
|
.map {|b| b.chr }.to_a.join
|
119
|
-
when :blob then
|
120
|
+
when :blob then @io.read(2).unpack1('s<')
|
121
|
+
.then {|size| @io.read(size) }
|
120
122
|
when :char then @io.read(1)
|
121
123
|
when :bool then @io.read(1) == 'T'
|
122
124
|
end
|
@@ -128,7 +130,8 @@ class SimpleData
|
|
128
130
|
end
|
129
131
|
|
130
132
|
# Generating file
|
131
|
-
def self.generate(file, fields,
|
133
|
+
def self.generate(file, fields,
|
134
|
+
compress: const_defined?(:IOCompressedWrite),
|
132
135
|
tags: nil, sections: nil, &block)
|
133
136
|
# Sanity check
|
134
137
|
if compress && !const_defined?(:IOCompressedWrite)
|
@@ -152,19 +155,32 @@ class SimpleData
|
|
152
155
|
# Spec
|
153
156
|
io.puts "#"
|
154
157
|
io.puts "# --<spec>--"
|
155
|
-
|
156
|
-
fields.
|
158
|
+
name_maxlen = fields.map {|(_, name)| name.size }.max
|
159
|
+
unit_maxlen = fields.map {|(_, _, unit)| unit&.size || 0 }.max
|
160
|
+
|
161
|
+
fields.each do |(type, name, unit, desc)|
|
157
162
|
if desc
|
158
|
-
|
163
|
+
if unit
|
164
|
+
io.puts "# %-4s : %-*s [%-*s] (%s)" % [
|
165
|
+
type, name_maxlen, name, unit_maxlen, unit, desc ]
|
166
|
+
else
|
167
|
+
io.puts "# %-4s : %-*s %-*s (%s)" % [
|
168
|
+
type, name_maxlen, name, unit_maxlen, '', desc ]
|
169
|
+
end
|
159
170
|
else
|
160
|
-
|
171
|
+
if unit
|
172
|
+
io.puts "# %-4s : %-*s [%-*s]" % [
|
173
|
+
type, name_maxlen, name, unit_maxlen, unit, ]
|
174
|
+
else
|
175
|
+
io.puts "# %-4s : %s" % [ type, name ]
|
176
|
+
end
|
161
177
|
end
|
162
178
|
end
|
163
179
|
|
164
180
|
# Custom sections
|
165
181
|
if sections && !sections.empty?
|
166
|
-
io.puts "#"
|
167
182
|
sections.each do |name, value|
|
183
|
+
io.puts "#"
|
168
184
|
io.puts "# --<#{name}>--"
|
169
185
|
value.split(/\r?\n/).each do |line|
|
170
186
|
io.puts "# #{line}"
|
@@ -205,7 +221,7 @@ class SimpleData
|
|
205
221
|
fields, tags, sections, dataopt = self.get_metadata(io)
|
206
222
|
|
207
223
|
# Deal with compression
|
208
|
-
if dataopt
|
224
|
+
if dataopt&.include?(:compressed)
|
209
225
|
unless const_defined?(:IOCompressedRead)
|
210
226
|
raise Error, 'compression not supported (add zstd-ruby gem)'
|
211
227
|
end
|
@@ -220,6 +236,18 @@ class SimpleData
|
|
220
236
|
sda.close if sda && block
|
221
237
|
end
|
222
238
|
|
239
|
+
# Iterate over sda file
|
240
|
+
def self.each(file)
|
241
|
+
return to_enum(:each) unless block_given?
|
242
|
+
|
243
|
+
self.open(file, :read) do |sda|
|
244
|
+
while d = sda.get
|
245
|
+
yield(d)
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
|
223
251
|
private
|
224
252
|
|
225
253
|
def self.get_magic(io)
|
@@ -255,7 +283,7 @@ class SimpleData
|
|
255
283
|
raise ParserError, "wrong spec" if field.nil?
|
256
284
|
|
257
285
|
# Normalize
|
258
|
-
t, n, d = field
|
286
|
+
t, n, u, d = field
|
259
287
|
t = t.downcase.to_sym
|
260
288
|
n .force_encoding('UTF-8')
|
261
289
|
d&.force_encoding('UTF-8')
|
@@ -266,10 +294,12 @@ class SimpleData
|
|
266
294
|
end
|
267
295
|
|
268
296
|
# Cleaned-up field description
|
269
|
-
[ t, n, d ]
|
297
|
+
[ t, n, u, d ]
|
270
298
|
}
|
271
299
|
# Extract description
|
272
300
|
else
|
301
|
+
grp = grp.map {|l| l.sub(/^#\s?/, '') }
|
302
|
+
grp = grp[...-1] if grp.last&.empty?
|
273
303
|
sections[s] = grp.join("\n")
|
274
304
|
end
|
275
305
|
else
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple-data
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stéphane D'Alu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: zstd-ruby
|
@@ -88,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
requirements: []
|
91
|
-
rubygems_version: 3.3.
|
91
|
+
rubygems_version: 3.3.26
|
92
92
|
signing_key:
|
93
93
|
specification_version: 4
|
94
94
|
summary: Simple Data (CSV alternative)
|