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.
Files changed (50) hide show
  1. data/gem_package.rb +2 -1
  2. data/html/classes/BaseEnvelope.html +204 -0
  3. data/html/classes/BaseEnvelope.src/M000001.html +18 -0
  4. data/html/classes/BaseEnvelope.src/M000002.html +20 -0
  5. data/html/classes/BaseEnvelope.src/M000003.html +18 -0
  6. data/html/classes/Envelope.html +329 -0
  7. data/html/classes/Envelope.src/M000013.html +19 -0
  8. data/html/classes/Envelope.src/M000014.html +19 -0
  9. data/html/classes/Envelope.src/M000015.html +35 -0
  10. data/html/classes/Envelope.src/M000016.html +19 -0
  11. data/html/classes/Envelope.src/M000017.html +19 -0
  12. data/html/classes/Envelope.src/M000018.html +26 -0
  13. data/html/classes/Envelope.src/M000020.html +18 -0
  14. data/html/classes/EnvelopeException.html +119 -0
  15. data/html/classes/ForwardReference.html +195 -0
  16. data/html/classes/ForwardReference.src/M000021.html +20 -0
  17. data/html/classes/ForwardReference.src/M000022.html +18 -0
  18. data/html/classes/ForwardReferencer.html +176 -0
  19. data/html/classes/ForwardReferencing.html +299 -0
  20. data/html/classes/ForwardReferencing.src/M000023.html +20 -0
  21. data/html/classes/ForwardReferencing.src/M000024.html +20 -0
  22. data/html/classes/ForwardReferencing.src/M000025.html +20 -0
  23. data/html/classes/ForwardReferencing.src/M000026.html +28 -0
  24. data/html/classes/ForwardReferencing.src/M000027.html +18 -0
  25. data/html/classes/ForwardReferencing.src/M000028.html +25 -0
  26. data/html/classes/ForwardReferencing.src/M000029.html +18 -0
  27. data/html/classes/ForwardReferencing.src/M000030.html +18 -0
  28. data/html/classes/Histogram.html +325 -0
  29. data/html/classes/Histogram.src/M000004.html +19 -0
  30. data/html/classes/Histogram.src/M000005.html +21 -0
  31. data/html/classes/Histogram.src/M000006.html +37 -0
  32. data/html/classes/Histogram.src/M000007.html +18 -0
  33. data/html/classes/Histogram.src/M000008.html +20 -0
  34. data/html/classes/Histogram.src/M000009.html +20 -0
  35. data/html/classes/Histogram.src/M000010.html +20 -0
  36. data/html/classes/Histogram.src/M000011.html +20 -0
  37. data/html/classes/Histogram.src/M000012.html +24 -0
  38. data/html/classes/HistogramException.html +118 -0
  39. data/html/created.rid +1 -0
  40. data/html/files/lib/envelope_rb.html +109 -0
  41. data/html/files/lib/forward_referencing_rb.html +120 -0
  42. data/html/files/lib/histogram_rb.html +109 -0
  43. data/html/fr_class_index.html +34 -0
  44. data/html/fr_file_index.html +29 -0
  45. data/html/fr_method_index.html +56 -0
  46. data/html/index.html +24 -0
  47. data/html/rdoc-style.css +208 -0
  48. data/lib/forward_referencing.rb +138 -0
  49. data/test/tc_forward_referencing.rb +126 -0
  50. 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.0
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.0
7
- date: 2007-05-10 00:00:00 -04:00
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: