daemon-kit 0.1.7.12 → 0.1.8pre

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 (144) hide show
  1. data/History.txt +7 -0
  2. data/Manifest.txt +4 -0
  3. data/README.rdoc +11 -9
  4. data/Rakefile +0 -1
  5. data/TODO.txt +1 -2
  6. data/bin/daemon-kit +11 -11
  7. data/daemon-kit.gemspec +109 -78
  8. data/lib/daemon_kit.rb +7 -10
  9. data/lib/daemon_kit/abstract_logger.rb +22 -14
  10. data/lib/daemon_kit/application.rb +0 -1
  11. data/lib/daemon_kit/arguments.rb +1 -6
  12. data/lib/daemon_kit/commands/destroy.rb +10 -0
  13. data/lib/daemon_kit/commands/generate.rb +10 -0
  14. data/lib/daemon_kit/config.rb +7 -2
  15. data/lib/daemon_kit/generators.rb +67 -0
  16. data/lib/daemon_kit/generators/base.rb +60 -0
  17. data/lib/daemon_kit/initializer.rb +1 -1
  18. data/lib/daemon_kit/jabber.rb +1 -0
  19. data/lib/daemon_kit/tasks/framework.rake +6 -1
  20. data/lib/daemon_kit/vendor/thor-0.12.3/CHANGELOG.rdoc +80 -0
  21. data/lib/daemon_kit/vendor/thor-0.12.3/LICENSE +20 -0
  22. data/lib/daemon_kit/vendor/thor-0.12.3/README.rdoc +234 -0
  23. data/lib/daemon_kit/vendor/thor-0.12.3/Thorfile +64 -0
  24. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor.rb +242 -0
  25. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/actions.rb +274 -0
  26. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/actions/create_file.rb +103 -0
  27. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/actions/directory.rb +91 -0
  28. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/actions/empty_directory.rb +134 -0
  29. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/actions/file_manipulation.rb +223 -0
  30. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/actions/inject_into_file.rb +101 -0
  31. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/base.rb +515 -0
  32. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/core_ext/file_binary_read.rb +9 -0
  33. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/core_ext/hash_with_indifferent_access.rb +75 -0
  34. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/core_ext/ordered_hash.rb +100 -0
  35. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/error.rb +27 -0
  36. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/group.rb +271 -0
  37. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/invocation.rb +178 -0
  38. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/parser.rb +4 -0
  39. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/parser/argument.rb +67 -0
  40. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/parser/arguments.rb +145 -0
  41. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/parser/option.rb +132 -0
  42. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/parser/options.rb +142 -0
  43. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/rake_compat.rb +66 -0
  44. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/runner.rb +303 -0
  45. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/shell.rb +78 -0
  46. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/shell/basic.rb +239 -0
  47. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/shell/color.rb +108 -0
  48. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/task.rb +111 -0
  49. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/util.rb +233 -0
  50. data/lib/daemon_kit/vendor/thor-0.12.3/lib/thor/version.rb +3 -0
  51. data/lib/daemon_kit/xmpp.rb +75 -6
  52. data/{daemon_generators → lib/generators/daemon_kit}/amqp/USAGE +0 -0
  53. data/lib/generators/daemon_kit/amqp/amqp_generator.rb +24 -0
  54. data/{daemon_generators → lib/generators/daemon_kit}/amqp/templates/config/amqp.yml +0 -0
  55. data/{daemon_generators/amqp/templates/config/initializers → lib/generators/daemon_kit/amqp/templates/config/pre-daemonize}/amqp.rb +0 -0
  56. data/{daemon_generators/amqp/templates/libexec/daemon.rb → lib/generators/daemon_kit/amqp/templates/libexec/%app_name%-daemon.rb} +0 -0
  57. data/{app_generators/daemon_kit → lib/generators/daemon_kit/app}/USAGE +0 -0
  58. data/lib/generators/daemon_kit/app/app_generator.rb +140 -0
  59. data/lib/generators/daemon_kit/app/templates/Gemfile +8 -0
  60. data/{app_generators/daemon_kit → lib/generators/daemon_kit/app}/templates/README +0 -0
  61. data/{app_generators/daemon_kit → lib/generators/daemon_kit/app}/templates/Rakefile +0 -0
  62. data/lib/generators/daemon_kit/app/templates/bin/daemon.tt +7 -0
  63. data/{app_generators/daemon_kit → lib/generators/daemon_kit/app}/templates/config/arguments.rb +0 -0
  64. data/{app_generators/daemon_kit → lib/generators/daemon_kit/app}/templates/config/boot.rb +10 -3
  65. data/{app_generators/daemon_kit/templates/config/environment.rb → lib/generators/daemon_kit/app/templates/config/environment.rb.tt} +1 -1
  66. data/{app_generators/daemon_kit → lib/generators/daemon_kit/app}/templates/config/environments/development.rb +0 -0
  67. data/{app_generators/daemon_kit → lib/generators/daemon_kit/app}/templates/config/environments/production.rb +0 -0
  68. data/{app_generators/daemon_kit → lib/generators/daemon_kit/app}/templates/config/environments/test.rb +0 -0
  69. data/{app_generators/daemon_kit → lib/generators/daemon_kit/app}/templates/config/post-daemonize/readme +0 -0
  70. data/{app_generators/daemon_kit → lib/generators/daemon_kit/app}/templates/config/pre-daemonize/readme +0 -0
  71. data/{app_generators/daemon_kit/templates/lib/daemon.rb → lib/generators/daemon_kit/app/templates/lib/%app_name%.rb} +0 -0
  72. data/{app_generators/daemon_kit/templates/libexec/daemon.erb → lib/generators/daemon_kit/app/templates/libexec/%app_name%-daemon.rb} +0 -0
  73. data/{app_generators/daemon_kit → lib/generators/daemon_kit/app}/templates/script/console +0 -0
  74. data/lib/generators/daemon_kit/app/templates/script/destroy +2 -0
  75. data/lib/generators/daemon_kit/app/templates/script/generate +2 -0
  76. data/lib/generators/daemon_kit/capistrano/capistrano_generator.rb +21 -0
  77. data/{daemon_generators/deploy_capistrano → lib/generators/daemon_kit/capistrano}/templates/Capfile +0 -0
  78. data/{daemon_generators/deploy_capistrano → lib/generators/daemon_kit/capistrano}/templates/USAGE +0 -0
  79. data/{daemon_generators/deploy_capistrano/templates/config/deploy.rb → lib/generators/daemon_kit/capistrano/templates/config/deploy.rb.tt} +1 -1
  80. data/lib/generators/daemon_kit/capistrano/templates/config/deploy/production.rb.tt +6 -0
  81. data/lib/generators/daemon_kit/capistrano/templates/config/deploy/staging.rb.tt +6 -0
  82. data/{daemon_generators/deploy_capistrano → lib/generators/daemon_kit/capistrano}/templates/config/environments/staging.rb +0 -0
  83. data/{daemon_generators → lib/generators/daemon_kit}/cron/USAGE +0 -0
  84. data/lib/generators/daemon_kit/cron/cron_generator.rb +24 -0
  85. data/{daemon_generators/cron/templates/config/initializers → lib/generators/daemon_kit/cron/templates/config/pre-daemonize}/cron.rb +0 -0
  86. data/{daemon_generators/cron/templates/libexec/daemon.rb → lib/generators/daemon_kit/cron/templates/libexec/%app_name%-daemon.rb} +0 -0
  87. data/{daemon_generators → lib/generators/daemon_kit}/cucumber/USAGE +0 -0
  88. data/lib/generators/daemon_kit/cucumber/cucumber_generator.rb +45 -0
  89. data/{daemon_generators/cucumber/templates/cucumber_environment.rb → lib/generators/daemon_kit/cucumber/templates/config/environments/cucumber.rb} +0 -0
  90. data/lib/generators/daemon_kit/cucumber/templates/features/step_definitions/.empty_directory +0 -0
  91. data/{daemon_generators/cucumber/templates → lib/generators/daemon_kit/cucumber/templates/features/support}/env.rb +0 -0
  92. data/{daemon_generators/cucumber/templates → lib/generators/daemon_kit/cucumber/templates/script}/cucumber +1 -2
  93. data/{daemon_generators/cucumber/templates → lib/generators/daemon_kit/cucumber/templates/tasks}/cucumber.rake +0 -0
  94. data/{daemon_generators/jabber → lib/generators/daemon_kit/nanite_agent}/USAGE +0 -0
  95. data/lib/generators/daemon_kit/nanite_agent/nanite_agent_generator.rb +29 -0
  96. data/{daemon_generators → lib/generators/daemon_kit}/nanite_agent/templates/config/nanite.yml +0 -0
  97. data/{daemon_generators/nanite_agent/templates/config/initializers → lib/generators/daemon_kit/nanite_agent/templates/config/pre-daemonize}/nanite_agent.rb +0 -0
  98. data/{daemon_generators → lib/generators/daemon_kit}/nanite_agent/templates/lib/actors/sample.rb +0 -0
  99. data/{daemon_generators/nanite_agent/templates/libexec/daemon.rb → lib/generators/daemon_kit/nanite_agent/templates/libexec/%app_name%-daemon.rb} +0 -0
  100. data/{daemon_generators/nanite_agent → lib/generators/daemon_kit/rspec}/USAGE +0 -0
  101. data/lib/generators/daemon_kit/rspec/rspec_generator.rb +20 -0
  102. data/{daemon_generators/rspec/templates/spec.rb → lib/generators/daemon_kit/rspec/templates/spec/%app_name%_spec.rb} +0 -0
  103. data/{daemon_generators → lib/generators/daemon_kit}/rspec/templates/spec/spec.opts +0 -0
  104. data/{daemon_generators → lib/generators/daemon_kit}/rspec/templates/spec/spec_helper.rb +0 -0
  105. data/{daemon_generators → lib/generators/daemon_kit}/rspec/templates/tasks/rspec.rake +0 -0
  106. data/{daemon_generators/rspec → lib/generators/daemon_kit/ruote}/USAGE +0 -0
  107. data/lib/generators/daemon_kit/ruote/ruote_generator.rb +29 -0
  108. data/{daemon_generators → lib/generators/daemon_kit}/ruote/templates/config/amqp.yml +0 -0
  109. data/{daemon_generators/ruote/templates/config/initializers → lib/generators/daemon_kit/ruote/templates/config/pre-daemonize}/ruote.rb +0 -0
  110. data/{daemon_generators → lib/generators/daemon_kit}/ruote/templates/config/ruote.yml +0 -0
  111. data/{daemon_generators/ruote/templates/lib/daemon.rb → lib/generators/daemon_kit/ruote/templates/lib/%app_name%.rb} +0 -0
  112. data/{daemon_generators → lib/generators/daemon_kit}/ruote/templates/lib/sample.rb +0 -0
  113. data/{daemon_generators/ruote/templates/libexec/daemon.rb → lib/generators/daemon_kit/ruote/templates/libexec/%app_name%-daemon.rb} +0 -0
  114. data/{daemon_generators/ruote → lib/generators/daemon_kit/test_unit}/USAGE +0 -0
  115. data/{daemon_generators → lib/generators/daemon_kit}/test_unit/templates/tasks/test_unit.rake +0 -0
  116. data/{daemon_generators/test_unit/templates/test/test.rb → lib/generators/daemon_kit/test_unit/templates/test/%app_name%_test.rb.tt} +1 -1
  117. data/{daemon_generators → lib/generators/daemon_kit}/test_unit/templates/test/test_helper.rb +0 -0
  118. data/lib/generators/daemon_kit/test_unit/test_unit_generator.rb +20 -0
  119. data/lib/generators/daemon_kit/xmpp/templates/config/pre-daemonize/xmpp.rb +6 -0
  120. data/{daemon_generators/jabber/templates/config/jabber.yml → lib/generators/daemon_kit/xmpp/templates/config/xmpp.yml} +5 -2
  121. data/lib/generators/daemon_kit/xmpp/templates/libexec/%app_name%-daemon.rb +27 -0
  122. data/lib/generators/daemon_kit/xmpp/xmpp_generator.rb +24 -0
  123. data/spec/argument_spec.rb +1 -1
  124. data/spec/config_spec.rb +7 -3
  125. metadata +110 -86
  126. data/app_generators/daemon_kit/daemon_kit_generator.rb +0 -178
  127. data/app_generators/daemon_kit/templates/bin/daemon.erb +0 -7
  128. data/app_generators/daemon_kit/templates/script/destroy +0 -14
  129. data/app_generators/daemon_kit/templates/script/generate +0 -14
  130. data/daemon_generators/amqp/amqp_generator.rb +0 -65
  131. data/daemon_generators/cron/cron_generator.rb +0 -64
  132. data/daemon_generators/cucumber/cucumber_generator.rb +0 -38
  133. data/daemon_generators/deploy_capistrano/deploy_capistrano_generator.rb +0 -35
  134. data/daemon_generators/deploy_capistrano/templates/config/deploy/production.rb +0 -6
  135. data/daemon_generators/deploy_capistrano/templates/config/deploy/staging.rb +0 -6
  136. data/daemon_generators/jabber/jabber_generator.rb +0 -65
  137. data/daemon_generators/jabber/templates/config/initializers/jabber.rb +0 -7
  138. data/daemon_generators/jabber/templates/libexec/daemon.rb +0 -27
  139. data/daemon_generators/nanite_agent/nanite_agent_generator.rb +0 -68
  140. data/daemon_generators/rspec/rspec_generator.rb +0 -55
  141. data/daemon_generators/ruote/ruote_generator.rb +0 -67
  142. data/daemon_generators/test_unit/USAGE +0 -5
  143. data/daemon_generators/test_unit/test_unit_generator.rb +0 -51
  144. data/test/test_jabber_generator.rb +0 -49
