cheri 0.0.7 → 0.0.8

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/lib/cheri/awt.rb CHANGED
@@ -22,10 +22,7 @@
22
22
  #++
23
23
  #
24
24
 
25
- if (defined?JRUBY_VERSION) &&
26
- ((JRUBY_VERSION =~ /^(\d+\.\d+\.\d+)([-\.A-Z0-9]*)/ &&
27
- (($1 == '1.0.0' && ($2.empty? || $2 >= 'RC3')) || $1 > '1.0.0')) ||
28
- (JRUBY_VERSION =~ /^(\d+\.\d+)([-\.A-Z0-9]*)/ && $1 >= '1.0'))
25
+ if RUBY_PLATFORM =~ /java/ && defined?JRUBY_VERSION
29
26
 
30
27
  require 'cheri/java/builder'
31
28
  require 'cheri/builder/awt/types'
@@ -34,10 +31,12 @@ if (defined?JRUBY_VERSION) &&
34
31
  require 'cheri/builder/awt/main'
35
32
 
36
33
  else
34
+
37
35
  STDERR.puts %{
38
- Cheri::AWT requires JRuby (1.0.0RC3 or later)
39
- Download the latest version of JRuby at:
40
- http://www.jruby.org/
36
+ Cheri::AWT requires JRuby 1.0 or later
37
+ Download the latest version of JRuby at:
38
+ http://www.jruby.org/
39
+
41
40
  }
42
41
 
43
42
  end
@@ -95,7 +95,7 @@ module Frame
95
95
 
96
96
  # Overrides the default Object#inspect to prevent mind-boggling circular displays in IRB.
97
97
  def inspect
98
- "#<#{self.class}:instance>"
98
+ to_s
99
99
  end
100
100
 
101
101
  end #Frame
@@ -31,8 +31,7 @@ class Config
31
31
  @m = [] # included modules
32
32
  @f = {} # factories, indexed by module
33
33
  @c = {} # connecters, indexed by module
34
- # lazily allocated:
35
- # @n = {} # consumers, indexed by module
34
+ @n = {} # consumers, indexed by module
36
35
  # @r = {} # resolvers, indexed by module
37
36
  mods.each do |mod| self << mod; end
38
37
  end
@@ -50,9 +49,11 @@ class Config
50
49
  end
51
50
 
52
51
  def consumers
53
- @n || None
52
+ @n
54
53
  end
55
54
 
55
+
56
+ # FIXME: eliminate!
56
57
  def resolvers
57
58
  @r || None
58
59
  end
@@ -63,74 +64,159 @@ class Config
63
64
  extendee = mod.respond_to?(:extends) ? mod.extends : nil
64
65
  raise BuilderException,"extended builder module not included: #{extendee}" if extendee && !@m.include?(extendee)
65
66
  @m << mod
66
- @f[mod] = mod.factory if mod.respond_to?(:factory) && mod.factory
67
- @c[mod] = mod.connecter if mod.respond_to?(:connecter) && mod.connecter
68
- (@n ||= {})[mod] = mod.consumer if mod.respond_to?(:consumer) && mod.consumer
67
+
68
+ if mod.respond_to?(:factory) && (obj = mod.factory)
69
+ @f[mod] = obj
70
+ end
71
+
72
+ if mod.respond_to?(:connecter) && (obj = mod.connecter)
73
+ @c[mod] = obj
74
+ end
75
+
76
+ if mod.respond_to?(:consumer) && (obj = mod.consumer)
77
+ @n[mod] = obj
78
+ end
79
+
80
+ # FIXME: eliminate (isolate in Java class stuff)
69
81
  (@r ||= {})[mod] = mod.resolver if mod.respond_to?(:resolver) && mod.resolver
82
+
83
+
70
84
  extend_mod(extendee,mod) if extendee
71
85
  self
72
86
  end
73
87
  alias_method :add, :<<
74
88
 
75
- def extend_mod(mod,ext)
76
- # get to the base module to be extended
77
- mod = mod.extends while mod.respond_to?(:extends) && mod.extends
78
-
79
- # if we're extending the factory...
80
- if (fx = @f[ext])
81
- if (fm = @f[mod])
82
- # if there's already a factory, wrap it in a SuperFactory
83
- # extender goes first so it can override
84
- @f[mod] = SuperFactory[fx,fm]
89
+ def flatten(obj)
90
+ if obj
91
+ if Aggregate === obj
92
+ obj.flatten
85
93
  else
86
- # no factory, use the extender
87
- @f[mod] = fx
94
+ [obj]
88
95
  end
96
+ else
97
+ []
89
98
  end
99
+ end
100
+ private :flatten
90
101
 
91
- # if we're extending the connecter...
92
- if (cx = @c[ext])
93
- # TODO: break apart mod/ext SuperConnecters to combine embedded type connecters?
94
- # Right now all built-in/generated Cheri connecters are type connecters, so it's
95
- # not an issue... yet...
96
- if (cm = @c[mod])
97
- if TypeConnecter === cm && TypeConnecter === cx
98
- # if they're both TypeConnecters, create a combined TypeConnecter
99
- # extender goes second so it can override
100
- @c[mod] = TypeConnecter.new(cm,cx)
101
- else
102
- # otherwise, combine them in a SuperConnecter
103
- # extender goes first so it can override
104
- @c[mod] = SuperConnecter[cx,cm]
105
- end
106
- else
107
- # no connecter, use extender
108
- @c[mod] = cx
109
- end
102
+ def merge_aggregates(amod, aext, aggr_clazz)
103
+ aggr = aggr_clazz.new
104
+ flatten(aext).each do |elem|
105
+ aggr << elem
110
106
  end
107
+ flatten(amod).each do |elem|
108
+ aggr << elem
109
+ end
110
+ aggr
111
+ end
112
+ private :merge_aggregates
113
+
114
+ def merge_factories(fmod, fext)
115
+ merge_aggregates(fmod,fext,SuperFactory)
116
+ end
117
+ private :merge_factories
118
+
119
+ def merge_consumers(cmod, cext)
120
+ merge_aggregates(cmod,cext,SuperConsumer)
121
+ end
122
+ private :merge_consumers
111
123
 
112
- # if we're extending the consumer... (see comments for factory)
113
- if @n && (nx = @n[ext])
114
- if (nm = @n[mod])
115
- @n[mod] = SuperConsumer[nx,nm]
124
+ def merge_connecters(cmod, cext)
125
+ # first, break down connecters into TypeConnecters and others
126
+ tcs = []
127
+ others = []
128
+ flatten(cmod).each do |ctr|
129
+ if TypeConnecter === ctr
130
+ tcs << ctr
116
131
  else
117
- @n[mod] = nx
132
+ others << ctr
133
+ end
134
+ end
135
+ # we want extender's TC's after mod's
136
+ (fext = flatten(cext)).each do |ctr|
137
+ tcs << ctr if TypeConnecter === ctr
138
+ end
139
+ # we want extender's other connecters before mod's
140
+ fext.reverse_each do |ctr|
141
+ others.unshift(ctr) unless TypeConnecter === ctr
142
+ end
143
+
144
+ # combine (merge) any TypeConnecters
145
+ unless tcs.empty?
146
+ tc = TypeConnecter.new
147
+ tcs.each do |atc|
148
+ tc.merge!(atc)
118
149
  end
150
+ # return the merged TC if there are no other
151
+ # connecters (the usual case)
152
+ return tc if others.empty?
153
+ else
154
+ tc = nil
155
+ end
156
+
157
+ # aggregate any 'other' (non-TypeConnecter) connecters,
158
+ # and add the (merged) TypeConnecter (if any) last
159
+ sc = SuperConnecter.new
160
+ others.each do |oth|
161
+ sc << oth
162
+ end
163
+ sc << tc if tc
164
+ sc
165
+ end
166
+ private :merge_connecters
167
+
168
+ def extend_mod(mod,ext)
169
+ # get to the base module to be extended
170
+ while mod.respond_to?(:extends) && (mext = mod.extends)
171
+ mod = mext
172
+ end
173
+
174
+ # merge the extendee's (mod) factory(s) with the extender's (ext)
175
+ # factory(s). update any reference to either to point to the
176
+ # merged factory(s).
177
+ mods = [mod,ext]
178
+ hash = @f
179
+ hmod = hash[mod]
180
+ hext = hash[ext]
181
+ hash.each_pair do |m,h|
182
+ mods << m if h == hmod || h == hext unless mods.include?(m)
183
+ end
184
+ merged = merge_factories(hmod,hext)
185
+ mods.each do |m|
186
+ hash[m] = merged
119
187
  end
120
188
 
