kwikemon 0.0.1

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