julien51-babylon 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -11,7 +11,7 @@ begin
11
11
  gem.authors = ["julien Genestoux"]
12
12
  gem.requirements = ["eventmachine", "yaml", "fileutils", "log4r", "nokogiri"]
13
13
  gem.executables = "babylon"
14
- gem.files = ["bin/babylon", "lib/babylon.rb", "lib/babylon/base/controller.rb", "lib/babylon/base/view.rb", "lib/babylon/client_connection.rb", "lib/babylon/component_connection.rb", "lib/babylon/router/dsl.rb", "lib/babylon/router.rb", "lib/babylon/runner.rb", "lib/babylon/xmpp_connection.rb", "lib/babylon/xpath_helper.rb", "LICENSE", "Rakefile", "README.rdoc", "templates/babylon/app/controllers/README.rdoc", "templates/babylon/app/models/README.rdoc", "templates/babylon/app/views/README.rdoc", "templates/babylon/config/boot.rb", "templates/babylon/config/config.yaml", "templates/babylon/config/dependencies.rb", "templates/babylon/config/routes.rb", "templates/babylon/config/initializers/README.rdoc"]
14
+ gem.files = ["bin/babylon", "lib/babylon.rb", "lib/babylon/base/controller.rb", "lib/babylon/base/view.rb", "lib/babylon/client_connection.rb", "lib/babylon/component_connection.rb", "lib/babylon/router/dsl.rb", "lib/babylon/router.rb", "lib/babylon/runner.rb", "lib/babylon/xmpp_connection.rb", "lib/babylon/xmpp_parser.rb", "lib/babylon/xpath_helper.rb", "LICENSE", "Rakefile", "README.rdoc", "templates/babylon/app/controllers/README.rdoc", "templates/babylon/app/models/README.rdoc", "templates/babylon/app/views/README.rdoc", "templates/babylon/config/boot.rb", "templates/babylon/config/config.yaml", "templates/babylon/config/dependencies.rb", "templates/babylon/config/routes.rb", "templates/babylon/config/initializers/README.rdoc"]
15
15
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
16
  end
17
17
  rescue LoadError
@@ -34,11 +34,37 @@ Rake::TestTask.new(:test) do |test|
34
34
  test.verbose = false
35
35
  end
36
36
 
37
+ # begin
38
+ # require 'rcov/rcovtask'
39
+ # Rcov::RcovTask.new do |test|
40
+ # test.libs << 'test'
41
+ # test.pattern = 'test/**/*_test.rb'
42
+ # test.verbose = true
43
+ # end
44
+ # rescue LoadError
45
+ # task :rcov do
46
+ # abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
47
+ # end
48
+ # end
49
+
50
+ begin
51
+ require 'spec/rake/spectask'
52
+ desc "Run all Spec"
53
+ Spec::Rake::SpecTask.new('spec') do |spec|
54
+ spec.spec_files = FileList['spec/**/*.rb']
55
+ spec.verbose = true
56
+ end
57
+ rescue LoadError
58
+ task :rcov do
59
+ abort "Rspec is not available. In order to run rspec, you must: sudo gem install rspec"
60
+ end
61
+ end
62
+
37
63
  begin
38
64
  require 'rcov/rcovtask'
39
65
  Rcov::RcovTask.new do |test|
40
- test.libs << 'test'
41
- test.pattern = 'test/**/*_test.rb'
66
+ test.libs << 'spec'
67
+ test.pattern = 'spec/**/*_spec.rb'
42
68
  test.verbose = true
43
69
  end
44
70
  rescue LoadError
@@ -47,6 +73,7 @@ rescue LoadError
47
73
  end
48
74
  end
49
75
 
76
+
50
77
  task :install => :build
51
78
 
52
79
  task :default => :test
data/lib/babylon.rb CHANGED
@@ -8,6 +8,7 @@ require 'yaml'
8
8
  require 'fileutils'
9
9
 
10
10
  require 'babylon/xmpp_connection'
11
+ require 'babylon/xmpp_parser'
11
12
  require 'babylon/component_connection'
12
13
  require 'babylon/client_connection'
13
14
  require 'babylon/router'
@@ -35,11 +35,16 @@ module Babylon
35
35
  return if @rendered # Avoid double rendering
36
36
 
37
37
  if options.nil? # default rendering
38
- return render(:file => default_template_name)
38
+ render(:file => default_template_name)
39
39
  elsif options[:file]
40
- render_for_file(view_path(options[:file]))
40
+ file = options[:file]
41
+ if file.include?('/')
42
+ render_for_file("app/views/#{file}.xml.builder")
43
+ else
44
+ render_for_file(view_path(file))
45
+ end
41
46
  elsif action_name = options[:action]
42
- return render(:file => default_template_name(action_name.to_s))
47
+ render(:file => default_template_name(action_name.to_s))
43
48
  end
44
49
 
45
50
  # And finally, we set up rendered to be true
@@ -73,4 +78,4 @@ module Babylon
73
78
  end
74
79
  end
75
80
  end
76
- end
81
+ end
@@ -1,5 +1,5 @@
1
1
  module Babylon
2
-
2
+
3
3
  ##
4
4
  # ClientConnection is in charge of the XMPP connection for a Regular XMPP Client.
5
5
  # So far, SASL Plain authenticationonly is supported
@@ -8,7 +8,7 @@ module Babylon
8
8
  require 'digest/sha1'
9
9
  require 'base64'
10
10
  require 'resolv'
11
-
11
+
12
12
 
13
13
  attr_reader :binding_iq_id, :session_iq_id
14
14
 
@@ -18,13 +18,13 @@ module Babylon
18
18
  super(params)
19
19
  @state = :wait_for_stream
20
20
  end
21
-
21
+
22
22
  ##
23
23
  # Connects the ClientConnection based on SRV records for the jid's domain, if no host or port has been specified.
24
24
  # In any case, we give priority to the specified host and port.
25
25
  def self.connect(params, &block)
26
26
  return super(params, &block) if params["host"] && params["port"]
27
-
27
+
28
28
  begin
29
29
  begin
30
30
  srv = []
@@ -79,18 +79,18 @@ module Babylon
79
79
  case @state
80
80
  when :connected
81
81
  super # Can be dispatched
82
-
82
+
83
83
  when :wait_for_stream
84
84
  if stanza.name == "stream:stream" && stanza.attributes['id']
85
85
  @state = :wait_for_auth_mechanisms unless @success
86
86
  @state = :wait_for_bind if @success
87
87
  end
88
-
88
+
89
89
  when :wait_for_auth_mechanisms
90
90
  if stanza.name == "stream:features"
91
91
  if stanza.at("starttls") # we shall start tls
92
92
  starttls = Nokogiri::XML::Node.new("starttls", @outstream)
93
- starttls["xmlns"] = stanza.at("starttls").namespaces.first.last
93
+ starttls["xmlns"] = "urn:ietf:params:xml:ns:xmpp-tls"
94
94
  send(starttls)
95
95
  @state = :wait_for_proceed
96
96
  elsif stanza.at("mechanisms") # tls is ok
@@ -98,14 +98,14 @@ module Babylon
98
98
  # auth_text = "#{jid.strip}\x00#{jid.node}\x00#{password}"
99
99
  auth = Nokogiri::XML::Node.new("auth", @outstream)
100
100
  auth['mechanism'] = "PLAIN"
101
- auth['xmlns'] = stanza.at("mechanisms").namespaces.first.last
101
+ auth['xmlns'] = "urn:ietf:params:xml:ns:xmpp-sasl"
102
102
  auth.content = Base64::encode64([jid, jid.split("@").first, @password].join("\000")).gsub(/\s/, '')
103
103
  send(auth)
104
104
  @state = :wait_for_success
105
105
  end
106
106
  end
107
107
  end
108
-
108
+
109
109
  when :wait_for_success
110
110
  if stanza.name == "success" # Yay! Success
111
111
  @success = true
@@ -120,7 +120,7 @@ module Babylon
120
120
  else
121
121
  # Hum Failure...
122
122
  end
123
-
123
+
124
124
  when :wait_for_bind
125
125
  if stanza.name == "stream:features"
126
126
  if stanza.at("bind")
@@ -142,7 +142,7 @@ module Babylon
142
142
  @state = :wait_for_confirmed_binding
143
143
  end
144
144
  end
145
-
145
+
146
146
  when :wait_for_confirmed_binding
147
147
  if stanza.name == "iq" && stanza["type"] == "result" && Integer(stanza["id"]) == @binding_iq_id
148
148
  if stanza.at("jid")
@@ -159,7 +159,7 @@ module Babylon
159
159
  iq = @outstream.add_child(builder.doc.root)
160
160
  send(iq)
161
161
  @state = :wait_for_confirmed_session
162
-
162
+
163
163
  when :wait_for_confirmed_session
164
164
  if stanza.name == "iq" && stanza["type"] == "result" && Integer(stanza["id"]) == @session_iq_id && stanza.at("session")
165
165
  # And now, send a presence!
@@ -168,21 +168,23 @@ module Babylon
168
168
  @connection_callback.call(self) if @connection_callback
169
169
  @state = :connected
170
170
  end
171
-
171
+
172
172
  when :wait_for_proceed
173
173
  start_tls() # starting TLS
174
174
  @state = :wait_for_stream
175
175
  @parser.reset
176
176
  send @outstream.root.to_xml.split('<paste_content_here/>').first
177
177
  end
178
-
179
- end
180
-
181
- ##
182
- # Namespace of the client
183
- def stream_namespace
184
- "jabber:client"
178
+ rescue
179
+ Babylon.logger.error("#{$!}:\n#{$!.backtrace.join("\n")}")
185
180
  end
181
+ end
186
182
 
183
+ ##
184
+ # Namespace of the client
185
+ def stream_namespace
186
+ "jabber:client"
187
187
  end
188
+
189
+ end
188
190
  end
@@ -8,7 +8,6 @@ module Babylon
8
8
  # xml-not-well-formed Exception
9
9
  class XmlNotWellFormed < Exception; end
10
10
 
11
-
12
11
  ##
13
12
  # This class is in charge of handling the network connection to the XMPP server.
14
13
  class XmppConnection < EventMachine::Connection
@@ -113,111 +112,4 @@ module Babylon
113
112
  end
114
113
  end
115
114
 
116
- ##
117
- # This is the XML SAX Parser that accepts "pushed" content
118
- class XmppParser < Nokogiri::XML::SAX::Document
119
-
120
- attr_accessor :elem, :doc
121
-
122
- ##
123
- # Initialize the parser and adds the callback that will be called upon stanza completion
124
- def initialize(&callback)
125
- @callback = callback
126
- super()
127
- reset
128
- end
129
-
130
- ##
131
- # Resets the Pushed SAX Parser.
132
- def reset
133
- @parser = Nokogiri::XML::SAX::PushParser.new(self)
134
- @doc = Nokogiri::XML::Document.new
135
- @elem = nil
136
- end
137
-
138
- ##
139
- # Pushes the received data to the parser. The parser will then callback the document's methods (start_tag, end_tag... etc)
140
- def push(data)
141
- @parser << data
142
- end
143
-
144
- ##
145
- # Called when the document contains a CData block
146
- def cdata_block(string)
147
- cdata = Nokogiri::XML::CDATA.new(@doc, string)
148
- @elem.add_child(cdata)
149
- end
150
-
151
- ##
152
- # Called when the document received in the stream is started
153
- def start_document
154
- @doc = Nokogiri::XML::Document.new
155
- end
156
-
157
- ##
158
- # Adds characters to the current element (being parsed)
159
- def characters(string)
160
- @last_text_elem ||= @elem
161
- @last_text = @last_text ? @last_text + string : string
162
- end
163
-
164
- ##
165
- # Instantiate a new current Element, adds the corresponding attributes and namespaces
166
- # The new element is eventually added to a parent element (if present).
167
- # If this element is the first element (the root of the document), then instead of adding it to a parent, we add it to the document itself. In this case, the current element will not be terminated, so we activate the callback immediately.
168
- def start_element(qname, attributes = [])
169
- e = Nokogiri::XML::Element.new(qname, @doc)
170
- add_namespaces_and_attributes_to_node(attributes, e)
171
-
172
- # Adding the newly created element to the @elem that is being parsed, or, if no element is being parsed, then we set the @root and the @elem to be this newly created element.
173
- @elem = @elem ? @elem.add_child(e) : (@root = e)
174
-
175
- if @elem.name == "stream:stream"
176
- # Should be called only for stream:stream.
177
- # We re-initialize the document and set its root to be the doc.
178
- # Also, we activate the callback since this element will never end.
179
- @doc = Nokogiri::XML::Document.new
180
- @doc.root = @root = @elem
181
- @callback.call(@elem)
182
- end
183
- end
184
-
185
- ##
186
- # Terminates the current element and calls the callback
187
- def end_element(name)
188
- if @last_text_elem
189
- @elem.add_child(Nokogiri::XML::Text.new(@last_text, @doc))
190
- @last_text_elem = nil
191
- @last_text = nil
192
- end
193
- if @elem
194
- if @elem.parent == @root
195
- @callback.call(@elem)
196
- # And we also need to remove @elem from its tree
197
- @elem.unlink
198
- # And the current elem is the next sibling or the root
199
- @elem = @root
200
- else
201
- @elem = @elem.parent
202
- end
203
- end
204
- end
205
-
206
- private
207
-
208
- ##
209
- # Adds namespaces and attributes. Nokogiri passes them as a array of [name, value, name, value]...
210
- def add_namespaces_and_attributes_to_node(attrs, node)
211
- (attrs.size / 2).times do |i|
212
- name, value = attrs[2 * i], attrs[2 * i + 1]
213
- if name =~ /xmlns/
214
- node.add_namespace(name, value)
215
- else
216
- node.set_attribute name, value
217
- end
218
- end
219
- end
220
-
221
- end
222
-
223
115
  end
@@ -0,0 +1,104 @@
1
+ module Babylon
2
+
3
+ ##
4
+ # This is the XML SAX Parser that accepts "pushed" content
5
+ class XmppParser < Nokogiri::XML::SAX::Document
6
+
7
+ attr_accessor :elem, :doc, :parser, :top
8
+
9
+ ##
10
+ # Initialize the parser and adds the callback that will be called upon stanza completion
11
+ def initialize(&callback)
12
+ @callback = callback
13
+ super()
14
+ reset
15
+ end
16
+
17
+ ##
18
+ # Resets the Pushed SAX Parser.
19
+ def reset
20
+ @parser = Nokogiri::XML::SAX::PushParser.new(self)
21
+ start_document
22
+ @elem = nil
23
+ end
24
+
25
+ ##
26
+ # Pushes the received data to the parser. The parser will then callback the document's methods (start_tag, end_tag... etc)
27
+ def push(data)
28
+ @parser << data
29
+ end
30
+
31
+ ##
32
+ # Called when the document contains a CData block
33
+ def cdata_block(string)
34
+ @elem.add_child(Nokogiri::XML::CDATA.new(@doc, string))
35
+ end
36
+
37
+ ##
38
+ # Called when the document received in the stream is started
39
+ def start_document
40
+ @doc = Nokogiri::XML::Document.new
41
+ end
42
+
43
+ ##
44
+ # Adds characters to the current element (being parsed)
45
+ def characters(string)
46
+ @elem.add_child(Nokogiri::XML::Text.new(string, @doc)) if @elem
47
+ end
48
+
49
+ ##
50
+ # Instantiate a new current Element, adds the corresponding attributes and namespaces
51
+ # The new element is eventually added to a parent element (if present).
52
+ # If this element is the first element (the root of the document), then instead of adding it to a parent, we add it to the document itself. In this case, the current element will not be terminated, so we activate the callback immediately.
53
+ def start_element(qname, attributes = [])
54
+ e = Nokogiri::XML::Element.new(qname, @doc)
55
+ add_namespaces_and_attributes_to_node(attributes, e)
56
+
57
+ if e.name == "stream:stream"
58
+ # Should be called only for stream:stream.
59
+ # We re-initialize the document and set its root to be the newly created element.
60
+ start_document
61
+ @doc.root = e
62
+ # Also, we activate the callback since this element will never end.
63
+ @callback.call(e)
64
+ else
65
+ # Adding the newly created element to the @elem that is being parsed, or, if no element is being parsed, then we set the @top and the @elem to be this newly created element.
66
+ # Room is the "highest" element to (it's parent is the <stream> element)
67
+ @elem = @elem ? @elem.add_child(e) : (@top = e)
68
+ end
69
+ end
70
+
71
+ ##
72
+ # Terminates the current element and calls the callback
73
+ def end_element(name)
74
+ if @elem
75
+ if @elem == @top
76
+ @callback.call(@elem)
77
+ # And the current elem is the next sibling or the root
78
+ @elem = @top = nil
79
+ else
80
+ @elem = @elem.parent
81
+ end
82
+ else
83
+ # Not sure what to do since it seems we're not processing any element at this time, so how can one end?
84
+ end
85
+ end
86
+
87
+ private
88
+
89
+ ##
90
+ # Adds namespaces and attributes. Nokogiri passes them as a array of [name, value, name, value]...
91
+ def add_namespaces_and_attributes_to_node(attrs, node)
92
+ (attrs.size / 2).times do |i|
93
+ name, value = attrs[2 * i], attrs[2 * i + 1]
94
+ if name =~ /xmlns/
95
+ node.add_namespace(name, value)
96
+ else
97
+ node.set_attribute name, value
98
+ end
99
+ end
100
+ end
101
+
102
+ end
103
+
104
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: julien51-babylon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - julien Genestoux
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-22 00:00:00 -07:00
12
+ date: 2009-03-23 00:00:00 -07:00
13
13
  default_executable: babylon
14
14
  dependencies: []
15
15
 
@@ -33,6 +33,7 @@ files:
33
33
  - lib/babylon/router.rb
34
34
  - lib/babylon/runner.rb
35
35
  - lib/babylon/xmpp_connection.rb
36
+ - lib/babylon/xmpp_parser.rb
36
37
  - lib/babylon/xpath_helper.rb
37
38
  - LICENSE
38
39
  - Rakefile