dorian-csv-uniq 0.1.1 → 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 +16 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 840b7e2f1b21b6216b7b4ffbd81fc734e89875451b50a4a413b1c7b648d156a1
4
- data.tar.gz: b05e8907b44c6851ed2a99a0cf4c72e1f85d16646ca4596d33a801223138805e
3
+ metadata.gz: 8890562977177594a6271149092412127fbf019dbd43bcd0b011f6333f910541
4
+ data.tar.gz: 564679dfac50c4a80084ef502964d01dadafd36e709c73c9422b734e249f7061
5
5
  SHA512:
6
- metadata.gz: fdf422f2c703a41bb5929c7ffa93c9e23a6820a716064be569430c734e0cb75e0275142d6819d5a757e958f9416ddc4a2b9a8b96da133fa320944985f8e49830
7
- data.tar.gz: 51e1d4fc419c4742caf117e699a5fab950f2381153f84d5126f9ee666072ddadd34d347744786cc8273a0174bd7d29039af71f9bb326ae17d81ccc7617b83341
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.1
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-18 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
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dorian-arguments
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description: returns a csv by unique keys, can be index or name
28
42
  email: dorian@dorianmarie.com
29
43
  executables: