censive 1.0.4 → 1.1.0

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/censive.rb +43 -33
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 14b2b860b44e06018a627322fe8cb2d6b2e437a0f24cd21ad110d6a7f8f6170e
4
- data.tar.gz: 942fc5ddcff3239e654ba391a72209e09844ac4e9df430c762ef0d54d38095b4
3
+ metadata.gz: 8f5885eeeeab9f57546128e03407fbb1546137c3dfe19edc1a8dc8e08c95ad50
4
+ data.tar.gz: ed4b2f1ac55b826534c5bf9d854feca86cd2b4ef3cca9a2fab9e1993f3b2d6a4
5
5
  SHA512:
6
- metadata.gz: 38677787034eb1de1d4272fe0e5b8f5629c14fe28f69d3d1b05652644fc76d3b2fcdd80bdde3c91b5c4107ec634a28f7d7e58b7f417ada84fa2190d76ba3c2d5
7
- data.tar.gz: 1f6496e143fd7ee75cea6797cf59f55fdda5fc877a5aeb53580de0680827666e66f97b15018db7fd197169366af8ce1f09e2f9a8a014eea70faf784bdb276ef6
6
+ metadata.gz: bf304f19bcabdbff428cfbc021807228291eded005c30bb3578bf2530f97dfb73b7fd08f684f39cb2eb5bd159c24ecedc8d6d8a768dd3dba50c3462ff87dc597
7
+ data.tar.gz: 02fddd62e35fd145ed34d34524c038b3397508eb8bfc81ce66dad2cfd4b4ea4bea931f1685f1f8ae81cdaac027740c5ef73f422c80c566974121ceaa3ed4bb87
data/lib/censive.rb CHANGED
@@ -4,14 +4,14 @@
4
4
  # censive - A quick and lightweight CSV handling library for Ruby
5
5
  #
6
6
  # Author: Steve Shreeve (steve.shreeve@gmail.com)
7
- # Date: June 16, 2023
7
+ # Date: June 28, 2023
8
8
  #
9
9
  # https://crystal-lang.org/api/1.7.2/CSV.html (Crystal's CSV library)
10
10
  # https://github.com/ruby/strscan/blob/master/ext/strscan/strscan.c
11
11
  #
12
- # Thanks to Sutou Kouhei (kou) for his excellent advice on using scan
12
+ # Thanks to Sutou Kouhei (kou) for his excellent advice on using scan better
13
13
  # ============================================================================
14
- # GOALS:
14
+ # HIGHLIGHTS:
15
15
  # 1. Faster than Ruby's default CSV library
16
16
  # 2. Lightweight code with streamlined and optimized logic
17
17
  # 3. Support most non-compliant CSV variations (@excel, @relax, etc)
@@ -29,19 +29,26 @@ require "stringio"
29
29
  require "strscan"
30
30
 
31
31
  class Censive < StringScanner
32
- VERSION="1.0.4"
32
+ VERSION="1.1.0"
33
33
 
34
34
  attr :encoding, :out, :rows
35
35
 
36
- def self.parse(...)
37
- new(...).parse
36
+ def self.read(...)
37
+ new(...).read
38
38
  end
39
39
 
40
- def self.writer(obj=nil, **opts, &code)
40
+ def self.write(obj=nil, **opts, &code)
41
41
  case obj
42
- when String then File.open(obj, "w") {|io| new(out: io, **opts, &code) }
43
- when StringIO,IO,nil then new(out: obj, **opts, &code)
44
- else abort "#{File.basename($0)}: invalid #{obj.class} object in writer"
42
+ when String
43
+ if block_given?
44
+ File.open(obj, "w") {|io| new(out: io, **opts, &code) }
45
+ else
46
+ new(out: File.open(obj, "w"), **opts)
47
+ end
48
+ when StringIO, IO, nil
49
+ new(out: obj, **opts, &code)
50
+ else
51
+ abort "#{File.basename($0)}: #{self}.write can't use #{obj.class} objects"
45
52
  end
46
53
  end
47
54
 
@@ -117,9 +124,9 @@ class Censive < StringScanner
117
124
  super()
