daemon-kit 0.1.7.12 → 0.1.8pre

Sign up to get free protection for your applications and to get access to all the features.
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