goat 0.3.27 → 0.3.29

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/bin/state-srv CHANGED
@@ -32,6 +32,8 @@ module Goat
32
32
  @channelsrvs = {}
33
33
  @page_versions = {}
34
34
  @page_updates = {}
35
+ @page_users = {}
36
+ @user_pages = {}
35
37
  end
36
38
 
37
39
  def add_component(pgid, skel)
@@ -52,8 +54,10 @@ module Goat
52
54
  @components_by_id[cid]
53
55
  end
54
56
 
55
- def initialize_page(pgid)
57
+ def initialize_page(pgid, user)
56
58
  @page_versions[pgid] = 0
59
+ @page_users[pgid] = user
60
+ user_pages(user) << pgid if user
57
61
  @registration_times[pgid] = Time.now
58
62
  end
59
63
 
@@ -65,6 +69,14 @@ module Goat
65
69
  @page_versions[pgid]
66
70
  end
67
71
 
72
+ def page_user(pgid)
73
+ @page_users[pgid]
74
+ end
75
+
76
+ def user_pages(user)
77
+ @user_pages[user] ||= Set.new
78
+ end
79
+
68
80
  def find_page(pgid)
69
81
  @components_by_page[pgid] ||= Set.new
70
82
  end
@@ -126,6 +138,10 @@ module Goat
126
138
  Goat.logw "(No components for #{pgid})"
127
139
  end
128
140
 
141
+ if user = @page_users[pgid]
142
+ user_pages(user).delete(pgid)
143
+ end
144
+ @page_users.delete(pgid)
129
145
  @page_updates.delete(pgid)
130
146
  @last_connected.delete(pgid)
131
147
  @page_connections.delete(pgid)
@@ -180,7 +196,7 @@ module Goat
180
196
 
181
197
  class Delegate
182
198
  @registry = Registry.new
183
-
199
+
184
200
  def self.registry; @registry; end
185
201
 
186
202
  class << self
@@ -193,7 +209,7 @@ module Goat
193
209
  end
194
210
 
195
211
  def register_page(msg)
196
- ensure_keys(msg, %w{pgid components})
212
+ ensure_keys(msg, %w{pgid user components})
197
213
 
198
214
  pgid = msg['pgid']
199
215
 
@@ -203,7 +219,7 @@ module Goat
203
219
 
204
220
  Goat.logd("registered #{msg['components'].count} components")
205
221
 
206
- @registry.initialize_page(pgid)
222
+ @registry.initialize_page(pgid, msg['user'])
207
223
 
208
224
  nil
209
225
  end
@@ -213,7 +229,7 @@ module Goat
213
229
 
214
230
  # return newest components first
215
231
  @registry.components_by_class(msg['class']).\
216
- select{|c| c.spec == msg['spec']}.\
232
+ select{|c| c.live_spec == msg['spec']}.\
217
233
  select{|c| @registry.connected?(c.pgid) || \
218
234
  @registry.last_connected_delta(c.pgid) < 120 || \
219
235
  @registry.registration_delta(c.pgid) < 20}.\
@@ -280,7 +296,7 @@ module Goat
280
296
 
281
297
  if comp
282
298
  comp.dom = update.skel.dom
283
- comp.state = update.skel.state
299
+ comp.live_state = update.skel.live_state
284
300
 
285
301
  @registry.incr_page_version(comp.pgid)
286
302
 
@@ -288,7 +304,7 @@ module Goat
288
304
 
289
305
  @registry.add_update(comp.pgid, txn, update)
290
306
  else
291
- $stderr.puts "Couldn't find component #{id}"
307
+ $stderr.puts "Couldn't find component #{update.skel.id}"
292
308
  end
293
309
  end
294
310
 
@@ -343,12 +359,30 @@ module Goat
343
359
  end
344
360
 
345
361
  def run
362
+ Goat.logd "Garbage collecting. Live objects: #{ObjectSpace.live_objects}"
346
363
  @registry.connected_pages.each do |pgid|
347
364
  if @registry.last_connected_delta(pgid) > (60 * 60)
348
365
  Goat.logd "Deleting page #{pgid}"
349
366
  @registry.delete_page(pgid)
367
+ else
368
+ user = @registry.page_user(pgid)
369
+ if user
370
+ pgs = @registry.user_pages(user).sort_by {|pg| @registry.last_connected_delta(pg)}
371
+ if pgs.count > 5
372
+ pgs[5..-1].each do |pg|
373
+ if @registry.last_connected_delta(pg) > 10 \
374
+ && !@registry.connected?(pg) \
375
+ && @registry.registration_delta(pg) > 10
376
+ Goat.logd "Deleting page #{pg} because user #{user} has too many pages open"
377
+ @registry.delete_page(pg)
378
+ end
379
+ end
380
+ end
381
+ end
350
382
  end
351
383
  end
384
+
385
+ Goat.logd "Done. Live objects: #{ObjectSpace.live_objects}"
352
386
  end
353
387
  end
354
388
 
data/goat.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'goat'
3
- s.version = '0.3.27'
3
+ s.version = '0.3.29'
4
4
  s.summary = 'Pre-release beta version of Goat'
5
5
  s.author = 'Patrick Collison'
6
6
  s.email = 'patrick@collison.ie'
data/lib/goat.rb CHANGED
@@ -568,7 +568,7 @@ module Goat
568
568
  if opts[:live]
569
569
  if skel = StateSrvClient.fetch_component(cid)
570
570
  component = Kernel.fetch_class(cls).from_skel(skel)
571
- component.deserialize(skel.state)
571
+ component.deserialize(skel.live_state)
572
572
 
573
573
  args << component
574
574
  else
@@ -784,7 +784,7 @@ module Goat
784
784
  c.skel
785
785
  end
786
786
 
787
- StateSrvClient.register_page(@id, pg_spec)
787
+ StateSrvClient.register_page(@id, self.user, pg_spec)
788
788
  end
789
789
 
790
790
  def _dom; self.dom; end
@@ -848,6 +848,8 @@ module Goat
848
848
  def erb=(erb); @erb = erb; #TODO make it work properly, but not support embenned components
849
849
  end
850
850
  def title=(title); @title = title; end
851
+
852
+ def user; end
851
853
  end
852
854
 
853
855
  class PageCanvas
@@ -1130,7 +1132,7 @@ module Goat
1130
1132
  def self.rerender(skel)
1131
1133
  Profile.in(:create_component)
1132
1134
  c = Kernel.fetch_class(skel.cls).from_skel(skel)
1133
- c.deserialize(skel.state)
1135
+ c.deserialize(skel.live_state)
1134
1136
  Profile.out(:create_component)
1135
1137
 
1136
1138
  c.rerender
@@ -1173,12 +1175,12 @@ module Goat
1173
1175
 
1174
1176
  def skel
1175
1177
  ComponentSkeleton.new(
1176
- @pgid,
1177
- self.class.name,
1178
- @id,
1179
- live_spec,
1180
- serialize,
1181
- @expanded_dom
1178
+ 'pgid' => @pgid,
1179
+ 'class' => self.class.name,
1180
+ 'id' => @id,
1181
+ 'live_spec' => live_spec,
1182
+ 'live_state' => serialize,
1183
+ 'dom' => @expanded_dom
1182
1184
  )
1183
1185
  end
1184
1186
 
@@ -1192,7 +1194,7 @@ module Goat
1192
1194
  @id = skel.id
1193
1195
  @pgid = skel.pgid
1194
1196
  @old_dom = skel.dom
1195
- @live_spec = skel.spec
1197
+ @live_spec = skel.live_spec
1196
1198
  end
1197
1199
 
1198
1200
  def rerender_partially(diff)
data/lib/goat/common.rb CHANGED
@@ -11,33 +11,45 @@ module Goat
11
11
  end
12
12
 
13
13
  class ComponentSkeleton
14
- attr_reader :pgid, :id, :spec
15
- attr_accessor :dom, :state
14
+ def ensure_keys(h, spec)
15
+ hash = h.clone
16
+ spec[:required].each do |k|
17
+ raise "#{k} not present" unless h.include?(k)
18
+ hash.delete(k)
19
+ end
20
+ spec[:optional].each {|k| hash.delete(k)}
16
21
 
17
- def cls; @class; end
22
+ raise "Unknown keys supplied: #{hash.keys.join(', ')}" unless hash.keys.empty?
23
+ end
18
24
 
19
- def initialize(pgid, cls, id, spec, state, dom)
20
- @pgid = pgid
21
- @class = cls
22
- @id = id
23
- @state = state
24
- @dom = dom
25
- @spec = spec
25
+ def initialize(h={})
26
+ ensure_keys(h,
27
+ :required => %w{pgid class id live_spec live_state dom}, :optional => []
28
+ )
29
+ @hash = h
26
30
  end
27
31
 
32
+ # in which we fail at DRY:
33
+ def cls; @hash['class']; end
34
+ def pgid; @hash['pgid']; end
35
+ def id; @hash['id']; end
36
+ def live_spec; @hash['live_spec']; end
37
+ def live_state; @hash['live_state']; end
38
+ def dom; @hash['dom']; end
39
+
40
+ def dom=(d); @hash['dom'] = d; end
41
+ def live_state=(s); @hash['live_state'] = s; end
42
+
28
43
  def self.from_hash(h)
29
- self.new(h['pgid'], h['class'], h['id'], h['spec'], h['state'], Marshal.load(h['dom']))
44
+ hash = h.clone
45
+ hash['dom'] = Marshal.load(h['dom'])
46
+ self.new(hash)
30
47
  end
31
48
 
32
49
  def to_hash
33
- {
34
- 'pgid' => @pgid,
35
- 'class' => @class,
36
- 'id' => @id,
37
- 'spec' => @spec,
38
- 'state' => @state,
39
- 'dom' => Marshal.dump(@dom),
40
- }
50
+ hash = @hash.clone
51
+ hash['dom'] = Marshal.dump(@hash['dom'])
52
+ hash
41
53
  end
42
54
  end
43
55
 
@@ -10,8 +10,8 @@ module Goat
10
10
  StateSrvConnection.send_message(type, m, sync)
11
11
  end
12
12
 
13
- def self.register_page(pgid, cs)
14
- send_message('register_page', 'pgid' => pgid, 'components' => cs.map(&:to_hash))
13
+ def self.register_page(pgid, user, cs)
14
+ send_message('register_page', 'pgid' => pgid, 'user' => user, 'components' => cs.map(&:to_hash))
15
15
  end
16
16
 
17
17
  def self.live_components(cls, spec)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: goat
3
3
  version: !ruby/object:Gem::Version
4
- hash: 37
4
+ hash: 41
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 27
10
- version: 0.3.27
9
+ - 29
10
+ version: 0.3.29
11
11
  platform: ruby
12
12
  authors:
13
13
  - Patrick Collison