redisk 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +23 -0
- data/LICENSE +20 -0
- data/README.rdoc +56 -0
- data/Rakefile +49 -0
- data/lib/redisk/helper.rb +13 -0
- data/lib/redisk/io.rb +867 -0
- data/lib/redisk/logger.rb +36 -0
- data/lib/redisk/stat.rb +382 -0
- data/lib/redisk.rb +37 -0
- data/redisk.gemspec +70 -0
- data/spec/fixtures/rails.log +100 -0
- data/spec/redis-test.conf +132 -0
- data/spec/redisk_io_spec.rb +348 -0
- data/spec/redisk_logger_spec.rb +53 -0
- data/spec/redisk_stat_spec.rb +87 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +47 -0
- metadata +105 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
# Redisk::Log is a wrapper around logger, that uses Redisk::IO internally and provides some extra options
|
2
|
+
module Redisk
|
3
|
+
class Logger
|
4
|
+
extend Helper
|
5
|
+
include Helper
|
6
|
+
|
7
|
+
attr_reader :name, :logger, :io
|
8
|
+
|
9
|
+
def initialize(name, options = {})
|
10
|
+
@name = name
|
11
|
+
@io = Redisk::IO.new(name)
|
12
|
+
@truncate = options.delete(:truncate) || false
|
13
|
+
@logger = ::Logger.new(@io, options)
|
14
|
+
end
|
15
|
+
|
16
|
+
def length
|
17
|
+
@io.length
|
18
|
+
end
|
19
|
+
|
20
|
+
def truncate!
|
21
|
+
@io.truncate(@truncate) if @truncate && length > @truncate
|
22
|
+
end
|
23
|
+
|
24
|
+
# delegate to logger
|
25
|
+
def method_missing(meth, *args)
|
26
|
+
if @logger.respond_to?(meth)
|
27
|
+
returned = @logger.send(meth, *args)
|
28
|
+
truncate!
|
29
|
+
returned
|
30
|
+
else
|
31
|
+
super
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
data/lib/redisk/stat.rb
ADDED
@@ -0,0 +1,382 @@
|
|
1
|
+
# Redisk::Stat mimics File::Stat
|
2
|
+
# mostly accessed through Redisk::IO#stat
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
module Redisk
|
6
|
+
class Stat
|
7
|
+
extend Helper
|
8
|
+
include Helper
|
9
|
+
include Comparable
|
10
|
+
|
11
|
+
attr_reader :name
|
12
|
+
|
13
|
+
def initialize(name)
|
14
|
+
@name = name
|
15
|
+
write_default('atime', Time.now)
|
16
|
+
write_default('ctime', Time.now)
|
17
|
+
write_default('mtime', Time.now)
|
18
|
+
write_default('size', 0)
|
19
|
+
end
|
20
|
+
|
21
|
+
# stat <=> other_stat => -1, 0, 1
|
22
|
+
# Compares File::Stat objects by comparing their respective modification times.
|
23
|
+
#
|
24
|
+
# f1 = File.new("f1", "w")
|
25
|
+
# sleep 1
|
26
|
+
# f2 = File.new("f2", "w")
|
27
|
+
# f1.stat <=> f2.stat #=> -1
|
28
|
+
def <=>(other_stat)
|
29
|
+
self.mtime <=> other_stat.mtime
|
30
|
+
end
|
31
|
+
|
32
|
+
# stat.atime => time
|
33
|
+
# Returns the last access time for this file as an object of class Time.
|
34
|
+
#
|
35
|
+
# File.stat("testfile").atime #=> Wed Dec 31 18:00:00 CST 1969
|
36
|
+
def atime
|
37
|
+
Time.parse(read_attribute('atime'))
|
38
|
+
end
|
39
|
+
|
40
|
+
# stat.blksize => integer or nil
|
41
|
+
# Returns the native file system‘s block size. Will return nil on platforms that don‘t support this information.
|
42
|
+
#
|
43
|
+
# File.stat("testfile").blksize #=> 4096
|
44
|
+
def blksize
|
45
|
+
0
|
46
|
+
end
|
47
|
+
|
48
|
+
# stat.blockdev? => true or false
|
49
|
+
# Returns true if the file is a block device, false if it isn‘t or if the operating system doesn‘t support this feature.
|
50
|
+
#
|
51
|
+
# File.stat("testfile").blockdev? #=> false
|
52
|
+
# File.stat("/dev/hda1").blockdev? #=> true
|
53
|
+
def blockdev?
|
54
|
+
false
|
55
|
+
end
|
56
|
+
|
57
|
+
# stat.blocks => integer or nil
|
58
|
+
# Returns the number of native file system blocks allocated for this file, or nil if the operating system doesn‘t support this feature.
|
59
|
+
#
|
60
|
+
# File.stat("testfile").blocks #=> 2
|
61
|
+
def blocks
|
62
|
+
0
|
63
|
+
end
|
64
|
+
|
65
|
+
# stat.chardev? => true or false
|
66
|
+
# Returns true if the file is a character device, false if it isn‘t or if the operating system doesn‘t support this feature.
|
67
|
+
#
|
68
|
+
# File.stat("/dev/tty").chardev? #=> true
|
69
|
+
def chardev?
|
70
|
+
false
|
71
|
+
end
|
72
|
+
|
73
|
+
# stat.ctime → aTime
|
74
|
+
# Returns the change time for stat (that is, the time directory information about the file was changed, not the file itself).
|
75
|
+
#
|
76
|
+
# File.stat("testfile").ctime #=> Wed Apr 09 08:53:14 CDT 2003
|
77
|
+
def ctime
|
78
|
+
Time.parse(read_attribute('ctime'))
|
79
|
+
end
|
80
|
+
|
81
|
+
# stat.dev => fixnum
|
82
|
+
# Returns an integer representing the device on which stat resides.
|
83
|
+
#
|
84
|
+
# File.stat("testfile").dev #=> 774
|
85
|
+
def dev
|
86
|
+
nil
|
87
|
+
end
|
88
|
+
|
89
|
+
# stat.dev_major => fixnum
|
90
|
+
# Returns the major part of File_Stat#dev or nil.
|
91
|
+
#
|
92
|
+
# File.stat("/dev/fd1").dev_major #=> 2
|
93
|
+
# File.stat("/dev/tty").dev_major #=> 5
|
94
|
+
def dev_major
|
95
|
+
0
|
96
|
+
end
|
97
|
+
|
98
|
+
# stat.dev_minor => fixnum
|
99
|
+
# Returns the minor part of File_Stat#dev or nil.
|
100
|
+
#
|
101
|
+
# File.stat("/dev/fd1").dev_minor #=> 1
|
102
|
+
# File.stat("/dev/tty").dev_minor #=> 0
|
103
|
+
def dev_minor
|
104
|
+
0
|
105
|
+
end
|
106
|
+
|
107
|
+
# stat.directory? => true or false
|
108
|
+
# Returns true if stat is a directory, false otherwise.
|
109
|
+
#
|
110
|
+
# File.stat("testfile").directory? #=> false
|
111
|
+
# File.stat(".").directory? #=> true
|
112
|
+
def directory?
|
113
|
+
false
|
114
|
+
end
|
115
|
+
|
116
|
+
# stat.executable? => true or false
|
117
|
+
# Returns true if stat is executable or if the operating system doesn‘t distinguish executable files from nonexecutable files. The tests are made using the effective owner of the process.
|
118
|
+
#
|
119
|
+
# File.stat("testfile").executable? #=> false
|
120
|
+
def executable?
|
121
|
+
false
|
122
|
+
end
|
123
|
+
|
124
|
+
# stat.executable_real? => true or false
|
125
|
+
# Same as executable?, but tests using the real owner of the process.
|
126
|
+
def executable_real?
|
127
|
+
false
|
128
|
+
end
|
129
|
+
|
130
|
+
# stat.file? => true or false
|
131
|
+
# Returns true if stat is a regular file (not a device file, pipe, socket, etc.).
|
132
|
+
#
|
133
|
+
# File.stat("testfile").file? #=> true
|
134
|
+
def file?
|
135
|
+
false
|
136
|
+
end
|
137
|
+
|
138
|
+
# stat.ftype => string
|
139
|
+
# Identifies the type of stat. The return string is one of: ``file’’, ``directory’’, ``characterSpecial’’, ``blockSpecial’’, ``fifo’’, ``link’’, ``socket’’, or ``unknown’’.
|
140
|
+
#
|
141
|
+
# File.stat("/dev/tty").ftype #=> "characterSpecial"
|
142
|
+
def ftype
|
143
|
+
'unknown'
|
144
|
+
end
|
145
|
+
|
146
|
+
# stat.gid => fixnum
|
147
|
+
# Returns the numeric group id of the owner of stat.
|
148
|
+
#
|
149
|
+
# File.stat("testfile").gid #=> 500
|
150
|
+
def gid
|
151
|
+
Process.gid
|
152
|
+
end
|
153
|
+
|
154
|
+
# stat.grpowned? => true or false
|
155
|
+
# Returns true if the effective group id of the process is the same as the group id of stat. On Windows NT, returns false.
|
156
|
+
#
|
157
|
+
# File.stat("testfile").grpowned? #=> true
|
158
|
+
# File.stat("/etc/passwd").grpowned? #=> false
|
159
|
+
def grpowned?
|
160
|
+
Process.grpowned?
|
161
|
+
end
|
162
|
+
|
163
|
+
# stat.ino => fixnum
|
164
|
+
# Returns the inode number for stat.
|
165
|
+
#
|
166
|
+
# File.stat("testfile").ino #=> 1083669
|
167
|
+
def ino
|
168
|
+
Process.ino
|
169
|
+
end
|
170
|
+
|
171
|
+
# stat.inspect => string
|
172
|
+
# Produce a nicely formatted description of stat.
|
173
|
+
#
|
174
|
+
# File.stat("/etc/passwd").inspect
|
175
|
+
# #=> "#<File::Stat dev=0xe000005, ino=1078078, mode=0100644,
|
176
|
+
# nlink=1, uid=0, gid=0, rdev=0x0, size=1374, blksize=4096,
|
177
|
+
# blocks=8, atime=Wed Dec 10 10:16:12 CST 2003,
|
178
|
+
# mtime=Fri Sep 12 15:41:41 CDT 2003,
|
179
|
+
# ctime=Mon Oct 27 11:20:27 CST 2003>"
|
180
|
+
def inspect
|
181
|
+
"#<Redis::Stat (#{name}) atime=#{atime}, ctime=#{ctime}, mtime=#{mtime}, size=#{size}"
|
182
|
+
end
|
183
|
+
alias :to_s :inspect
|
184
|
+
|
185
|
+
# stat.mode => fixnum
|
186
|
+
# Returns an integer representing the permission bits of stat. The meaning of the bits is platform dependent; on Unix systems, see stat(2).
|
187
|
+
#
|
188
|
+
# File.chmod(0644, "testfile") #=> 1
|
189
|
+
# s = File.stat("testfile")
|
190
|
+
# sprintf("%o", s.mode) #=> "100644"
|
191
|
+
def mode
|
192
|
+
Process.mode
|
193
|
+
end
|
194
|
+
|
195
|
+
# stat.mtime → aTime
|
196
|
+
# Returns the modification time of stat.
|
197
|
+
#
|
198
|
+
# File.stat("testfile").mtime #=> Wed Apr 09 08:53:14 CDT 2003
|
199
|
+
def mtime
|
200
|
+
Time.parse(read_attribute('mtime'))
|
201
|
+
end
|
202
|
+
|
203
|
+
# stat.nlink => fixnum
|
204
|
+
# Returns the number of hard links to stat.
|
205
|
+
#
|
206
|
+
# File.stat("testfile").nlink #=> 1
|
207
|
+
# File.link("testfile", "testfile.bak") #=> 0
|
208
|
+
# File.stat("testfile").nlink #=> 2
|
209
|
+
def nlink
|
210
|
+
0
|
211
|
+
end
|
212
|
+
|
213
|
+
# stat.owned? => true or false
|
214
|
+
# Returns true if the effective user id of the process is the same as the owner of stat.
|
215
|
+
#
|
216
|
+
# File.stat("testfile").owned? #=> true
|
217
|
+
# File.stat("/etc/passwd").owned? #=> false
|
218
|
+
def owned?
|
219
|
+
true
|
220
|
+
end
|
221
|
+
|
222
|
+
# stat.pipe? => true or false
|
223
|
+
# Returns true if the operating system supports pipes and stat is a pipe; false otherwise.
|
224
|
+
def pipe
|
225
|
+
false
|
226
|
+
end
|
227
|
+
|
228
|
+
# stat.rdev => fixnum or nil
|
229
|
+
# Returns an integer representing the device type on which stat resides. Returns nil if the operating system doesn‘t support this feature.
|
230
|
+
#
|
231
|
+
# File.stat("/dev/fd1").rdev #=> 513
|
232
|
+
# File.stat("/dev/tty").rdev #=> 1280
|
233
|
+
def rdev
|
234
|
+
0
|
235
|
+
end
|
236
|
+
|
237
|
+
# stat.rdev_major => fixnum
|
238
|
+
# Returns the major part of File_Stat#rdev or nil.
|
239
|
+
#
|
240
|
+
# File.stat("/dev/fd1").rdev_major #=> 2
|
241
|
+
# File.stat("/dev/tty").rdev_major #=> 5
|
242
|
+
def rdev_major
|
243
|
+
0
|
244
|
+
end
|
245
|
+
|
246
|
+
# stat.rdev_minor => fixnum
|
247
|
+
# Returns the minor part of File_Stat#rdev or nil.
|
248
|
+
#
|
249
|
+
# File.stat("/dev/fd1").rdev_minor #=> 1
|
250
|
+
# File.stat("/dev/tty").rdev_minor #=> 0
|
251
|
+
def rdev_minor
|
252
|
+
0
|
253
|
+
end
|
254
|
+
|
255
|
+
# stat.readable? => true or false
|
256
|
+
# Returns true if stat is readable by the effective user id of this process.
|
257
|
+
#
|
258
|
+
# File.stat("testfile").readable? #=> true
|
259
|
+
def readable?
|
260
|
+
true
|
261
|
+
end
|
262
|
+
|
263
|
+
# stat.readable_real? → true or false
|
264
|
+
# Returns true if stat is readable by the real user id of this process.
|
265
|
+
#
|
266
|
+
# File.stat("testfile").readable_real? #=> true
|
267
|
+
def readable_real?
|
268
|
+
true
|
269
|
+
end
|
270
|
+
|
271
|
+
# stat.setgid? => true or false
|
272
|
+
# Returns true if stat has the set-group-id permission bit set, false if it doesn‘t or if the operating system doesn‘t support this feature.
|
273
|
+
#
|
274
|
+
# File.stat("/usr/sbin/lpc").setgid? #=> true
|
275
|
+
def setgid?
|
276
|
+
Process.setgid?
|
277
|
+
end
|
278
|
+
|
279
|
+
# stat.setuid? => true or false
|
280
|
+
# Returns true if stat has the set-user-id permission bit set, false if it doesn‘t or if the operating system doesn‘t support this feature.
|
281
|
+
#
|
282
|
+
# File.stat("/bin/su").setuid? #=> true
|
283
|
+
def setuid?
|
284
|
+
Process.setuid?
|
285
|
+
end
|
286
|
+
|
287
|
+
# stat.size => fixnum
|
288
|
+
# Returns the size of stat in bytes.
|
289
|
+
#
|
290
|
+
# File.stat("testfile").size #=> 66
|
291
|
+
def size
|
292
|
+
read_attribute('size').to_i
|
293
|
+
end
|
294
|
+
|
295
|
+
# stat.socket? => true or false
|
296
|
+
# Returns true if stat is a socket, false if it isn‘t or if the operating system doesn‘t support this feature.
|
297
|
+
#
|
298
|
+
# File.stat("testfile").socket? #=> false
|
299
|
+
def socket
|
300
|
+
false
|
301
|
+
end
|
302
|
+
|
303
|
+
# stat.sticky? => true or false
|
304
|
+
# Returns true if stat has its sticky bit set, false if it doesn‘t or if the operating system doesn‘t support this feature.
|
305
|
+
#
|
306
|
+
# File.stat("testfile").sticky? #=> false
|
307
|
+
def sticky
|
308
|
+
false
|
309
|
+
end
|
310
|
+
|
311
|
+
# stat.symlink? => true or false
|
312
|
+
# Returns true if stat is a symbolic link, false if it isn‘t or if the operating system doesn‘t support this feature. As File::stat automatically follows symbolic links, symlink? will always be false for an object returned by File::stat.
|
313
|
+
#
|
314
|
+
# File.symlink("testfile", "alink") #=> 0
|
315
|
+
# File.stat("alink").symlink? #=> false
|
316
|
+
# File.lstat("alink").symlink? #=> true
|
317
|
+
def symlink?
|
318
|
+
false
|
319
|
+
end
|
320
|
+
|
321
|
+
|
322
|
+
# stat.uid => fixnum
|
323
|
+
# Returns the numeric user id of the owner of stat.
|
324
|
+
#
|
325
|
+
# File.stat("testfile").uid #=> 501
|
326
|
+
def uid
|
327
|
+
Process.uid
|
328
|
+
end
|
329
|
+
|
330
|
+
# stat.writable? → true or false
|
331
|
+
# Returns true if stat is writable by the effective user id of this process.
|
332
|
+
#
|
333
|
+
# File.stat("testfile").writable? #=> true
|
334
|
+
def writable?
|
335
|
+
true
|
336
|
+
end
|
337
|
+
|
338
|
+
# stat.writable_real? → true or false
|
339
|
+
# Returns true if stat is writable by the real user id of this process.
|
340
|
+
#
|
341
|
+
# File.stat("testfile").writable_real? #=> true
|
342
|
+
def writable_real?
|
343
|
+
true
|
344
|
+
end
|
345
|
+
|
346
|
+
# stat.zero? => true or false
|
347
|
+
# Returns true if stat is a zero-length file; false otherwise.
|
348
|
+
#
|
349
|
+
# File.stat("testfile").zero? #=> false
|
350
|
+
def zero?
|
351
|
+
size == 0
|
352
|
+
end
|
353
|
+
|
354
|
+
# redis specific
|
355
|
+
|
356
|
+
# reads the attribute from Redis or returns nil
|
357
|
+
def read_attribute(key)
|
358
|
+
write_attribute('atime', Time.now)
|
359
|
+
redis.get key_for_attribute(key)
|
360
|
+
end
|
361
|
+
|
362
|
+
# writes the attribute to redis as a string
|
363
|
+
def write_attribute(key, value)
|
364
|
+
redis.set key_for_attribute(key), value.to_s
|
365
|
+
redis.set key_for_attribute('ctime'), Time.now
|
366
|
+
value.to_s
|
367
|
+
end
|
368
|
+
|
369
|
+
# writes the default if this is the first time for this file
|
370
|
+
def write_default(key, value)
|
371
|
+
redis.setnx key_for_attribute(key), value.to_s
|
372
|
+
end
|
373
|
+
|
374
|
+
private
|
375
|
+
def key_for_attribute(key)
|
376
|
+
"#{name}:_stat:#{key}"
|
377
|
+
end
|
378
|
+
|
379
|
+
end
|
380
|
+
end
|
381
|
+
|
382
|
+
|
data/lib/redisk.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'redis/namespace'
|
3
|
+
require 'redisk/helper'
|
4
|
+
require 'redisk/stat'
|
5
|
+
require 'redisk/io'
|
6
|
+
require 'redisk/logger'
|
7
|
+
|
8
|
+
module Redisk
|
9
|
+
VERSION = '0.1.0'
|
10
|
+
|
11
|
+
extend self
|
12
|
+
|
13
|
+
# straight up lifted from from @defunkt's resque
|
14
|
+
# Accepts a 'hostname:port' string or a Redis server.
|
15
|
+
def redis=(server)
|
16
|
+
case server
|
17
|
+
when String
|
18
|
+
host, port = server.split(':')
|
19
|
+
redis = Redis.new(:host => host, :port => port, :thread_safe => true)
|
20
|
+
@redis = Redis::Namespace.new(:redisk, :redis => redis)
|
21
|
+
when Redis
|
22
|
+
@redis = Redis::Namespace.new(:redisk, :redis => server)
|
23
|
+
else
|
24
|
+
raise "I don't know what to do with #{server.inspect}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns the current Redis connection. If none has been created, will
|
29
|
+
# create a new one.
|
30
|
+
def redis
|
31
|
+
return @redis if @redis
|
32
|
+
self.redis = 'localhost:6379'
|
33
|
+
self.redis
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
data/redisk.gemspec
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{redisk}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Aaron Quint"]
|
12
|
+
s.date = %q{2009-12-17}
|
13
|
+
s.description = %q{Redisk includes Redisk::IO which is ~ Ruby's stdlib IO. It can be used with stdlib's Logger to log directly to redis}
|
14
|
+
s.email = %q{aaron@quirkey.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".gitignore",
|
22
|
+
"LICENSE",
|
23
|
+
"README.rdoc",
|
24
|
+
"Rakefile",
|
25
|
+
"lib/redisk.rb",
|
26
|
+
"lib/redisk/helper.rb",
|
27
|
+
"lib/redisk/io.rb",
|
28
|
+
"lib/redisk/logger.rb",
|
29
|
+
"lib/redisk/stat.rb",
|
30
|
+
"redisk.gemspec",
|
31
|
+
"spec/fixtures/rails.log",
|
32
|
+
"spec/redis-test.conf",
|
33
|
+
"spec/redisk_io_spec.rb",
|
34
|
+
"spec/redisk_logger_spec.rb",
|
35
|
+
"spec/redisk_stat_spec.rb",
|
36
|
+
"spec/spec.opts",
|
37
|
+
"spec/spec_helper.rb"
|
38
|
+
]
|
39
|
+
s.homepage = %q{http://github.com/quirkey/redis_log}
|
40
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
41
|
+
s.require_paths = ["lib"]
|
42
|
+
s.rubygems_version = %q{1.3.5}
|
43
|
+
s.summary = %q{An interface to Redis that mimic's Ruby's IO classes}
|
44
|
+
s.test_files = [
|
45
|
+
"spec/redisk_io_spec.rb",
|
46
|
+
"spec/redisk_logger_spec.rb",
|
47
|
+
"spec/redisk_stat_spec.rb",
|
48
|
+
"spec/spec_helper.rb"
|
49
|
+
]
|
50
|
+
|
51
|
+
if s.respond_to? :specification_version then
|
52
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
53
|
+
s.specification_version = 3
|
54
|
+
|
55
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
56
|
+
s.add_runtime_dependency(%q<redis>, [">= 0.1.1"])
|
57
|
+
s.add_runtime_dependency(%q<redis-namespace>, [">= 0.1.0"])
|
58
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
59
|
+
else
|
60
|
+
s.add_dependency(%q<redis>, [">= 0.1.1"])
|
61
|
+
s.add_dependency(%q<redis-namespace>, [">= 0.1.0"])
|
62
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
63
|
+
end
|
64
|
+
else
|
65
|
+
s.add_dependency(%q<redis>, [">= 0.1.1"])
|
66
|
+
s.add_dependency(%q<redis-namespace>, [">= 0.1.0"])
|
67
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
@@ -0,0 +1,100 @@
|
|
1
|
+
Processing ArticlesController#new (for 0.0.0.0 at 2009-08-26 00:07:30) [GET]
|
2
|
+
Parameters: {"action"=>"new", "controller"=>"admin/articles"}
|
3
|
+
[4;35;1mUser Load (0.3ms)[0m [0mSELECT * FROM `users` WHERE (`users`.`id` = 2129706640) LIMIT 1[0m
|
4
|
+
[4;36;1mRole Load (0.4ms)[0m [0;1mSELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON (`roles`.`id`=`roles_users`.`role_id`) WHERE (`roles`.`title` = 'admin') AND ((`roles_users`.`user_id` = 2129706640)) LIMIT 1[0m
|
5
|
+
[4;35;1mRole Load (0.3ms)[0m [0mSELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON (`roles`.`id`=`roles_users`.`role_id`) WHERE (`roles`.`title` = 'admin') AND ((`roles_users`.`user_id` = 2129706640)) LIMIT 1[0m
|
6
|
+
[4;36;1mRole Load (0.2ms)[0m [0;1mSELECT * FROM `roles` WHERE (`roles`.`title` = 'author') LIMIT 1[0m
|
7
|
+
Rendering template within layouts/admin
|
8
|
+
Rendering admin/articles/new
|
9
|
+
Rendered admin/contents/_category_select_form (0.3ms)
|
10
|
+
Rendered admin/contents/_category_select (1.1ms)
|
11
|
+
[4;35;1mUser Load (0.5ms)[0m [0mSELECT * FROM `users` INNER JOIN `roles_users` ON (`users`.`id`=`roles_users`.`user_id`) WHERE ((`roles_users`.`role_id` = 1034934473)) [0m
|
12
|
+
Rendered admin/stored_files/_file_selector (0.3ms)
|
13
|
+
Rendered admin/stored_files/_file_selector (0.3ms)
|
14
|
+
Rendered admin/articles/_form (153.2ms)
|
15
|
+
[4;36;1mRole Load (0.5ms)[0m [0;1mSELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON (`roles`.`id`=`roles_users`.`role_id`) WHERE (`roles`.`title` = 'admin') AND ((`roles_users`.`user_id` = 2129706640)) LIMIT 1[0m
|
16
|
+
Completed in 171ms (View: 165, DB: 3) | 200 OK [http://test.host/admin/articles/new]
|
17
|
+
[4;35;1mSQL (0.2ms)[0m [0mROLLBACK[0m
|
18
|
+
[4;36;1mSQL (0.1ms)[0m [0;1mBEGIN[0m
|
19
|
+
[4;35;1mArticle Load (0.3ms)[0m [0mSELECT * FROM `articles` WHERE (`articles`.`id` = 1910336964) [0m
|
20
|
+
[4;36;1mUser Load (0.2ms)[0m [0;1mSELECT * FROM `users` WHERE (`users`.`id` = 2129706640) [0m
|
21
|
+
|
22
|
+
|
23
|
+
Processing ArticlesController#new (for 0.0.0.0 at 2009-08-26 00:07:30) [GET]
|
24
|
+
Parameters: {"action"=>"new", "controller"=>"admin/articles"}
|
25
|
+
[4;35;1mUser Load (0.3ms)[0m [0mSELECT * FROM `users` WHERE (`users`.`id` = 2129706640) LIMIT 1[0m
|
26
|
+
[4;36;1mRole Load (0.4ms)[0m [0;1mSELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON (`roles`.`id`=`roles_users`.`role_id`) WHERE (`roles`.`title` = 'admin') AND ((`roles_users`.`user_id` = 2129706640)) LIMIT 1[0m
|
27
|
+
[4;35;1mRole Load (0.2ms)[0m [0mSELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON (`roles`.`id`=`roles_users`.`role_id`) WHERE (`roles`.`title` = 'admin') AND ((`roles_users`.`user_id` = 2129706640)) LIMIT 1[0m
|
28
|
+
[4;36;1mRole Load (0.2ms)[0m [0;1mSELECT * FROM `roles` WHERE (`roles`.`title` = 'author') LIMIT 1[0m
|
29
|
+
Rendering template within layouts/admin
|
30
|
+
Rendering admin/articles/new
|
31
|
+
Rendered admin/contents/_category_select_form (0.3ms)
|
32
|
+
Rendered admin/contents/_category_select (1.1ms)
|
33
|
+
[4;35;1mUser Load (0.4ms)[0m [0mSELECT * FROM `users` INNER JOIN `roles_users` ON (`users`.`id`=`roles_users`.`user_id`) WHERE ((`roles_users`.`role_id` = 1034934473)) [0m
|
34
|
+
Rendered admin/stored_files/_file_selector (0.4ms)
|
35
|
+
Rendered admin/stored_files/_file_selector (0.2ms)
|
36
|
+
Rendered admin/articles/_form (18.4ms)
|
37
|
+
[4;36;1mRole Load (0.5ms)[0m [0;1mSELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON (`roles`.`id`=`roles_users`.`role_id`) WHERE (`roles`.`title` = 'admin') AND ((`roles_users`.`user_id` = 2129706640)) LIMIT 1[0m
|
38
|
+
Completed in 36ms (View: 30, DB: 3) | 200 OK [http://test.host/admin/articles/new]
|
39
|
+
[4;35;1mSQL (0.2ms)[0m [0mROLLBACK[0m
|
40
|
+
[4;36;1mSQL (0.1ms)[0m [0;1mBEGIN[0m
|
41
|
+
[4;35;1mArticle Load (0.3ms)[0m [0mSELECT * FROM `articles` WHERE (`articles`.`id` = 1910336964) [0m
|
42
|
+
[4;36;1mUser Load (0.2ms)[0m [0;1mSELECT * FROM `users` WHERE (`users`.`id` = 2129706640) [0m
|
43
|
+
|
44
|
+
|
45
|
+
Processing ArticlesController#new (for 0.0.0.0 at 2009-08-26 00:07:30) [GET]
|
46
|
+
Parameters: {"action"=>"new", "controller"=>"admin/articles"}
|
47
|
+
[4;35;1mUser Load (0.3ms)[0m [0mSELECT * FROM `users` WHERE (`users`.`id` = 2129706640) LIMIT 1[0m
|
48
|
+
[4;36;1mRole Load (0.4ms)[0m [0;1mSELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON (`roles`.`id`=`roles_users`.`role_id`) WHERE (`roles`.`title` = 'admin') AND ((`roles_users`.`user_id` = 2129706640)) LIMIT 1[0m
|
49
|
+
[4;35;1mRole Load (0.4ms)[0m [0mSELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON (`roles`.`id`=`roles_users`.`role_id`) WHERE (`roles`.`title` = 'admin') AND ((`roles_users`.`user_id` = 2129706640)) LIMIT 1[0m
|
50
|
+
[4;36;1mRole Load (0.2ms)[0m [0;1mSELECT * FROM `roles` WHERE (`roles`.`title` = 'author') LIMIT 1[0m
|
51
|
+
Rendering template within layouts/admin
|
52
|
+
Rendering admin/articles/new
|
53
|
+
Rendered admin/contents/_category_select_form (0.4ms)
|
54
|
+
Rendered admin/contents/_category_select (1.0ms)
|
55
|
+
[4;35;1mUser Load (0.4ms)[0m [0mSELECT * FROM `users` INNER JOIN `roles_users` ON (`users`.`id`=`roles_users`.`user_id`) WHERE ((`roles_users`.`role_id` = 1034934473)) [0m
|
56
|
+
Rendered admin/stored_files/_file_selector (0.4ms)
|
57
|
+
Rendered admin/stored_files/_file_selector (0.4ms)
|
58
|
+
Rendered admin/articles/_form (21.1ms)
|
59
|
+
[4;36;1mRole Load (0.5ms)[0m [0;1mSELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON (`roles`.`id`=`roles_users`.`role_id`) WHERE (`roles`.`title` = 'admin') AND ((`roles_users`.`user_id` = 2129706640)) LIMIT 1[0m
|
60
|
+
Completed in 40ms (View: 32, DB: 3) | 200 OK [http://test.host/admin/articles/new]
|
61
|
+
[4;35;1mSQL (0.2ms)[0m [0mROLLBACK[0m
|
62
|
+
[4;36;1mSQL (0.1ms)[0m [0;1mBEGIN[0m
|
63
|
+
[4;35;1mArticle Load (0.3ms)[0m [0mSELECT * FROM `articles` WHERE (`articles`.`id` = 1910336964) [0m
|
64
|
+
[4;36;1mUser Load (0.2ms)[0m [0;1mSELECT * FROM `users` WHERE (`users`.`id` = 2129706640) [0m
|
65
|
+
|
66
|
+
|
67
|
+
Processing ArticlesController#new (for 0.0.0.0 at 2009-08-26 00:07:30) [GET]
|
68
|
+
Parameters: {"action"=>"new", "controller"=>"admin/articles"}
|
69
|
+
[4;35;1mUser Load (0.3ms)[0m [0mSELECT * FROM `users` WHERE (`users`.`id` = 2129706640) LIMIT 1[0m
|
70
|
+
[4;36;1mRole Load (0.3ms)[0m [0;1mSELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON (`roles`.`id`=`roles_users`.`role_id`) WHERE (`roles`.`title` = 'admin') AND ((`roles_users`.`user_id` = 2129706640)) LIMIT 1[0m
|
71
|
+
[4;35;1mRole Load (0.2ms)[0m [0mSELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON (`roles`.`id`=`roles_users`.`role_id`) WHERE (`roles`.`title` = 'admin') AND ((`roles_users`.`user_id` = 2129706640)) LIMIT 1[0m
|
72
|
+
[4;36;1mRole Load (0.1ms)[0m [0;1mSELECT * FROM `roles` WHERE (`roles`.`title` = 'author') LIMIT 1[0m
|
73
|
+
Rendering template within layouts/admin
|
74
|
+
Rendering admin/articles/new
|
75
|
+
Rendered admin/contents/_category_select_form (0.4ms)
|
76
|
+
Rendered admin/contents/_category_select (1.1ms)
|
77
|
+
[4;35;1mUser Load (0.4ms)[0m [0mSELECT * FROM `users` INNER JOIN `roles_users` ON (`users`.`id`=`roles_users`.`user_id`) WHERE ((`roles_users`.`role_id` = 1034934473)) [0m
|
78
|
+
Rendered admin/stored_files/_file_selector (0.3ms)
|
79
|
+
Rendered admin/stored_files/_file_selector (0.3ms)
|
80
|
+
Rendered admin/articles/_form (16.9ms)
|
81
|
+
[4;36;1mRole Load (0.5ms)[0m [0;1mSELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON (`roles`.`id`=`roles_users`.`role_id`) WHERE (`roles`.`title` = 'admin') AND ((`roles_users`.`user_id` = 2129706640)) LIMIT 1[0m
|
82
|
+
Completed in 35ms (View: 29, DB: 3) | 200 OK [http://test.host/admin/articles/new]
|
83
|
+
[4;35;1mSQL (0.1ms)[0m [0mROLLBACK[0m
|
84
|
+
[4;36;1mSQL (0.1ms)[0m [0;1mBEGIN[0m
|
85
|
+
[4;35;1mArticle Load (0.3ms)[0m [0mSELECT * FROM `articles` WHERE (`articles`.`id` = 1910336964) [0m
|
86
|
+
[4;36;1mUser Load (0.2ms)[0m [0;1mSELECT * FROM `users` WHERE (`users`.`id` = 2129706640) [0m
|
87
|
+
|
88
|
+
|
89
|
+
Processing ArticlesController#show (for 0.0.0.0 at 2009-08-26 00:07:30) [GET]
|
90
|
+
Parameters: {"action"=>"show", "id"=>"1910336964", "controller"=>"admin/articles"}
|
91
|
+
[4;35;1mUser Load (0.4ms)[0m [0mSELECT * FROM `users` WHERE (`users`.`id` = 2129706640) LIMIT 1[0m
|
92
|
+
[4;36;1mRole Load (0.4ms)[0m [0;1mSELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON (`roles`.`id`=`roles_users`.`role_id`) WHERE (`roles`.`title` = 'admin') AND ((`roles_users`.`user_id` = 2129706640)) LIMIT 1[0m
|
93
|
+
[4;35;1mRole Load (0.4ms)[0m [0mSELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON (`roles`.`id`=`roles_users`.`role_id`) WHERE (`roles`.`title` = 'admin') AND ((`roles_users`.`user_id` = 2129706640)) LIMIT 1[0m
|
94
|
+
[4;36;1mRole Load (0.2ms)[0m [0;1mSELECT * FROM `roles` WHERE (`roles`.`title` = 'author') LIMIT 1[0m
|
95
|
+
[4;35;1mArticle Load (0.3ms)[0m [0mSELECT * FROM `articles` WHERE (`articles`.`id` = 1910336964) [0m
|
96
|
+
Completed in 9ms (View: 2, DB: 2) | 200 OK [http://test.host/admin/articles/show/1910336964]
|
97
|
+
[4;36;1mSQL (0.1ms)[0m [0;1mROLLBACK[0m
|
98
|
+
[4;35;1mSQL (0.1ms)[0m [0mBEGIN[0m
|
99
|
+
[4;36;1mArticle Load (0.3ms)[0m [0;1mSELECT * FROM `articles` WHERE (`articles`.`id` = 1910336964) [0m
|
100
|
+
[4;35;1mUser Load (0.3ms)[0m [0mSELECT * FROM `users` WHERE (`users`.`id` = 2129706640) [0m
|