tanemaki 0.1.0 → 0.1.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 +61 -21
- data/lib/tanemaki.rb +48 -16
- data/lib/tanemaki/version.rb +1 -1
- data/tanemaki.gemspec +1 -1
- 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: bdc41e1779ca067b789c12ce2fada5b86719d094
|
4
|
+
data.tar.gz: fda55d2f676a52ac8d65e86dafe12b9ead144dcf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3fd272cd160de9f426ad42b5f40407b212cd4ef2f9b6c5bf1b4cebf73c852ca7a1fe4ec2f18f1b3e8e671411f20d11fd2293f7cad6ac5cb6bb207345f96370e9
|
7
|
+
data.tar.gz: 44f8af01d55abb92283eef0d2c89a821f0b85125a5745a465419a985e1502417e5394626dc1cbd66d1989e10acf4ecc1eff51f8fd3fffb078d75aa2868d58892
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
Tanemaki(たねまき)はRuby on Railsの`rake db:seed`で使われるseed.rbを整理するために書かれました。
|
6
6
|
|
7
7
|
こうなっているのが
|
8
|
-
```
|
8
|
+
```ruby
|
9
9
|
AreaCode.create([
|
10
10
|
{ken_code: 27, sityouson_code: 0, tiiki_code: 27000, ken_name: ,'大阪府', sityouson_name1: , sityouson_name2: '', sityouson_name3: , yomigana: 'おおさかふ'},
|
11
11
|
{ken_code: 27, sityouson_code: 100, tiiki_code: 27100, ken_name: ,'大阪府', sityouson_name1: ,'大阪市', sityouson_name2: '', sityouson_name3: , yomigana: 'おおさかし'},
|
@@ -17,7 +17,7 @@ AreaCode.create([
|
|
17
17
|
```
|
18
18
|
|
19
19
|
用意したCSVファイルと
|
20
|
-
```
|
20
|
+
```csv
|
21
21
|
ken_code,sityouson_code,tiiki_code,ken_name,sityouson_name1,sityouson_name2,sityouson_name3,yomigana
|
22
22
|
27,0,27000,大阪府,,,,おおさかふ
|
23
23
|
27,100,27100,大阪府,大阪市,,,おおさかし
|
@@ -27,40 +27,80 @@ ken_code,sityouson_code,tiiki_code,ken_name,sityouson_name1,sityouson_name2,sity
|
|
27
27
|
27,128,27128,大阪府,大阪市,,中央区,ちゅうおうく
|
28
28
|
```
|
29
29
|
|
30
|
-
```
|
30
|
+
```ruby
|
31
31
|
AreaCode.tanemaki(csv_path).seed
|
32
32
|
```
|
33
33
|
|
34
34
|
になります。
|
35
35
|
## Installation
|
36
|
-
|
37
|
-
Add this line to your application's Gemfile:
|
38
|
-
|
39
36
|
```ruby
|
40
|
-
gem 'tanemaki'
|
37
|
+
gem 'tanemaki', require: false
|
41
38
|
```
|
39
|
+
$ bundle install
|
40
|
+
使う場所で
|
42
41
|
|
43
|
-
|
44
|
-
|
45
|
-
$ bundle
|
46
|
-
|
47
|
-
Or install it yourself as:
|
48
|
-
|
49
|
-
$ gem install tanemaki
|
42
|
+
require 'tanemaki'
|
50
43
|
|
51
44
|
## Usage
|
52
45
|
|
53
|
-
|
54
|
-
|
55
|
-
|
46
|
+
こういうmodelがあるとして
|
47
|
+
```ruby
|
48
|
+
pry(main)> AreaCode
|
49
|
+
class AreaCode < ActiveRecord::Base {
|
50
|
+
:id => :integer,
|
51
|
+
:ken_code => :integer,
|
52
|
+
:sityouson_code => :integer,
|
53
|
+
:tiiki_code => :integer,
|
54
|
+
:ken_name => :string,
|
55
|
+
:sityouson_name1 => :string,
|
56
|
+
:sityouson_name2 => :string,
|
57
|
+
:sityouson_name3 => :string,
|
58
|
+
:yomigana => :string,
|
59
|
+
:created_at => :datetime,
|
60
|
+
:updated_at => :datetime
|
61
|
+
}
|
62
|
+
```
|
63
|
+
`create`に必要なキーワード引数の**キーを一行目に書いたCSV**(例えば area_code.csv)を用意。
|
64
|
+
```csv
|
65
|
+
ken_code,sityouson_code,tiiki_code,ken_name,sityouson_name1,sityouson_name2,sityouson_name3,yomigana
|
66
|
+
27,0,27000,大阪府,,,,おおさかふ
|
67
|
+
27,100,27100,大阪府,大阪市,,,おおさかし
|
68
|
+
27,102,27102,大阪府,大阪市,,都島区,みやこじまく
|
69
|
+
27,103,27103,大阪府,大阪市,,福島区,ふくしまく
|
70
|
+
# 略
|
71
|
+
27,128,27128,大阪府,大阪市,,中央区,ちゅうおうく
|
72
|
+
```
|
73
|
+
ゴー。
|
74
|
+
```ruby
|
75
|
+
AreaCode.tanemaki('area_code.csv').seed
|
76
|
+
```
|
77
|
+
内部的には各行においてこのようなことが起こります。
|
78
|
+
```ruby
|
79
|
+
AreaCode.create({ken_code: 27, sityouson_code: 102, tiiki_code: 27102, ken_name: ,'大阪府', sityouson_name1: ,'大阪市', sityouson_name2: '', sityouson_name3: '都島区', yomigana: 'みやこじまく'})
|
80
|
+
```
|
81
|
+
返り値は`create`の返り値の`Array`。
|
56
82
|
|
57
|
-
|
83
|
+
## create以外を使う
|
84
|
+
ぼくはどちらかというと`create!`が好きなので
|
85
|
+
```ruby
|
86
|
+
AreaCode.tanemaki('area_code.csv', method: :create!).seed
|
87
|
+
```
|
58
88
|
|
59
|
-
|
89
|
+
## select
|
60
90
|
|
61
|
-
|
91
|
+
CSVから必要なカラムのみ使います。
|
92
|
+
```ruby
|
93
|
+
AreaCode.tanemaki('area_code.csv').select(:tiiki_code, :ken_name, :sityouson_name1, :sityouson_name3).seed
|
94
|
+
```
|
95
|
+
内部的には各行においてこのようなことが起こります。
|
96
|
+
```ruby
|
97
|
+
AreaCode.create({tiiki_code: 27102, ken_name: ,'大阪府', sityouson_name1: ,'大阪市', sityouson_name3: '都島区'})
|
98
|
+
```
|
62
99
|
|
63
|
-
|
100
|
+
## evaluate
|
101
|
+
指定したカラムの値を式として評価します。
|
102
|
+
インスタンス変数の参照先は`scope: self`などと設定します。`Tanemaki.default_eva_scope =self`なども可能です。
|
103
|
+
(記述中)
|
64
104
|
|
65
105
|
|
66
106
|
## License
|
data/lib/tanemaki.rb
CHANGED
@@ -14,6 +14,11 @@ module Tanemaki
|
|
14
14
|
|
15
15
|
|
16
16
|
def default_eval_scope(eval_scope)
|
17
|
+
self.default_eval_scope = eval_scope
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def default_eval_scope=(eval_scope)
|
17
22
|
@eval_scope = eval_scope
|
18
23
|
end
|
19
24
|
end
|
@@ -28,11 +33,25 @@ module Tanemaki
|
|
28
33
|
|
29
34
|
def ready(path)
|
30
35
|
header, *lines = CSV.read(path)
|
31
|
-
|
36
|
+
nameless = []
|
37
|
+
readiness = header.map.with_index do |name, index|
|
38
|
+
if name
|
39
|
+
name.to_sym
|
40
|
+
else
|
41
|
+
nameless.push(index)
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
32
46
|
lines.map do |line|
|
47
|
+
nameless_parameter = []
|
33
48
|
line.each_with_index.each_with_object({}) do |(col, index), result|
|
34
|
-
|
35
|
-
|
49
|
+
if nameless.include?(index)
|
50
|
+
nameless_parameter.push(col) if col
|
51
|
+
else
|
52
|
+
result[readiness[index]] = col if col
|
53
|
+
end
|
54
|
+
end.merge(namelass_parameter_array: nameless_parameter)
|
36
55
|
end
|
37
56
|
end
|
38
57
|
end
|
@@ -71,13 +90,17 @@ module Tanemaki
|
|
71
90
|
|
72
91
|
def seed(klass = nil, method = nil, &block)
|
73
92
|
@named_csv.map do |row|
|
74
|
-
readiness =
|
93
|
+
readiness, nameless = begin
|
94
|
+
result = evaluated(row.dup)
|
95
|
+
[result, result.delete(:namelass_parameter_array)]
|
96
|
+
end
|
97
|
+
|
75
98
|
begin
|
76
|
-
(klass || @klass).send((method || @method), **readiness)
|
99
|
+
(klass || @klass).send((method || @method), *nameless, **readiness)
|
77
100
|
rescue => e
|
78
101
|
raise e unless block_given?
|
79
102
|
|
80
|
-
block.(
|
103
|
+
block.(e, row)
|
81
104
|
nil
|
82
105
|
end
|
83
106
|
end.compact
|
@@ -97,19 +120,28 @@ module Tanemaki
|
|
97
120
|
def evaluated(row)
|
98
121
|
return row if @evaluate.size == 0
|
99
122
|
|
100
|
-
row.
|
101
|
-
next
|
123
|
+
row[:namelass_parameter_array].map!.with_index do |value, index|
|
124
|
+
next value unless @evaluate.include?(index)
|
102
125
|
|
103
|
-
|
104
|
-
|
126
|
+
do_eval(value)
|
127
|
+
end
|
105
128
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
129
|
+
row.each_pair.each_with_object({}) do |(key, value), result|
|
130
|
+
next result[key] = value unless @evaluate.include?(key)
|
131
|
+
|
132
|
+
result[key] = do_eval(value)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
def do_eval(value)
|
138
|
+
return eval(value) unless @eval_scope
|
139
|
+
|
140
|
+
@eval_scope.instance_eval do
|
141
|
+
eval(value)
|
112
142
|
end
|
143
|
+
rescue
|
144
|
+
value
|
113
145
|
end
|
114
146
|
|
115
147
|
|
data/lib/tanemaki/version.rb
CHANGED
data/tanemaki.gemspec
CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.description = 'Seeding with CSV having named column.'
|
14
14
|
spec.homepage = 'http://mmmpa.net/'
|
15
15
|
spec.license = 'MIT'
|
16
|
-
|
16
|
+
|
17
17
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
18
|
spec.bindir = "exe"
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tanemaki
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mmmpa
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|