@@ -0,0 +1,233 @@
1
+ require 'rbconfig'
2
+
3
+ class Thor
4
+ module Sandbox #:nodoc:
5
+ end
6
+
7
+ # This module holds several utilities:
8
+ #
9
+ # 1) Methods to convert thor namespaces to constants and vice-versa.
10
+ #
11
+ # Thor::Utils.namespace_from_thor_class(Foo::Bar::Baz) #=> "foo:bar:baz"
12
+ #
13
+ # 2) Loading thor files and sandboxing:
14
+ #
15
+ # Thor::Utils.load_thorfile("~/.thor/foo")
16
+ #
17
+ module Util
18
+
19
+ # Receives a namespace and search for it in the Thor::Base subclasses.
20
+ #
21
+ # ==== Parameters
22
+ # namespace<String>:: The namespace to search for.
23
+ #
24
+ def self.find_by_namespace(namespace)
25
+ namespace = "default#{namespace}" if namespace.empty? || namespace =~ /^:/
26
+
27
+ Thor::Base.subclasses.find do |klass|
28
+ klass.namespace == namespace
29
+ end
30
+ end
31
+
32
+ # Receives a constant and converts it to a Thor namespace. Since Thor tasks
33
+ # can be added to a sandbox, this method is also responsable for removing
34
+ # the sandbox namespace.
35
+ #
36
+ # This method should not be used in general because it's used to deal with
37
+ # older versions of Thor. On current versions, if you need to get the
38
+ # namespace from a class, just call namespace on it.
39
+ #
40
+ # ==== Parameters
41
+ # constant<Object>:: The constant to be converted to the thor path.
42
+ #
43
+ # ==== Returns
44
+ # String:: If we receive Foo::Bar::Baz it returns "foo:bar:baz"
45
+ #
46
+ def self.namespace_from_thor_class(constant, remove_default=true)
47
+ constant = constant.to_s.gsub(/^Thor::Sandbox::/, "")
48
+ constant = snake_case(constant).squeeze(":")
49
+ constant.gsub!(/^default/, '') if remove_default
50
+ constant
51
+ end
52
+
53
+ # Given the contents, evaluate it inside the sandbox and returns the
54
+ # namespaces defined in the sandbox.
55
+ #
56
+ # ==== Parameters
57
+ # contents<String>
58
+ #
59
+ # ==== Returns
60
+ # Array[Object]
61
+ #
62
+ def self.namespaces_in_content(contents, file=__FILE__)
63
+ old_constants = Thor::Base.subclasses.dup
64
+ Thor::Base.subclasses.clear
65
+
66
+ load_thorfile(file, contents)
67
+
68
+ new_constants = Thor::Base.subclasses.dup
69
+ Thor::Base.subclasses.replace(old_constants)
70
+
71
+ new_constants.map!{ |c| c.namespace }
72
+ new_constants.compact!
73
+ new_constants
74
+ end
75
+
76
+ # Returns the thor classes declared inside the given class.
77
+ #
78
+ def self.thor_classes_in(klass)
79
+ stringfied_constants = klass.constants.map { |c| c.to_s }
80
+ Thor::Base.subclasses.select do |subclass|
81
+ next unless subclass.name
82
+ stringfied_constants.include?(subclass.name.gsub("#{klass.name}::", ''))
83
+ end
84
+ end
85
+
86
+ # Receives a string and convert it to snake case. SnakeCase returns snake_case.
87
+ #
88
+ # ==== Parameters
89
+ # String
90
+ #
91
+ # ==== Returns
92
+ # String
93
+ #
94
+ def self.snake_case(str)
95
+ return str.downcase if str =~ /^[A-Z_]+$/
96
+ str.gsub(/\B[A-Z]/, '_\&').squeeze('_') =~ /_*(.*)/
97
+ return $+.downcase
98
+ end
99
+
100
+ # Receives a string and convert it to camel case. camel_case returns CamelCase.
101
+ #
102
+ # ==== Parameters
103
+ # String
104
+ #
105
+ # ==== Returns
106
+ # String
107
+ #
108
+ def self.camel_case(str)
109
+ return str if str !~ /_/ && str =~ /[A-Z]+.*/
110
+ str.split('_').map { |i| i.capitalize }.join
111
+ end
112
+
113
+ # Receives a namespace and tries to retrieve a Thor or Thor::Group class
114
+ # from it. It first searches for a class using the all the given namespace,
115
+ # if it's not found, removes the highest entry and searches for the class
116
+ # again. If found, returns the highest entry as the class name.
117
+ #
118
+ # ==== Examples
119
+ #
120
+ # class Foo::Bar < Thor
121
+ # def baz
122
+ # end
123
+ # end
124
+ #
125
+ # class Baz::Foo < Thor::Group
126
+ # end
127
+ #
128
+ # Thor::Util.namespace_to_thor_class("foo:bar") #=> Foo::Bar, nil # will invoke default task
129
+ # Thor::Util.namespace_to_thor_class("baz:foo") #=> Baz::Foo, nil
130
+ # Thor::Util.namespace_to_thor_class("foo:bar:baz") #=> Foo::Bar, "baz"
131
+ #
132
+ # ==== Parameters
133
+ # namespace<String>
134
+ #
135
+ # ==== Errors
136
+ # Thor::Error:: raised if the namespace cannot be found.
137
+ #
138
+ # Thor::Error:: raised if the namespace evals to a class which does not
139
+ # inherit from Thor or Thor::Group.
140
+ #
141
+ def self.namespace_to_thor_class_and_task(namespace, raise_if_nil=true)
142
+ if namespace.include?(?:)
143
+ pieces = namespace.split(":")
144
+ task = pieces.pop
145
+ klass = Thor::Util.find_by_namespace(pieces.join(":"))
146
+ end
147
+
148
+ unless klass
149
+ klass, task = Thor::Util.find_by_namespace(namespace), nil
150
+ end
151
+
152
+ raise Error, "could not find Thor class or task '#{namespace}'" if raise_if_nil && klass.nil?
153
+ return klass, task
154
+ end
155
+
156
+ # Receives a path and load the thor file in the path. The file is evaluated
157
+ # inside the sandbox to avoid namespacing conflicts.
158
+ #
159
+ def self.load_thorfile(path, content=nil)
160
+ content ||= File.binread(path)
161
+
162
+ begin
163
+ Thor::Sandbox.class_eval(content, path)
164
+ rescue Exception => e
165
+ $stderr.puts "WARNING: unable to load thorfile #{path.inspect}: #{e.message}"
166
+ end
167
+ end
168
+
169
+ def self.user_home
170
+ @@user_home ||= if ENV["HOME"]
171
+ ENV["HOME"]
172
+ elsif ENV["USERPROFILE"]
173
+ ENV["USERPROFILE"]
174
+ elsif ENV["HOMEDRIVE"] && ENV["HOMEPATH"]
175
+ File.join(ENV["HOMEDRIVE"], ENV["HOMEPATH"])
176
+ elsif ENV["APPDATA"]
177
+ ENV["APPDATA"]
178
+ else
179
+ begin
180
+ File.expand_path("~")
181
+ rescue
182
+ if File::ALT_SEPARATOR
183
+ "C:/"
184
+ else
185
+ "/"
186
+ end
187
+ end
188
+ end
189
+ end
190
+
191
+ # Returns the root where thor files are located, dependending on the OS.
192
+ #
193
+ def self.thor_root
194
+ File.join(user_home, ".thor").gsub(/\\/, '/')
195
+ end
196
+
197
+ # Returns the files in the thor root. On Windows thor_root will be something
198
+ # like this:
199
+ #
200
+ # C:\Documents and Settings\james\.thor
201
+ #
202
+ # If we don't #gsub the \ character, Dir.glob will fail.
203
+ #
204
+ def self.thor_root_glob
205
+ files = Dir["#{thor_root}/*"]
206
+
207
+ files.map! do |file|
208
+ File.directory?(file) ? File.join(file, "main.thor") : file
209
+ end
210
+ end
211
+
212
+ # Where to look for Thor files.
213
+ #
214
+ def self.globs_for(path)
215
+ ["#{path}/Thorfile", "#{path}/*.thor", "#{path}/tasks/*.thor", "#{path}/lib/tasks/*.thor"]
216
+ end
217
+
218
+ # Return the path to the ruby interpreter taking into account multiple
219
+ # installations and windows extensions.
220
+ #
221
+ def self.ruby_command
222
+ @ruby_command ||= begin
223
+ ruby = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
224
+ ruby << Config::CONFIG['EXEEXT']
225
+
226
+ # escape string in case path to ruby executable contain spaces.
227
+ ruby.sub!(/.*\s.*/m, '"\&"')
228
+ ruby
229
+ end
230
+ end
231
+
232
+ end
233
+ end
@@ -0,0 +1,3 @@
1
+ class Thor
2
+ VERSION = "0.12.3".freeze
3
+ end
@@ -1,3 +1,6 @@
1
+ require 'blather/client/client'
2
+ require 'blather/client/dsl'
3
+
1
4
  module DaemonKit
