array_hasher 0.1.3 → 0.1.4

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: 9a45f205da83f60a92f9437f226b17d374923bf2
4
- data.tar.gz: 7ffc5736b6950a7043c82e6667fa188d1771f711
3
+ metadata.gz: a911e20523c7d6e32acd5b9b7966c42fac7a4162
4
+ data.tar.gz: 0d368a949b832854f4fcf251d352e6f74bd03985
5
5
  SHA512:
6
- metadata.gz: ab368697c968a84ca599e0a8b1e1f646ecb2486dfdba7807b5049015e5dfa89e53bcd1c959ad3cb614f13c2232588159aeb18dfc12b743124e13dfe852d61cc7
7
- data.tar.gz: f95939e348360dc4a3fdff59d6a3246651d369bdfc0f42b674e2771de7985642743f936d12c49628602a54faa4366f9d8dd6d3f2ed83d8a49e9673fd2332288e
6
+ metadata.gz: 6569caa11bc8414f3e37cca4fcbf28a6322de6c5da967a7ea6e45715213fe8aee9a45540c873e0cf4e0bed79729a88e7e2c5b73e8a901d3790cad009c9ffa710
7
+ data.tar.gz: 7fbb2f6f968265a22ea30ebe188fbd5237d19bb353248851352aa8eeb8bb5c73ef425584f8e3ebcaec60211d7155c43bd64eac5a6dc1952fbacff8441978b832
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- array_hasher (0.1.3)
4
+ array_hasher (0.1.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # ArrayHasher
1
+ ArrayHasher
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/array_hasher.svg)](https://badge.fury.io/rb/array_hasher)
4
4
 
5
- [![Build Status](https://travis-ci.org/xiejiangzhi/arrah_hasher.svg?branch=master)](https://travis-ci.org/xiejiangzhi/arrah_hasher)
5
+ [![Build Status](https://travis-ci.org/xiejiangzhi/array_hasher.svg?branch=master)](https://travis-ci.org/xiejiangzhi/array_hasher)
6
6
 
7
7
  Format Array data to a hash with your definition. it also can parse the CSV file with definition of title.
8
8
 
@@ -27,32 +27,49 @@ Or install it yourself as:
27
27
 
28
28
  ### Format array
29
29
 
30
+ New a formatter
31
+
30
32
  ```
31
33
  require 'array_hasher'
32
34
 
33
35
  f = ArrayHasher.new_formatter([
34
- [:a, :int], [:b, :float], [:c, proc {|v| v.split(',') }], [:d, nil, range: 3..-1]
36
+ # [hash_key, data_type]
37
+ [:a, :int],
38
+ [:b, :float],
39
+ [:c, proc {|v| v.split(',') }],
40
+ [:d, nil, range: 3..-1]
35
41
  ])
42
+ ```
43
+
44
+ Array to hash by formatter
45
+
46
+ ```
36
47
  f.parse(['number: 123', '$ 123.1', 'a,b,c', 'd1', 'd2', 'd3'])
37
48
  # => {a: 123, b: 123.1, c: ['a', 'b', 'c'], d: ['d1', 'd2', 'd3']}
49
+ ```
50
+
51
+ Define your data type
38
52
 
53
+ ```
39
54
  f.define_type(:my_arr) {|v| v.split(',').map(&:to_i) }
40
55
  f.cols[2] = [:c, :my_arr]
41
56
  f.parse(['number: 123', '$ 123.1', '1,2,3', 'd1', 'd2', 'd3'])
42
57
  # => {a: 123, b: 123.1, c: [1, 2, 3], d: ['d1', 'd2', 'd3']}
43
58
  ```
44
59
 
45
- ### Parse format from a array of string
60
+ ### Format CSV
46
61
 
47
- ```
48
- format = ArrayHasher.parse_formatter(['name:string', 'price:float', 'attrs:arr:{range: 2..-1}'])
49
- # => [[:name, :string], [:price, :float], [:attrs, :arr, range: 2..-1]]
50
- ArrayHasher.new_formatter(format)
51
- ```
62
+ For a CSV file, add a defination to csv first line, `hash_key:data_type:options`
63
+ If a column's `hash_key` is empty, we will ignore this column
64
+ If a column's `data_type` is empty, :string will be use.
65
+ `options` is a JSON of hash, it is optional.
52
66
 
53
- ### Format CSV
67
+ For examples
54
68
 
55
- CSV file
69
+ * `name`: equal to `name:string`
70
+ * ` `, `:`, `:string`: this column will be ignore
71
+ * `tags::{"range": [2,3]}`: we'll put `line[2...(2+3)]` to the `tags` key
72
+ * `name:undefined_type`: if you give a undefined type, and you didn't define it in your code, its type is `string`
56
73
 
57
74
  ```
58
75
  name:bookname,price:float,"tags::{""range"": [2, 3]}",,
@@ -62,7 +79,11 @@ My book,USD 4.3,C,123,
62
79
  Your book,1.2,Hehe,Haha,666
63
80
  ```
64
81
 
82
+ Define our data type and parser
83
+
65
84
  ```
85
+ # `bookname` type was used in that CSV file
86
+ # We can define this type, it will tell parser how to parse data of bookname
66
87
  ext_types = {bookname: proc {|v| "<#{v}>" }}
67
88
  ArrayHasher.csv_each('path/to/test.csv', ext_types) do |line|
68
89
  puts line
@@ -72,7 +93,25 @@ end
72
93
  # {:name=>"<World>", :price=>3.2, :tags=>["B", "C", "What’s this?"]}
73
94
  # {:name=>"<My book>", :price=>4.3, :tags=>["C", "123", nil]}
74
95
  # {:name=>"<Your book>", :price=>1.2, :tags=>["Hehe", "Haha", "666"]}
96
+
97
+ ArrayHasher.csv_each('path/to/test.csv', ext_types) # <Enumerator: xxx>
98
+ ```
99
+
100
+ ### Put multiple columns to one key.
101
+
75
102
  ```
103
+ # We can append a `range` option as third arguments
104
+ # `range` also can be used in CSV title
105
+ format = ArrayHasher.parse_formatter([
106
+ 'name:string',
107
+ 'price:float',
108
+ 'attrs:arr:{"range": [2, 100]}'
109
+ ])
110
+ # => [[:name, :string], [:price, :float], [:attrs, :arr, range: 2..-1]]
111
+
112
+ ArrayHasher.new_formatter(format)
113
+ ```
114
+
76
115
 
77
116
  ### Examples
78
117
 
@@ -84,7 +123,7 @@ See [Here](./examples)
84
123
  * `float` # convert string to float
85
124
  * `string`: # to_s
86
125
  * `time` # Time.parse(string)
87
- * `Proc` # format the value with your proc
126
+ * `Proc` # format the value with your proc. we can define a Proc in our code only.
88
127
 
89
128
 
90
129
  ## Development
data/examples/csv.rb CHANGED
@@ -1,9 +1,14 @@
1
1
  require 'bundler/setup'
2
2
  require 'array_hasher'
3
3
 
4
+ puts "Undefined data type 'bookname'"
5
+ ArrayHasher.csv_each(File.expand_path('../test.csv', __FILE__)) do |line|
6
+ puts line
7
+ end
8
+
9
+ puts "\nDefined 'bookname' wrap with <>"
4
10
  ext_types = {bookname: proc {|v| "<#{v}>" }}
5
11
  ArrayHasher.csv_each(File.expand_path('../test.csv', __FILE__), ext_types) do |line|
6
12
  puts line
7
13
  end
8
14
 
9
-
data/lib/array_hasher.rb CHANGED
@@ -27,7 +27,11 @@ module ArrayHasher
27
27
  csv = CSV.open(path)
28
28
  formatter = new_formatter(parse_format(csv.gets))
29
29
  formatter.types.merge!(ext_types)
30
- csv.each { |line| block.call(formatter.parse(line)) }
30
+ if block
31
+ csv.each { |line| block.call(formatter.parse(line)) }
32
+ else
33
+ Enumerator.new { |y| csv.each { |line| y << formatter.parse(line) } }
34
+ end
31
35
  end
32
36
  end
33
37
  end
@@ -1,3 +1,3 @@
1
1
  module ArrayHasher
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: array_hasher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - jiangzhi.xie
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-11-20 00:00:00.000000000 Z
11
+ date: 2018-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler