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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9aed9addfc8d5c3e3edfc4ba6bc47b4bc3da51f1
4
- data.tar.gz: 25dd4eb7b93d1967c361fff185576ba589acb9f6
3
+ metadata.gz: fa1189fb2be4c0a87c3e95522ea91a23cf35f956
4
+ data.tar.gz: 18aa344f90494fe0a3d42ae74688a2771598eed9
5
5
  SHA512:
6
- metadata.gz: a3ebbfd04906f7a62897a3affe6640c12d610e2bf6ebb012f48280e6334b9a4a870ef930117b29111e32ae11dac63cb44a9fa070dfc9d567c17c62d8819ebca4
7
- data.tar.gz: a14b51ff040d8a55cf1cbc3540852775119083424926368a906d502db0fc23dc1d3786f45d1a33543a3453daa1be1cf5c6dba254e17860a76a5fb71129749b7f
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
@@ -1,6 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
2
 
3
3
  task :test do
4
- sh "bundle ex rgot -v"
4
+ sh "bundle ex rgot -v --bench ."
5
5
  end
6
6
  task default: :test
@@ -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 { |csv| csv.to_a.last }
48
- new(keys.zip(last_value).to_h)
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
- if condition
61
- Relation.new(self, [Condition.new(:==, condition)])
62
- else
63
- WhereChain.new(self, [])
64
- end
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
- h = {}
90
- self.class.keys.map { |k| h[k] = __send__ k }
91
- h
105
+ @attrs.dup
92
106
  end
93
107
  end
94
108
  end
@@ -4,16 +4,21 @@ module ActiveTsv
4
4
  class Relation
5
5
  include Enumerable
6
6
 
7
- def initialize(table, conditions)
8
- @table = table
9
- @conditions = conditions
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(condition = nil)
13
- if condition
14
- self.class.new(@table, @conditions << Condition.new(:==, condition))
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(@table, @conditions)
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 each
29
- return to_enum(:each) unless block_given?
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
- keys = @table.keys
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
- @table.open do |csv|
46
+ @model.open do |csv|
34
47
  csv.gets
35
48
  csv.each do |value|
36
- yield @table.new(@table.keys.zip(value).to_h) if @conditions.all? { |cond|
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveTsv
4
- VERSION = "0.0.3"
4
+ VERSION = "0.1.0"
5
5
  end
@@ -1,12 +1,13 @@
1
1
  module ActiveTsv
2
2
  class WhereChain
3
- def initialize(table, conditions)
4
- @table = table
5
- @conditions = conditions
3
+ def initialize(relation)
4
+ @relation = relation
6
5
  end
7
6
 
8
7
  def not(condition)
9
- Relation.new(@table, @conditions << Condition.new(:!=, condition))
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.3
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-04-30 00:00:00.000000000 Z
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.5.1
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