kwikemon 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/kwikemon.rb +113 -0
  3. data/monitor.rb +98 -0
  4. 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: