csvp 0.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 +7 -0
  2. data/lib/csvp.rb +59 -0
  3. metadata +128 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bd64e586de8ea735f1d88ad7c881bb4d6c637a4b
4
+ data.tar.gz: 3034ebd73917f9a3f21b6a33e1b911672bbdac55
5
+ SHA512:
6
+ metadata.gz: 8877057a52f562f88d75b89b900dccb12e6a8dfaef081a09687930f47c2aad371a8a11dc3f96f0f6d22405c59f8e4f613e94af0ceb3b93c96e84dd634673897f
7
+ data.tar.gz: 62c7420dfb8f263ce38ac7085600a6a64c76f3863be6b2c2d16b607245f631b530f1c94a9b39a01e6cd9725419e3582626438fbbbb46c7b737bf1f1b60912160
@@ -0,0 +1,59 @@
1
+ # Prints Enumerable in CSV format on the best effort basis.
2
+ #
3
+ # @param enum [Enumerable]
4
+ # @param separator [String]
5
+ # @param quote [String]
6
+ #
7
+ # Example:
8
+ # ?> csvp [{a: 1, b: 2}, {a: 3, b: 4} ]
9
+ # a,b
10
+ # 1,2
11
+ # 3,4
12
+ #
13
+ # This implementation attempts to follow https://tools.ietf.org/html/rfc4180
14
+
15
+ def csvp(enum, separator: ',', quote: "")
16
+ return if enum.nil?
17
+
18
+ add_quotes = proc { |str| "#{quote}#{str.gsub(quote, quote*2)}#{quote}" }
19
+
20
+ # Vectorize scalar values into Enumerables to avoid multiple codepaths.
21
+ enum = case enum
22
+ when Struct then enum.to_h
23
+ when OpenStruct then enum.to_h
24
+ when -> (obj) { defined?(ActiveRecord::Base) && ActiveRecord::Base === obj } then enum.attributes
25
+ when -> (obj) { defined?(ActiveRecord::Relation) && ActiveRecord::Relation === obj } then enum.to_a
26
+ when -> (obj) { !obj.is_a?(Enumerable) } then [enum]
27
+ else enum
28
+ end
29
+
30
+ columns = case enum.first
31
+ when Hash then enum.first.keys
32
+ when Struct then enum.first.members
33
+ when OpenStruct then enum.first.instance_variable_get("@table").keys
34
+ when -> (obj) { defined?(ActiveRecord::Base) && ActiveRecord::Base === obj } then enum.first.attributes.keys
35
+ end
36
+ puts columns.map(&:to_s).map(&add_quotes).join(separator) if columns
37
+
38
+ enum.each do |row|
39
+ values = case row
40
+ when Hash then row.values
41
+ when OpenStruct then row.instance_variable_get("@table").values
42
+ when -> (obj) { defined?(ActiveRecord::Base) && ActiveRecord::Base === obj } then row.attributes.values
43
+ when Enumerable then row
44
+ else [row]
45
+ end
46
+
47
+ puts values.map(&:to_s).map(&add_quotes).join(separator)
48
+ end
49
+
50
+ nil
51
+ end
52
+
53
+ def tsvp(enum)
54
+ csvp enum, separator: "\t"
55
+ end
56
+
57
+ def qcsvp(enum)
58
+ csvp enum, quote: "\""
59
+ end
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: csvp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Martin Scavnicky
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-06-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.4'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.10'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.10'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry-byebug
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activerecord
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '4.2'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '4.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sqlite3
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.3'
83
+ - !ruby/object:Gem::Dependency
84
+ name: codecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.1'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.1'
97
+ description: Print enumerables as CSV effortlessly.
98
+ email: martin.scavnicky@gmail.com
99
+ executables: []
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - lib/csvp.rb
104
+ homepage: https://github.com/mscavnicky/csvp
105
+ licenses:
106
+ - MIT
107
+ metadata: {}
108
+ post_install_message:
109
+ rdoc_options: []
110
+ require_paths:
111
+ - lib
112
+ required_ruby_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ requirements: []
123
+ rubyforge_project:
124
+ rubygems_version: 2.5.1
125
+ signing_key:
126
+ specification_version: 4
127
+ summary: CSV Print
128
+ test_files: []