2
5
  # Thin wrapper around the blather DSL
3
6
  class XMPP
@@ -6,18 +9,24 @@ module DaemonKit
6
9
  class << self
7
10
 
8
11
  def run( &block )
9
- DaemonKit::EM.run
10
-
11
- xmpp = new
12
+ DaemonKit.trap('INT') { ::EM.stop }
13
+ DaemonKit.trap('TERM') { ::EM.stop }
12
14
 
13
- xmpp.instance_eval( &block )
15
+ DaemonKit::EM.run {
14
16
 
15
- xmpp.run
17
+ xmpp = new
18
+ xmpp.instance_eval( &block )
19
+ xmpp.run
20
+ }
16
21
  end
17
22
  end
18
23
 
19
24
  def initialize
20
- @config = DaemonKit::Config.load('jabber')
25
+ @config = DaemonKit::Config.load('xmpp')
26
+
27
+ if @config.enable_logging
28
+ Blather.logger = DaemonKit.logger
29
+ end
21
30
 
22
31
  jid = if @config.resource
23
32
  "#{@config.jabber_id}/#{@config.resource}"
@@ -26,6 +35,66 @@ module DaemonKit
26
35
  end
27
36
 
28
37
  setup jid, @config.password
38
+
39
+ when_ready do
40
+ configure_roster!
41
+ become_available
42
+ end
43
+
44
+ return if @config['require_master'] == false
45
+
46
+ message do |m|
47
+ trusted?( m ) ? pass : halt
48
+ end
49
+ end
50
+
51
+ def configure_roster!
52
+ DaemonKit.logger.debug 'Configuring roster'
53
+
54
+ my_roster.each do |(jid, item)|
55
+ unless contacts.include?( jid )
56
+ DaemonKit.logger.debug "Removing #{jid} from roster"
57
+
58
+ my_roster.delete( item.jid )
59
+ next
60
+ end
61
+ end
62
+
63
+ contacts.each do |jid|
64
+ DaemonKit.logger.debug "Adding #{jid} to roster"
65
+
66
+ my_roster.add( Blather::JID.new( jid ) )
67
+ end
68
+
69
+ my_roster.each do |(jid,item)|
70
+ item.subscription = :both
71
+ item.ask = :subscribe
72
+ end
73
+ end
74
+
75
+ def become_available
76
+ set_status( :chat, "#{DaemonKit.configuration.daemon_name} is available" )
77
+ end
78
+
79
+ def trusted?( message )
80
+ @config.masters.include?( message.from.stripped.to_s )
81
+ end
82
+
83
+ def contacts
84
+ @config.masters + @config.supporters
85
+ end
86
+
87
+ def run
88
+ client.run
89
+ end
90
+
91
+ def busy( message = nil, &block )
92
+ set_status( :dnd, message )
93
+
94
+ block.call
95
+
96
+ become_available
29
97
  end
98
+
30
99
  end
31
100
  end
@@ -0,0 +1,24 @@
1
+ module DaemonKit
2
+ module Generators
3
+ class AmqpGenerator < Base
4
+
5
+ def update_gemfile
6
+ append_file 'Gemfile', %q(gem 'amqp')
7
+ end
8
+
9
+ def create_config_files
10
+ directory 'config'
11
+ end
12
+
13
+ def create_daemon
14
+ directory 'libexec'
15
+ end
16
+
17
+ protected
18
+
19
+ def self.source_root
20
+ File.expand_path( File.join( File.dirname(__FILE__), 'templates') )
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,140 @@
1
+ module DaemonKit
2
+ module Generators
3
+ class AppGenerator < Base
4
+ INSTALLERS = %w( default amqp cron nanite_agent ruote xmpp )
5
+ DEPLOYERS = %w( capistrano )
6
+ TEST_FRAMEWORKS = %w( none rspec test_unit )
7
+ add_shebang_option!
8
+
9
+ argument :app_path, :type => :string
10
+
11
+ class_option :installer, :type => :string, :aliases => '-i', :default => 'default',
12
+ :desc => "Pre-configured daemon to generate (options: #{INSTALLERS.join(', ')})"
13
+
14
+ class_option :deployer, :type => :string, :aliases => '-d',
15
+ :desc => "Select an optional deployment mechanism (options: #{DEPLOYERS.join(', ')})"
16
+
17
+ class_option :test_framework, :type => :string, :aliases => '-t', :default => 'rspec',
18
+ :desc => "Select your prefered test framework (options: #{TEST_FRAMEWORKS.join(', ')})"
19
+
20
+ class_option :cucumber, :type => :boolean, :aliases => '-c', :default => false,
21
+ :desc => "Install cucumber support"
22
+
23
+ def initialize( *args )
24
+ super
25
+
26
+ unless INSTALLERS.include?( options[:installer] )
27
+ raise Error, "Invalid value for --installer option. Supported installers are: #{INSTALLERS.join(', ')}"
28
+ end
29
+
30
+ if options[:deployer] && !DEPLOYERS.include?( options[:deployer] )
31
+ raise Error, "Invalid value for --deployer option. Supported deployers are: #{DEPLOYERS.join(', ')}"
32
+ end
33
+
34
+ unless TEST_FRAMEWORKS.include?( options[:test_framework] )
35
+ raise Error, "Invalid value for --test_framework option. Supported frameworks are: #{TEST_FRAMEWORKS.join(', ')}"
36
+ end
37
+ end
38
+
39
+ def create_root
40
+ self.destination_root = File.expand_path( app_path, destination_root )
41
+ empty_directory('.')
42
+ FileUtils.cd( destination_root )
43
+ end
44
+
45
+ def create_root_files
46
+ copy_file 'README'
47
+ copy_file 'Rakefile'
48
+ copy_file 'Gemfile'
49
+ end
50
+
51
+ def create_bin_files
52
+ empty_directory 'bin'
53
+ template 'bin/daemon.tt', "bin/#{app_name}" do |content|
54
+ "#{shebang}\n" + content
55
+ end
56
+ chmod "bin", 0755, :verbose => false
57
+ end
58
+
59
+ def create_config_files
60
+ directory 'config'
61
+ end
62
+
63
+ def create_script_files
64
+ directory 'script' do |content|
65
+ "#{shebang}\n" + content
66
+ end
67
+ chmod 'script', 0755, :verbose => false
68
+ end
69
+
70
+ def create_task_directory
71
+ empty_directory 'tasks'
72
+ end
73
+
74
+ def create_log_directory
75
+ empty_directory 'log'
76
+ end
77
+
78
+ def create_tmp_directory
79
+ empty_directory 'tmp'
80
+ end
81
+
82
+ def create_vendor_directory
83
+ empty_directory 'vendor'
84
+ end
85
+
86
+ def create_lib_files
87
+ directory 'lib'
88
+ end
89
+
90
+ def create_lib_exec
91
+ case options[:installer]
92
+ when 'default'
93
+ directory 'libexec'
94
+ when 'amqp'
95
+ invoke DaemonKit::Generators::AmqpGenerator
96
+ when 'cron'
97
+ invoke DaemonKit::Generators::CronGenerator
98
+ when 'nanite_agent'
99
+ invoke DaemonKit::Generators::NaniteAgentGenerator
100
+ when 'ruote'
101
+ invoke DaemonKit::Generators::RuoteGenerator
102
+ when 'xmpp'
103
+ invoke DaemonKit::Generators::XmppGenerator
104
+ end
105
+ end
106
+
107
+ def create_deployment_config
108
+ return unless options[:deployer]
109
+
110
+ case options[:deployer]
111
+ when 'capistrano'
112
+ invoke DaemonKit::Generators::CapistranoGenerator
113
+ end
114
+ end
115
+
116
+ def create_test_environment
117
+ return if options[:test_framework] == 'none'
118
+
119
+ case options[:test_framework]
120
+ when 'rspec'
121
+ invoke DaemonKit::Generators::SpecGenerator
122
+ when 'test_unit'
123
+ invoke DaemonKit::Generators::TestUnitGenerator
124
+ end
125
+ end
126
+
127
+ def create_cucumber
128
+ return unless options.cucumber?
129
+ invoke DaemonKit::Generators::CucumberGenerator
130
+ end
131
+
132
+ protected
133
+
134
+ def self.source_root
135
+ File.expand_path( File.join( File.dirname(__FILE__), 'templates') )
136
+ end
137
+
138
+ end
139
+ end
140
+ end