csv2hash 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8e9db6b93dc1699a3757bb2e9d813285c58e5f4b
4
- data.tar.gz: aa03c5a3d6679ac7b1598052dbe8cb38a9ea88ae
3
+ metadata.gz: 9ab8b867d5257761c23fb310ad45eab25d5eebe9
4
+ data.tar.gz: ffec55a91cb1ccd853e641b65f965cc0a51c0350
5
5
  SHA512:
6
- metadata.gz: d3aa7cdba3548a4bca5e185ee550fbf3812b0912fd5f0a47b4db131a3245a4e736bfb89a93dbd259118cdd37b405a6958fdf4a58d6e07b1ceab208d69436d232
7
- data.tar.gz: 9485aca4d1047db6566e07b8dd87282c505fe4db9ad5d7cd4db6f5b8097819b50aeeea0c381a2beca64ec1e096938713a04f674c973d80a5995fbd5dc49f9d4a
6
+ metadata.gz: 801f045f211e3dffaafad4c27dffd922132b40be5bc98b2013fafa676f7c3a7584bfad7f5c39ce96dc34a7ace3033cfd54f5505812d61e58ba0c20b6b956228c
7
+ data.tar.gz: d446c104f67af25a884fabfa3784b2baaaeaf559de8cb8d901c55acef7762966a4aa1ff80b637cfbda25e18c75bcc725b29fd3a1b97212ef9d3b7719ae628b78
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- csv2hash (0.2.0)
4
+ csv2hash (0.2.1)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/README.md CHANGED
@@ -35,19 +35,19 @@ You should declare a definition for you CSV, and then define for each cell what
35
35
 
36
36
  Example :
37
37
 
38
- You want the cell located on first line, first column to be a string with its values to be 'yes' or 'no'. Then you can right the following validation rule :
38
+ If you want the very first cell, located on the first line and on the first column to be a string with values are either 'yes' either 'no', you can write the following validation rule:
39
39
 
40
40
  { name: 'aswering', type: 'string', values: ['yes', 'no'], position: [0,0] }
41
41
 
42
- The type is 'string' by default, so can just write:
42
+ :type attribute has 'string' for default value, therefore you can just write this:
43
43
 
44
44
  { name: 'aswering', values: ['yes', 'no'], position: [0,0] }
45
45
 
46
- You can define a message, default is 'undefined :key on :position'
46
+ You can define you own message but default message is 'undefined :key on :position'
47
47
 
48
48
  { name: 'aswering', values: ['yes', 'no'], position: [0,0], message: 'this value is not supported' }
49
49
 
50
- You can also define Range
50
+ You can also define Range of values
51
51
 
52
52
  { name: 'score', values: 0..5, position: [0,0] }
53
53
 
@@ -57,7 +57,7 @@ The message is parsed:
57
57
 
58
58
  It produces :
59
59
 
60
- value of aswering is not supported, please you one of [yes, no]
60
+ value of answering is not supported, please use one of [yes, no]
61
61
 
62
62
  ### Default values
63
63
 
@@ -85,7 +85,7 @@ A definition should be provided. There are 2 types of definitions:
85
85
 
86
86
  ## Samples
87
87
 
88
- ### Validation of a cell at a precise position
88
+ ### Validation of cells with defined precision
89
89
 
90
90
  Consider the following CSV:
91
91
 
@@ -125,7 +125,7 @@ Precise position validation sample:
125
125
 
126
126
  end
127
127
 
128
- ### Validation of a collection
128
+ ### Validation of a collection (Regular CSV)
129
129
 
130
130
  Consider the following CSV:
131
131
 
@@ -164,7 +164,6 @@ Collection validation sample:
164
164
 
165
165
  end
166
166
 
167
-
168
167
  ### Structure validation rules
169
168
 
170
169
  You may want to validate some structure, like min or max number of columns, definition accepts structure_rules as a key for the third parameter.
@@ -193,7 +192,7 @@ class MyParser
193
192
  end
194
193
 
