kwikemon 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/kwikemon.rb +113 -0
- data/monitor.rb +98 -0
- metadata +60 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: fce96e65afa48f57198fe53a1d593fae89011ef9
|
4
|
+
data.tar.gz: bb28df5484586c9c3ec64fee04ea17076afd64a2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bc74200cf3e78b49845f498a6e340a25f7b0ff79e049e594fce93f2c8dc09b4f199ec8a14fe36976af7333dbbf74fb50e0fcd7f23c171da5993fd31e7575eff3
|
7
|
+
data.tar.gz: 20f941b14e5176694647798a04d30a6130eb4392093fed6ab4ccdf003d7f732752e7008c0458edec2b890ed36e98c218ea9802fb8b97f12e2655fb578a622cba
|
data/kwikemon.rb
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
# Copyright 2013 Sami Samhuri <sami@samhuri.net>
|
2
|
+
#
|
3
|
+
# MIT License
|
4
|
+
# http://sjs.mit-license.org
|
5
|
+
|
6
|
+
require 'redis'
|
7
|
+
require File.expand_path('../monitor.rb', __FILE__)
|
8
|
+
|
9
|
+
module Kwikemon
|
10
|
+
|
11
|
+
extend self
|
12
|
+
|
13
|
+
include Enumerable
|
14
|
+
|
15
|
+
def redis
|
16
|
+
@redis ||= Redis.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def redis=(redis)
|
20
|
+
@redis = redis
|
21
|
+
end
|
22
|
+
|
23
|
+
def key_prefix
|
24
|
+
@key_prefix ||= "kwikemon"
|
25
|
+
end
|
26
|
+
|
27
|
+
def key_prefix=(key_prefix)
|
28
|
+
@key_prefix = key_prefix
|
29
|
+
end
|
30
|
+
|
31
|
+
def key(x)
|
32
|
+
"#{key_prefix}:#{x}"
|
33
|
+
end
|
34
|
+
|
35
|
+
Monitor.on(:create) do |name|
|
36
|
+
redis.sadd(key('monitors'), name)
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
# Set `name` to `value`.
|
41
|
+
#
|
42
|
+
# @param name [#to_s] name of the monitor
|
43
|
+
# @param text [#to_s] status text
|
44
|
+
def set(name, text)
|
45
|
+
Monitor.new(name, text).save
|
46
|
+
end
|
47
|
+
|
48
|
+
# Check if `name` exists3
|
49
|
+
#
|
50
|
+
# @param name [#to_s] name of the monitor
|
51
|
+
# @return [true, false] true if monitor exists, otherwise false
|
52
|
+
def exists?(name)
|
53
|
+
Monitor.new(name).exists?
|
54
|
+
end
|
55
|
+
|
56
|
+
# Get the value of `name`. Returns `nil` if it doesn't exist.
|
57
|
+
#
|
58
|
+
# @param name [#_tos] name of the monitor
|
59
|
+
# @return [String, nil] status text, or `nil` if it doesn't exist
|
60
|
+
def get(name)
|
61
|
+
Monitor.new(name).text
|
62
|
+
end
|
63
|
+
|
64
|
+
# Get the TTL in seconds of `name`. Returns `nil` if it doesn't exit.
|
65
|
+
#
|
66
|
+
# @param name [#_tos] name of the monitor
|
67
|
+
# @return [String, nil] TTL, or `nil` if it doesn't exist
|
68
|
+
def ttl(name)
|
69
|
+
Monitor.new(name).ttl
|
70
|
+
end
|
71
|
+
|
72
|
+
# Count all monitors.
|
73
|
+
def count
|
74
|
+
redis.scard(key('monitors'))
|
75
|
+
end
|
76
|
+
|
77
|
+
# List all monitor names.
|
78
|
+
def list
|
79
|
+
redis.smembers(key('monitors'))
|
80
|
+
end
|
81
|
+
|
82
|
+
def each
|
83
|
+
list.each { |m| yield(m) }
|
84
|
+
end
|
85
|
+
|
86
|
+
# Get a `Hash` of all monitors.
|
87
|
+
def get_all
|
88
|
+
list.inject({}) do |ms, name|
|
89
|
+
ms[name] = Monitor.new(name).text
|
90
|
+
ms
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Remove the monitor named `name`.
|
95
|
+
def remove(name)
|
96
|
+
Monitor.new(name).delete
|
97
|
+
end
|
98
|
+
|
99
|
+
# Clear all monitors.
|
100
|
+
def clear
|
101
|
+
list.each do |name|
|
102
|
+
remove(name)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# Clean up expired monitors.
|
107
|
+
def sweep
|
108
|
+
list.each do |name|
|
109
|
+
remove(name) unless exists?(name)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
data/monitor.rb
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
# Copyright 2013 Sami Samhuri <sami@samhuri.net>
|
2
|
+
#
|
3
|
+
# MIT License
|
4
|
+
# http://sjs.mit-license.org
|
5
|
+
|
6
|
+
module Kwikemon
|
7
|
+
|
8
|
+
class Monitor
|
9
|
+
|
10
|
+
DefaultTTL = 86400 # 1 day
|
11
|
+
|
12
|
+
attr_accessor :redis
|
13
|
+
attr_reader :name, :text, :ttl, :created, :modified
|
14
|
+
|
15
|
+
@listeners = Hash.new { |h, k| h[k] = [] }
|
16
|
+
|
17
|
+
def Monitor.on(event, &block)
|
18
|
+
@listeners[event] << block
|
19
|
+
end
|
20
|
+
|
21
|
+
def Monitor.emit(event, *args)
|
22
|
+
@listeners[event].each { |handler| handler.call(*args) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(name, text = nil)
|
26
|
+
@name = name
|
27
|
+
@text = text
|
28
|
+
end
|
29
|
+
|
30
|
+
def save
|
31
|
+
if exists?
|
32
|
+
update
|
33
|
+
else
|
34
|
+
create
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def exists?
|
39
|
+
redis.exists(key)
|
40
|
+
end
|
41
|
+
|
42
|
+
def create
|
43
|
+
raise MonitorError.new('name cannot be blank') if name.to_s.strip.length == 0
|
44
|
+
redis.hmset(key, *to_a)
|
45
|
+
emit(:create, name)
|
46
|
+
self
|
47
|
+
end
|
48
|
+
|
49
|
+
def update(text, ttl = nil)
|
50
|
+
raise MonitorError.new('name cannot be blank') if name.to_s.strip.length == 0
|
51
|
+
redis.hmset(key, 'text', text, 'modified', Time.now.to_i)
|
52
|
+
redis.ttl(key, ttl) if ttl
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
56
|
+
def key
|
57
|
+
Kwikemon.key("monitor:#{name}")
|
58
|
+
end
|
59
|
+
|
60
|
+
def ttl
|
61
|
+
@ttl ||= exists? ? redis.ttl(key) : nil
|
62
|
+
end
|
63
|
+
|
64
|
+
def created
|
65
|
+
@created ||= exists? ? redis.hget(key, 'created').to_i : nil
|
66
|
+
end
|
67
|
+
|
68
|
+
def modified
|
69
|
+
@modified ||= exists? ? redis.hget(key, 'modified').to_i : nil
|
70
|
+
end
|
71
|
+
|
72
|
+
def text
|
73
|
+
@text ||= exists? ? redis.hget(key, 'name')
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def redis
|
80
|
+
Kwikemon.redis
|
81
|
+
end
|
82
|
+
|
83
|
+
def to_hash
|
84
|
+
{ name: name,
|
85
|
+
text: text,
|
86
|
+
ttl: ttl || DefaultTTL,
|
87
|
+
created: created || Time.now.to_i,
|
88
|
+
modified: modified || Time.now_to_i
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
def to_a
|
93
|
+
to_hash.to_a
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kwikemon
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sami Samhuri
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-08-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: redis
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.0.4
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.0.4
|
27
|
+
description: Read & write simple monitors using Redis.
|
28
|
+
email: sami@samhuri.net
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- kwikemon.rb
|
34
|
+
- monitor.rb
|
35
|
+
homepage: https://github.com/samsonjs/kwikemon
|
36
|
+
licenses:
|
37
|
+
- MIT
|
38
|
+
metadata: {}
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- .
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.9.1
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubyforge_project:
|
55
|
+
rubygems_version: 2.0.3
|
56
|
+
signing_key:
|
57
|
+
specification_version: 4
|
58
|
+
summary: Ruby client for kwikemon.
|
59
|
+
test_files: []
|
60
|
+
has_rdoc:
|