active_tsv 0.0.3 → 0.1.0

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 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