ccp 0.2.6 → 0.2.7
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.
- data/lib/ccp/persistent/tsv.rb +29 -6
- data/lib/ccp/version.rb +1 -1
- data/spec/persistent/tsv_spec.rb +33 -0
- metadata +4 -4
data/lib/ccp/persistent/tsv.rb
CHANGED
@@ -7,15 +7,37 @@ class Ccp::Persistent::Tsv < Ccp::Persistent::Dir
|
|
7
7
|
|
8
8
|
def load_tsv(path)
|
9
9
|
hash = {}
|
10
|
+
prev = []
|
11
|
+
|
10
12
|
path.readlines.each_with_index do |line, i|
|
11
13
|
no = i+1
|
12
14
|
key, val = line.split(/\t/,2)
|
13
|
-
|
14
|
-
|
15
|
-
|
15
|
+
|
16
|
+
if val
|
17
|
+
# flush previous line
|
18
|
+
if prev.size == 2
|
19
|
+
hash[prev[0]] = decode(prev[1])
|
20
|
+
prev = []
|
21
|
+
end
|
22
|
+
|
23
|
+
# push prev line
|
24
|
+
prev = [key, val]
|
25
|
+
|
26
|
+
else
|
27
|
+
# maybe sequencial lines for one value
|
28
|
+
if prev.size == 2
|
29
|
+
prev[1] = prev[1] + "\n" + key
|
30
|
+
|
31
|
+
else
|
32
|
+
$stderr.puts "#{self.class}#load_tsv: value not found. key='#{key}' (line: #{no})"
|
33
|
+
next
|
34
|
+
end
|
16
35
|
end
|
17
|
-
|
18
|
-
|
36
|
+
end
|
37
|
+
|
38
|
+
# flush last line
|
39
|
+
if prev.size == 2
|
40
|
+
hash[prev[0]] = decode(prev[1])
|
19
41
|
end
|
20
42
|
|
21
43
|
return hash
|
@@ -33,7 +55,8 @@ class Ccp::Persistent::Tsv < Ccp::Persistent::Dir
|
|
33
55
|
end
|
34
56
|
|
35
57
|
keys.each do |key|
|
36
|
-
|
58
|
+
value = encode(hash[key]).sub(/\n+\Z/m, '') # strip last LF for human-readability
|
59
|
+
f.puts "%s\t%s\n" % [key, value]
|
37
60
|
end
|
38
61
|
end
|
39
62
|
|
data/lib/ccp/version.rb
CHANGED
data/spec/persistent/tsv_spec.rb
CHANGED
@@ -16,4 +16,37 @@ describe Ccp::Persistent::Tsv do
|
|
16
16
|
kvs.tsv_path_for(:states).should == Pathname(root) + "states.json.tsv"
|
17
17
|
end
|
18
18
|
end
|
19
|
+
|
20
|
+
context "(with json)" do
|
21
|
+
let(:kvs) { Ccp::Persistent::Tsv.new(root, :json)}
|
22
|
+
|
23
|
+
it "should save and load hash" do
|
24
|
+
kvs["a"] = {"int"=>1, "str"=>"x"}
|
25
|
+
kvs["a"].should == {"int"=>1, "str"=>"x"}
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should save and load complex-valued hash" do
|
29
|
+
kvs["a"] = {"int"=>[1,2], "str"=>["x","y"]}
|
30
|
+
kvs["a"].should == {"int"=>[1,2], "str"=>["x","y"]}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "(with yaml)" do
|
35
|
+
let(:kvs) { Ccp::Persistent::Tsv.new(root, :yaml) }
|
36
|
+
|
37
|
+
it "should save and load hash" do
|
38
|
+
kvs["a"] = {"int"=>1, "str"=>"x"}
|
39
|
+
kvs["a"].should == {"int"=>1, "str"=>"x"}
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should save and load complex-valued hash" do
|
43
|
+
kvs["a"] = {"int"=>[1,2], "str"=>["x","y"]}
|
44
|
+
kvs["a"].should == {"int"=>[1,2], "str"=>["x","y"]}
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should save and load tab-contained hash" do
|
48
|
+
kvs["a"] = {"str"=>"a\tb"}
|
49
|
+
kvs["a"].should == {"str"=>"a\tb"}
|
50
|
+
end
|
51
|
+
end
|
19
52
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ccp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 7
|
10
|
+
version: 0.2.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- maiha
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-05-
|
18
|
+
date: 2012-05-22 00:00:00 +09:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|