csv2hash 0.7.3 → 0.7.5
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/CHANGELOG.md +15 -0
- data/Gemfile.lock +32 -34
- data/README.md +70 -17
- data/lib/csv2hash/coercers/yaml_coercer.rb +78 -5
- data/lib/csv2hash/configuration.rb +4 -0
- data/lib/csv2hash/version.rb +1 -1
- data/lib/generators/csv2hash/install/templates/csh2hash.rb +9 -4
- data/spec/csv2hash/coniguration_spec.rb +21 -3
- data/spec/csv2hash/yaml_coercer_spec.rb +106 -15
- metadata +22 -22
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 98a1f20cad762675329d3eeb1a4c916200dd3b66
|
|
4
|
+
data.tar.gz: e4f8835e3204827e081fe07a99ad5c98bfdc6e93
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ba40bdb3783b76f10791df8e6de5f20461097ef966b4e4eb7a73dab030b6265e32125e0ed502de97080dd8be98f4714e214d7717f463b411f7730b92dc03b9a0
|
|
7
|
+
data.tar.gz: 7c9b7c83c2982fa6fbd73ba8d4e56f6386f7b23ffb1216a90e9fae64c6947a38ba2cc3639c303023b938f5b019623c89c58bd680560d048937b7598eb6549459
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
### VERSION 0.7.5
|
|
2
|
+
|
|
3
|
+
Add extra feature on Autodiscover Regex field.
|
|
4
|
+
|
|
5
|
+
* enhancements
|
|
6
|
+
* Add case sensitive option on auto discover field
|
|
7
|
+
* Add exact matching option on auto discover field
|
|
8
|
+
|
|
9
|
+
* [fullchanges](https://github.com/FinalCAD/csv2hash/pull/25)
|
|
10
|
+
* [Author Joel AZEMAR](https://github.com/joel)
|
|
11
|
+
|
|
12
|
+
### VERSION 0.7.4
|
|
13
|
+
|
|
14
|
+
* security updates
|
|
15
|
+
|
|
1
16
|
### VERSION 0.7.3
|
|
2
17
|
|
|
3
18
|
* enhancements
|
data/Gemfile.lock
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
csv2hash (0.7.
|
|
4
|
+
csv2hash (0.7.5)
|
|
5
5
|
activesupport (~> 4.1)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: http://rubygems.org/
|
|
9
9
|
specs:
|
|
10
|
-
actionpack (4.1.
|
|
11
|
-
actionview (= 4.1.
|
|
12
|
-
activesupport (= 4.1.
|
|
10
|
+
actionpack (4.1.8)
|
|
11
|
+
actionview (= 4.1.8)
|
|
12
|
+
activesupport (= 4.1.8)
|
|
13
13
|
rack (~> 1.5.2)
|
|
14
14
|
rack-test (~> 0.6.2)
|
|
15
|
-
actionview (4.1.
|
|
16
|
-
activesupport (= 4.1.
|
|
15
|
+
actionview (4.1.8)
|
|
16
|
+
activesupport (= 4.1.8)
|
|
17
17
|
builder (~> 3.1)
|
|
18
18
|
erubis (~> 2.7.0)
|
|
19
|
-
activesupport (4.1.
|
|
19
|
+
activesupport (4.1.8)
|
|
20
20
|
i18n (~> 0.6, >= 0.6.9)
|
|
21
21
|
json (~> 1.7, >= 1.7.7)
|
|
22
22
|
minitest (~> 5.1)
|
|
@@ -24,12 +24,12 @@ GEM
|
|
|
24
24
|
tzinfo (~> 1.1)
|
|
25
25
|
builder (3.2.2)
|
|
26
26
|
coderay (1.1.0)
|
|
27
|
-
coveralls (0.7.
|
|
27
|
+
coveralls (0.7.2)
|
|
28
28
|
multi_json (~> 1.3)
|
|
29
|
-
rest-client
|
|
29
|
+
rest-client (= 1.6.7)
|
|
30
30
|
simplecov (>= 0.7)
|
|
31
|
-
term-ansicolor
|
|
32
|
-
thor
|
|
31
|
+
term-ansicolor (= 1.2.2)
|
|
32
|
+
thor (= 0.18.1)
|
|
33
33
|
diff-lcs (1.2.5)
|
|
34
34
|
docile (1.1.5)
|
|
35
35
|
erubis (2.7.0)
|
|
@@ -37,19 +37,18 @@ GEM
|
|
|
37
37
|
activesupport (>= 3.0.0)
|
|
38
38
|
railties (>= 3.0.0)
|
|
39
39
|
i18n (0.6.11)
|
|
40
|
-
inch (0.
|
|
40
|
+
inch (0.5.7)
|
|
41
41
|
pry
|
|
42
42
|
sparkr (>= 0.2.0)
|
|
43
43
|
term-ansicolor
|
|
44
|
-
yard (~> 0.8.7)
|
|
44
|
+
yard (~> 0.8.7.5)
|
|
45
45
|
its (0.2.0)
|
|
46
46
|
rspec-core
|
|
47
47
|
json (1.8.1)
|
|
48
48
|
method_source (0.8.2)
|
|
49
|
-
mime-types (2.3)
|
|
50
|
-
minitest (5.4.
|
|
49
|
+
mime-types (2.4.3)
|
|
50
|
+
minitest (5.4.3)
|
|
51
51
|
multi_json (1.10.1)
|
|
52
|
-
netrc (0.7.7)
|
|
53
52
|
pry (0.10.1)
|
|
54
53
|
coderay (~> 1.1.0)
|
|
55
54
|
method_source (~> 0.8.1)
|
|
@@ -57,43 +56,42 @@ GEM
|
|
|
57
56
|
rack (1.5.2)
|
|
58
57
|
rack-test (0.6.2)
|
|
59
58
|
rack (>= 1.0)
|
|
60
|
-
railties (4.1.
|
|
61
|
-
actionpack (= 4.1.
|
|
62
|
-
activesupport (= 4.1.
|
|
59
|
+
railties (4.1.8)
|
|
60
|
+
actionpack (= 4.1.8)
|
|
61
|
+
activesupport (= 4.1.8)
|
|
63
62
|
rake (>= 0.8.7)
|
|
64
63
|
thor (>= 0.18.1, < 2.0)
|
|
65
|
-
rake (10.
|
|
66
|
-
rest-client (1.7
|
|
67
|
-
mime-types (>= 1.16
|
|
68
|
-
netrc (~> 0.7)
|
|
64
|
+
rake (10.4.0)
|
|
65
|
+
rest-client (1.6.7)
|
|
66
|
+
mime-types (>= 1.16)
|
|
69
67
|
rspec (3.1.0)
|
|
70
68
|
rspec-core (~> 3.1.0)
|
|
71
69
|
rspec-expectations (~> 3.1.0)
|
|
72
70
|
rspec-mocks (~> 3.1.0)
|
|
73
|
-
rspec-core (3.1.
|
|
71
|
+
rspec-core (3.1.7)
|
|
74
72
|
rspec-support (~> 3.1.0)
|
|
75
|
-
rspec-expectations (3.1.
|
|
73
|
+
rspec-expectations (3.1.2)
|
|
76
74
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
77
75
|
rspec-support (~> 3.1.0)
|
|
78
|
-
rspec-mocks (3.1.
|
|
76
|
+
rspec-mocks (3.1.3)
|
|
79
77
|
rspec-support (~> 3.1.0)
|
|
80
|
-
rspec-support (3.1.
|
|
81
|
-
simplecov (0.9.
|
|
78
|
+
rspec-support (3.1.2)
|
|
79
|
+
simplecov (0.9.1)
|
|
82
80
|
docile (~> 1.1.0)
|
|
83
|
-
multi_json
|
|
81
|
+
multi_json (~> 1.0)
|
|
84
82
|
simplecov-html (~> 0.8.0)
|
|
85
83
|
simplecov-html (0.8.0)
|
|
86
84
|
slop (3.6.0)
|
|
87
85
|
sparkr (0.4.1)
|
|
88
|
-
term-ansicolor (1.
|
|
89
|
-
tins (~>
|
|
90
|
-
thor (0.
|
|
86
|
+
term-ansicolor (1.2.2)
|
|
87
|
+
tins (~> 0.8)
|
|
88
|
+
thor (0.18.1)
|
|
91
89
|
thread_safe (0.3.4)
|
|
92
|
-
tins (
|
|
90
|
+
tins (0.13.2)
|
|
93
91
|
tomparse (0.4.2)
|
|
94
92
|
tzinfo (1.2.2)
|
|
95
93
|
thread_safe (~> 0.1)
|
|
96
|
-
yard (0.8.7.
|
|
94
|
+
yard (0.8.7.6)
|
|
97
95
|
yard-tomdoc (0.7.1)
|
|
98
96
|
tomparse (>= 0.4.0)
|
|
99
97
|
yard
|
data/README.md
CHANGED
|
@@ -23,8 +23,9 @@ It is a DSL to validate and map a CSV to a Ruby Hash.
|
|
|
23
23
|
* [Definition DSL](#definition-dsl)
|
|
24
24
|
* [Definition Rules](#definition-rules)
|
|
25
25
|
* [Default rules values](#default-rules-values)
|
|
26
|
-
* [
|
|
26
|
+
* [Define where your data are expected](#define-where-your-data-are-expected)
|
|
27
27
|
* [Samples](#samples)
|
|
28
|
+
* [Autodiscover generale setting](#autodiscover-generale-setting)
|
|
28
29
|
* [[MAPPING] Validation of cells with defined precision](#mapping-validation-of-cells-with-defined-precision)
|
|
29
30
|
* [Auto discover position feature in Mapping](#auto-discover-position-feature-in-mapping)
|
|
30
31
|
* [[COLLECTION] Validation of a collection (Regular CSV)](#collection-validation-of-a-collection-regular-csv)
|
|
@@ -33,6 +34,7 @@ It is a DSL to validate and map a CSV to a Ruby Hash.
|
|
|
33
34
|
* [CSV Headers](#csv-headers)
|
|
34
35
|
* [Parser and configuration](#parser-and-configuration)
|
|
35
36
|
* [Response](#response)
|
|
37
|
+
* [Configuration](#configuration)
|
|
36
38
|
* [Exception or Not !](#exception-or-not-)
|
|
37
39
|
* [On **BREAK_ON_FAILURE MODE**](#on-break_on_failure-mode)
|
|
38
40
|
* [On **CSV MODE**](#on-csv-mode)
|
|
@@ -42,7 +44,7 @@ It is a DSL to validate and map a CSV to a Ruby Hash.
|
|
|
42
44
|
* [Rule](#rule)
|
|
43
45
|
* [Error](#error)
|
|
44
46
|
* [Personal Validator Rule](#personal-validator-rule)
|
|
45
|
-
* [Config file](#config-file)
|
|
47
|
+
* [Yaml Config file](#yaml-config-file)
|
|
46
48
|
* [YamlLoader](#yamlloader)
|
|
47
49
|
* [Type conversion](#type-conversion)
|
|
48
50
|
* [Changes](#changes)
|
|
@@ -170,7 +172,7 @@ All remaining keys are optionals:
|
|
|
170
172
|
* mappable: true
|
|
171
173
|
* type: 'string'
|
|
172
174
|
* values: nil
|
|
173
|
-
* case_sensitive_values: true
|
|
175
|
+
* case_sensitive_values: true # When you define set of 'values'
|
|
174
176
|
* nested: nil
|
|
175
177
|
* allow_blank: false
|
|
176
178
|
* extra_validator: nil
|
|
@@ -185,6 +187,19 @@ A definition should be provided. There are 2 types of definitions:
|
|
|
185
187
|
|
|
186
188
|
## Samples
|
|
187
189
|
|
|
190
|
+
### Autodiscover generale setting
|
|
191
|
+
|
|
192
|
+
You can define your matching expression as exact match and case sensitive or not.
|
|
193
|
+
|
|
194
|
+
```
|
|
195
|
+
conf.ignore_case = true # /Sex/ become /Sex/i
|
|
196
|
+
conf.exact_matching = true # /Sex/ become /\A(Sex)\z/
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Both option can be cumulated : /Sex/ can become /\A(Sex)\z/i
|
|
200
|
+
|
|
201
|
+
For further information please see section [Configuration](#configuration)
|
|
202
|
+
|
|
188
203
|
### [MAPPING] Validation of cells with defined precision
|
|
189
204
|
|
|
190
205
|
Consider the following CSV:
|
|
@@ -259,6 +274,12 @@ became
|
|
|
259
274
|
cell position: [[0, /Employment/],1], key: 'employment'
|
|
260
275
|
```
|
|
261
276
|
|
|
277
|
+
or
|
|
278
|
+
|
|
279
|
+
```
|
|
280
|
+
cell position: [[0, 'Employment'],1], key: 'employment'
|
|
281
|
+
```
|
|
282
|
+
|
|
262
283
|
### [COLLECTION] Validation of a collection (Regular CSV)
|
|
263
284
|
|
|
264
285
|
Consider the following CSV:
|
|
@@ -332,6 +353,11 @@ can be change to
|
|
|
332
353
|
cell position: /Name/ key: 'name'
|
|
333
354
|
```
|
|
334
355
|
|
|
356
|
+
or
|
|
357
|
+
|
|
358
|
+
```
|
|
359
|
+
cell position: 'Name' key: 'name'
|
|
360
|
+
```
|
|
335
361
|
|
|
336
362
|
### Structure validation rules
|
|
337
363
|
|
|
@@ -405,6 +431,34 @@ data or errors are Array, but errors can be formatted on csv format with .to_csv
|
|
|
405
431
|
response.errors.to_csv
|
|
406
432
|
```
|
|
407
433
|
|
|
434
|
+
## Configuration
|
|
435
|
+
|
|
436
|
+
You can add a configuration file on your Rails project under this directory
|
|
437
|
+
|
|
438
|
+
add file `config/initializers/csv2hash.rb`
|
|
439
|
+
|
|
440
|
+
You can use the Rails generator for this
|
|
441
|
+
|
|
442
|
+
`rails generate csh2hash:install`
|
|
443
|
+
|
|
444
|
+
```
|
|
445
|
+
Csv2hash.configure do |conf|
|
|
446
|
+
# Conversion of values
|
|
447
|
+
# conf.convert = false # default: false
|
|
448
|
+
# conf.true_values = ['yes','y','t'] # default: ['yes','y','t']
|
|
449
|
+
# conf.false_values = ['no','n','f'] # default: ['no','n','f']
|
|
450
|
+
# conf.nil_values = ['nil','null'] # default: ['nil','null']
|
|
451
|
+
|
|
452
|
+
# Auto discover for (mapping and collection)
|
|
453
|
+
# conf.ignore_case = false # default: false
|
|
454
|
+
# conf.exact_matching = false # default: false
|
|
455
|
+
end
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
For explanation of "Conversion of values" please take a look on [Type conversion](#type-conversion)
|
|
459
|
+
|
|
460
|
+
For explanation of "Auto discover for (mapping and collection)" please take a look on [Autodiscover generale setting](#autodiscover-generale-setting)
|
|
461
|
+
|
|
408
462
|
## Exception or Not !
|
|
409
463
|
|
|
410
464
|
You can choose into 2 differents modes of parsing, either **break_on_failure mode** for throw an exception when rule fail or **csv mode** for get csv original data + errors throwing into added extra column.
|
|
@@ -509,7 +563,7 @@ Csv data
|
|
|
509
563
|
[ [ 'Foo' ] ]
|
|
510
564
|
```
|
|
511
565
|
|
|
512
|
-
# Config file
|
|
566
|
+
# Yaml Config file
|
|
513
567
|
|
|
514
568
|
You can defined rules into a yaml file
|
|
515
569
|
|
|
@@ -584,31 +638,30 @@ loader.definition
|
|
|
584
638
|
|
|
585
639
|
# Type conversion
|
|
586
640
|
|
|
587
|
-
By default Csv2hash doesn't convert basic value, but you can activate this
|
|
641
|
+
By default Csv2hash doesn't convert basic value, but you can activate this option `convert = true`
|
|
588
642
|
|
|
589
|
-
|
|
643
|
+
You can define which String are converted on `true`, `false` or `nil`
|
|
590
644
|
|
|
591
645
|
```
|
|
592
|
-
|
|
593
|
-
conf.convert = true
|
|
594
|
-
end
|
|
646
|
+
true_values = ['yes','y','t']
|
|
595
647
|
```
|
|
596
648
|
|
|
649
|
+
With this configuration 'Yes' become => true (Basic boolean ruby value)
|
|
650
|
+
|
|
597
651
|
```
|
|
598
|
-
|
|
652
|
+
conf.false_values = ['no','n','f']
|
|
599
653
|
```
|
|
600
654
|
|
|
601
|
-
|
|
655
|
+
With this configuration 'No' become => false (Basic boolean ruby value)
|
|
602
656
|
|
|
603
657
|
```
|
|
604
|
-
|
|
605
|
-
# conf.convert = false # default: false
|
|
606
|
-
# conf.true_values = ['yes','y','t'] # default: ['yes','y','t']
|
|
607
|
-
# conf.false_values = ['no','n','f'] # default: ['no','n','f']
|
|
608
|
-
# conf.nil_values = ['nil','null'] # default: ['nil','null']
|
|
609
|
-
end
|
|
658
|
+
conf.nil_values = ['nil','null']
|
|
610
659
|
```
|
|
611
660
|
|
|
661
|
+
With this configuration 'Null' become => nil (Basic ruby value)
|
|
662
|
+
|
|
663
|
+
For further information please see section [Configuration](#configuration)
|
|
664
|
+
|
|
612
665
|
# Changes
|
|
613
666
|
|
|
614
667
|
please refere to [CHANGELOG.md](https://github.com/FinalCAD/csv2hash/blob/master/CHANGELOG.md) doc
|
|
@@ -19,16 +19,89 @@ module Csv2hash
|
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
# Public: Extract String to Regex
|
|
23
|
+
#
|
|
24
|
+
# /Sex/ => /Sex/
|
|
25
|
+
# /Sex/ => /Sex/i
|
|
26
|
+
# /Sex/ => /\A(Sex)\z/
|
|
27
|
+
# /Sex/ => /\A(Sex)\z/i
|
|
28
|
+
|
|
29
|
+
# 'Sex' => /Sex/
|
|
30
|
+
# 'Sex' => /Sex/i
|
|
31
|
+
# 'Sex' => /\A(Sex)\z/
|
|
32
|
+
# 'Sex' => /\A(Sex)\z/i
|
|
33
|
+
#
|
|
34
|
+
# Examples
|
|
35
|
+
#
|
|
36
|
+
# deserialize_regex!
|
|
37
|
+
# # => position: [0 ,0]
|
|
38
|
+
# # => position: /Sex/
|
|
39
|
+
# # => position: [[0 ,/Sex/], 0]
|
|
40
|
+
#
|
|
41
|
+
# Returns Regex (See private method YamlCoercer#regexp)
|
|
22
42
|
def deserialize_regex!
|
|
23
43
|
y, x = self.rules.fetch :position
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
44
|
+
# Value possible:
|
|
45
|
+
# * (regular) [0, 0]
|
|
46
|
+
# * (collection) 'Sex'
|
|
47
|
+
# * (mapping) [[0, 'Sex'], 0]
|
|
48
|
+
|
|
49
|
+
return if y.is_a?(Fixnum) # There are nothing to deserialized [0, 0]
|
|
50
|
+
|
|
51
|
+
# Deserialize only type of (Collection) ['Sex', 0] or (Mapping) [[0, 'Sex'], 0]
|
|
52
|
+
column, matching_string_expression = extract_column y
|
|
53
|
+
|
|
54
|
+
self.rules[:position] = if y.is_a?(Array)
|
|
55
|
+
[[column, regexp(matching_string_expression)],x] # (Mapping)
|
|
56
|
+
else # String or Regexp
|
|
57
|
+
regexp(matching_string_expression) # (Collection)
|
|
29
58
|
end
|
|
30
59
|
end
|
|
31
60
|
|
|
61
|
+
# Public: Extract if is necessary the column number.
|
|
62
|
+
# You have two type of position based on regex :
|
|
63
|
+
# * mapping: This need a column position for searching on this column the row position (search y position)
|
|
64
|
+
# * collection: Search in all columns for find column position (search x position)
|
|
65
|
+
#
|
|
66
|
+
# value - Array or String - example : [1,'Sex'] or 'Sex'
|
|
67
|
+
#
|
|
68
|
+
# Examples
|
|
69
|
+
#
|
|
70
|
+
# extract_column([1, 'Sex'])
|
|
71
|
+
# # => [1, 'Sex']
|
|
72
|
+
#
|
|
73
|
+
# extract_column('Sex')
|
|
74
|
+
# # => [nil, 'Sex']
|
|
75
|
+
#
|
|
76
|
+
# Returns a array with column position (type mapping) and matching string
|
|
77
|
+
def extract_column value
|
|
78
|
+
return value if value.is_a?(Array)
|
|
79
|
+
[nil, value]
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Public: Return regexp from string
|
|
83
|
+
#
|
|
84
|
+
# term - Matching String - Example : 'Sex'
|
|
85
|
+
#
|
|
86
|
+
# Examples
|
|
87
|
+
#
|
|
88
|
+
# regexp('Sex')
|
|
89
|
+
# # => /\A(Sex)\z/ # exact_matching: true, ignore_case: false
|
|
90
|
+
# # => /\A(Sex)\z/i # exact_matching: true, ignore_case: true
|
|
91
|
+
# # => /Sex/ # exact_matching: false, ignore_case: false
|
|
92
|
+
# # => /Sex/i # exact_matching: false, ignore_case: true
|
|
93
|
+
#
|
|
94
|
+
# Returns a regex depend of configuration, see
|
|
95
|
+
def regexp term
|
|
96
|
+
term = term.source if term.is_a?(Regexp)
|
|
97
|
+
term = "\\A(#{term})\\z" if Csv2hash.configuration.exact_matching
|
|
98
|
+
|
|
99
|
+
args = [term]
|
|
100
|
+
args << Regexp::IGNORECASE if Csv2hash.configuration.ignore_case
|
|
101
|
+
|
|
102
|
+
Regexp.new(*args)
|
|
103
|
+
end
|
|
104
|
+
|
|
32
105
|
def deserialize_range!
|
|
33
106
|
begin
|
|
34
107
|
values = self.rules.fetch(:values)
|
|
@@ -5,6 +5,8 @@ module Csv2hash
|
|
|
5
5
|
attr_accessor :nil_values
|
|
6
6
|
# attr_accessor :extra_values
|
|
7
7
|
attr_accessor :convert
|
|
8
|
+
attr_accessor :ignore_case
|
|
9
|
+
attr_accessor :exact_matching
|
|
8
10
|
|
|
9
11
|
def initialize
|
|
10
12
|
self.convert = false
|
|
@@ -12,6 +14,8 @@ module Csv2hash
|
|
|
12
14
|
self.false_values = ['no','n','f']
|
|
13
15
|
self.nil_values = ['nil','null']
|
|
14
16
|
# self.extra_values = {} # { [] => }
|
|
17
|
+
self.ignore_case = false
|
|
18
|
+
self.exact_matching = false
|
|
15
19
|
end
|
|
16
20
|
end
|
|
17
21
|
end
|
data/lib/csv2hash/version.rb
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
Csv2hash.configure do |conf|
|
|
2
|
-
#
|
|
3
|
-
# conf.
|
|
4
|
-
# conf.
|
|
5
|
-
# conf.
|
|
2
|
+
# Conversion of values
|
|
3
|
+
# conf.convert = false # default: false
|
|
4
|
+
# conf.true_values = ['yes','y','t'] # default: ['yes','y','t']
|
|
5
|
+
# conf.false_values = ['no','n','f'] # default: ['no','n','f']
|
|
6
|
+
# conf.nil_values = ['nil','null'] # default: ['nil','null']
|
|
7
|
+
|
|
8
|
+
# Auto discover for (mapping and collection)
|
|
9
|
+
# conf.ignore_case = false # default: false
|
|
10
|
+
# conf.exact_matching = false # default: false
|
|
6
11
|
end
|
|
@@ -5,13 +5,31 @@ module Csv2hash
|
|
|
5
5
|
let(:configuration) { Configuration.new }
|
|
6
6
|
|
|
7
7
|
describe '#default' do
|
|
8
|
-
let(:true_values)
|
|
9
|
-
let(:false_values)
|
|
10
|
-
let(:nil_values)
|
|
8
|
+
let(:true_values) { ['yes','y','t'] }
|
|
9
|
+
let(:false_values) { ['no','n','f'] }
|
|
10
|
+
let(:nil_values) { ['nil','null'] }
|
|
11
|
+
let(:ignore_case) { false }
|
|
12
|
+
let(:exact_matching) { false }
|
|
11
13
|
|
|
12
14
|
it 'true values' do
|
|
13
15
|
expect(configuration.true_values).to eq(true_values)
|
|
14
16
|
end
|
|
17
|
+
|
|
18
|
+
it 'false values' do
|
|
19
|
+
expect(configuration.false_values).to eq(false_values)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'nil values' do
|
|
23
|
+
expect(configuration.nil_values).to eq(nil_values)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'ignore_case' do
|
|
27
|
+
expect(configuration.ignore_case).to eq(ignore_case)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'exact_matching' do
|
|
31
|
+
expect(configuration.exact_matching).to eq(exact_matching)
|
|
32
|
+
end
|
|
15
33
|
end
|
|
16
34
|
|
|
17
35
|
end
|
|
@@ -3,25 +3,116 @@ require 'spec_helper'
|
|
|
3
3
|
module Csv2hash
|
|
4
4
|
module Coercers
|
|
5
5
|
describe YamlCoercer do
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
let(:base_rules) {{ key: 'mobile_phone', allow_blank: true }}
|
|
7
|
+
let(:ignore_case) { false }
|
|
8
|
+
let(:exact_matching) { false }
|
|
9
|
+
|
|
10
|
+
context 'deserialize!' do
|
|
9
11
|
subject { YamlCoercer.new(rules) }
|
|
12
|
+
before do
|
|
13
|
+
Csv2hash.configure do |conf|
|
|
14
|
+
conf.ignore_case = ignore_case
|
|
15
|
+
conf.exact_matching = exact_matching
|
|
16
|
+
end
|
|
17
|
+
subject.deserialize!
|
|
18
|
+
end
|
|
10
19
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
20
|
+
after do
|
|
21
|
+
Csv2hash.configure do |conf|
|
|
22
|
+
conf.ignore_case = false
|
|
23
|
+
conf.exact_matching = false
|
|
24
|
+
end
|
|
25
|
+
end
|
|
15
26
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
27
|
+
context 'regular' do
|
|
28
|
+
context 'from string' do
|
|
29
|
+
context 'when position is a string' do
|
|
30
|
+
let(:rules) { base_rules.merge(position: 'Mobile phone number') }
|
|
31
|
+
let(:result_rules) { base_rules.merge(position: /Mobile phone number/) }
|
|
32
|
+
|
|
33
|
+
it { expect(subject.rules).to eql(result_rules) }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context 'when position is a array' do
|
|
37
|
+
let(:rules) { base_rules.merge(position: [[1, 'Mobile phone number'], 2]) }
|
|
38
|
+
let(:result_rules) { base_rules.merge(position: [[1, /Mobile phone number/], 2]) }
|
|
39
|
+
|
|
40
|
+
it { expect(subject.rules).to eql(result_rules) }
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
context 'from regex' do
|
|
44
|
+
context 'when position is a string' do
|
|
45
|
+
let(:rules) { base_rules.merge(position: /Mobile phone number/) }
|
|
46
|
+
let(:result_rules) { base_rules.merge(position: /Mobile phone number/) }
|
|
47
|
+
|
|
48
|
+
it { expect(subject.rules).to eql(result_rules) }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
context 'when position is a array' do
|
|
52
|
+
let(:rules) { base_rules.merge(position: [[1, /Mobile phone number/], 2]) }
|
|
53
|
+
let(:result_rules) { base_rules.merge(position: [[1, /Mobile phone number/], 2]) }
|
|
54
|
+
|
|
55
|
+
it { expect(subject.rules).to eql(result_rules) }
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context 'ignore_case' do
|
|
61
|
+
let(:ignore_case) { true }
|
|
62
|
+
|
|
63
|
+
context 'when position is a string' do
|
|
64
|
+
let(:rules) { base_rules.merge(position: 'Mobile phone number') }
|
|
65
|
+
let(:result_rules) { base_rules.merge(position: /Mobile phone number/i) }
|
|
66
|
+
|
|
67
|
+
it { expect(subject.rules).to eql(result_rules) }
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
context 'when position is a array' do
|
|
71
|
+
let(:rules) { base_rules.merge(position: [[1, 'Mobile phone number'], 2]) }
|
|
72
|
+
let(:result_rules) { base_rules.merge(position: [[1, /Mobile phone number/i], 2]) }
|
|
73
|
+
|
|
74
|
+
it { expect(subject.rules).to eql(result_rules) }
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
context 'exact_matching' do
|
|
79
|
+
let(:exact_matching) { true }
|
|
80
|
+
|
|
81
|
+
context 'when position is a string' do
|
|
82
|
+
let(:rules) { base_rules.merge(position: 'Mobile phone number') }
|
|
83
|
+
let(:result_rules) { base_rules.merge(position: /\A(Mobile phone number)\z/) }
|
|
84
|
+
|
|
85
|
+
it { expect(subject.rules).to eql(result_rules) }
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
context 'when position is a array' do
|
|
89
|
+
let(:rules) { base_rules.merge(position: [[1, 'Mobile phone number'], 2]) }
|
|
90
|
+
let(:result_rules) { base_rules.merge(position: [[1, /\A(Mobile phone number)\z/], 2]) }
|
|
91
|
+
|
|
92
|
+
it { expect(subject.rules).to eql(result_rules) }
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
context 'exact_matching and ignore_case' do
|
|
97
|
+
let(:ignore_case) { true }
|
|
98
|
+
let(:exact_matching) { true }
|
|
99
|
+
|
|
100
|
+
context 'when position is a string' do
|
|
101
|
+
let(:rules) { base_rules.merge(position: 'Mobile phone number') }
|
|
102
|
+
let(:result_rules) { base_rules.merge(position: /\A(Mobile phone number)\z/i) }
|
|
103
|
+
|
|
104
|
+
it { expect(subject.rules).to eql(result_rules) }
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
context 'when position is a array' do
|
|
108
|
+
let(:rules) { base_rules.merge(position: [[1, 'Mobile phone number'], 2]) }
|
|
109
|
+
let(:result_rules) { base_rules.merge(position: [[1, /\A(Mobile phone number)\z/i], 2]) }
|
|
110
|
+
|
|
111
|
+
it { expect(subject.rules).to eql(result_rules) }
|
|
112
|
+
end
|
|
113
|
+
end
|
|
20
114
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
it{expect(subject.rules).to eql(result_rules)}
|
|
24
|
-
end
|
|
115
|
+
end
|
|
25
116
|
end
|
|
26
117
|
end
|
|
27
118
|
end
|
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.7.
|
|
4
|
+
version: 0.7.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Joel AZEMAR
|
|
@@ -14,70 +14,70 @@ dependencies:
|
|
|
14
14
|
name: activesupport
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- -
|
|
17
|
+
- - ~>
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
19
|
version: '4.1'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- -
|
|
24
|
+
- - ~>
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: '4.1'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: bundler
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
|
-
- -
|
|
31
|
+
- - '>'
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
33
|
version: '1.3'
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- -
|
|
38
|
+
- - '>'
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '1.3'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: rake
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
|
-
- -
|
|
45
|
+
- - ~>
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
47
|
version: '10.3'
|
|
48
48
|
type: :development
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
|
-
- -
|
|
52
|
+
- - ~>
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '10.3'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: rspec
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
|
-
- -
|
|
59
|
+
- - ~>
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
61
|
version: '3.0'
|
|
62
62
|
type: :development
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
|
-
- -
|
|
66
|
+
- - ~>
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: '3.0'
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: its
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements:
|
|
73
|
-
- -
|
|
73
|
+
- - ~>
|
|
74
74
|
- !ruby/object:Gem::Version
|
|
75
75
|
version: '0.2'
|
|
76
76
|
type: :development
|
|
77
77
|
prerelease: false
|
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements:
|
|
80
|
-
- -
|
|
80
|
+
- - ~>
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
82
|
version: '0.2'
|
|
83
83
|
description: DSL to map a CSV to a Ruby Hash
|
|
@@ -89,14 +89,14 @@ executables:
|
|
|
89
89
|
extensions: []
|
|
90
90
|
extra_rdoc_files: []
|
|
91
91
|
files:
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
-
|
|
97
|
-
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
92
|
+
- .coveralls.yml
|
|
93
|
+
- .gitignore
|
|
94
|
+
- .rspec
|
|
95
|
+
- .travis.yml
|
|
96
|
+
- .yardoc/checksums
|
|
97
|
+
- .yardoc/object_types
|
|
98
|
+
- .yardoc/objects/root.dat
|
|
99
|
+
- .yardoc/proxy_types
|
|
100
100
|
- CHANGELOG.md
|
|
101
101
|
- Gemfile
|
|
102
102
|
- Gemfile.lock
|
|
@@ -172,17 +172,17 @@ require_paths:
|
|
|
172
172
|
- lib
|
|
173
173
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
174
174
|
requirements:
|
|
175
|
-
- -
|
|
175
|
+
- - '>='
|
|
176
176
|
- !ruby/object:Gem::Version
|
|
177
177
|
version: '0'
|
|
178
178
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
179
|
requirements:
|
|
180
|
-
- -
|
|
180
|
+
- - '>='
|
|
181
181
|
- !ruby/object:Gem::Version
|
|
182
182
|
version: '0'
|
|
183
183
|
requirements: []
|
|
184
184
|
rubyforge_project:
|
|
185
|
-
rubygems_version: 2.
|
|
185
|
+
rubygems_version: 2.0.14
|
|
186
186
|
signing_key:
|
|
187
187
|
specification_version: 4
|
|
188
188
|
summary: Mapping a CSV to a Ruby Hash
|