195
194
  def definition
196
- Csv2Hash::Definition.new(rules, type = Csv2Hash::Definition::COLLECTION, structure_rules: {'MinColumn' => 2, 'MaxColumn' => 3})
195
+ Csv2Hash::Definition.new(rules, type = Csv2Hash::Definition::COLLECTION, structure_rules: { 'MinColumns' => 2, 'MaxColumns' => 3 })
197
196
  end
198
197
  end
199
198
 
@@ -202,19 +201,19 @@ end
202
201
 
203
202
  You can define the number of rows to skip in the header of the CSV.
204
203
 
205
- Definition.new(rules, type, header_size=0)
204
+ Definition.new(rules, type, header_size: 0)
206
205
 
207
206
  ### Parser and configuration
208
207
 
209
- Pasrer take severale parameters like that :
208
+ Pasrer can take several parameters like that:
210
209
 
211
- initialize definition, file_path, exception_mode=true, data_source=nil, ignore_blank_line=false
210
+ definition, file_path, exception_mode=true, data_source=nil, ignore_blank_line=false
212
211
 
213
- you can pass directly Array of data (Array at 2 dimensions) really useful for testing, if you don't care about line blank in your CSV you can ignore them.
212
+ you can pass directly Array of data (Array at 2 dimensions) really useful for testing, if you don't care about blank lines in your CSV you can ignore them.
214
213
 
215
214
  ### Response
216
215
 
217
- The parser return values wrapper into DataWrapper Object, you can call .valid? method on this Object and grab either data or errors like that :
216
+ The parser return values wrapper into DataWrapper Object, you can call ```.valid?``` method on this Object and grab either data or errors like that :
218
217
 
219
218
  response = parser.parse
220
219
  if response.valid?
@@ -229,11 +228,11 @@ data or errors are Array, but errors can be formatted on csv format with .to_csv
229
228
 
230
229
  ## Exception or Not !
231
230
 
232
- You can choice 2 modes of parsing, either **exception mode** for raise exception in first breaking rules or **csv mode** for get csv original data + errors throwing into added columns.
231
+ You can choose into 2 different modes of parsing, either **exception mode** for raise exception in first breaking rules or **csv mode** for get csv original data + errors throwing into added columns.
233
232
 
234
233
  ### On **CSV MODE** you can choose different way for manage errors
235
234
 
236
- `.parse()` return `data_wrapper` if `.parse()` is invalid, you can code your own behavior like that :
235
+ `.parse()` return `data_wrapper` if `.parse()` is invalid, you can code your own behavior:
237
236
 
238
237
  in your code
239
238
 
@@ -242,7 +241,7 @@ in your code
242
241
  return response if response.valid?
243
242
  # Whatever
244
243
 
245
- In the same time Csv2hash call **notify(response)** method when CSV parsing fail, you can add your own Notifier like that
244
+ In the same time Csv2hash call **notify(response)** method when CSV parsing fail, you can add your own Notifier:
246
245
 
247
246
  module Csv2hash
248
247
  module Plugins
@@ -287,6 +286,7 @@ errors is a Array of Hash
287
286
  ### Error
288
287
 
289
288
  { y: 1, x: 1, message: 'undefined nikcname on [0, 0]', key: 'nickname', value: nil }
289
+
290
290
  ## Personal Validator Rule
291
291
 
292
292
  You can define your own Validator
@@ -302,16 +302,15 @@ For downcase validation
302
302
  in your rule
303
303
 
304
304
  { position: [0,0], key: 'name', extra_validator: DowncaseValidator.new,
305
- message: 'your data should be writting in downcase only' }
305
+ message: 'your data should be written in lowercase only.' }
306
306
 
307
307
  Csv data
308
308
 
309
309
  [ [ 'Foo' ] ]
310
310
 
311
+ # Upgrading from 0.1 to 0.2
311
312
 
312
- ### Upgrading from 0.1 to 0.2
313
-
314
- The signature of Definition#initialize changed, as last parameter is a configuration hash, while in versions prior to 0.2 it was an integer (header_size) consider upgrading your code :
313
+ The signature of Definition#new has changed, the last parameter is a configuration hash, while in versions prior to 0.2 it was an integer (header_size) consider upgrading your code :
315
314
 
316
315
  Prior to 0.2 :
317
316
 
data/ReleaseNotes.md CHANGED
@@ -1,3 +1,7 @@
1
+ VERSION 0.2.1
2
+
3
+ * Correct little bug on error mode.
4
+
1
5
  VERSION 0.2
2
6
 
3
7
  * The signature of Definition#new
data/csv2hash.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |spec|
2
2
 
3
3
  spec.name = 'csv2hash'
4
- spec.version = '0.2.0'
4
+ spec.version = '0.2.1'
5
5
  spec.date = '2013-11-26'
6
6
  spec.summary = %q{Mapping a CSV to a Ruby Hash}
7
7
  spec.description = %q{DSL to map a CSV to a Ruby Hash}
@@ -6,14 +6,14 @@ module Csv2hash::StructureValidator
6
6
  begin
7
7
  rule_instance(rule, options).validate! data_source
8
8
  rescue => e
9
- self.errors << e.message
9
+ self.errors << { y: nil, x: nil, message: e.message, key: nil }
10
10
  raise if exception_mode
11
11
  end
12
12
  end
13
+ end
13
14
 
14
- def rule_instance rule, options
15
- Csv2hash::StructureValidator.const_get(rule).new(options)
16
- end
15
+ def rule_instance rule, options
16
+ Csv2hash::StructureValidator.const_get(rule).new(options)
17
17
  end
18
18
 
19
19
  module Validator
@@ -1,3 +1,3 @@
1
1
  module Cvs2hash
2
- VERSION = '0.2.0'
2
+ VERSION = '0.2.1'
3
3
  end
@@ -4,6 +4,7 @@ describe Csv2hash::StructureValidator do
4
4
 
5
5
  let(:rules) { [ { position: [0,0], key: 'name' } ] }
6
6
  let(:options) { {} }
7
+ let(:exception_mode) { true }
7
8
  let(:definition) do
8
9
  Csv2hash::Definition.new(rules, Csv2hash::Definition::MAPPING, options).tap do |definition|
9
10
  definition.validate!
@@ -12,9 +13,27 @@ describe Csv2hash::StructureValidator do
12
13
  end
13
14
 
14
15
  subject do
15
- Csv2hash.new(definition, 'file_path', true, data_source)
16
+ Csv2hash.new(definition, 'file_path', exception_mode, data_source)
16
17
  end
17
18
 
19
+ context 'the csv with errors' do
20
+ let(:options){ { structure_rules: { 'MaxColumns' => 2 } } }
21
+ let(:exception_mode) { false }
22
+ before { subject.parse }
23
+ let(:data_source) do
24
+ [
25
+ [ 'John', 'Doe' ],
26
+ [ 'Jane', 'Doe', 'extra field' ]
27
+ ]
28
+ end
29
+
30
+ its(:csv_with_errors) { should be_kind_of CsvArray }
31
+ it "adds structure error in first cell" do
32
+ subject.csv_with_errors.first[:message].should eq 'Too many columns (max. 2) on line 1'
33
+ end
34
+ end
35
+
36
+
18
37
  context '#MaxColumns' do
19
38
  let(:options){ { structure_rules: { 'MaxColumns' => 2 } } }
20
39
 
@@ -9,12 +9,6 @@ describe Csv2hash::Validator do
9
9
  end
10
10
  end
11
11
 
12
- subject do
13
- Csv2hash.new(definition, 'file_path').tap do |parser|
14
- parser.instance_variable_set :@data_source, data_source
15
- end
16
- end
17
-
18
12
  describe '#message' do
19
13
  subject { Csv2hash.new double('definition', type: Csv2hash::Definition::COLLECTION), nil }
20
14
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: csv2hash
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
  - Joel AZEMAR