zipstream 0.0.2 → 0.0.3

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
@@ -0,0 +1,35 @@
1
+ # Credit: http://www.khjk.org/log/2010/jun/fibr.html
2
+
3
+ class Fiber
4
+ @@fibers = [] # a stack of fibers corresponding to calls of 'resume'
5
+
6
+ def initialize &block
7
+ @body = lambda &block # lambda makes 'return' work as expected
8
+ end
9
+
10
+ def resume *args
11
+ @@fibers.push self
12
+ jump *args # jumping into fiber
13
+ end
14
+
15
+ def self.current
16
+ @@fibers.last
17
+ end
18
+
19
+ def self.yield *args
20
+ if fiber = @@fibers.pop
21
+ fiber.send :jump, args # jumping out of fiber
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def jump *args
28
+ callcc do |continuation|
29
+ destination, @body = @body, continuation
30
+ destination.call *args
31
+ @@fibers.pop
32
+ @body.call # return from the last 'resume'
33
+ end
34
+ end
35
+ end if RUBY_VERSION < '1.9'
@@ -0,0 +1,32 @@
1
+ require 'zipstream'
2
+ require 'zipstream-fiber-compat' unless defined? Fiber
3
+
4
+ # We use Fibers to deep-yield data being written to the zip stream
5
+ # to use as a rack response body (responds to #each)
6
+ class ZipStream::Body
7
+ def initialize &block
8
+ @stream = FiberYieldingStream.new
9
+ @fiber = Fiber.new do
10
+ zip = ZipStream.new @stream
11
+ block.call zip
12
+ zip.close
13
+ # Make sure this returns nil as a sentinel
14
+ nil
15
+ end
16
+ end
17
+
18
+ def each
19
+ while !(data = @fiber.resume).nil?
20
+ yield data
21
+ end
22
+ end
23
+
24
+ # A stream that yields each write to the current fiber
25
+ class FiberYieldingStream
26
+ def write data
27
+ tap { Fiber.yield data }
28
+ end
29
+
30
+ alias << write
31
+ end
32
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zipstream
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-11-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70264667231240 !ruby/object:Gem::Requirement
16
+ requirement: &70230380021020 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: 2.7.0
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70264667231240
24
+ version_requirements: *70230380021020
25
25
  description:
26
26
  email: sj26@sj26.com
27
27
  executables: []
@@ -33,6 +33,8 @@ files:
33
33
  - README.md
34
34
  - LICENSE
35
35
  - VERSION
36
+ - lib/zipstream/body.rb
37
+ - lib/zipstream-fiber-compat.rb
36
38
  - lib/zipstream.rb
37
39
  homepage: http://github.com/sj26/zipstream
38
40
  licenses: []