dorian-csv-uniq 0.1.2 → 1.0.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 +51 -20
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b0f43afd50cb8ba7012f5ca77ce42426533ac1118e2eb4f0b102e97a73e1cc80
4
- data.tar.gz: 5893e31eed4f2eccfc77302d6f286b190e11c8df2588a84dfb17be23d0abb081
3
+ metadata.gz: 8890562977177594a6271149092412127fbf019dbd43bcd0b011f6333f910541
4
+ data.tar.gz: 564679dfac50c4a80084ef502964d01dadafd36e709c73c9422b734e249f7061
5
5
  SHA512:
6
- metadata.gz: 9bec710af2bf383307649cee46a0433cdf8bc74341b602c7c78199d0c63e8e5be9d917b4947d7d3c66b30e5a10dc697ecf238c5d89f3458f8852cbd2d2865d60
7
- data.tar.gz: a4196cd5709e61c9341db83ce5f181c99505a83edaed194a0e21f489e39aea2676ac2972d6b24bbf1e637b5525684dd96231ff7cee85200c67b27b746cf18786
6
+ metadata.gz: 1018b2ffbf3518c1862de7c47b289f44bf23dfa869343e0c361b15e7a6756ddbfb8a0e4c7ac82274c4f19aaf88af76e767069142d90594f2b45c1d16e5205da9
7
+ data.tar.gz: 7b66353370765cba05dc18ab12d436d71b541ec008f6dfb67c1986a78dc69b806735937d71be08510d0446d0e802971a545e6adf4d8dccab7134833f8d1be792
data/bin/csv-uniq CHANGED
@@ -2,29 +2,60 @@
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", __FILE__))
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
+ if parsed.options.print_headers && index.zero?
41
+ output << (keys || input.headers).map do |key|
42
+ if input.headers.include?(key)
43
+ key
44
+ elsif key.to_i.to_s == key
45
+ input.headers[key.to_i]
46
+ else
47
+ key
48
+ end
49
+ end
50
+ end
51
+
52
+ input.map do |row|
53
+ (
54
+ keys || (headers && input.headers) || (0...input.first.size)
55
+ ).map { |key| row[key.to_i.to_s == key ? key.to_i : key] }
56
+ end
57
+ end
58
+
59
+ rows.flatten(1).uniq.each { |row| output << row }
60
+ end
30
61
  )
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.0.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-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: csv