121
- # if we're extending the resolver...
122
- # FIXME: this won't really work right now, at least for Java apps, which are
123
- # the only ones likely to use this feature. the Java constant resolver wants
124
- # all constant symbols from a single (virtual) source, and raises exceptions if
125
- # it fails to resolve. coding it anyway, will rethink for next version.
126
- if @r && (rx = @r[ext])
127
- if (rm = @r[mod])
128
- @r[mod] = SuperResolver[rx,rm]
129
- else
130
- @r[mod] = rx
131
- end
189
+ # merge the extendee's (mod) connecter(s) with the extender's (ext)
190
+ # connecter(s). update any reference to either to point to the
191
+ # merged connecter(s).
192
+ mods = [mod,ext]
193
+ hash = @c
194
+ hmod = hash[mod]
195
+ hext = hash[ext]
196
+ hash.each_pair do |m,h|
197
+ mods << m if h == hmod || h == hext unless mods.include?(m)
198
+ end
199
+ merged = merge_connecters(hmod,hext)
200
+ mods.each do |m|
201
+ hash[m] = merged
202
+ end
203
+
204
+ # merge the extendee's (mod) consumers(s) with the extender's (ext)
205
+ # consumers(s). update any reference to either to point to the
206
+ # merged consumer(s).
207
+ mods = [mod,ext]
208
+ hash = @n
209
+ hmod = hash[mod]
210
+ hext = hash[ext]
211
+ hash.each_pair do |m,h|
212
+ mods << m if h == hmod || h == hext unless mods.include?(m)
213
+ end
214
+ merged = merge_consumers(hmod,hext)
215
+ mods.each do |m|
216
+ hash[m] = merged
132
217
  end
133
218
  end
219
+ private :extend_mod
134
220
 
135
221
  def include?(mod)
136
222
  @m.include?(mod)
@@ -146,7 +232,7 @@ class Config
146
232
 
147
233
  # Overrides the default Object#inspect to prevent mind-boggling circular displays in IRB.
148
234
  def inspect
149
- "#<#{self.class}:instance>"
235
+ to_s
150
236
  end
151
237
 
152
238
  protected
@@ -154,7 +240,7 @@ protected
154
240
  @m = m.dup
155
241
  @f = f.dup
156
242
  @c = c.dup
157
- @n = n.dup if n
243
+ @n = n.dup
158
244
  @r = r.dup if r
159
245
  self
160
246
  end
@@ -27,32 +27,33 @@ module Builder
27
27
 
28
28
  class TypeConnecter
29
29
 
30
- def initialize(*parents,&k)
30
+ def initialize(*parents,&block)
31
31
  @t = {}
32
32
  @s = {}
33
33
  @c = {}
34
- unless parents.empty?
35
- t = @t
36
- s = @s
37
- parents.each do |parent|
38
- raise Cheri.type_error(parent,TypeConnecter) unless TypeConnecter === parent
39
- parent.get_types.each_pair do |mod,type|
40
- if (tmod = t[mod])
41
- tmod.merge(type)
42
- else
43
- t[mod] = type.copy
44
- end
45
- end
46
- parent.get_syms.each_pair do |sym,symc|
47
- if (ssym = s[sym])
48
- ssym.merge(symc)
49
- else
50
- s[sym] = symc.copy
51
- end
52
- end
34
+ parents.each do |parent| merge!(parent); end
35
+ instance_eval(&block) if block
36
+ end
37
+
38
+ def merge!(other)
39
+ raise Cheri.type_error(other,TypeConnecter) unless TypeConnecter === other
40
+ t = @t
41
+ s = @s
42
+ other.get_types.each_pair do |mod,type|
43
+ if (tmod = t[mod])
44
+ tmod.merge(type)
45
+ else
46
+ t[mod] = type.copy
53
47
  end
54
48
  end
55
- instance_eval(&k) if k
49
+ other.get_syms.each_pair do |sym,symc|
50
+ if (ssym = s[sym])
51
+ ssym.merge(symc)
52
+ else
53
+ s[sym] = symc.copy
54
+ end
55
+ end
56
+ self
56
57
  end
57
58
 
58
59
  def prepare(ctx,builder,obj,sym,props)
@@ -155,6 +156,7 @@ class TypeConnecter
155
156
  @t[mod] ||= Type.new(mod)
156
157
  end
157
158
 
159
+
158
160
  class Type
159
161
  def initialize(mod)
160
162
  raise Cheri.type_error(mod,Class,Module) unless Module === mod
@@ -28,7 +28,7 @@ module Builder
28
28
  class InstanceContext
29
29
  # TODO: defined?Java pulls it in (same as require 'java' or include Java)
30
30
  # not sure if anyone would object...
