simple_csv 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +7 -3
- data/bin/console +1 -6
- data/lib/simple_csv/base.rb +20 -7
- data/lib/simple_csv/reader.rb +5 -1
- data/lib/simple_csv/version.rb +1 -1
- data/lib/simple_csv/writer.rb +16 -9
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 231e7fbad555b49a61b98371f3a05ee09808a553
|
4
|
+
data.tar.gz: 984bef2177800ab060792a42f77f6db230974243
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a720b5c40d5551eba6b13dbf18da0eebfd2eb7c8ad4ba7760ca065b663aa60b9349233aaee9d6237e4d58b657a8cd2210ee6ba9dea1a77099ffc90f7589f515d
|
7
|
+
data.tar.gz: 21eb0638cd1b3093f1ef6d425ad3b0948a907c4079a4ac0b6fd150b3034f4f2f06ad7d110fe35d02db24a8661e8dc77f67a9d883f2ffcbe2c58aa6d33a3d7502
|
data/README.md
CHANGED
@@ -43,13 +43,13 @@ The headers will be picked up and used instead of the first line.
|
|
43
43
|
|
44
44
|
#### SimpleCsv default settings
|
45
45
|
|
46
|
-
These are the settings that will be merged with settings passed
|
46
|
+
These are the settings that will be merged with settings passed through either `SimpleCsv#generate` or `SimpleCsv#read`
|
47
47
|
|
48
48
|
| setting | value |
|
49
49
|
|----------------------|---------------------------------------|
|
50
|
-
|`:col_sep` | `","`
|
50
|
+
|`:col_sep` | `","` |
|
51
51
|
|`:row_sep` | `:auto` |
|
52
|
-
|`:quote_char` | `"\"`
|
52
|
+
|`:quote_char` | `"\"` |
|
53
53
|
|`:field_size_limit` | `nil` |
|
54
54
|
|`:converters` | `[:all, :blank_to_nil, :null_to_nil]` |
|
55
55
|
|`:unconverted_fields` | `nil` |
|
@@ -109,6 +109,8 @@ SimpleCsv.generate path, options = { ... }, &block
|
|
109
109
|
The `SimpleCsv#generate` method takes a (required) path, an (optional) hash of options and a (required) block to start building a CSV file.
|
110
110
|
To generate a CSV file we use `SimpleCsv#generate` (using the [faker](https://github.com/stympy/faker) gem to provide fake data)
|
111
111
|
|
112
|
+
While writing a row to a CSV, the value of a set property can be accessed by calling that property method again without arguments. (See the "inspect a value" comment in the following example)
|
113
|
+
|
112
114
|
```ruby
|
113
115
|
require 'faker'
|
114
116
|
|
@@ -121,6 +123,8 @@ SimpleCsv.generate('output.csv') do
|
|
121
123
|
100.times do
|
122
124
|
# insert data in each field defined in headers to insert a row.
|
123
125
|
first_name Faker::Name.first_name
|
126
|
+
# inspect a value
|
127
|
+
p first_name
|
124
128
|
last_name Faker::Name.last_name
|
125
129
|
birth_date Faker::Date.between(Date.today << 900, Date.today << 200)
|
126
130
|
employed_at [Faker::Company.name, nil].sample
|
data/bin/console
CHANGED
@@ -5,9 +5,4 @@ require 'pry'
|
|
5
5
|
require 'faker'
|
6
6
|
require 'simple_csv'
|
7
7
|
|
8
|
-
|
9
|
-
headers :first_name, :last_name, :birth_date, :employed_at, employed_at: :job
|
10
|
-
each_row { p job }
|
11
|
-
end
|
12
|
-
|
13
|
-
# Pry.start
|
8
|
+
Pry.start
|
data/lib/simple_csv/base.rb
CHANGED
@@ -4,11 +4,6 @@ module SimpleCsv
|
|
4
4
|
|
5
5
|
COMMON_DELIMITERS = %w(, ; |).freeze
|
6
6
|
|
7
|
-
def debug_headers
|
8
|
-
p "@headers is now: #{@headers.join ','}"
|
9
|
-
p "@col_map is now #{@col_map}"
|
10
|
-
end
|
11
|
-
|
12
7
|
private
|
13
8
|
|
14
9
|
def settings(**opts)
|
@@ -18,16 +13,34 @@ module SimpleCsv
|
|
18
13
|
|
19
14
|
def headers(*cols, **col_map)
|
20
15
|
@headers ||= []
|
21
|
-
|
16
|
+
|
17
|
+
if cols.any?
|
18
|
+
@headers.concat cols.map { |col| col.to_s.strip }
|
19
|
+
alias_to_friendly_headers
|
20
|
+
end
|
22
21
|
|
23
22
|
@col_map ||= {}
|
24
23
|
@col_map.merge! stringify_col_map(col_map) if col_map.any?
|
25
24
|
|
26
25
|
@headers_set ||= @headers.any?
|
27
|
-
|
28
26
|
@headers
|
29
27
|
end
|
30
28
|
|
29
|
+
def alias_to_friendly_headers
|
30
|
+
@col_map ||= {}
|
31
|
+
aliasses = headers.each_with_object({}) do |hdr, h|
|
32
|
+
n = hdr.to_s.strip.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
|
33
|
+
.gsub(/[^\w]|\s/, '_')
|
34
|
+
h[n] = hdr unless @col_map.key? n
|
35
|
+
end
|
36
|
+
|
37
|
+
@col_map.merge! aliasses
|
38
|
+
end
|
39
|
+
|
40
|
+
def method_missing(mtd, *args, &block)
|
41
|
+
super
|
42
|
+
end
|
43
|
+
|
31
44
|
def stringify_col_map(col_map)
|
32
45
|
col_map.to_a.map { |m| m.reverse.map(&:to_s) }.to_h
|
33
46
|
end
|
data/lib/simple_csv/reader.rb
CHANGED
@@ -70,10 +70,14 @@ module SimpleCsv
|
|
70
70
|
@first_line ||= File.open @csv_path, &:readline
|
71
71
|
end
|
72
72
|
|
73
|
+
def respond_to_missing?(mtd, include_private)
|
74
|
+
headers.include?(m) || @col_map.key?(m)
|
75
|
+
end
|
76
|
+
|
73
77
|
def method_missing(mtd, *args, &block)
|
74
78
|
m = mtd.to_s
|
75
79
|
return @record[m] if headers.include?(m)
|
76
|
-
return @record[@col_map[m]] if @col_map
|
80
|
+
return @record[@col_map[m]] if @col_map.key?(m)
|
77
81
|
super
|
78
82
|
end
|
79
83
|
end
|
data/lib/simple_csv/version.rb
CHANGED
data/lib/simple_csv/writer.rb
CHANGED
@@ -4,6 +4,7 @@ module SimpleCsv
|
|
4
4
|
settings.apply({force_row_completion: true}, opts)
|
5
5
|
CSV.open(File.expand_path(path), 'w', settings.for_csv) do |csv|
|
6
6
|
@csv = csv
|
7
|
+
@last_row = {}
|
7
8
|
@current_row = {}
|
8
9
|
instance_eval(&block)
|
9
10
|
end
|
@@ -12,29 +13,35 @@ module SimpleCsv
|
|
12
13
|
private
|
13
14
|
|
14
15
|
def respond_to_missing?(mtd, include_private = false)
|
15
|
-
super
|
16
|
+
super unless headers.include?(mtd.to_s) || @col_map.key?(mtd.to_s)
|
16
17
|
end
|
17
18
|
|
18
19
|
def method_missing(mtd, *args, &block)
|
19
20
|
SimpleCsv.csv_manually_set_headers! unless @headers_written
|
20
|
-
|
21
|
+
current_val = @current_row[mtd] if @current_row.key?(mtd)
|
22
|
+
current_val = @last_row[mtd] if @last_row.key?(mtd)
|
23
|
+
|
24
|
+
return current_val if args.empty? && current_val
|
25
|
+
super unless headers.include?(mtd.to_s) || @col_map.key?(mtd.to_s)
|
21
26
|
|
22
|
-
if settings.force_row_completion && @current_row.key?(mtd)
|
27
|
+
if settings.force_row_completion && @current_row.key?(mtd) && args.any?
|
23
28
|
SimpleCsv.row_not_complete!(mtd, args.first)
|
24
29
|
end
|
25
30
|
|
26
|
-
@current_row[mtd] = args.first ||
|
31
|
+
current_val = @current_row[mtd] = args.first || current_val
|
27
32
|
|
28
|
-
return unless @current_row.size == headers.size
|
33
|
+
return current_val unless @current_row.size == headers.size
|
29
34
|
|
35
|
+
@last_row = @current_row
|
30
36
|
@csv << @current_row.values
|
31
37
|
@current_row = {}
|
38
|
+
current_val
|
32
39
|
end
|
33
40
|
|
34
|
-
def headers(*
|
35
|
-
|
36
|
-
|
37
|
-
|
41
|
+
def headers(*args)
|
42
|
+
super
|
43
|
+
(@csv << @headers) && @headers_written = true if !@headers_written && @csv
|
44
|
+
@headers
|
38
45
|
end
|
39
46
|
end
|
40
47
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_csv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sidney Liebrand
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|