fraggle-synchrony 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.autotest ADDED
@@ -0,0 +1,2 @@
1
+ require 'autotest/bundler'
2
+ require 'autotest/growl'
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ .rvmrc
4
+ Gemfile.lock
5
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format nested
2
+ --color
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in fraggle-synchrony/.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ ### Fraggle-synchrony
2
+
3
+ This is a Fiber-aware wrapper for the Fraggle EM library, which provides
4
+ an evented Ruby interface to [Doozer](https://github.com/ha/doozerd).
5
+
6
+ **NOTE:** This only runs on Ruby 1.9.2 due to the underlying use of Fibers.
7
+
8
+ Fraggle code can often become a bit of a spaghetti mess due to the
9
+ reliance on callbacks - wrapping with Synchrony allows you to replace:
10
+
11
+ Fraggle.connect do |client|
12
+ client.rev do |rev|
13
+ client.get rev, "/path/to/thing"
14
+ end
15
+ end
16
+
17
+ with
18
+
19
+ client = Fraggle.connect
20
+ rev = client.rev
21
+ client.get rev, "/path/to/thing"
22
+
23
+ The full list of supported commands is: rev, set, get, del, stat
24
+
25
+ wait is not supported - just use the standard aynch callback mechanism
26
+ provided by Fraggle (a pseudo-blocking wait command makes no sense).
27
+
28
+ All using Fibers ensuring the code is still fully asynchronous. Pretty
29
+ awesome huh? (bear in mind 99% of the awesomeness is clearly due to Ilya
30
+ Grigorik and his wonderful [em-synchrony](https://github.com/igrigorik/em-synchrony), not me :)
31
+
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ Bundler.require(:default, :test)
4
+
5
+ require 'rspec/core/rake_task'
6
+
7
+ RSpec::Core::RakeTask.new do |t|
8
+ t.pattern = "**/*_spec.rb"
9
+ t.rspec_opts = ["--format", "documentation", "--colour"]
10
+ end
11
+
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "fraggle-synchrony/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "fraggle-synchrony"
7
+ s.version = Fraggle::Synchrony::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Steven Mohapi-Banks"]
10
+ s.email = ["steven.mohapibanks@gmail.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{An em-synchrony wrapper for fraggle}
13
+ s.description = s.summary
14
+
15
+ s.rubyforge_project = "fraggle-synchrony"
16
+
17
+ s.add_dependency "fraggle"
18
+ s.add_dependency "em-synchrony"
19
+
20
+ s.add_development_dependency "rake", ">= 0.8.7"
21
+ s.add_development_dependency "rspec", ">= 2.0"
22
+
23
+ s.files = `git ls-files`.split("\n")
24
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
26
+ s.require_paths = ["lib"]
27
+ end
@@ -0,0 +1,10 @@
1
+ require 'em-synchrony'
2
+ begin
3
+ require 'fraggle'
4
+ rescue LoadError => error
5
+ raise 'Missing fraggle-synchrony dependency: gem install fraggle'
6
+ end
7
+
8
+ require 'fraggle-synchrony/fraggle'
9
+ require 'fraggle-synchrony/fraggle/client'
10
+
@@ -0,0 +1,19 @@
1
+ module Fraggle
2
+
3
+ class << self
4
+ alias :aconnect :connect
5
+ end
6
+
7
+ def self.connect(uri = nil)
8
+ f = Fiber.current
9
+
10
+ cb = proc { |client, err|
11
+ f.resume client || err
12
+ }
13
+ self.aconnect(uri, &cb)
14
+
15
+ response = Fiber.yield
16
+ raise response if response.is_a?(StandardError)
17
+ response
18
+ end
19
+ end
@@ -0,0 +1,23 @@
1
+ module Fraggle
2
+ class Client
3
+
4
+ %w{rev set get del stat}.each do |cmd|
5
+ class_eval <<-CODE
6
+ alias :a#{cmd} :#{cmd}
7
+
8
+ def #{cmd}(*args)
9
+ f = Fiber.current
10
+ cb = proc { |e, err|
11
+ f.resume e || err
12
+ }
13
+ a#{cmd}(*args, &cb)
14
+
15
+ response = Fiber.yield
16
+ raise response if response.is_a?(StandardError)
17
+ response
18
+ end
19
+ CODE
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,5 @@
1
+ module Fraggle
2
+ module Synchrony
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,104 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fraggle::Client do
4
+
5
+ it "should retrieve rev" do
6
+ EM.synchrony {
7
+ initialize_server(DoozerConnection)
8
+ client = Fraggle.connect("doozer:?ca=127.0.0.1:9876")
9
+ response = client.rev
10
+ response.should == 2
11
+ EM.stop
12
+ }
13
+ end
14
+
15
+ it "should trap an error from rev" do
16
+ EM.synchrony {
17
+ initialize_server(BadDoozerConnection)
18
+ client = Fraggle.connect("doozer:?ca=127.0.0.1:9876")
19
+ expect {
20
+ client.rev
21
+ }.to raise_error(Fraggle::Connection::ResponseError)
22
+ EM.stop
23
+ }
24
+ end
25
+
26
+ it "should set a value" do
27
+ EM.synchrony {
28
+ initialize_server(DoozerConnection)
29
+ client = Fraggle.connect("doozer:?ca=127.0.0.1:9876")
30
+ response = client.set(3, "/path", "value")
31
+ response.rev.should == 4
32
+ EM.stop
33
+ }
34
+ end
35
+
36
+ it "should trap an error from set" do
37
+ EM.synchrony {
38
+ initialize_server(BadDoozerConnection)
39
+ client = Fraggle.connect("doozer:?ca=127.0.0.1:9876")
40
+ expect {
41
+ client.set(3, "/path", "value")
42
+ }.to raise_error(Fraggle::Connection::ResponseError)
43
+ EM.stop
44
+ }
45
+ end
46
+
47
+ it "should get a value" do
48
+ EM.synchrony {
49
+ initialize_server(DoozerConnection)
50
+ client = Fraggle.connect("doozer:?ca=127.0.0.1:9876")
51
+ response = client.get(5, "/path")
52
+ response.rev.should == 6
53
+ response.value.should == "VALUE"
54
+ EM.stop
55
+ }
56
+ end
57
+
58
+ it "should trap an error from get" do
59
+ EM.synchrony {
60
+ initialize_server(BadDoozerConnection)
61
+ client = Fraggle.connect("doozer:?ca=127.0.0.1:9876")
62
+ expect {
63
+ client.get(2, "/path")
64
+ }.to raise_error(Fraggle::Connection::ResponseError)
65
+ EM.stop
66
+ }
67
+ end
68
+
69
+ it "should del a value" do
70
+ EM.synchrony {
71
+ initialize_server(DoozerConnection)
72
+ client = Fraggle.connect("doozer:?ca=127.0.0.1:9876")
73
+ response = client.del(7, "/path")
74
+ response.rev.should == 8
75
+ EM.stop
76
+ }
77
+ end
78
+
79
+ it "should trap an error from del" do
80
+ EM.synchrony {
81
+ initialize_server(BadDoozerConnection)
82
+ client = Fraggle.connect("doozer:?ca=127.0.0.1:9876")
83
+ expect {
84
+ client.del(7, "/path")
85
+ }.to raise_error(Fraggle::Connection::ResponseError)
86
+ EM.stop
87
+ }
88
+ end
89
+
90
+ it "should returns stat" do
91
+ EM.synchrony {
92
+ initialize_server(DoozerConnection)
93
+ client = Fraggle.connect("doozer:?ca=127.0.0.1:9876")
94
+ response = client.stat(9, "/path")
95
+ response.rev.should == 10
96
+ response.value.should == "STAT"
97
+ EM.stop
98
+ }
99
+ end
100
+
101
+ def initialize_server(connection_class)
102
+ EM::start_server "127.0.0.1", 9876, connection_class
103
+ end
104
+ end
@@ -0,0 +1,81 @@
1
+ $:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
3
+ require 'fraggle-synchrony'
4
+ require 'eventmachine'
5
+
6
+ class DoozerConnection < EM::Connection
7
+ def receive_data(data)
8
+ request = Fraggle::Request.decode(data)
9
+ response = Fraggle::Response.new
10
+ response.tag = request.tag
11
+ __send__ :"__#{verb_to_s(request.verb)}__", request, response
12
+ end
13
+ def __ACCESS__(request, response)
14
+ send_response(response)
15
+ end
16
+ def __REV__(request, response)
17
+ response.rev = 2
18
+ send_response(response)
19
+ end
20
+ def __SET__(request, response)
21
+ response.rev = 4
22
+ send_response(response)
23
+ end
24
+ def __GET__(request, response)
25
+ response.rev = 6
26
+ response.value = "VALUE"
27
+ send_response(response)
28
+ end
29
+ def __DEL__(request, response)
30
+ response.rev = 8
31
+ send_response(response)
32
+ end
33
+ def __STAT__(request, response)
34
+ response.rev = 10
35
+ response.value = "STAT"
36
+ send_response(response)
37
+ end
38
+ def send_response(response)
39
+ data = response.encode
40
+ head = [data.length].pack("N")
41
+ send_data("#{head}#{data}")
42
+ end
43
+ def verb_to_s(verb)
44
+ {
45
+ 1 => "GET",
46
+ 2 => "SET",
47
+ 3 => "DEL",
48
+ 5 => "REV",
49
+ 6 => "WAIT",
50
+ 7 => "NOP",
51
+ 9 => "WALK",
52
+ 14 => "GETDIR",
53
+ 16 => "STAT",
54
+ 99 => "ACCESS"
55
+ }[verb]
56
+ end
57
+ end
58
+
59
+ class BadDoozerConnection < DoozerConnection
60
+ def __REV__(request, response)
61
+ response.rev = 2
62
+ response.err_code = Fraggle::Response::Err::OTHER
63
+ send_response(response)
64
+ end
65
+ def __SET__(request, response)
66
+ response.rev = 4
67
+ response.err_code = Fraggle::Response::Err::OTHER
68
+ send_response(response)
69
+ end
70
+ def __GET__(request, response)
71
+ response.rev = 6
72
+ response.err_code = Fraggle::Response::Err::OTHER
73
+ send_response(response)
74
+ end
75
+ def __DEL__(request, response)
76
+ response.rev = 8
77
+ response.err_code = Fraggle::Response::Err::OTHER
78
+ send_response(response)
79
+ end
80
+ end
81
+
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fraggle-synchrony
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Steven Mohapi-Banks
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-07-12 00:00:00.000000000 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: fraggle
17
+ requirement: &2153512440 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *2153512440
26
+ - !ruby/object:Gem::Dependency
27
+ name: em-synchrony
28
+ requirement: &2153512020 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *2153512020
37
+ - !ruby/object:Gem::Dependency
38
+ name: rake
39
+ requirement: &2153511520 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: 0.8.7
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *2153511520
48
+ - !ruby/object:Gem::Dependency
49
+ name: rspec
50
+ requirement: &2153511020 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '2.0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *2153511020
59
+ description: An em-synchrony wrapper for fraggle
60
+ email:
61
+ - steven.mohapibanks@gmail.com
62
+ executables: []
63
+ extensions: []
64
+ extra_rdoc_files: []
65
+ files:
66
+ - .autotest
67
+ - .gitignore
68
+ - .rspec
69
+ - Gemfile
70
+ - README.md
71
+ - Rakefile
72
+ - fraggle-synchrony.gemspec
73
+ - lib/fraggle-synchrony.rb
74
+ - lib/fraggle-synchrony/fraggle.rb
75
+ - lib/fraggle-synchrony/fraggle/client.rb
76
+ - lib/fraggle-synchrony/version.rb
77
+ - spec/fraggle-synchrony/fraggle/client_spec.rb
78
+ - spec/spec_helper.rb
79
+ has_rdoc: true
80
+ homepage: ''
81
+ licenses: []
82
+ post_install_message:
83
+ rdoc_options: []
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ! '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements: []
99
+ rubyforge_project: fraggle-synchrony
100
+ rubygems_version: 1.6.2
101
+ signing_key:
102
+ specification_version: 3
103
+ summary: An em-synchrony wrapper for fraggle
104
+ test_files:
105
+ - spec/fraggle-synchrony/fraggle/client_spec.rb
106
+ - spec/spec_helper.rb