31
- if (defined?Java) && (defined?JRUBY_VERSION) # JRuby 0.9.9 or later
31
+ if (defined?(::Java)) && (defined?JRUBY_VERSION) # JRuby 0.9.9 or later
32
32
  Col = java.util.Collections
33
33
  Map = java.util.HashMap
34
34
  WMap = java.util.WeakHashMap
@@ -108,7 +108,7 @@ class InstanceContext
108
108
 
109
109
  # Overrides the default Object#inspect to prevent mind-boggling circular displays in IRB.
110
110
  def inspect
111
- "#<#{self.class}:instance>"
111
+ to_s
112
112
  end
113
113
 
114
114
  end #InstanceContext
@@ -134,7 +134,6 @@ class Context
134
134
  # @r - array of ConstantResolver instances, lazily initialized
135
135
  # @s - the stack, holds active builders and builder frames
136
136
  # @u - auto-factories array, lazily initialized
137
- ##### TODO: REMOVE @v - flag used to prevent reentrant calls to #consume (aka #csm)
138
137
  # @x - flag indicating whether instance_exec is supported, lazily initialized
139
138
  #++
140
139
  def initialize(ictx,client)
@@ -428,15 +427,15 @@ class Context
428
427
  # in the order they were enabled. Returns nil if no builder is found.
429
428
  def bld(*r,&k)
430
429
  #puts "bld args: #{[r.join(',')]}"
431
- fs = nil # lazily-allocated array to hold factories we've already queried
430
+ queried = nil # lazily-allocated array to hold factories we've already queried
432
431
  b = nil # builder
433
-
432
+ atf = @f
434
433
  # search stack for a frame whose module's factory can supply a matching builder
435
434
  @s.reverse_each do |s|
436
- if (f = @f[s.mod])
437
- unless fs && fs.include?(f)
435
+ if (f = atf[s.mod])
436
+ unless queried && queried.include?(f)
438
437
  return b if (b = f.builder(self,*r,&k))
439
- (fs ||= []) << f
438
+ (queried ||= []) << f
440
439
  end
441
440
  end
442
441
  end
@@ -444,10 +443,10 @@ class Context
444
443
  # try auto-enabled builders
445
444
  if (u = auto)
446
445
  u.each do |m|
447
- if (f = @f[m])
448
- unless fs && fs.include?(f)
446
+ if (f = atf[m])
447
+ unless queried && queried.include?(f)
449
448
  return b if (b = f.builder(self,*r,&k))
450
- (fs ||= []) << f
449
+ (queried ||= []) << f
451
450
  end
452
451
  end
453
452
  end
@@ -540,9 +539,12 @@ class Context
540
539
  break
541
540
  end
542
541
  end
543
-
542
+
543
+ #puts "frame.object #{obj}"
544
+ #puts "parent #{parent}"
544
545
  # if we got a builder (parent), attempt to connect it
545
546
  if parent && (n = @n[parent.mod])
547
+ #puts "parent.mod #{n}"
546
548
  n.prepare(self,parent,obj,sym,props)
547
549
  end
548
550
 
@@ -624,7 +626,7 @@ class Context
624
626
 
625
627
  # Overrides the default Object#inspect to prevent mind-boggling circular displays in IRB.
626
628
  def inspect
627
- "#<#{self.class}:instance>"
629
+ to_s
628
630
  end
629
631
 
630
632
  # We want to prevent built objects passed as parameters from
@@ -669,14 +671,14 @@ class Context
669
671
  # store a prepared connection.
670
672
  def ppd(ctr,bldr,obj,sym,props=nil)
671
673
  @o[obj.__id__] = bldr
672
- @c[bldr.__id__] << Con.new(ctr,bldr.object,obj,sym,props)
674
+ @c[bldr.__id__] << Conn.new(ctr,bldr.object,obj,sym,props)
673
675
  true
674
676
  end
675
677
  alias_method :prepared, :ppd #:nodoc:
676
678
 
677
679
  # store a prepared 'any' connection.
678
680
  def ppda(ctr,bldr,obj,sym,props=nil)
679
- ((@a ||= {})[bldr.__id__] ||= []) << Con.new(ctr,bldr.object,obj,sym,props)
681
+ ((@a ||= {})[bldr.__id__] ||= []) << Conn.new(ctr,bldr.object,obj,sym,props)
680
682
  true
681
683
  end
682
684
  alias_method :prepared_any, :ppda # :nodoc:
@@ -714,7 +716,7 @@ class Context
714
716
  end
