Skip to content

Commit

Permalink
Initial import
Browse files Browse the repository at this point in the history
  • Loading branch information
betamatt committed May 5, 2011
0 parents commit bb5c0da
Show file tree
Hide file tree
Showing 8 changed files with 146 additions and 0 deletions.
1 change: 1 addition & 0 deletions .rvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
rvm 1.9.2
5 changes: 5 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
source :rubygems

gem 'eventmachine'
gem 'em-http-request'
gem 'json'
19 changes: 19 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
GEM
remote: http://rubygems.org/
specs:
addressable (2.2.5)
em-http-request (0.3.0)
addressable (>= 2.0.0)
escape_utils
eventmachine (>= 0.12.9)
escape_utils (0.2.3)
eventmachine (0.12.10)
json (1.5.1)

PLATFORMS
ruby

DEPENDENCIES
em-http-request
eventmachine
json
4 changes: 4 additions & 0 deletions README
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Evented IO orchestrated with Fibers
===================================

ruby test.rb
50 changes: 50 additions & 0 deletions lib/fiber_pool.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
require 'fiber'

class FiberPool
def initialize(max)
@max = max
@fibers = []
@queue = []

max.times do
fiber = Fiber.new do |value, block|
loop do
block.call(value)

if @queue.empty?
@fibers << Fiber.current

break if @done
block = Fiber.yield
else
value, block = @queue.shift
end
end

teardown
end

@fibers << fiber
end
end

def finish(parent)
@done = true
@parent = parent
end

def enqueue(value, &block)
if @fibers.empty?
@queue << [value, block]
else
fiber = @fibers.shift
fiber.resume([value, block])
end
end

private

def teardown
@parent.resume if @fibers.size == @max
end
end
26 changes: 26 additions & 0 deletions lib/github_search.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
require 'em-http-request'
require 'json'

class GithubSearch
def initialize(term)
@term = term
end

def first
result['repositories'].first
end

def url
"https://github.com/api/v2/json/repos/search/#{URI.encode(@term)}"
end

def result
fiber = Fiber.current

http = EventMachine::HttpRequest.new(url).get
http.callback { fiber.resume(http) }
Fiber.yield

JSON.parse(http.response)
end
end
11 changes: 11 additions & 0 deletions phrases.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
python
lua
ruby
perl
java
php
tcl
groovy
erlang
awk
vbscript
30 changes: 30 additions & 0 deletions test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
require 'rubygems'
require 'bundler'
Bundler.setup
$: << 'lib'

require 'eventmachine'
require 'fiber_pool'
require 'github_search'

pool = FiberPool.new(3)

# Read phrases from a file, printing the first github repo matching each
EM.run do
File.open('phrases.txt') do |f|
while (line = f.gets)
line = line.strip
pool.enqueue(line) do |line|
repo = GithubSearch.new(line).first
puts "#{line}: #{repo['name']}"
end
end
end

# Need a notification when all of the items on the queue are done processing
Fiber.new do
pool.finish(Fiber.current)
Fiber.yield # wait for callback
EM.stop
end.resume
end

0 comments on commit bb5c0da

Please sign in to comment.