goat 0.3.32 → 0.3.33
Sign up to get free protection for your applications and to get access to all the features.
- data/goat.gemspec +1 -1
- data/lib/goat/mongo.rb +26 -0
- data/lib/goat/notifications.rb +11 -5
- data/lib/goat/state-srv.rb +11 -3
- data/lib/goat.rb +64 -49
- metadata +4 -4
data/goat.gemspec
CHANGED
data/lib/goat/mongo.rb
CHANGED
@@ -26,3 +26,29 @@ module Mongo
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
29
|
+
|
30
|
+
module MongoComponent
|
31
|
+
def self.db_notifications; @db_notifications ||= {}; end
|
32
|
+
|
33
|
+
def self.db_notification_subscribe(coll, depkey, &blk)
|
34
|
+
db_notifications[coll] = depkey
|
35
|
+
|
36
|
+
Goat::NotificationCenter.subscribe(self, :db_notification_recv,
|
37
|
+
'type' => 'db_action',
|
38
|
+
'collection' => coll
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.db_notification_recv(notif)
|
43
|
+
if notif['obj'] && notif['collection']
|
44
|
+
depkey = db_notifications[notif['collection']]
|
45
|
+
if depkey && (dep = notif['obj'][depkey])
|
46
|
+
rerender_and_update([dep])
|
47
|
+
end
|
48
|
+
else
|
49
|
+
raise "Invalid notification: #{notif.inspect}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
data/lib/goat/notifications.rb
CHANGED
@@ -28,16 +28,20 @@ module Goat
|
|
28
28
|
Receiver.start(@host, @recv_port)
|
29
29
|
end
|
30
30
|
|
31
|
-
def self.enabled?; @configured; end
|
32
|
-
|
33
31
|
def self.configure(opts={})
|
34
|
-
opts = {:host => '127.0.0.1', :recv_port => 8000, :send_port => 8001}.merge(opts)
|
35
|
-
@configured = true
|
36
32
|
@host = opts[:host]
|
37
33
|
@recv_port = opts[:recv_port]
|
38
34
|
@send_port = opts[:send_port]
|
35
|
+
end
|
39
36
|
|
40
|
-
|
37
|
+
def self.set_defaults
|
38
|
+
@host ||= '127.0.0.1'
|
39
|
+
@recv_port ||= 8000
|
40
|
+
@send_port ||= 8001
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.schedule
|
44
|
+
EM.next_tick { set_defaults; self.start_receiver }
|
41
45
|
end
|
42
46
|
|
43
47
|
def self.subscribers; @subscribers ||= Set.new; end
|
@@ -92,6 +96,8 @@ module Goat
|
|
92
96
|
end
|
93
97
|
|
94
98
|
def self.notify(notif)
|
99
|
+
set_defaults # maybe #schedule or #configure never got called
|
100
|
+
|
95
101
|
if Dynamic.variable?(:txn)
|
96
102
|
notif['txn'] = Dynamic[:txn]
|
97
103
|
notif['txn_pgid'] = Dynamic[:txn_pgid]
|
data/lib/goat/state-srv.rb
CHANGED
@@ -1,9 +1,17 @@
|
|
1
1
|
module Goat
|
2
2
|
module StateSrvClient
|
3
3
|
def self.configure(opts={})
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
@host = opts[:host]
|
5
|
+
@port = opts[:port]
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.schedule
|
9
|
+
EM.next_tick {
|
10
|
+
StateSrvConnection.connect(
|
11
|
+
@host || '127.0.0.1',
|
12
|
+
@port || 8011
|
13
|
+
)
|
14
|
+
}
|
7
15
|
end
|
8
16
|
|
9
17
|
def self.send_message(type, m, sync=false)
|
data/lib/goat.rb
CHANGED
@@ -69,67 +69,77 @@ module Goat
|
|
69
69
|
|
70
70
|
def self.goat_path(f); File.join(File.dirname(__FILE__), 'goat', f); end
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
72
|
+
class Config
|
73
|
+
def initialize
|
74
|
+
@config = {}
|
75
|
+
end
|
75
76
|
|
76
|
-
|
77
|
-
|
78
|
-
|
77
|
+
def enable_notifications(opts={})
|
78
|
+
NotificationCenter.configure(opts)
|
79
|
+
end
|
79
80
|
|
80
|
-
|
81
|
-
|
82
|
-
|
81
|
+
def enable_statesrv(opts={})
|
82
|
+
StateSrvClient.configure(opts)
|
83
|
+
end
|
83
84
|
|
84
|
-
|
85
|
-
|
86
|
-
|
85
|
+
def enable_mongo(opts={})
|
86
|
+
require Goat.goat_path('mongo')
|
87
|
+
end
|
87
88
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
89
|
+
def get!(opt)
|
90
|
+
if @config.include?(opt)
|
91
|
+
@config[opt]
|
92
|
+
else
|
93
|
+
raise "#{opt} not set"
|
94
|
+
end
|
92
95
|
end
|
93
|
-
end
|
94
96
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
end
|
97
|
+
def add_component_helpers(modul)
|
98
|
+
Goat::Component.send(:include, modul)
|
99
|
+
end
|
99
100
|
|
100
|
-
|
101
|
-
|
102
|
-
@
|
103
|
-
|
104
|
-
|
101
|
+
def [](k); @config[k]; end
|
102
|
+
def []=(k, v)
|
103
|
+
@config[k] = v
|
104
|
+
|
105
|
+
meth = "enable_#{k}".to_sym
|
106
|
+
if self.respond_to?(meth)
|
107
|
+
self.send(meth, v)
|
108
|
+
end
|
105
109
|
end
|
106
110
|
end
|
107
111
|
|
108
|
-
def self.
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
+
def self.load_all(dir_fragment)
|
113
|
+
dir = File.join(Goat.config.get!(:root), dir_fragment)
|
114
|
+
if File.directory?(dir)
|
115
|
+
Dir.entries(dir).select{|f| f =~ /\.rb$/}.each {|f| require(File.join(dir, f))}
|
116
|
+
end
|
112
117
|
end
|
113
118
|
|
119
|
+
def self.config; @config; end
|
120
|
+
|
114
121
|
def self.configure(&blk)
|
115
|
-
|
122
|
+
@config = Config.new
|
123
|
+
|
124
|
+
blk.call(@config)
|
116
125
|
|
117
126
|
load_all('components')
|
118
127
|
load_all('pages')
|
119
128
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
end
|
129
|
+
# disabled for now
|
130
|
+
#if p = Goat.setting(:press)
|
131
|
+
# Goat::Static.press = p
|
132
|
+
#end
|
125
133
|
|
126
|
-
if
|
134
|
+
if @config[:debug]
|
127
135
|
if defined?(Thin)
|
128
136
|
Thin::Logging.debug = true
|
129
137
|
end
|
130
138
|
end
|
131
139
|
|
132
|
-
|
140
|
+
Goat::StateSrvClient.schedule
|
141
|
+
Goat::NotificationCenter.schedule
|
142
|
+
UpdateDispatcher.enable
|
133
143
|
end
|
134
144
|
|
135
145
|
def self.rack_builder(app, opts={})
|
@@ -137,13 +147,13 @@ module Goat
|
|
137
147
|
opts = defaults.merge(opts)
|
138
148
|
|
139
149
|
Rack::Builder.new do
|
140
|
-
if cookies = Goat.
|
150
|
+
if cookies = Goat.config[:cookies]
|
141
151
|
use Rack::Session::Cookie, cookies
|
142
152
|
end
|
143
153
|
|
144
154
|
use opts[:logger]
|
145
155
|
|
146
|
-
if static = Goat.
|
156
|
+
if static = Goat.config[:static]
|
147
157
|
use Rack::Static, :urls => static.fetch(:urls), :root => static.fetch(:root)
|
148
158
|
end
|
149
159
|
|
@@ -153,6 +163,11 @@ module Goat
|
|
153
163
|
end
|
154
164
|
end
|
155
165
|
|
166
|
+
def self.run_app(app, opts={})
|
167
|
+
builder = rack_builder(app, opts)
|
168
|
+
Rack::Handler::Thin.run(builder.to_app)
|
169
|
+
end
|
170
|
+
|
156
171
|
class NotFoundError < RuntimeError
|
157
172
|
attr_reader :path
|
158
173
|
|
@@ -437,10 +452,10 @@ module Goat
|
|
437
452
|
if name =~ /\.erb$/ # allow an absolute path to be passed
|
438
453
|
erbf = name
|
439
454
|
else
|
440
|
-
erbf = File.join(Goat.
|
455
|
+
erbf = File.join(Goat.config.get!(:root), 'views', "#{name}.erb")
|
441
456
|
end
|
442
457
|
|
443
|
-
layf = File.join(Goat.
|
458
|
+
layf = File.join(Goat.config.get!(:root), 'views', 'layout.erb')
|
444
459
|
template = Tilt[:erb].new(erbf) { File.read(erbf) }
|
445
460
|
|
446
461
|
layout = File.read(layf) if File.exists?(layf) && !partial && use_layout
|
@@ -533,10 +548,6 @@ module Goat
|
|
533
548
|
around_handlers << [:after, blk]
|
534
549
|
end
|
535
550
|
|
536
|
-
def enable_notifications(opts={})
|
537
|
-
NotificationCenter.configure(opts)
|
538
|
-
end
|
539
|
-
|
540
551
|
def respond_success; [200, {}, ['ok']]; end
|
541
552
|
def respond_failed; [500, {}, ['failed']]; end
|
542
553
|
|
@@ -721,7 +732,7 @@ module Goat
|
|
721
732
|
|
722
733
|
def unpressed_component_classes
|
723
734
|
ordered_component_classes.to_a.reject do |cls|
|
724
|
-
Goat.
|
735
|
+
Goat.config[:press] && Goat::Static.pressed?(cls)
|
725
736
|
end
|
726
737
|
end
|
727
738
|
|
@@ -759,6 +770,9 @@ module Goat
|
|
759
770
|
|
760
771
|
def self.handle_request(app)
|
761
772
|
pg = self.new(app)
|
773
|
+
|
774
|
+
raise "Page #{pg} has no id: did you forget to call super()?" unless pg.id
|
775
|
+
|
762
776
|
pg.response
|
763
777
|
end
|
764
778
|
|
@@ -1283,8 +1297,9 @@ module Goat
|
|
1283
1297
|
def clientside_args; []; end
|
1284
1298
|
|
1285
1299
|
def clientside_instance
|
1286
|
-
args = [id, @parent ? @parent.id : nil, clientside_args]
|
1287
|
-
|
1300
|
+
args = [id, @parent ? @parent.id : nil, clientside_args]
|
1301
|
+
argjson = args.to_json[1..-2] # strip the braces
|
1302
|
+
"(new #{self.class.name}('#{self.class.name}', #{argjson}))"
|
1288
1303
|
end
|
1289
1304
|
|
1290
1305
|
def self.rpc(name, opts={}, &blk)
|
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:
|
4
|
+
hash: 81
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 33
|
10
|
+
version: 0.3.33
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Patrick Collison
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-18 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|