em-imap 0.1 → 0.1.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.

Potentially problematic release.


This version of em-imap might be problematic. Click here for more details.

@@ -20,7 +20,7 @@ module EventMachine
20
20
  # first response was BYE.
21
21
  #
22
22
  def self.connect(host, port, ssl=false)
23
- conn = EventMachine.connect(host, port, self).tap do |conn|
23
+ EventMachine.connect(host, port, self).tap do |conn|
24
24
  conn.start_tls if ssl
25
25
  end
26
26
  end
@@ -97,12 +97,17 @@ module EventMachine
97
97
  end
98
98
 
99
99
  # Called when the connection is closed.
100
- # If there are any listeners left, we fail them.
101
- # (TODO: Should we actually succeed them if the connection was
102
- # explicitly closed by us?)
103
100
  # TODO: Figure out how to send a useful error...
104
101
  def unbind
105
- @listeners.each{ |listener| listener.fail EOFError.new("Connection to IMAP server was unbound") }
102
+ fail_all EOFError.new("Connection to IMAP server was unbound"), true
103
+ end
104
+
105
+ def fail_all(error, closed=false)
106
+ # NOTE: Take a shallow clone of the listeners here so that we get guaranteed
107
+ # behaviour. We want to fail any listeners that may be added by the errbacks
108
+ # of other listeners.
109
+ @listeners.clone.each{ |listener| listener.fail error } while @listeners.size > 0
110
+ close_connection unless closed
106
111
  end
107
112
 
108
113
  def add_to_listener_pool(listener)
@@ -113,7 +118,9 @@ module EventMachine
113
118
  # EM::IMAP::ResponseParser. Each response is a Net::IMAP response
114
119
  # object. (FIXME)
115
120
  def receive_response(response)
116
- @listeners.each{ |listener| listener.receive_event response }
121
+ # NOTE: Take a shallow clone of the listeners so that if receiving an
122
+ # event causes a new listener to be added, it won't receive this response!
123
+ @listeners.clone.each{ |listener| listener.receive_event response }
117
124
  end
118
125
 
119
126
  # Await the response that marks the completion of this command,
@@ -59,8 +59,12 @@ module EventMachine
59
59
  # continuation responses onto the currently awaiting block.
60
60
  def listen_for_continuation
61
61
  add_response_handler do |response|
62
- if awaiting_continuation? && response.is_a?(Net::IMAP::ContinuationRequest)
63
- @awaiting_continuation.receive_event response
62
+ if response.is_a?(Net::IMAP::ContinuationRequest)
63
+ if awaiting_continuation?
64
+ @awaiting_continuation.receive_event response
65
+ else
66
+ fail_all Net::IMAP::ResponseError.new("Unexpected continuation response from server")
67
+ end
64
68
  end
65
69
  end
66
70
  end
@@ -92,12 +92,15 @@ module EventMachine
92
92
  # Register a block to be called when receive_event is called.
93
93
  def listen(&block)
94
94
  listeners << block
95
+ stopback{ |*args| listeners.delete block }
95
96
  self
96
97
  end
97
98
 
98
99
  # Pass arguments onto any blocks registered with listen.
99
100
  def receive_event(*args, &block)
100
- listeners.each{ |l| l.call *args, &block }
101
+ # NOTE: Take a clone of listeners, so any listeners added by listen
102
+ # blocks won't receive these events.
103
+ listeners.clone.each{ |l| l.call *args, &block }
101
104
  end
102
105
 
103
106
  # Register a block to be called when the ListeningDeferrable is stopped.
@@ -39,10 +39,15 @@ module EventMachine
39
39
  # Callback used by receive data.
40
40
  def receive_response(response); end
41
41
 
42
+ # Callback used if something goes wrong.
43
+ def fail_all(error); end
44
+
42
45
  private
43
46
 
44
47
  def parse(line)
45
48
  @parser.parse(line)
49
+ rescue Net::IMAP::ResponseParseError => e
50
+ fail_all e
46
51
  end
47
52
  end
48
53
  end
metadata CHANGED
@@ -1,11 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-imap
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 25
5
+ prerelease:
5
6
  segments:
6
7
  - 0
7
8
  - 1
8
- version: "0.1"
9
+ - 1
10
+ version: 0.1.1
9
11
  platform: ruby
10
12
  authors:
11
13
  - Conrad Irwin
@@ -13,16 +15,18 @@ autorequire:
13
15
  bindir: bin
14
16
  cert_chain: []
15
17
 
16
- date: 2011-05-02 00:00:00 -07:00
18
+ date: 2011-07-02 00:00:00 -07:00
17
19
  default_executable:
18
20
  dependencies:
19
21
  - !ruby/object:Gem::Dependency
20
22
  name: eventmachine
21
23
  prerelease: false
22
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
29
+ hash: 3
26
30
  segments:
27
31
  - 0
28
32
  version: "0"
@@ -32,9 +36,11 @@ dependencies:
32
36
  name: deferrable_gratification
33
37
  prerelease: false
34
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
35
40
  requirements:
36
41
  - - ">="
37
42
  - !ruby/object:Gem::Version
43
+ hash: 3
38
44
  segments:
39
45
  - 0
40
46
  version: "0"
@@ -44,9 +50,11 @@ dependencies:
44
50
  name: rspec
45
51
  prerelease: false
46
52
  requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
47
54
  requirements:
48
55
  - - ">="
49
56
  - !ruby/object:Gem::Version
57
+ hash: 3
50
58
  segments:
51
59
  - 0
52
60
  version: "0"
@@ -64,12 +72,12 @@ extra_rdoc_files: []
64
72
  files:
65
73
  - lib/em-imap.rb
66
74
  - lib/em-imap/listener.rb
67
- - lib/em-imap/client.rb
68
- - lib/em-imap/continuation_synchronisation.rb
69
- - lib/em-imap/response_parser.rb
70
- - lib/em-imap/connection.rb
71
75
  - lib/em-imap/command_sender.rb
72
76
  - lib/em-imap/authenticators.rb
77
+ - lib/em-imap/connection.rb
78
+ - lib/em-imap/continuation_synchronisation.rb
79
+ - lib/em-imap/client.rb
80
+ - lib/em-imap/response_parser.rb
73
81
  - LICENSE.MIT
74
82
  - README.md
75
83
  has_rdoc: true
@@ -82,25 +90,29 @@ rdoc_options: []
82
90
  require_paths:
83
91
  - lib
84
92
  required_ruby_version: !ruby/object:Gem::Requirement
93
+ none: false
85
94
  requirements:
86
95
  - - ">="
87
96
  - !ruby/object:Gem::Version
97
+ hash: 57
88
98
  segments:
89
99
  - 1
90
100
  - 8
91
101
  - 7
92
102
  version: 1.8.7
93
103
  required_rubygems_version: !ruby/object:Gem::Requirement
104
+ none: false
94
105
  requirements:
95
106
  - - ">="
96
107
  - !ruby/object:Gem::Version
108
+ hash: 3
97
109
  segments:
98
110
  - 0
99
111
  version: "0"
100
112
  requirements: []
101
113
 
102
114
  rubyforge_project:
103
- rubygems_version: 1.3.6
115
+ rubygems_version: 1.6.2
104
116
  signing_key:
105
117
  specification_version: 3
106
118
  summary: An EventMachine based IMAP client.