metacosm 0.2.11 → 0.2.12
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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/gemspec.yml +1 -1
- data/lib/metacosm.rb +0 -1
- data/lib/metacosm/model.rb +7 -3
- data/lib/metacosm/redis_simulation.rb +6 -0
- data/lib/metacosm/simulation.rb +85 -32
- data/lib/metacosm/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8dc2f64e388c19864b4913a01eeb821f6016fdde
|
4
|
+
data.tar.gz: 0e3f337465c42548784342fde5260f93b14c8808
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28c5f71234421d6fc5c1ac19161dcf8f8b149e30b771c58168becdb2c9c2888d56cd31d372b46f1e8f8566f55ea763a886b7dffa2af030b402790bd8becf186f
|
7
|
+
data.tar.gz: 1bcad03a5914c8cb0b47c5ddb7bf5a219dc7433e59b246b74a7b14844dc4fb755157701ce0b14950eefe1965c59ad67794fc5664d4313296d0a0c9f46621fb49
|
data/Gemfile
CHANGED
data/gemspec.yml
CHANGED
data/lib/metacosm.rb
CHANGED
data/lib/metacosm/model.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
1
|
module Metacosm
|
2
2
|
class Model
|
3
3
|
include PassiveRecord
|
4
|
-
before_create :register_observer
|
4
|
+
# before_create :register_observer
|
5
5
|
after_create :emit_creation_event
|
6
6
|
after_update :emit_updation_event
|
7
7
|
after_destroy :emit_destruction_event
|
8
8
|
|
9
9
|
private
|
10
|
-
def register_observer
|
11
|
-
|
10
|
+
# def register_observer
|
11
|
+
# Simulation.current.watch(self)
|
12
|
+
# end
|
13
|
+
|
14
|
+
def emit(event)
|
15
|
+
Simulation.current.receive(event)
|
12
16
|
end
|
13
17
|
|
14
18
|
def emit_creation_event
|
data/lib/metacosm/simulation.rb
CHANGED
@@ -1,15 +1,5 @@
|
|
1
|
-
require 'drb/drb'
|
2
1
|
module Metacosm
|
3
|
-
class EventStream < Frappuccino::Stream
|
4
|
-
include DRb::DRbUndumped
|
5
|
-
end
|
6
|
-
|
7
2
|
class Simulation
|
8
|
-
attr_accessor :running
|
9
|
-
def watch(model)
|
10
|
-
Frappuccino::Stream.new(model).on_value(&method(:receive))
|
11
|
-
end
|
12
|
-
|
13
3
|
def fire(command)
|
14
4
|
command_queue.push(command)
|
15
5
|
end
|
@@ -18,6 +8,10 @@ module Metacosm
|
|
18
8
|
@command_queue ||= Queue.new
|
19
9
|
end
|
20
10
|
|
11
|
+
def event_queue
|
12
|
+
@event_queue ||= Queue.new
|
13
|
+
end
|
14
|
+
|
21
15
|
def conduct!
|
22
16
|
@conductor_thread = Thread.new { execute }
|
23
17
|
end
|
@@ -26,10 +20,9 @@ module Metacosm
|
|
26
20
|
while true
|
27
21
|
if (command=command_queue.pop)
|
28
22
|
apply(command)
|
29
|
-
|
30
|
-
thread.pass
|
31
|
-
sleep 0.001
|
23
|
+
sleep 0.01
|
32
24
|
end
|
25
|
+
Thread.pass
|
33
26
|
end
|
34
27
|
end
|
35
28
|
|
@@ -43,33 +36,95 @@ module Metacosm
|
|
43
36
|
|
44
37
|
def apply(command)
|
45
38
|
mutex.synchronize do
|
46
|
-
|
47
|
-
|
39
|
+
if command.is_a?(Hash)
|
40
|
+
handler_module_name = command.delete(:handler_module)
|
41
|
+
handler_class_name = command.delete(:handler_class_name)
|
42
|
+
module_name = handler_module_name
|
43
|
+
handler = (module_name.constantize).
|
44
|
+
const_get(handler_class_name).new
|
45
|
+
handler.handle(command)
|
46
|
+
else
|
47
|
+
handler = handler_for(command)
|
48
|
+
handler.handle(command.attrs)
|
49
|
+
end
|
48
50
|
end
|
49
51
|
end
|
50
52
|
|
51
|
-
def
|
52
|
-
|
53
|
-
|
53
|
+
def apply_event(event)
|
54
|
+
if !@on_event_callback.nil?
|
55
|
+
event_dto = event.attrs.merge(listener_module: event.listener_module_name, listener_class_name: event.listener_class_name)
|
56
|
+
@on_event_callback[event_dto]
|
57
|
+
end
|
54
58
|
|
55
|
-
|
56
|
-
|
59
|
+
if !@event_publication_channel.nil?
|
60
|
+
event_dto = event.attrs.merge(listener_module: event.listener_module_name, listener_class_name: event.listener_class_name)
|
61
|
+
redis = Redis.new
|
62
|
+
redis.publish(@event_publication_channel, Marshal.dump(event_dto))
|
63
|
+
end
|
64
|
+
|
65
|
+
if !local_events_disabled?
|
66
|
+
listener = listener_for(event)
|
67
|
+
if event.attrs.any?
|
68
|
+
listener.receive(event.attrs)
|
69
|
+
else
|
70
|
+
listener.receive
|
71
|
+
end
|
72
|
+
end
|
57
73
|
end
|
58
74
|
|
59
|
-
def
|
60
|
-
|
61
|
-
|
62
|
-
emit(event) if has_event_stream?
|
75
|
+
def on_event(publish_to:nil,&blk)
|
76
|
+
unless publish_to.nil?
|
77
|
+
@event_publication_channel = publish_to
|
63
78
|
end
|
64
79
|
|
65
|
-
|
66
|
-
|
67
|
-
listener.receive(event.attrs)
|
68
|
-
else
|
69
|
-
listener.receive
|
80
|
+
if block_given?
|
81
|
+
@on_event_callback = blk
|
70
82
|
end
|
71
83
|
end
|
72
84
|
|
85
|
+
# TODO lift this stuff from socius
|
86
|
+
# def push_commands_to(channel:)
|
87
|
+
# @command_push_channel = channel
|
88
|
+
# end
|
89
|
+
|
90
|
+
def subscribe_for_commands(channel:)
|
91
|
+
p [ :subscribe_to_command_channel, channel: channel ]
|
92
|
+
redis = Redis.new
|
93
|
+
begin
|
94
|
+
redis.subscribe(channel) do |on|
|
95
|
+
on.subscribe do |chan, subscriptions|
|
96
|
+
puts "Subscribed to ##{chan} (#{subscriptions} subscriptions)"
|
97
|
+
end
|
98
|
+
|
99
|
+
on.message do |chan, message|
|
100
|
+
puts "##{chan}: #{message}"
|
101
|
+
apply(Marshal.load(message))
|
102
|
+
end
|
103
|
+
|
104
|
+
on.unsubscribe do |chan, subscriptions|
|
105
|
+
puts "Unsubscribed from ##{chan} (#{subscriptions} subscriptions)"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
rescue Redis::BaseConnectionError => error
|
109
|
+
puts "#{error}, retrying in 1s"
|
110
|
+
sleep 1
|
111
|
+
retry
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def disable_local_events
|
116
|
+
@local_events_disabled = true
|
117
|
+
end
|
118
|
+
|
119
|
+
def local_events_disabled?
|
120
|
+
@local_events_disabled ||= false
|
121
|
+
end
|
122
|
+
|
123
|
+
def receive(event, record: true)
|
124
|
+
events.push(event) if record
|
125
|
+
apply_event(event)
|
126
|
+
end
|
127
|
+
|
73
128
|
def events
|
74
129
|
@events ||= []
|
75
130
|
end
|
@@ -91,7 +146,6 @@ module Metacosm
|
|
91
146
|
|
92
147
|
def construct_handler_for(command)
|
93
148
|
module_name = command.handler_module_name
|
94
|
-
# module_name = "Object" if module_name.empty?
|
95
149
|
(module_name.constantize).
|
96
150
|
const_get(command.handler_class_name).new
|
97
151
|
rescue => ex
|
@@ -105,8 +159,7 @@ module Metacosm
|
|
105
159
|
end
|
106
160
|
|
107
161
|
def construct_listener_for(event)
|
108
|
-
module_name = event.listener_module_name
|
109
|
-
# module_name = "Object" if module_name.empty?
|
162
|
+
module_name = event.listener_module_name
|
110
163
|
listener = (module_name.constantize).const_get(event.listener_class_name).new(self)
|
111
164
|
listener
|
112
165
|
end
|
data/lib/metacosm/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metacosm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joseph Weissman
|
@@ -25,19 +25,19 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: redis
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '3.2'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '3.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -163,6 +163,7 @@ files:
|
|
163
163
|
- gemspec.yml
|
164
164
|
- lib/metacosm.rb
|
165
165
|
- lib/metacosm/model.rb
|
166
|
+
- lib/metacosm/redis_simulation.rb
|
166
167
|
- lib/metacosm/simulation.rb
|
167
168
|
- lib/metacosm/support/spec_harness.rb
|
168
169
|
- lib/metacosm/support/test_harness.rb
|