smith 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/smith.rb +0 -1
- data/lib/smith/bootstrap.rb +29 -14
- data/lib/smith/commands/common.rb +27 -5
- data/lib/smith/commands/smithctl/rm.rb +3 -2
- data/lib/smith/config.rb +5 -5
- data/lib/smith/utils.rb +18 -2
- data/lib/smith/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60291ee6d180d1883c743e69e17c590f350c29ee
|
4
|
+
data.tar.gz: 9c2e93dad014cdc16a813c38c3ffc3402d68a81e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ade57bcee554e10eac994c33f3ce32660d19e8938d25fb49e91c1e6c3c7494823f7c2bb3bad0734e9852a076ad04ad46b4f015d0822e6768f77ed8ed7cb951c
|
7
|
+
data.tar.gz: d3c2507f28b378a2d74924ee0d04ff03dd6605e2153587284cd0526ccd64549855eab4267f132e506b4e2a8fa452b984972fdf659a6940c641a0b869ba021683
|
data/lib/smith.rb
CHANGED
data/lib/smith/bootstrap.rb
CHANGED
@@ -41,7 +41,8 @@ module Smith
|
|
41
41
|
|
42
42
|
def load_agent
|
43
43
|
path = agent_directories(@agent_name)
|
44
|
-
logger.
|
44
|
+
logger.info { "Loading #{@agent_name}" }
|
45
|
+
logger.debug { "Loading #{@agent_name} from: #{path}" }
|
45
46
|
add_agent_load_path(path)
|
46
47
|
load path
|
47
48
|
|
@@ -49,7 +50,7 @@ module Smith
|
|
49
50
|
@agent = class_from_name(@agent_name).new(@agent_uuid)
|
50
51
|
rescue NameError => e
|
51
52
|
# TODO: include the class name from the path.
|
52
|
-
logger.fatal { "Cannot instantiate agent.
|
53
|
+
logger.fatal { "Cannot instantiate agent. File #{path} exists but doesn't contain the Class: #{@agent_name}." }
|
53
54
|
terminate!
|
54
55
|
false
|
55
56
|
end
|
@@ -66,9 +67,7 @@ module Smith
|
|
66
67
|
# See the note at the in main.
|
67
68
|
def terminate!(exception=nil)
|
68
69
|
|
69
|
-
|
70
|
-
logger.error { format_exception(exception) }
|
71
|
-
logger.error { "Terminating: #{@agent_uuid}." }
|
70
|
+
run_exception_handler(exception)
|
72
71
|
|
73
72
|
if Smith.running?
|
74
73
|
send_dead_message
|
@@ -111,12 +110,23 @@ module Smith
|
|
111
110
|
end
|
112
111
|
end
|
113
112
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
113
|
+
# Format any excptions
|
114
|
+
# @param e [Exception] the exeption to format
|
115
|
+
# @return [String] formated exception
|
116
|
+
def format_exception(e)
|
117
|
+
"#{e.class.to_s}: #{e.inspect}\n\t".tap do
|
118
|
+
str << e.backtrace[0..-1].join("\n\t") if e.backtrace
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# Run the on_exception proc defined in the agent.
|
123
|
+
# @param e [Exception] the exeption to handle
|
124
|
+
def run_exception_handler(exception)
|
125
|
+
if exception && @agent
|
126
|
+
@agent.__send__(:__exception_handler, exception)
|
127
|
+
logger.error { format_exception(exception) }
|
128
|
+
logger.error { "Terminating: #{@agent_uuid}." }
|
118
129
|
end
|
119
|
-
str
|
120
130
|
end
|
121
131
|
|
122
132
|
# Add the ../lib to the load path. This assumes the directory
|
@@ -131,10 +141,15 @@ module Smith
|
|
131
141
|
# TODO think this through some more.
|
132
142
|
def add_agent_load_path(path)
|
133
143
|
path = path.dirname.dirname.join('lib')
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
144
|
+
|
145
|
+
Smith.agent_directories.each do |path|
|
146
|
+
lib_path = path.parent.join('lib')
|
147
|
+
if lib_path.exist?
|
148
|
+
logger.info { "Adding #{lib_path} to load path" }
|
149
|
+
$LOAD_PATH << path
|
150
|
+
else
|
151
|
+
logger.info { "No lib directory for: #{path.parent}." }
|
152
|
+
end
|
138
153
|
end
|
139
154
|
end
|
140
155
|
end
|
@@ -2,12 +2,28 @@
|
|
2
2
|
module Smith
|
3
3
|
module Commands
|
4
4
|
module Common
|
5
|
+
|
6
|
+
# Returns the fully qualified class of all agents in a group. The group
|
7
|
+
# //must// be a sub-directory in the agents directory. Only sym-links are
|
8
|
+
# considered. The group directory is recursively searched and addeed to
|
9
|
+
# the ilst of agents for that group if it passed all checks.
|
10
|
+
#
|
11
|
+
# @param group [String] the group name
|
12
|
+
#
|
13
|
+
# @return [Array<Class>] the class of each agent in the group
|
5
14
|
def agent_group(group)
|
6
|
-
agents = Smith.agent_directories.map do |
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
agents
|
15
|
+
agents = Smith.agent_directories.map do |agent_directory|
|
16
|
+
group_directory = agent_directory.join(group)
|
17
|
+
|
18
|
+
if group_directory.exist? && group_directory.directory?
|
19
|
+
agents = Pathname.glob(group_directory.join("*.rb")).map(&:expand_path)
|
20
|
+
|
21
|
+
agents.each_with_object([]) do |agent, acc|
|
22
|
+
if agent.symlink?
|
23
|
+
expanded_agent_path = resolve_agent_path(group_directory, agent)
|
24
|
+
acc << Utils.class_name_from_path(expanded_agent_path, agent_directory)
|
25
|
+
end
|
26
|
+
end
|
11
27
|
else
|
12
28
|
nil
|
13
29
|
end
|
@@ -16,6 +32,12 @@ module Smith
|
|
16
32
|
raise RuntimeError, "Group does not exist: #{group}" if agents == [nil]
|
17
33
|
agents.compact.flatten
|
18
34
|
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def resolve_agent_path(group_directory, agent)
|
39
|
+
agent.readlink.expand_path(group_directory)
|
40
|
+
end
|
19
41
|
end
|
20
42
|
end
|
21
43
|
end
|
@@ -53,10 +53,11 @@ module Smith
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
# Delete
|
56
|
+
# Delete a queue.
|
57
57
|
#
|
58
|
-
# @param
|
58
|
+
# @param queue_name [String] name of the queue.
|
59
59
|
# @yield calls the block when the queue has been deleted
|
60
|
+
#
|
60
61
|
# @yieldparam [AMQ::Protocol::Channel::Close] the amqp close message
|
61
62
|
# FIXME: remove duplication
|
62
63
|
def delete_queue(queue_name, &blk)
|
data/lib/smith/config.rb
CHANGED
@@ -152,16 +152,16 @@ module Smith
|
|
152
152
|
|
153
153
|
# Loads and merges multiple toml files.
|
154
154
|
#
|
155
|
-
# @
|
156
|
-
# @
|
155
|
+
# @param default [String] the default toml file
|
156
|
+
# @param secondary [String] the user supplied toml file
|
157
157
|
# @return [ConfigHash] the merge toml files.
|
158
|
-
def load_tomls(default,
|
159
|
-
load_toml(default).deep_merge(load_toml(
|
158
|
+
def load_tomls(default, secondary)
|
159
|
+
load_toml(default).deep_merge(load_toml(secondary))
|
160
160
|
end
|
161
161
|
|
162
162
|
# Load the toml file specified
|
163
163
|
#
|
164
|
-
# @param [Pathname] the path of the toml file
|
164
|
+
# @param path [Pathname] the path of the toml file
|
165
165
|
# @return [ConfigHash] the toml file
|
166
166
|
def load_toml(path)
|
167
167
|
ConfigHash.new(TOML.parse(path.read, :symbolize_keys => true))
|
data/lib/smith/utils.rb
CHANGED
@@ -24,12 +24,16 @@ module Smith
|
|
24
24
|
parts[-1] = "#{parts[-1]}.rb"
|
25
25
|
Pathname.new(root).join(*parts)
|
26
26
|
end
|
27
|
+
module_function :path_from_class
|
27
28
|
|
28
|
-
|
29
|
+
# Returns a Constant based on the pathname.
|
30
|
+
def class_name_from_path(path, root=Pathname.new('.'))
|
29
31
|
relative_path = path.relative_path_from(root)
|
30
|
-
parts = relative_path.
|
32
|
+
parts = split_path(relative_path.sub_ext(''))
|
33
|
+
|
31
34
|
parts.map { |p| p.to_s.camel_case }.join('::')
|
32
35
|
end
|
36
|
+
module_function :class_name_from_path
|
33
37
|
|
34
38
|
# Performs a Kernel.const_get on each element of the class.
|
35
39
|
#
|
@@ -38,7 +42,19 @@ module Smith
|
|
38
42
|
def class_from_name(name)
|
39
43
|
name.to_s.split(/::/).inject(Kernel) { |acc, t| acc.const_get(t) }
|
40
44
|
end
|
45
|
+
module_function :class_from_name
|
46
|
+
|
47
|
+
|
48
|
+
# Slipts a path into it's component parts.
|
49
|
+
#
|
50
|
+
# @param pathname [Pathname] the path to split.
|
51
|
+
def split_path(pathname)
|
52
|
+
pathname.each_filename.inject([]) { |acc, p| acc << p }
|
53
|
+
end
|
54
|
+
module_function :split_path
|
41
55
|
|
56
|
+
# Check for the existance of a directory and create if it doesn't exist.
|
57
|
+
# @param dir [Pathname]
|
42
58
|
def check_and_create_directory(dir)
|
43
59
|
dir.tap do
|
44
60
|
dir.exist? || dir.mkpath
|
data/lib/smith/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smith
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Heycock
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|
@@ -323,4 +323,4 @@ signing_key:
|
|
323
323
|
specification_version: 4
|
324
324
|
summary: Multi-agent framework
|
325
325
|
test_files: []
|
326
|
-
has_rdoc:
|
326
|
+
has_rdoc:
|