118
125
  end
119
126
 
120
- # ==[ Parser ]==
127
+ # ==[ Reader ]==
121
128
 
122
- def parse
129
+ def read
123
130
  @rows = []
124
131
  while row = next_row
125
132
  @rows << row
@@ -182,28 +189,19 @@ class Censive < StringScanner
182
189
  end
183
190
 
184
191
  def each
185
- @rows or parse
192
+ @rows or read
186
193
  @rows.each {|row| yield row }
187
194
  end
188
195
 
189
- def to_csv(*args, **opts, &code)
196
+ # ==[ Writer ]==
197
+
198
+ def write(*args, **opts, &code)
190
199
  if args.empty? && opts.empty?
191
200
  block_given? ? each(&code) : each {|row| @out << row }
192
201
  elsif block_given?
193
- Censive.writer(*args, **opts, &code)
194
- else
195
- Censive.writer(*args, **opts) {|csv| each {|row| csv << row }}
196
- end
197
- end
198
-
199
- # ==[ Helpers ]==
200
-
201
- # returns 2 (must be quoted and escaped), 1 (must be quoted), 0 (neither)
202
- def grok(str)
203
- if idx = str&.index(@escapes)
204
- $1 ? 2 : str.index(@quote, idx) ? 2 : 1
202
+ Censive.write(*args, **opts, &code)
205
203
  else
206
- 0
204
+ Censive.write(*args, **opts) {|csv| each {|row| csv << row }}
207
205
  end
208
206
  end
209
207
 
@@ -216,7 +214,7 @@ class Censive < StringScanner
216
214
  s,q = @sep, @quote
217
215
  out = case @mode
218
216
  when :compact
219
- case @excel ? 2 : grok(row.join)
217
+ case @excel ? 2 : quote_type(row.join)
220
218
  when 0
221
219
  row
222
220
  when 1
@@ -226,7 +224,7 @@ class Censive < StringScanner
226
224
  else
227
225
  row.map do |col|
228
226
  @excel && col =~ @leadzero ? "=#{q}#{col}#{q}" :
229
- case grok(col)
227
+ case quote_type(col)
230
228
  when 0 then col
231
229
  when 1 then "#{q}#{col}#{q}"
232
230
  else "#{q}#{col.gsub(q, @esc)}#{q}"
@@ -246,6 +244,21 @@ class Censive < StringScanner
246
244
  @out << out + @rowsep
247
245
  end
248
246
 
247
+ # ==[ Helpers ]==
248
+
249
+ def bomb(msg)
250
+ abort "\n#{File.basename($0)}: #{msg} at character #{pos} near '#{string[pos-4,7]}'"
251
+ end
252
+
253
+ # returns 2 (must be quoted and escaped), 1 (must be quoted), 0 (neither)
254
+ def quote_type(str)
255
+ if idx = str&.index(@escapes)
256
+ $1 ? 2 : str.index(@quote, idx) ? 2 : 1
257
+ else
258
+ 0
259
+ end
260
+ end
261
+
249
262
  def stats
250
263
  wide = string.size.to_s.size
251
264
  puts "%#{wide}d rows" % @rows.size
@@ -254,9 +267,6 @@ class Censive < StringScanner
254
267
  puts "%#{wide}d bytes" % string.size
255
268
  end
256
269
 
257
- def bomb(msg)
258
- abort "\n#{File.basename($0)}: #{msg} at character #{pos} near '#{string[pos-4,7]}'"
259
- end
260
270
  end
261
271
 
262
272
  if __FILE__ == $0
@@ -274,7 +284,7 @@ if __FILE__ == $0
274
284
  # out = csv.export
275
285
  # puts out.out
276
286
 
277
- puts Censive.parse(str, excel: true, relax: true).to_csv
287
+ puts Censive.read(str, excel: true, relax: true).write
278
288
  end
279
289
 
280
290
  __END__
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: censive
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Shreeve
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-16 00:00:00.000000000 Z
11
+ date: 2023-06-28 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A quick and lightweight CSV handling library for Ruby
14
14
  email: steve.shreeve@gmail.com