expires 0.0.1 → 0.0.2

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: 1446302323c38bdefd615bf3233188cf80e00160
4
- data.tar.gz: 4f8c9717d3e77a6197b7b5166cfbaec6a90343bd
3
+ metadata.gz: 56e31be07a9e1e953a4b0ad9d2e6d0b412c53cf7
4
+ data.tar.gz: e6719430566a092eead55ce856d514f090da2308
5
5
  SHA512:
6
- metadata.gz: f7997dfca5ccdca7e0a94245c97710ef7ca33ed080c93a32eda844bb8371ab354bf670809eb5662df2ac2b09325cd19b4e296b246b0cad78b712d65da72e847a
7
- data.tar.gz: 9762d5d75054c2d275b9e8f9c82d4ca1d15e4ba7a116126497d0160c2f9d513841d49831055453c5d7f140acafae91439dc5618a87208edfeb9134489e04b323
6
+ metadata.gz: 4fded42175255292c7d97e954813e8e88381c1caf3b295fb326646df06599c52546ed31730cfab339eda524b4412a974bfba9d4fe187adc721525da0f7352c72
7
+ data.tar.gz: e47cdeb20c79b66c30eaaa4b11dbc78a444363dbe82211fd187774cd8364bca08187279a131944ef06fb802ca48103962ff33e0f2d59c5950fa6621e39974f6a
data/expires.gemspec CHANGED
@@ -18,10 +18,10 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.add_dependency 'color_print'
22
+ spec.add_dependency 'sqlite3'
23
+
21
24
  spec.add_development_dependency "bundler", "~> 1.6"
22
25
  spec.add_development_dependency "rake"
23
26
  spec.add_development_dependency "rspec"
24
- spec.add_development_dependency "color_print"
25
- spec.add_development_dependency "sqlite3"
26
-
27
27
  end
@@ -1,3 +1,3 @@
1
1
  class Expires
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/expires.rb CHANGED
@@ -1,8 +1,13 @@
1
1
  require "expires/version"
2
2
  require 'sqlite3'
3
+ require 'json'
4
+ require 'pry'
3
5
 
4
6
  class Expires
5
7
  class DummyIO;def puts str;end;end
8
+
9
+ KEYS = %w[key value created_at updated_at expire on_expire remind]
10
+ SCHEMA = %Q(create table NAMESPACE (key TEXT PRIMARY KEY, value TEXT, created_at INTEGER, updated_at INTEGER, expire INTEGER, on_expire TEXT, remind TEXT);)
6
11
 
7
12
  @@dbs = Hash.new #namespace: instance
8
13
  @@database = 'expires.sqlite3'
@@ -28,6 +33,7 @@ class Expires
28
33
  @expire = expire
29
34
  @hotload = hotload
30
35
  @body = Hash.new
36
+ @remind = Hash.new
31
37
 
32
38
  connect(namespace)
33
39
  sync if @hotload
@@ -42,9 +48,13 @@ class Expires
42
48
  @synced = true
43
49
  end
44
50
 
51
+ def schema namespace
52
+ return SCHEMA.gsub("NAMESPACE",namespace)
53
+ end
54
+
45
55
  def create(namespace)
46
56
  begin
47
- @@db.execute(sql = "create table #{namespace} (key TEXT PRIMARY KEY, value TEXT, created_at INTEGER, updated_at INTEGER, expire INTEGER);")
57
+ @@db.execute(sql = schema(namespace))
48
58
  @@io.puts sql
49
59
  rescue SQLite3::SQLException => e
50
60
  raise e unless e.message =~ /table .* already exists/
@@ -53,9 +63,26 @@ class Expires
53
63
  end
54
64
 
55
65
  def kill_expired
66
+ @killing = true
56
67
  now = Time.new.to_i
68
+ expires = @@db.execute(sql = "select on_expire, key, value from #{@namespace} where (updated_at+expire) < #{now};")
69
+ expires.each do |values|
70
+ if values[0]
71
+ begin
72
+ @key = values[1]
73
+ @value = values[2]
74
+ flash(@key)
75
+ eval values[0].gsub("$n","\n")
76
+ rescue =>e
77
+ STDERR.puts e
78
+ STDERR.puts e.backtrace
79
+ end
80
+ end
81
+ end
82
+
57
83
  @@db.execute(sql = "delete from #{@namespace} where (updated_at+expire) < #{now};")
58
84
  @@io.puts sql
85
+ @killing = nil
59
86
  end
60
87
 
61
88
  def connect(namespace)
@@ -75,10 +102,9 @@ class Expires
75
102
  end
76
103
  end
77
104
 
78
- def set key, value
105
+ def set key, value, expire = @expire
79
106
  @body[key] = value
80
- kill_expired
81
- record = @@db.execute("select created_at from #{@namespace} where key = '#{key}' limit 1;").first
107
+ record = select(key, :created_at)
82
108
 
83
109
  if record
84
110
  created_at = record[0]
@@ -86,25 +112,126 @@ class Expires
86
112
  else
87
113
  updated_at = created_at = Time.new.to_i
88
114
  end
89
-
90
- @@db.execute(sql="insert or replace into #{@namespace} (key,value,created_at,updated_at,expire) values ('#{key}','#{value}','#{created_at}','#{updated_at}','#{@expire}');")
115
+
116
+ @@db.execute(sql="insert or replace into #{@namespace} (key,value,created_at,updated_at,expire)"+
117
+ " values ('#{key}','#{value}','#{created_at}','#{updated_at}','#{expire}'#{});")
91
118
  @@io.puts sql
92
119
  #TODO: syncedで状態管理
93
120
  end
94
121
 
