active_tsv 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -0
- data/Rakefile +1 -1
- data/lib/active_tsv/base.rb +28 -14
- data/lib/active_tsv/relation.rb +32 -12
- data/lib/active_tsv/version.rb +1 -1
- data/lib/active_tsv/where_chain.rb +5 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa1189fb2be4c0a87c3e95522ea91a23cf35f956
|
4
|
+
data.tar.gz: 18aa344f90494fe0a3d42ae74688a2771598eed9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c905b4740b81faf9f7068c5da07f4b1f5805cee13fa1667ce2f05d6bbf190481e71bdfd0819af2402202d79b77da6f37b371c5b4d2541be1d4c6b994b6bd00f4
|
7
|
+
data.tar.gz: 14d82e1931e8aaee4643d5a2caa6ec443d269d7bee6c5b130a0b34f68ef254ec131fa6482c3db7d2ed1a5d521ad5cfea5792a4f6fe8967a4f17d8b3f2ac96419
|
data/README.md
CHANGED
@@ -6,6 +6,8 @@ A Class of Active record pattern for TSV/CSV
|
|
6
6
|
|
7
7
|
## Usage
|
8
8
|
|
9
|
+
data/users.tsv
|
10
|
+
|
9
11
|
```tsv
|
10
12
|
id name age
|
11
13
|
1 ksss 30
|
@@ -14,6 +16,7 @@ id name age
|
|
14
16
|
```
|
15
17
|
|
16
18
|
```ruby
|
19
|
+
require 'active_tsv'
|
17
20
|
class User < ActiveTsv::Base
|
18
21
|
self.table_path = "data/users.tsv"
|
19
22
|
end
|
data/Rakefile
CHANGED
data/lib/active_tsv/base.rb
CHANGED
@@ -7,6 +7,8 @@ module ActiveTsv
|
|
7
7
|
# end
|
8
8
|
class Base
|
9
9
|
SEPARATER = "\t"
|
10
|
+
BUF_SIZE = 1024
|
11
|
+
|
10
12
|
class << self
|
11
13
|
attr_reader :table_path
|
12
14
|
|
@@ -15,7 +17,6 @@ module ActiveTsv
|
|
15
17
|
end
|
16
18
|
|
17
19
|
def reload(path)
|
18
|
-
old_table_path = table_path
|
19
20
|
if @keys
|
20
21
|
keys.each do |k|
|
21
22
|
remove_method(k)
|
@@ -29,9 +30,6 @@ module ActiveTsv
|
|
29
30
|
define_method(k) { @attrs[k] }
|
30
31
|
define_method("#{k}=") { |v| @attrs[k] = v }
|
31
32
|
end
|
32
|
-
rescue
|
33
|
-
reload(old_table_path)
|
34
|
-
raise
|
35
33
|
end
|
36
34
|
|
37
35
|
def all
|
@@ -44,8 +42,22 @@ module ActiveTsv
|
|
44
42
|
end
|
45
43
|
|
46
44
|
def last
|
47
|
-
last_value = open
|
48
|
-
|
45
|
+
last_value = File.open(table_path) do |f|
|
46
|
+
f.seek(0, IO::SEEK_END)
|
47
|
+
size = f.size
|
48
|
+
buf_size = [size, self::BUF_SIZE].min
|
49
|
+
while true
|
50
|
+
f.seek(-buf_size, IO::SEEK_CUR)
|
51
|
+
buf = f.read(buf_size)
|
52
|
+
if index = buf.rindex($INPUT_RECORD_SEPARATOR, -2)
|
53
|
+
f.seek(-buf_size + index + 1, IO::SEEK_CUR)
|
54
|
+
break f.read.chomp
|
55
|
+
else
|
56
|
+
f.seek(-buf_size, IO::SEEK_CUR)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
new(keys.zip(CSV.new(last_value, col_sep: self::SEPARATER).shift).to_h)
|
49
61
|
end
|
50
62
|
|
51
63
|
def open(&block)
|
@@ -57,11 +69,15 @@ module ActiveTsv
|
|
57
69
|
end
|
58
70
|
|
59
71
|
def where(condition = nil)
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
72
|
+
all.where(condition)
|
73
|
+
end
|
74
|
+
|
75
|
+
def count
|
76
|
+
all.count
|
77
|
+
end
|
78
|
+
|
79
|
+
def order(*columns)
|
80
|
+
all.order(*columns)
|
65
81
|
end
|
66
82
|
end
|
67
83
|
|
@@ -86,9 +102,7 @@ module ActiveTsv
|
|
86
102
|
end
|
87
103
|
|
88
104
|
def to_h
|
89
|
-
|
90
|
-
self.class.keys.map { |k| h[k] = __send__ k }
|
91
|
-
h
|
105
|
+
@attrs.dup
|
92
106
|
end
|
93
107
|
end
|
94
108
|
end
|
data/lib/active_tsv/relation.rb
CHANGED
@@ -4,16 +4,21 @@ module ActiveTsv
|
|
4
4
|
class Relation
|
5
5
|
include Enumerable
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
attr_reader :model
|
8
|
+
attr_reader :where_values
|
9
|
+
def initialize(model, where_values, order_values = [])
|
10
|
+
@model = model
|
11
|
+
@where_values = where_values
|
12
|
+
@order_values = order_values
|
10
13
|
end
|
11
14
|
|
12
|
-
def where(
|
13
|
-
if
|
14
|
-
|
15
|
+
def where(where_value = nil)
|
16
|
+
if where_value
|
17
|
+
dup.tap do |r|
|
18
|
+
r.where_values << Condition.new(:==, where_value)
|
19
|
+
end
|
15
20
|
else
|
16
|
-
WhereChain.new(
|
21
|
+
WhereChain.new(dup)
|
17
22
|
end
|
18
23
|
end
|
19
24
|
|
@@ -25,21 +30,36 @@ module ActiveTsv
|
|
25
30
|
to_a.last
|
26
31
|
end
|
27
32
|
|
28
|
-
def
|
29
|
-
|
33
|
+
def order(*columns)
|
34
|
+
@order_values += columns
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
def each(*args, &block)
|
39
|
+
to_a.each(*args, &block)
|
40
|
+
end
|
30
41
|
|
31
|
-
|
42
|
+
def to_a
|
43
|
+
ret = []
|
44
|
+
keys = @model.keys
|
32
45
|
key_to_value_index = keys.each_with_index.map { |k, index| [k, index] }.to_h
|
33
|
-
@
|
46
|
+
@model.open do |csv|
|
34
47
|
csv.gets
|
35
48
|
csv.each do |value|
|
36
|
-
|
49
|
+
ret << @model.new(keys.zip(value).to_h) if @where_values.all? { |cond|
|
37
50
|
cond.values.all? do |k, v|
|
38
51
|
value[key_to_value_index[k]].__send__(cond.method_name, v.to_s)
|
39
52
|
end
|
40
53
|
}
|
41
54
|
end
|
42
55
|
end
|
56
|
+
if @order_values.empty?
|
57
|
+
ret
|
58
|
+
else
|
59
|
+
ret.sort_by do |i|
|
60
|
+
@order_values.map { |m| i[m] }.join('-')
|
61
|
+
end
|
62
|
+
end
|
43
63
|
end
|
44
64
|
end
|
45
65
|
end
|
data/lib/active_tsv/version.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module ActiveTsv
|
2
2
|
class WhereChain
|
3
|
-
def initialize(
|
4
|
-
@
|
5
|
-
@conditions = conditions
|
3
|
+
def initialize(relation)
|
4
|
+
@relation = relation
|
6
5
|
end
|
7
6
|
|
8
7
|
def not(condition)
|
9
|
-
|
8
|
+
@relation.dup.tap do |r|
|
9
|
+
r.where_values << Condition.new(:!=, condition)
|
10
|
+
end
|
10
11
|
end
|
11
12
|
end
|
12
13
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_tsv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ksss
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -98,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
98
|
version: '0'
|
99
99
|
requirements: []
|
100
100
|
rubyforge_project:
|
101
|
-
rubygems_version: 2.
|
101
|
+
rubygems_version: 2.6.3
|
102
102
|
signing_key:
|
103
103
|
specification_version: 4
|
104
104
|
summary: A Class of Active record pattern for TSV/CSV
|