eymiha_util 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/gem_package.rb +2 -1
- data/html/classes/BaseEnvelope.html +204 -0
- data/html/classes/BaseEnvelope.src/M000001.html +18 -0
- data/html/classes/BaseEnvelope.src/M000002.html +20 -0
- data/html/classes/BaseEnvelope.src/M000003.html +18 -0
- data/html/classes/Envelope.html +329 -0
- data/html/classes/Envelope.src/M000013.html +19 -0
- data/html/classes/Envelope.src/M000014.html +19 -0
- data/html/classes/Envelope.src/M000015.html +35 -0
- data/html/classes/Envelope.src/M000016.html +19 -0
- data/html/classes/Envelope.src/M000017.html +19 -0
- data/html/classes/Envelope.src/M000018.html +26 -0
- data/html/classes/Envelope.src/M000020.html +18 -0
- data/html/classes/EnvelopeException.html +119 -0
- data/html/classes/ForwardReference.html +195 -0
- data/html/classes/ForwardReference.src/M000021.html +20 -0
- data/html/classes/ForwardReference.src/M000022.html +18 -0
- data/html/classes/ForwardReferencer.html +176 -0
- data/html/classes/ForwardReferencing.html +299 -0
- data/html/classes/ForwardReferencing.src/M000023.html +20 -0
- data/html/classes/ForwardReferencing.src/M000024.html +20 -0
- data/html/classes/ForwardReferencing.src/M000025.html +20 -0
- data/html/classes/ForwardReferencing.src/M000026.html +28 -0
- data/html/classes/ForwardReferencing.src/M000027.html +18 -0
- data/html/classes/ForwardReferencing.src/M000028.html +25 -0
- data/html/classes/ForwardReferencing.src/M000029.html +18 -0
- data/html/classes/ForwardReferencing.src/M000030.html +18 -0
- data/html/classes/Histogram.html +325 -0
- data/html/classes/Histogram.src/M000004.html +19 -0
- data/html/classes/Histogram.src/M000005.html +21 -0
- data/html/classes/Histogram.src/M000006.html +37 -0
- data/html/classes/Histogram.src/M000007.html +18 -0
- data/html/classes/Histogram.src/M000008.html +20 -0
- data/html/classes/Histogram.src/M000009.html +20 -0
- data/html/classes/Histogram.src/M000010.html +20 -0
- data/html/classes/Histogram.src/M000011.html +20 -0
- data/html/classes/Histogram.src/M000012.html +24 -0
- data/html/classes/HistogramException.html +118 -0
- data/html/created.rid +1 -0
- data/html/files/lib/envelope_rb.html +109 -0
- data/html/files/lib/forward_referencing_rb.html +120 -0
- data/html/files/lib/histogram_rb.html +109 -0
- data/html/fr_class_index.html +34 -0
- data/html/fr_file_index.html +29 -0
- data/html/fr_method_index.html +56 -0
- data/html/index.html +24 -0
- data/html/rdoc-style.css +208 -0
- data/lib/forward_referencing.rb +138 -0
- data/test/tc_forward_referencing.rb +126 -0
- metadata +69 -5
@@ -0,0 +1,138 @@
|
|
1
|
+
# Forward referencing is one of those painful problems in programming - if
|
2
|
+
# you try to use something before it's defined, trouble ensues. Using the
|
3
|
+
# ForwardReferencing module and the ForwardReference class can let you
|
4
|
+
# gracefully recover from problems caused by forward references in data and
|
5
|
+
# processing.
|
6
|
+
|
7
|
+
require 'eymiha'
|
8
|
+
|
9
|
+
# The ForwardReferencing module can be mixed into a class to allow it to
|
10
|
+
# capture and resolve ForwardReferences.
|
11
|
+
module ForwardReferencing
|
12
|
+
|
13
|
+
# An array containing the set of unresolved forward references.
|
14
|
+
attr_reader :forward_references
|
15
|
+
|
16
|
+
# To be called from the initializer of the includer, this sets up the forward
|
17
|
+
# reference capture and resolution mechanisms.
|
18
|
+
def start_forward_referencing
|
19
|
+
@forward_references = []
|
20
|
+
@had_forward_reference_resolution = false
|
21
|
+
@forward_reference_resolver = nil
|
22
|
+
end
|
23
|
+
|
24
|
+
# To be called when a section of code that could contain a forward reference
|
25
|
+
# is entered. The method returns a newly created ForwardReference with the
|
26
|
+
# given dependency that can be jumped to during resolution.
|
27
|
+
def create_forward_reference dependency=nil
|
28
|
+
forward_reference = ForwardReference.new dependency
|
29
|
+
@forward_references << forward_reference
|
30
|
+
forward_reference
|
31
|
+
end
|
32
|
+
|
33
|
+
# To be called when a section of code that could contain a forward reference
|
34
|
+
# has successfully been reached. It is used to remove the ForwardReference
|
35
|
+
# that was created at the start of the section, and asserts that a
|
36
|
+
# resolution was made.
|
37
|
+
def remove_forward_reference forward_reference=nil
|
38
|
+
@forward_references.delete forward_reference if
|
39
|
+
(forward_reference.kind_of? ForwardReference)
|
40
|
+
@had_forward_reference_resolution = true
|
41
|
+
end
|
42
|
+
|
43
|
+
# To be called to try to resolve any unresolved ForwardReferences by jumping
|
44
|
+
# to each in turn and retrying the code that caused it. This method repeats
|
45
|
+
# until nothing more is resolved. At that point unresolved forward reference
|
46
|
+
# may still exist, to be possibly resolved by another call to this method
|
47
|
+
# downstream.
|
48
|
+
def resolve_forward_references
|
49
|
+
forward_references = @forward_references
|
50
|
+
@forward_references = []
|
51
|
+
@had_forward_reference_resolution = false
|
52
|
+
if forward_references.size > 0
|
53
|
+
@forward_reference_resolver ||= callcc {|cont| cont} while
|
54
|
+
(@forward_reference_resolver == nil)
|
55
|
+
forward_reference = forward_references.shift
|
56
|
+
forward_reference.continuation.call if forward_reference != nil
|
57
|
+
end
|
58
|
+
@forward_reference_resolver = nil
|
59
|
+
resolve_forward_references if @had_forward_reference_resolution
|
60
|
+
end
|
61
|
+
|
62
|
+
# To be called at the end of a section of code that could contain a forward
|
63
|
+
# reference, it will continue during normal processing and jump back to the
|
64
|
+
# resolve_forward_references method during resolution.
|
65
|
+
def continue_forward_reference_resolution
|
66
|
+
@forward_reference_resolver.call if @forward_reference_resolver
|
67
|
+
end
|
68
|
+
|
69
|
+
# Returns a hash of dependencies to arrays of the ForwardReferences that
|
70
|
+
# have them as dependencies.
|
71
|
+
def forward_reference_dependencies
|
72
|
+
dependencies = {}
|
73
|
+
@forward_references.each { |forward_reference|
|
74
|
+
dependency = forward_reference.dependency
|
75
|
+
forward_references = dependencies[dependency]
|
76
|
+
dependencies[dependency] = [] if forward_references == nil
|
77
|
+
dependencies[dependency] << forward_reference
|
78
|
+
}
|
79
|
+
dependencies
|
80
|
+
end
|
81
|
+
|
82
|
+
# Returns a string indicating the current state of ForwardReferencing.
|
83
|
+
def forward_references_to_s
|
84
|
+
"#{self_name} #{forward_references_remaining} unresolved"
|
85
|
+
end
|
86
|
+
|
87
|
+
# Returns the number of unresolved forward references.
|
88
|
+
def forward_references_remaining
|
89
|
+
@forward_references.size
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
# A ForwardReferencer is simply a class-wrapper for the ForwardReferencing
|
96
|
+
# module. method have been shortened there is reduced potential for conflict
|
97
|
+
# from inheritence than from inclusion or extension.
|
98
|
+
class ForwardReferencer
|
99
|
+
|
100
|
+
understands ForwardReferencing
|
101
|
+
|
102
|
+
alias initialize start_forward_referencing
|
103
|
+
alias create create_forward_reference
|
104
|
+
alias remove remove_forward_reference
|
105
|
+
alias resolve resolve_forward_references
|
106
|
+
alias continue continue_forward_reference_resolution
|
107
|
+
alias dependencies forward_reference_dependencies
|
108
|
+
alias to_s forward_references_to_s
|
109
|
+
alias remaining forward_references_remaining
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
# A ForwardReference holds a continuation and a dependency, the where and
|
115
|
+
# the why of forward referencing.
|
116
|
+
class ForwardReference
|
117
|
+
|
118
|
+
# Holds the place to jump back to for attempting to resolve a forward
|
119
|
+
# reference.
|
120
|
+
attr_reader :continuation
|
121
|
+
|
122
|
+
# Holds an arbitrary object that indicates why the forward reference
|
123
|
+
# occurred.
|
124
|
+
attr_accessor :dependency
|
125
|
+
|
126
|
+
# Returns a new instance with a valid continuation and the given dependency.
|
127
|
+
def initialize(dependency)
|
128
|
+
@continuation = nil
|
129
|
+
@continuation = callcc{|cont| cont} while (@continuation == nil)
|
130
|
+
@dependency = dependency
|
131
|
+
end
|
132
|
+
|
133
|
+
# Returns a string indicating the current state of the ForwardReference.
|
134
|
+
def to_s
|
135
|
+
"#{self_name} dependency #{dependency} #{continuation}"
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
3
|
+
require 'forward_referencing'
|
4
|
+
|
5
|
+
class LineLink
|
6
|
+
|
7
|
+
attr_accessor :data, :link
|
8
|
+
|
9
|
+
def initialize(chain,data,link)
|
10
|
+
@data,@link = data,link
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
"#{data} #{link}"
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
class LineChain < ForwardReferencer
|
21
|
+
|
22
|
+
attr_accessor :chain
|
23
|
+
|
24
|
+
def load(text)
|
25
|
+
@chain = {}
|
26
|
+
pattern = /(\w*) (\w*)/
|
27
|
+
text.each do |line|
|
28
|
+
matches = pattern.match line
|
29
|
+
line_link = LineLink.new self, matches[1], matches[2]
|
30
|
+
@chain[line_link.data] = line_link
|
31
|
+
forward_reference = create line_link.data
|
32
|
+
if ((link = @chain[line_link.link]) != nil) ||
|
33
|
+
(line_link.link == 'end')
|
34
|
+
line_link.link = link
|
35
|
+
remove forward_reference
|
36
|
+
end
|
37
|
+
continue
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
class TC_Histogram < Test::Unit::TestCase
|
45
|
+
|
46
|
+
def test_forward_referencing
|
47
|
+
|
48
|
+
text = <<TEXT_END
|
49
|
+
eight nine
|
50
|
+
five six
|
51
|
+
four five
|
52
|
+
nine end
|
53
|
+
one two
|
54
|
+
seven eight
|
55
|
+
six seven
|
56
|
+
start zero
|
57
|
+
three four
|
58
|
+
two three
|
59
|
+
zero one
|
60
|
+
TEXT_END
|
61
|
+
|
62
|
+
line_chain = LineChain.new
|
63
|
+
line_chain.load(text)
|
64
|
+
dependencies = line_chain.dependencies
|
65
|
+
assert(dependencies["start"] != nil)
|
66
|
+
assert(dependencies["one"] != nil)
|
67
|
+
assert(dependencies["five"] != nil)
|
68
|
+
assert(dependencies["eight"] != nil)
|
69
|
+
assert(line_chain.remaining == 4)
|
70
|
+
assert(line_chain.chain['start'].to_s ==
|
71
|
+
'start zero')
|
72
|
+
assert(line_chain.chain['zero'].to_s ==
|
73
|
+
'zero one two')
|
74
|
+
assert(line_chain.chain['one'].to_s ==
|
75
|
+
'one two')
|
76
|
+
assert(line_chain.chain['two'].to_s ==
|
77
|
+
'two three four five six')
|
78
|
+
assert(line_chain.chain['three'].to_s ==
|
79
|
+
'three four five six')
|
80
|
+
assert(line_chain.chain['four'].to_s ==
|
81
|
+
'four five six')
|
82
|
+
assert(line_chain.chain['five'].to_s ==
|
83
|
+
'five six')
|
84
|
+
assert(line_chain.chain['six'].to_s ==
|
85
|
+
'six seven eight nine')
|
86
|
+
assert(line_chain.chain['seven'].to_s ==
|
87
|
+
'seven eight nine')
|
88
|
+
assert(line_chain.chain['eight'].to_s ==
|
89
|
+
'eight nine')
|
90
|
+
assert(line_chain.chain['nine'].to_s ==
|
91
|
+
'nine ')
|
92
|
+
assert(line_chain.chain.size == 11)
|
93
|
+
assert(line_chain.to_s == "LineChain 4 unresolved")
|
94
|
+
|
95
|
+
line_chain.resolve
|
96
|
+
assert(line_chain.remaining == 0)
|
97
|
+
assert(line_chain.chain['start'].to_s ==
|
98
|
+
'start zero one two three four five six seven eight nine ')
|
99
|
+
assert(line_chain.chain['zero'].to_s ==
|
100
|
+
'zero one two three four five six seven eight nine ')
|
101
|
+
assert(line_chain.chain['one'].to_s ==
|
102
|
+
'one two three four five six seven eight nine ')
|
103
|
+
assert(line_chain.chain['two'].to_s ==
|
104
|
+
'two three four five six seven eight nine ')
|
105
|
+
assert(line_chain.chain['three'].to_s ==
|
106
|
+
'three four five six seven eight nine ')
|
107
|
+
assert(line_chain.chain['four'].to_s ==
|
108
|
+
'four five six seven eight nine ')
|
109
|
+
assert(line_chain.chain['five'].to_s ==
|
110
|
+
'five six seven eight nine ')
|
111
|
+
assert(line_chain.chain['six'].to_s ==
|
112
|
+
'six seven eight nine ')
|
113
|
+
assert(line_chain.chain['seven'].to_s ==
|
114
|
+
'seven eight nine ')
|
115
|
+
assert(line_chain.chain['eight'].to_s ==
|
116
|
+
'eight nine ')
|
117
|
+
assert(line_chain.chain['nine'].to_s ==
|
118
|
+
'nine ')
|
119
|
+
assert(line_chain.chain.size == 11)
|
120
|
+
assert(line_chain.to_s == "LineChain 0 unresolved")
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.2
|
3
3
|
specification_version: 1
|
4
4
|
name: eymiha_util
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2007-05-
|
6
|
+
version: 0.1.1
|
7
|
+
date: 2007-05-16 00:00:00 -04:00
|
8
8
|
summary: Eymiha general utility classes and methods
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -32,9 +32,65 @@ files:
|
|
32
32
|
- gem_package.rb
|
33
33
|
- rakefile.rb
|
34
34
|
- lib/envelope.rb
|
35
|
+
- lib/forward_referencing.rb
|
35
36
|
- lib/histogram.rb
|
36
37
|
- test/tc_envelope.rb
|
38
|
+
- test/tc_forward_referencing.rb
|
37
39
|
- test/tc_histogram.rb
|
40
|
+
- html/classes
|
41
|
+
- html/classes/BaseEnvelope.html
|
42
|
+
- html/classes/BaseEnvelope.src
|
43
|
+
- html/classes/BaseEnvelope.src/M000001.html
|
44
|
+
- html/classes/BaseEnvelope.src/M000002.html
|
45
|
+
- html/classes/BaseEnvelope.src/M000003.html
|
46
|
+
- html/classes/Envelope.html
|
47
|
+
- html/classes/Envelope.src
|
48
|
+
- html/classes/Envelope.src/M000013.html
|
49
|
+
- html/classes/Envelope.src/M000014.html
|
50
|
+
- html/classes/Envelope.src/M000015.html
|
51
|
+
- html/classes/Envelope.src/M000016.html
|
52
|
+
- html/classes/Envelope.src/M000017.html
|
53
|
+
- html/classes/Envelope.src/M000018.html
|
54
|
+
- html/classes/Envelope.src/M000020.html
|
55
|
+
- html/classes/EnvelopeException.html
|
56
|
+
- html/classes/ForwardReference.html
|
57
|
+
- html/classes/ForwardReference.src
|
58
|
+
- html/classes/ForwardReference.src/M000021.html
|
59
|
+
- html/classes/ForwardReference.src/M000022.html
|
60
|
+
- html/classes/ForwardReferencer.html
|
61
|
+
- html/classes/ForwardReferencing.html
|
62
|
+
- html/classes/ForwardReferencing.src
|
63
|
+
- html/classes/ForwardReferencing.src/M000023.html
|
64
|
+
- html/classes/ForwardReferencing.src/M000024.html
|
65
|
+
- html/classes/ForwardReferencing.src/M000025.html
|
66
|
+
- html/classes/ForwardReferencing.src/M000026.html
|
67
|
+
- html/classes/ForwardReferencing.src/M000027.html
|
68
|
+
- html/classes/ForwardReferencing.src/M000028.html
|
69
|
+
- html/classes/ForwardReferencing.src/M000029.html
|
70
|
+
- html/classes/ForwardReferencing.src/M000030.html
|
71
|
+
- html/classes/Histogram.html
|
72
|
+
- html/classes/Histogram.src
|
73
|
+
- html/classes/Histogram.src/M000004.html
|
74
|
+
- html/classes/Histogram.src/M000005.html
|
75
|
+
- html/classes/Histogram.src/M000006.html
|
76
|
+
- html/classes/Histogram.src/M000007.html
|
77
|
+
- html/classes/Histogram.src/M000008.html
|
78
|
+
- html/classes/Histogram.src/M000009.html
|
79
|
+
- html/classes/Histogram.src/M000010.html
|
80
|
+
- html/classes/Histogram.src/M000011.html
|
81
|
+
- html/classes/Histogram.src/M000012.html
|
82
|
+
- html/classes/HistogramException.html
|
83
|
+
- html/created.rid
|
84
|
+
- html/files
|
85
|
+
- html/files/lib
|
86
|
+
- html/files/lib/envelope_rb.html
|
87
|
+
- html/files/lib/forward_referencing_rb.html
|
88
|
+
- html/files/lib/histogram_rb.html
|
89
|
+
- html/fr_class_index.html
|
90
|
+
- html/fr_file_index.html
|
91
|
+
- html/fr_method_index.html
|
92
|
+
- html/index.html
|
93
|
+
- html/rdoc-style.css
|
38
94
|
test_files: []
|
39
95
|
|
40
96
|
rdoc_options:
|
@@ -47,5 +103,13 @@ extensions: []
|
|
47
103
|
|
48
104
|
requirements: []
|
49
105
|
|
50
|
-
dependencies:
|
51
|
-
|
106
|
+
dependencies:
|
107
|
+
- !ruby/object:Gem::Dependency
|
108
|
+
name: eymiha
|
109
|
+
version_requirement:
|
110
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: 0.1.1
|
115
|
+
version:
|