minitest-em-sync 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source "http://rubygems.org"
2
+
3
+ group :test do
4
+ gem "minitest"
5
+ gem "minitest-reporters"
6
+ gem "debugger"
7
+ end
8
+
9
+ gemspec
@@ -0,0 +1,39 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ minitest-em-sync (0.1.0)
5
+ eventmachine (>= 0.12)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ ansi (1.4.3)
11
+ builder (3.1.4)
12
+ columnize (0.3.6)
13
+ debugger (1.2.2)
14
+ columnize (>= 0.3.1)
15
+ debugger-linecache (~> 1.1.1)
16
+ debugger-ruby_core_source (~> 1.1.5)
17
+ debugger-linecache (1.1.2)
18
+ debugger-ruby_core_source (>= 1.1.1)
19
+ debugger-ruby_core_source (1.1.5)
20
+ eventmachine (1.0.0)
21
+ hashie (1.2.0)
22
+ minitest (4.1.0)
23
+ minitest-reporters (0.12.0)
24
+ ansi
25
+ builder
26
+ minitest (>= 2.12, < 5.0)
27
+ powerbar
28
+ powerbar (1.0.11)
29
+ ansi (~> 1.4.0)
30
+ hashie (>= 1.1.0)
31
+
32
+ PLATFORMS
33
+ ruby
34
+
35
+ DEPENDENCIES
36
+ debugger
37
+ minitest
38
+ minitest-em-sync!
39
+ minitest-reporters
@@ -0,0 +1,63 @@
1
+ minitest-em-sync
2
+ ================
3
+
4
+ A little helper for make tests of EM code are more readable.
5
+
6
+ So
7
+
8
+ ```ruby
9
+ it "should perform successful GET" do
10
+ EventMachine.run {
11
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8090/').get
12
+ http.errback { failed(http) }
13
+ http.callback {
14
+ http.response_header.status.must_equal 200
15
+ http.response.must_match /Hello/
16
+ EventMachine.stop
17
+ }
18
+ }
19
+ end
20
+ ```
21
+
22
+ can be written as
23
+
24
+ ```ruby
25
+ it "should perform successful GET" do
26
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8090/').get
27
+ sync http
28
+ http.response_header.status.must_equal 200
29
+ http.response.must_match /Hello/
30
+ end
31
+ ```
32
+
33
+ Usage
34
+ -----
35
+
36
+ ```ruby
37
+ gem "minitest-em-sync"
38
+ ```
39
+
40
+ Just include Minitest::EMSync to your tests/specs:
41
+
42
+ ```ruby
43
+ require 'minites/em_sync'
44
+ describe Minitest::EMSync do
45
+ include Minitest::EMSync
46
+
47
+ it "should start EM and wait result from deferrable" do
48
+ d = EM::DefaultDeferrable.new
49
+ EM.next_tick { d.succeed :foo }
50
+ sync(d).must_equal :foo
51
+ end
52
+ end
53
+ ```
54
+
55
+ It raise exceptions passed to callbacks:
56
+
57
+ ```ruby
58
+ it "should raise exception from callbacks" do
59
+ d = EM::DefaultDeferrable.new
60
+ EM.next_tick { d.fail RuntimeError.new("oh!") }
61
+ proc { sync(d) }.must_raise RuntimeError
62
+ end
63
+ ```
@@ -0,0 +1,121 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'date'
4
+
5
+ #############################################################################
6
+ #
7
+ # Helper functions
8
+ #
9
+ #############################################################################
10
+
11
+ def name
12
+ @name ||= Dir['*.gemspec'].first.split('.').first
13
+ end
14
+
15
+ def version
16
+ line = File.read("lib/minitest/em_sync.rb")[/^\s*VERSION\s*=\s*.*/]
17
+ line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
18
+ end
19
+
20
+ def date
21
+ Date.today.to_s
22
+ end
23
+
24
+ def rubyforge_project
25
+ name
26
+ end
27
+
28
+ def gemspec_file
29
+ "#{name}.gemspec"
30
+ end
31
+
32
+ def gem_file
33
+ "#{name}-#{version}.gem"
34
+ end
35
+
36
+ def replace_header(head, header_name)
37
+ head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"}
38
+ end
39
+
40
+ #############################################################################
41
+ #
42
+ # Standard tasks
43
+ #
44
+ #############################################################################
45
+
46
+ task :default => :spec
47
+
48
+ require 'rake/testtask'
49
+ Rake::TestTask.new(:spec) do |test|
50
+ test.libs << 'lib' << 'spec'
51
+ test.pattern = 'spec/**/*_spec.rb'
52
+ test.verbose = true
53
+ end
54
+
55
+ desc "Open an irb session preloaded with this library"
56
+ task :console do
57
+ sh "irb -rubygems -r ./lib/#{name}.rb"
58
+ end
59
+
60
+ #############################################################################
61
+ #
62
+ # Custom tasks (add your own tasks here)
63
+ #
64
+ #############################################################################
65
+
66
+
67
+
68
+ #############################################################################
69
+ #
70
+ # Packaging tasks
71
+ #
72
+ #############################################################################
73
+
74
+ desc "Create tag v#{version} and build and push #{gem_file} to Rubygems"
75
+ task :release => :build do
76
+ unless `git branch` =~ /^\* master$/
77
+ puts "You must be on the master branch to release!"
78
+ exit!
79
+ end
80
+ sh "git commit --allow-empty -a -m 'Release #{version}'"
81
+ sh "git tag v#{version}"
82
+ sh "git push origin master"
83
+ sh "git push origin v#{version}"
84
+ sh "gem push pkg/#{name}-#{version}.gem"
85
+ end
86
+
87
+ desc "Build #{gem_file} into the pkg directory"
88
+ task :build => :gemspec do
89
+ sh "mkdir -p pkg"
90
+ sh "gem build #{gemspec_file}"
91
+ sh "mv #{gem_file} pkg"
92
+ end
93
+
94
+ desc "Generate #{gemspec_file}"
95
+ task :gemspec do
96
+ # read spec file and split out manifest section
97
+ spec = File.read(gemspec_file)
98
+ head, manifest, tail = spec.split(" # = MANIFEST =\n")
99
+
100
+ # replace name version and date
101
+ replace_header(head, :name)
102
+ replace_header(head, :version)
103
+ replace_header(head, :date)
104
+ #comment this out if your rubyforge_project has a different name
105
+ replace_header(head, :rubyforge_project)
106
+
107
+ # determine file list from git ls-files
108
+ files = `git ls-files`.
109
+ split("\n").
110
+ sort.
111
+ reject { |file| file =~ /^\./ }.
112
+ reject { |file| file =~ /^(rdoc|pkg)/ }.
113
+ map { |file| " #{file}" }.
114
+ join("\n")
115
+
116
+ # piece file back together and write
117
+ manifest = " s.files = %w[\n#{files}\n ]\n"
118
+ spec = [head, manifest, tail].join(" # = MANIFEST =\n")
119
+ File.open(gemspec_file, 'w') { |io| io.write(spec) }
120
+ puts "Updated #{gemspec_file}"
121
+ end
@@ -0,0 +1,61 @@
1
+ require 'eventmachine'
2
+ require 'fiber'
3
+ module Minitest
4
+ module EMSync
5
+ VERSION = '0.1.0'
6
+ def setup
7
+ super()
8
+ @current_fiber = Fiber.current
9
+ @em_reactor = Fiber.new do
10
+ begin
11
+ EM.run do
12
+ @current_fiber.transfer
13
+ end
14
+ rescue => e
15
+ @current_fiber.transfer e
16
+ end
17
+ end
18
+ em_transfer
19
+ end
20
+
21
+ def sync(df)
22
+ f = Fiber.current
23
+ res = nil
24
+ xback = proc do |*args|
25
+ if f == Fiber.current && args.first.is_a?(Exception)
26
+ raise args.first
27
+ elsif f == Fiber.current
28
+ res = args.size == 1 ? args.first : args
29
+ else
30
+ f.transfer(*args)
31
+ end
32
+ end
33
+
34
+ df.callback(&xback)
35
+ df.errback(&xback)
36
+
37
+ if res
38
+ res
39
+ else
40
+ em_transfer
41
+ end
42
+ end
43
+
44
+ def teardown
45
+ super()
46
+ done
47
+ end
48
+
49
+ def done
50
+ return unless @em_reactor.alive?
51
+ EM.next_tick { EM.stop }
52
+ em_transfer unless @em_reactor == Fiber.current
53
+ end
54
+
55
+ def em_transfer
56
+ res = @em_reactor.transfer
57
+ raise res if res.is_a? Exception
58
+ res
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,25 @@
1
+ spec = Gem::Specification.new do |s|
2
+ s.name = 'minitest-em-sync'
3
+ s.version = '0.1.0'
4
+ s.date = '2013-01-28'
5
+ s.summary = 'Less-callbacks helper for EventMachine and minitest'
6
+ s.email = "ceo@prepor.ru"
7
+ s.homepage = "http://github.com/prepor/em-postgres"
8
+ s.description = 'Less-callbacks helper for EventMachine and minitest'
9
+ s.has_rdoc = false
10
+ s.authors = ["Andrew Rudenko"]
11
+ s.add_dependency('eventmachine', '>= 0.12')
12
+
13
+ # = MANIFEST =
14
+ s.files = %w[
15
+ Gemfile
16
+ Gemfile.lock
17
+ README.md
18
+ Rakefile
19
+ lib/minitest/em_sync.rb
20
+ minitest-em-sync.gemspec
21
+ spec/minitest/em_sync_spec.rb
22
+ spec/spec_helper.rb
23
+ ]
24
+ # = MANIFEST =
25
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Minitest::EMSync do
4
+ include Minitest::EMSync
5
+
6
+ it "should start EM and wait result from deferrable" do
7
+ d = EM::DefaultDeferrable.new
8
+ EM.next_tick { d.succeed :foo }
9
+ sync(d).must_equal :foo
10
+ end
11
+
12
+ it "should raise exception from callbacks" do
13
+ d = EM::DefaultDeferrable.new
14
+ EM.next_tick { d.fail RuntimeError.new("oh!") }
15
+ proc { sync(d) }.must_raise RuntimeError
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)
2
+
3
+ require 'bundler/setup'
4
+
5
+ require 'minitest/spec'
6
+ require 'minitest/autorun'
7
+ require 'minitest/reporters'
8
+
9
+ require 'minitest/em_sync'
10
+
11
+ MiniTest::Reporters.use! MiniTest::Reporters::SpecReporter.new
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minitest-em-sync
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Andrew Rudenko
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-01-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: eventmachine
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0.12'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0.12'
30
+ description: Less-callbacks helper for EventMachine and minitest
31
+ email: ceo@prepor.ru
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - Gemfile
37
+ - Gemfile.lock
38
+ - README.md
39
+ - Rakefile
40
+ - lib/minitest/em_sync.rb
41
+ - minitest-em-sync.gemspec
42
+ - spec/minitest/em_sync_spec.rb
43
+ - spec/spec_helper.rb
44
+ homepage: http://github.com/prepor/em-postgres
45
+ licenses: []
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ requirements: []
63
+ rubyforge_project:
64
+ rubygems_version: 1.8.24
65
+ signing_key:
66
+ specification_version: 3
67
+ summary: Less-callbacks helper for EventMachine and minitest
68
+ test_files: []