eymiha_util 0.1.0 → 0.1.1
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/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:
|