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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: accda7d430cbe5c71e9a775bac95f9f8f7c01038
4
- data.tar.gz: c06a504dbdeaed0f91ee652655ce871a8ef5b18b
3
+ metadata.gz: 231e7fbad555b49a61b98371f3a05ee09808a553
4
+ data.tar.gz: 984bef2177800ab060792a42f77f6db230974243
5
5
  SHA512:
6
- metadata.gz: a979d33a0aab1573a75f7e8f8c98f4fea21b7bd4752b3ef80945f7ccaccb06f289efc947e537929e22d05c3db081ae9b267fb4ba89a562b8067133d07875a2a4
7
- data.tar.gz: d217b4ccea541d1136d5b2a6381720eb9defdf4d7232445b5d24c5870c3530a2cf3b84fab8266955a1c18cdba59786a6ab3d513a45f4b9fb9e7c61400061772f
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 throogh either `SimpleCsv#generate` or `SimpleCsv#read`
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
- SimpleCsv.read('spec/files/headerless.csv', has_headers: false) do
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
@@ -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
- @headers.concat cols.map(&:to_s) if cols.any?
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
@@ -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[m]
80
+ return @record[@col_map[m]] if @col_map.key?(m)
77
81
  super
78
82
  end
79
83
  end
@@ -1,3 +1,3 @@
1
1
  module SimpleCsv
2
- VERSION = "0.2.0"
2
+ VERSION = '0.2.1'.freeze
3
3
  end
@@ -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
- super unless headers.include? mtd.to_s
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(*col_names)
35
- return @headers if col_names.empty?
36
- super(*col_names)
37
- (@csv << @headers) && @headers_written = true if @csv
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.0
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-20 00:00:00.000000000 Z
11
+ date: 2016-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler