em-whois 0.1.1 → 0.2.0

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 (6) hide show
  1. data/Gemfile +1 -0
  2. data/Gemfile.lock +3 -1
  3. data/README.md +14 -5
  4. data/VERSION.yml +2 -2
  5. data/lib/em-whois.rb +33 -28
  6. metadata +6 -17
data/Gemfile CHANGED
@@ -4,5 +4,6 @@ gem 'em-synchrony'
4
4
  gem 'whois', '= 2.5.0' # Locked to specific version as internals of whois gem are overridden
5
5
 
6
6
  group :development do
7
+ gem 'rake'
7
8
  gem 'rspec'
8
9
  end
@@ -5,12 +5,13 @@ GEM
5
5
  em-synchrony (1.0.0)
6
6
  eventmachine (>= 1.0.0.beta.1)
7
7
  eventmachine (1.0.0.beta.4)
8
+ rake (0.9.2.2)
8
9
  rspec (2.9.0)
9
10
  rspec-core (~> 2.9.0)
10
11
  rspec-expectations (~> 2.9.0)
11
12
  rspec-mocks (~> 2.9.0)
12
13
  rspec-core (2.9.0)
13
- rspec-expectations (2.9.0)
14
+ rspec-expectations (2.9.1)
14
15
  diff-lcs (~> 1.1.3)
15
16
  rspec-mocks (2.9.0)
16
17
  whois (2.5.0)
@@ -20,5 +21,6 @@ PLATFORMS
20
21
 
21
22
  DEPENDENCIES
22
23
  em-synchrony
24
+ rake
23
25
  rspec
24
26
  whois (= 2.5.0)
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # em-whois
1
+ # em-whois [![Build Status](https://secure.travis-ci.org/mikejarema/em-whois.png)](http://travis-ci.org/mikejarema/em-whois)
2
2
 
3
3
  This is a container for the synchronous WHOIS gem which replaces socket communications
4
4
  with the EventMachine equivalent. The result is a gem permitting asynchronous WHOIS
@@ -8,14 +8,21 @@ lookups.
8
8
  inside the reactor, and fallback to original sockets outside the reactor context.
9
9
 
10
10
 
11
+ ## Supported Ruby Versions
12
+
13
+ Tested and used in production with MRI 1.9+.
14
+
15
+ `em-whois` relies on Ruby Fibers and `em-synchrony`, imposing a 1.9+ requirement.
16
+
17
+
11
18
  ## Examples
12
19
 
13
- Simple example to grab whois info within the EventMachine loop:
20
+ Simple example to check domain availability via WHOIS within the EventMachine loop:
14
21
 
15
22
  ```ruby
23
+ require 'em-whois'
24
+
16
25
  EM.synchrony do
17
-
18
- # Async domain availability lookup via WHOIS info
19
26
  whois = Whois.whois(ARGV[0] || "github.com")
20
27
  puts whois.properties[:available?] ? "Domain Available" : "Domain Taken"
21
28
 
@@ -23,10 +30,12 @@ EM.synchrony do
23
30
  end
24
31
  ```
25
32
 
33
+ Also take a look at `examples/async_whois.rb`.
34
+
26
35
 
27
36
  ## TODO
28
37
 
29
- * More elegant approach to reading from the EM::Synchrony::TcpSocket in Whois::Server::Adapters::Base#ask_the_socket
38
+ * Support for ruby 1.8 (remove em-synchrony/Fiber requirement)
30
39
 
31
40
 
32
41
  ## License & Notes
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 1
2
+ :patch: 0
3
3
  :major: 0
4
- :minor: 1
4
+ :minor: 2
@@ -4,15 +4,17 @@ require 'em-synchrony'
4
4
  module Whois
5
5
  class Server
6
6
  module Adapters
7
+
7
8
  class Base
9
+
8
10
  private
9
11
 
10
- # This method handles the lowest connection
11
- # to the WHOIS server.
12
12
  #
13
- # This is for internal use only!
13
+ # Overwrite Whois::Server::Adapters::Base#ask_the_socket to
14
+ # be EventMachine-aware, and send calls offs asynchronously
15
+ # if the EM reactor is running, otherwise fallback to the
16
+ # synchronous connection.
14
17
  #
15
- # @api internal
16
18
 
17
19
  alias :orig_ask_the_socket :ask_the_socket
18
20
 
@@ -21,32 +23,35 @@ module Whois
21
23
  end # ask_the_socket
22
24
 
23
25
  def em_ask_the_socket(query, *args)
24
- client = EventMachine::Synchrony::TCPSocket.new(*args)
25
- client.write("#{query}\r\n") # I could use put(foo) and forget the \n
26
- # but write/read is more symmetric than puts/read
27
- # and I really want to use read instead of gets.
28
-
29
- response = ""
30
-
31
- # Synchrony TCPSocket behaves a little differently, seems to require
32
- # polling until an IO exception is thrown.
33
- # TODO: There's gotta be a more elegant way to achieve this.
34
- while true do
35
- begin
36
- response += client.read
37
- rescue IOError => e
38
- break
39
- end
40
- end
41
-
42
- response
43
-
44
- ensure
45
- client.close if client # If != client something went wrong.
46
-
26
+ fiber = Fiber.current
27
+ EM::connect args[0], args[1], AsyncClient, query, fiber
28
+ Fiber.yield
47
29
  end # em_ask_the_socket
48
30
 
49
- end
31
+ end # Base
32
+
33
+ class AsyncClient < EventMachine::Connection
34
+
35
+ def initialize *args
36
+ @query, @fiber = args[0..1]
37
+ @data = ""
38
+ super
39
+ end
40
+
41
+ def post_init
42
+ send_data "#{@query}\r\n"
43
+ end
44
+
45
+ def receive_data(data)
46
+ @data << data
47
+ end
48
+
49
+ def unbind
50
+ @fiber.resume @data
51
+ end
52
+
53
+ end # AsyncClient
54
+
50
55
  end
51
56
  end
52
57
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-whois
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,8 +12,8 @@ cert_chain: []
12
12
  date: 2012-04-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: eventmachine
16
- requirement: &70096718694400 !ruby/object:Gem::Requirement
15
+ name: em-synchrony
16
+ requirement: &70340966931840 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70096718694400
24
+ version_requirements: *70340966931840
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: whois
27
- requirement: &70096718692400 !ruby/object:Gem::Requirement
27
+ requirement: &70340966931120 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - =
@@ -32,18 +32,7 @@ dependencies:
32
32
  version: 2.5.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70096718692400
36
- - !ruby/object:Gem::Dependency
37
- name: em-synchrony
38
- requirement: &70096718675440 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
- version: '0'
44
- type: :runtime
45
- prerelease: false
46
- version_requirements: *70096718675440
35
+ version_requirements: *70340966931120
47
36
  description: Wrapper around whois gem providing asynchronous WHOIS queries via EventMachine
48
37
  email: mike@jarema.com
49
38
  executables: []