From b11e3da4531d5f4f1ceff9930e2de0744f311dc5 Mon Sep 17 00:00:00 2001 From: wkh Date: Sun, 11 Oct 2026 23:23:37 +0200 Subject: [PATCH] =?UTF-8?q?splittable:=20klare=20Fehler=20f=C3=BCr=20-0=20?= =?UTF-8?q?und=20mehr=20als=20676=20St=C3=BCcke?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + demo/colorsaa | 5 +++++ demo/colorsab | 5 +++++ demo/colorsac | 4 ++++ lib/rdb/cmd/relational.rb | 10 ++++++---- test/rdb_test.rb | 15 +++++++++++++++ 6 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 demo/colorsaa create mode 100644 demo/colorsab create mode 100644 demo/colorsac diff --git a/CHANGELOG.md b/CHANGELOG.md index cf1444e..d35a150 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ folgen [Semantic Versioning](https://semver.org/lang/de/). Die Version steht in - README und `man/row.man` erklären, warum `select` in bash/zsh/ksh einen Syntaxfehler gibt und wie man es trotzdem aufruft. ### Behoben +- `splittable -0` und mehr als 676 Stücke endeten mit einem Ruby-Abbruch (im zweiten Fall nach 676 geschriebenen Dateien). Jetzt eine Fehlermeldung, und es wird vorher geprüft, damit nichts halb geschrieben wird. - `rdb man` zeigte `\\select` in den Man-Pages als `\elect`: ein doppelter Backslash wird jetzt zuerst geschützt. ## [0.5.0] - 2026-10-11 diff --git a/demo/colorsaa b/demo/colorsaa new file mode 100644 index 0000000..2f145b8 --- /dev/null +++ b/demo/colorsaa @@ -0,0 +1,5 @@ +Colors +------ +black +blue +carmel diff --git a/demo/colorsab b/demo/colorsab new file mode 100644 index 0000000..ff4d155 --- /dev/null +++ b/demo/colorsab @@ -0,0 +1,5 @@ +Colors +------ +green +purple +red diff --git a/demo/colorsac b/demo/colorsac new file mode 100644 index 0000000..5f7b83e --- /dev/null +++ b/demo/colorsac @@ -0,0 +1,4 @@ +Colors +------ +silver +white diff --git a/lib/rdb/cmd/relational.rb b/lib/rdb/cmd/relational.rb index 0f571f6..1e32988 100644 --- a/lib/rdb/cmd/relational.rb +++ b/lib/rdb/cmd/relational.rb @@ -164,12 +164,14 @@ end Rdb.register('splittable', 'Divide a table horizontally', 'splittable [-n] table') do |args| n = 50 n = args.shift[1..].to_i if args.first&.match?(/\A-\d+\z/) - die 'usage: splittable [-n] table' unless args.size == 1 + die 'usage: splittable [-n] table (n is at least 1)' unless args.size == 1 && n.positive? + t = open_table(args[0]) + chunks = t.rows.each_slice(n).to_a + die "#{args[0]}: #{t.rows.size} rows in pieces of #{n} need #{chunks.size} files, but there are only 676 names (aa to zz)" if chunks.size > 676 + suffix = ('aa'..'zz').each - t.rows.each_slice(n) do |chunk| - File.write("#{args[0]}#{suffix.next}", t.with(rows: chunk).to_s) - end + chunks.each { |chunk| File.write("#{args[0]}#{suffix.next}", t.with(rows: chunk).to_s) } end # ---- aggregates ------------------------------------------------------------ diff --git a/test/rdb_test.rb b/test/rdb_test.rb index 04227b3..90bed2e 100644 --- a/test/rdb_test.rb +++ b/test/rdb_test.rb @@ -5,6 +5,21 @@ require 'pty' require_relative '../lib/rdb' class SelectionTest < RdbCase + def test_splittable_pieces_and_errors + out, = run3('splittable', '-4', 'inventory') + assert_equal 4, data(File.read(File.join(@dir, 'inventoryaa'))).size + assert_equal 3, data(File.read(File.join(@dir, 'inventoryab'))).size + assert_includes File.read(File.join(@dir, 'inventoryab')), "Item\tAmount" + _o, err, st = run3('splittable', '-0', 'inventory') + refute st.success? + assert_match(/usage/, err) + write('big', "N\n-\n#{(1..700).to_a.join("\n")}\n") + _o, err, st = run3('splittable', '-1', 'big') + refute st.success? + assert_match(/only 676 names/, err) + assert_empty Dir[File.join(@dir, 'bigaa')] # nothing is written when it cannot all be written + end + def test_record_zero_and_one_are_the_first_and_negatives_count_from_the_end { '0' => '1', '1' => '1', '2' => '3', '3' => '6', '-1' => '6', '-2' => '3', '-3' => '1', '+2' => '3' }.each do |n, item| assert_equal [[item]], data(rdb('record', n, file: 'owners')).map { |r| r.first(1) }, "record #{n}"