dynamic_ruby 1.0.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.
@@ -0,0 +1,21 @@
1
+ def dynamic(bindings={}, &block)
2
+ if !block_given?
3
+ Thread.current
4
+ else
5
+ defined = {}
6
+ bindings.each do |name, val|
7
+ if Thread.current[name]
8
+ defined[name] = Thread.current[name]
9
+ end
10
+ Thread.current[name] = val
11
+ end
12
+ block.call
13
+ bindings.each do |name, val|
14
+ if defined[name]
15
+ Thread.current[name] = defined[name]
16
+ else
17
+ Thread.current[name] = nil
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,45 @@
1
+ require "minitest/autorun"
2
+ require_relative "../lib/dynamic_ruby"
3
+
4
+ describe "dynamic scope" do
5
+ it "should access dynamically declared variables" do
6
+ result = nil
7
+ testfun = lambda { dynamic[:name] }
8
+ dynamic(name: "john") do
9
+ result = testfun.call
10
+ end
11
+ result.must_equal "john"
12
+ testfun.call.must_be_nil
13
+ end
14
+
15
+ it "should stack access to dynamically declare variables" do
16
+ result = nil
17
+ testfun = lambda { dynamic[:name] }
18
+ dynamic(name: "right") do
19
+ dynamic(name: "wrong") do
20
+
21
+ end
22
+ result = testfun.call
23
+ end
24
+ result.must_equal "right"
25
+ end
26
+
27
+ it "should respect thread local variables" do
28
+ result = nil
29
+ testfun = lambda { dynamic[:name] }
30
+ thr = Thread.new do
31
+ dynamic(name: "right") do
32
+ sleep 0.1
33
+ result = testfun.call
34
+ end
35
+ end
36
+
37
+ Thread.new do
38
+ dynamic(name: "wrong") do
39
+ sleep 1
40
+ end
41
+ end
42
+ thr.join
43
+ result.must_equal "right"
44
+ end
45
+ end
metadata ADDED
@@ -0,0 +1,47 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dynamic_ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jürgen Bickert
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-20 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: A thin wrapper around ruby for easy use of dynamic scope in your rubies
15
+ email: juergenbickert@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/dynamic_ruby.rb
21
+ - spec/dynamic_ruby_spec.rb
22
+ homepage: http://juergenbickert.de
23
+ licenses: []
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ requirements: []
42
+ rubyforge_project:
43
+ rubygems_version: 1.8.15
44
+ signing_key:
45
+ specification_version: 3
46
+ summary: A library which correctly implements dynamic scope for ruby.
47
+ test_files: []