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.
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: