minitest-em-sync 0.1.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.
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: []