715
717
  alias_method :check, :ck #:nodoc:
716
718
 
717
- class Con # :nodoc: all
719
+ class Conn # :nodoc: all
718
720
  def initialize(ctr,par,obj,sym,props)
719
721
  @c = ctr
720
722
  @p = par
data/lib/cheri/cheri.rb CHANGED
@@ -29,7 +29,7 @@ module Cheri
29
29
  module VERSION #:nodoc:
30
30
  MAJOR = 0
31
31
  MINOR = 0
32
- TINY = 7
32
+ TINY = 8
33
33
  STRING = [MAJOR, MINOR, TINY].join('.').freeze
34
34
  end
35
35
  #:stopdoc:
@@ -24,10 +24,7 @@
24
24
 
25
25
  require 'cheri/cheri'
26
26
 
27
- if (defined?JRUBY_VERSION) &&
28
- ((JRUBY_VERSION =~ /^(\d+\.\d+\.\d+)([-\.A-Z0-9]*)/ &&
29
- (($1 == '1.0.0' && ($2.empty? || $2 >= 'RC3')) || $1 > '1.0.0')) ||
30
- (JRUBY_VERSION =~ /^(\d+\.\d+)([-\.A-Z0-9]*)/ && $1 >= '1.0'))
27
+ if RUBY_PLATFORM =~ /java/ && defined?JRUBY_VERSION
31
28
  require 'cheri/jruby'
32
29
  end
33
30
 
@@ -370,6 +370,10 @@ class GenericCheriYieldBuilder < CheriYieldBuilder
370
370
  end #GenericCheriYieldBuilder
371
371
 
372
372
  class GenericBuilderFactory
373
+ # :stopdoc:
374
+ BuildType = Cheri::Builder::BuildType
375
+ BuildTypes = Cheri::Builder::BuildTypes
376
+ # :startdoc:
373
377
  def initialize(mod,types)
374
378
  raise Cheri.type_error(types,BuildType) unless BuildTypes === types
375
379
  @mod = mod
data/lib/cheri/jruby.rb CHANGED
@@ -22,10 +22,7 @@
22
22
  #++
23
23
  #
24
24
 
25
- if (defined?JRUBY_VERSION) &&
26
- ((JRUBY_VERSION =~ /^(\d+\.\d+\.\d+)([-\.A-Z0-9]*)/ &&
27
- (($1 == '1.0.0' && ($2.empty? || $2 >= 'RC3')) || $1 > '1.0.0')) ||
28
- (JRUBY_VERSION =~ /^(\d+\.\d+)([-\.A-Z0-9]*)/ && $1 >= '1.0'))
25
+ if RUBY_PLATFORM =~ /java/ && defined?JRUBY_VERSION
29
26
  require 'java'
30
27
  require 'cheri/cheri'
31
28
  require 'cheri/jruby/jruby'
data/lib/cheri/swing.rb CHANGED
@@ -22,10 +22,7 @@
22
22
  #++
23
23
  #
24
24
 
25
- if (defined?JRUBY_VERSION) &&
26
- ((JRUBY_VERSION =~ /^(\d+\.\d+\.\d+)([-\.A-Z0-9]*)/ &&
27
- (($1 == '1.0.0' && ($2.empty? || $2 >= 'RC3')) || $1 > '1.0.0')) ||
28
- (JRUBY_VERSION =~ /^(\d+\.\d+)([-\.A-Z0-9]*)/ && $1 >= '1.0'))
25
+ if RUBY_PLATFORM =~ /java/ && defined?JRUBY_VERSION
29
26
 
30
27
  require 'cheri/awt'
31
28
  require 'cheri/builder/swing/types'
@@ -34,10 +31,12 @@ if (defined?JRUBY_VERSION) &&
34
31
  require 'cheri/builder/swing/main'
35
32
 
36
33
  else
34
+
37
35
  STDERR.puts %{
38
- Cheri::Swing requires JRuby (1.0.0RC3 or later)
39
- Download the latest version of JRuby at:
40
- http://www.jruby.org/
36
+ Cheri::Swing requires JRuby 1.0 or later
37
+ Download the latest version of JRuby at:
38
+ http://www.jruby.org/
39
+
41
40
  }
42
41
 
43
42
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: cheri
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.7
7
- date: 2007-06-20 00:00:00 -07:00
6
+ version: 0.0.8
7
+ date: 2007-12-10 00:00:00 -08:00
8
8
  summary: Cheri Builder Platform
9
9
  require_paths:
10
10
  - lib