dorian-csv-uniq 0.1.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/csv-uniq +41 -20
  3. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b0f43afd50cb8ba7012f5ca77ce42426533ac1118e2eb4f0b102e97a73e1cc80
4
- data.tar.gz: 5893e31eed4f2eccfc77302d6f286b190e11c8df2588a84dfb17be23d0abb081
3
+ metadata.gz: 6f5a3736fa1e9c706554263c8294fb2bf06d5d0e196783e9a61521beb41a15f1
4
+ data.tar.gz: 111c23b8feb2169bbfc33cbe942715b95cf787b1520c8098ee601b037075be86
5
5
  SHA512:
6
- metadata.gz: 9bec710af2bf383307649cee46a0433cdf8bc74341b602c7c78199d0c63e8e5be9d917b4947d7d3c66b30e5a10dc697ecf238c5d89f3458f8852cbd2d2865d60
7
- data.tar.gz: a4196cd5709e61c9341db83ce5f181c99505a83edaed194a0e21f489e39aea2676ac2972d6b24bbf1e637b5525684dd96231ff7cee85200c67b27b746cf18786
6
+ metadata.gz: a2e8335b3cf5d963752791665a76e60739097d8c409e59db54f782e8b1a8f8e5aac5c84b590070b6559546c41cf7fe5d6a1d05935a426b09e6cb354e5e96c37b
7
+ data.tar.gz: 3b9af5800134818fa5193e68e5084eefa7a01c3f7eccf9f7910a5628ff7d64c3d05f037f478b8b85844e74da35d644a70512d9c2bcec212349ca28b8b987db92
data/bin/csv-uniq CHANGED
@@ -2,29 +2,50 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "csv"
5
+ require "dorian/arguments"
5
6
 
6
- if ARGV.size < 1 || ARGV[0] == "--help" || ARGV[0] == "-h"
7
- puts "USAGE: ... | csv-uniq [KEY...] [-h|--headers]"
8
- exit
7
+ parsed =
8
+ Dorian::Arguments.parse(
9
+ headers: :boolean,
10
+ print_headers: {
11
+ alias: :p
12
+ },
13
+ version: {
14
+ alias: :v
15
+ },
16
+ help: {
17
+ alias: :h
18
+ }
19
+ )
20
+
21
+ abort parsed.help if parsed.options.help
22
+
23
+ if parsed.options.version
24
+ abort File.read(File.expand_path("../VERSION", __dir__))
9
25
  end
10
26
 
11
- HEADERS = ARGV.detect { |argv| argv == "-h" || argv == "--headers" }
12
- KEYS = (ARGV - [HEADERS]).map { |key| HEADERS ? key : key.to_i }
27
+ keys = parsed.arguments
28
+ keys = nil if keys.empty?
29
+ inputs = parsed.files.map { |file| File.read(file) }
30
+ inputs = [$stdin.each_line.to_a.map(&:strip).join("\n")] if inputs.empty?
31
+ headers = parsed.options.headers || parsed.options.print_headers
32
+ headers ||= keys&.any? { |key| key.to_i.to_s != key }
13
33
 
14
34
  puts(
15
- CSV
16
- .generate do |output|
17
- input =
18
- CSV.parse(
19
- $stdin.each_line.to_a.map(&:strip).join("\n"),
20
- headers: !!HEADERS
21
- )
22
-
23
- output << input.headers if HEADERS
24
-
25
- input
26
- .uniq { |row| KEYS.map { |key| row[key] } }
27
- .each { |row| output << row }
28
- end
29
- .strip
35
+ CSV.generate do |output|
36
+ rows =
37
+ inputs.map.with_index do |input, index|
38
+ input = CSV.parse(input, headers:)
39
+
40
+ output << input.headers if parsed.options.print_headers && index.zero?
41
+
42
+ input.uniq do |row|
43
+ (
44
+ keys || (headers && input.headers) || (0...input.first.size)
45
+ ).map { |key| row[key.to_i.to_s == key ? key.to_i : key] }
46
+ end
47
+ end
48
+
49
+ rows.flatten(1).uniq.each { |row| output << row }
50
+ end
30
51
  )
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dorian-csv-uniq
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dorian Marié
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-22 00:00:00.000000000 Z
11
+ date: 2024-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: csv
@@ -57,9 +57,9 @@ require_paths:
57
57
  - lib
58
58
  required_ruby_version: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - ">="
60
+ - - '='
61
61
  - !ruby/object:Gem::Version
62
- version: '0'
62
+ version: 3.3.4
63
63
  required_rubygems_version: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - ">="