95
- def [](key)
96
- if @hotload
97
- self.kill_expired
98
- return @body[key] = @@db.execute("select value from #{@namespace} where key = '#{key}' limit 1;").first.first
99
- else
100
- return @body[key]
122
+ def []=(key,value)
123
+ set(key,value)
124
+ end
125
+
126
+ def clean
127
+ @@db.execute("delete from #{@namespace};")
128
+ @@db.execute("VACUUM;")
129
+ end
130
+
131
+ def remind key, hash
132
+ raise "Remind your value as Hash." unless hash.is_a?(Hash)
133
+ update key, :remind, JSON.generate(hash) if get key
134
+ @remind[key.to_sym] = hash
135
+ end
136
+
137
+ def forget key
138
+ raise "Remind your value as Hash." unless hash.is_a?(Hash)
139
+ update key, :remind, "{}" if get key
140
+ @remind[key.to_sym] = {}
141
+ end
142
+
143
+ def flash key
144
+ if value = select(key, :remind)
145
+ begin
146
+ @remind = JSON.parse value.first
147
+ rescue
148
+ STDERR.puts "Invalid JSON value."
149
+ end
101
150
  end
151
+ end
152
+
153
+ def select key, *columns
154
+ kill_expired unless @killing
155
+ return @body[key.to_sym] = @@db.execute("select #{columns.join(", ")} from #{@namespace} where key = '#{key}' limit 1;").first
156
+ end
157
+
158
+ def get key
159
+ return select(key, :value).first
102
160
  rescue => e
103
161
  return nil
104
162
  end
105
163
 
106
- def []=(key,value)
107
- set(key,value)
164
+ def [](key)
165
+ get key
166
+ end
167
+
168
+ def update key, column, value
169
+ sql = Expires.escape_sqlite3("update :_namespace_ set #{column} = (:#{column}) where key = (:key);",
170
+ column=>value,
171
+ :key=>key,
172
+ :_namespace_=>@namespace)
173
+ @@db.execute(sql)
174
+ sql
175
+ end
176
+
177
+ def updates key, hash
178
+ sql = "update :_namespace_ set "
179
+ first = true
180
+ hash.each do |k, v|
181
+ if first
182
+ first = false
183
+ else
184
+ sql << ','
185
+ end
186
+ sql << "#{k} = :#{k} "
187
+ end
188
+ sql << "where key = (:key);"
189
+
190
+ sql = Expires.escape_sqlite3(sql,
191
+ :key=>key,
192
+ :_namespace_=>@namespace,
193
+ **hash)
194
+ @@db.execute(sql)
195
+ sql
196
+ end
197
+
198
+ def closer key, procedure=nil, remind: nil, &block
199
+ if block_given?
200
+ obj = Object.new
201
+ obj.define_singleton_method(:_, &block)
202
+ procedure = obj.method(:_).to_proc
203
+ end
204
+
205
+ source = Expires.get_source_str(procedure.source).gsub(/\n/,"$n")
206
+ if get key
207
+ sql = updates key, {:on_expire=>source.to_s, :remind=>JSON.generate(remind)}
208
+ else
209
+ #procedure.call
210
+ return
211
+ end
212
+
213
+ kill_expired
214
+ @@io.puts sql
215
+ end
216
+
217
+ def self.get_source_str source
218
+ source.gsub!(/\n/,"$n")
219
+ source.gsub!(/\A.*?(-> +\(.*\)|lambda) +?(do|\{)( +)?(\|.*?\|)?/, "")
220
+ source.gsub!(/\A.*?closer.*?(do|\{)( +)?(\|.*?\|)?/, "")
221
+ source.reverse!
222
+ source.gsub!(/\A(.*?)(dne|\})/, "")
223
+ source.reverse!
224
+ source.gsub!("$n","\n")
225
+ return source
226
+ end
227
+
228
+ def self.escape_sqlite3(string, **hash)
229
+ hash.each do |key, value|
230
+ value.gsub!(/'/,"''") if value.is_a?(String)
231
+ value = "null" if value.nil?
232
+ string.gsub!(":#{key}", "'#{value}'")
233
+ end
234
+ return string
108
235
  end
109
236
  end
110
237
 
data/spec/expires_spec.rb CHANGED
@@ -30,29 +30,8 @@ describe Expires do
30
30
  expect(expires["b"]).to eq 'b'
31
31
  end
32
32
  end
33
-
34
- describe "when hotload is false" do
35
- expires = Expires.new(namespace: "on_initialize_when_hotload_is_false")
36
- expires["a"] = :a
37
- expires["b"] = :b
38
- expires.disconnect
39
-
40
- expires = Expires.new(namespace: "on_initialize_when_hotload_is_false", hotload: false)
41
- it "have to loaded 'a' as nil" do
42
- expect(expires["a"]).to eq nil
43
- end
44
-
45
- it "have to loaded 'b' as nil" do
46
- expect(expires["b"]).to eq nil
47
- end
48
- end
49
33
  end
50
34
 
51
- context "when not connected" do
52
- end
53
-
54
- context "when connected" do
55
- end
56
35
 
57
36
 
58
37
 
metadata CHANGED
@@ -1,37 +1,37 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: expires
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tatumaki
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-21 00:00:00.000000000 Z
11
+ date: 2014-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
14
+ name: color_print
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.6'
20
- type: :development
19
+ version: '0'
20
+ type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.6'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: sqlite3
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
- type: :development
34
+ type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
@@ -39,21 +39,21 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
42
+ name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '1.6'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '1.6'
55
55
  - !ruby/object:Gem::Dependency
56
- name: color_print
56
+ name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: sqlite3
70
+ name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="