metacosm 0.2.11 → 0.2.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f1364b08565c171187ac2147a3812327ae0bacd
4
- data.tar.gz: 5c41390aa54ece8be01a6bd52beea209a1a98d97
3
+ metadata.gz: 8dc2f64e388c19864b4913a01eeb821f6016fdde
4
+ data.tar.gz: 0e3f337465c42548784342fde5260f93b14c8808
5
5
  SHA512:
6
- metadata.gz: 0f214a30b472251583b7db4f880feaf3fb7ce29104ea57b47eec8ba52ade6ce8de1602bc9cfb8ab3bd266ae67e317324c95661bbba94ce98cfca3b9375e09873
7
- data.tar.gz: 6a934a31535a83c58a01dc18d8001c48eeda2571c340e279c0cdd352bd7e1047d50fa3a877e4faca6bd25ea798c6c84d436d4a8ad96f17e315e1ab719e9af270
6
+ metadata.gz: 28c5f71234421d6fc5c1ac19161dcf8f8b149e30b771c58168becdb2c9c2888d56cd31d372b46f1e8f8566f55ea763a886b7dffa2af030b402790bd8becf186f
7
+ data.tar.gz: 1bcad03a5914c8cb0b47c5ddb7bf5a219dc7433e59b246b74a7b14844dc4fb755157701ce0b14950eefe1965c59ad67794fc5664d4313296d0a0c9f46621fb49
data/Gemfile CHANGED
@@ -4,9 +4,9 @@ ruby '2.3.0'
4
4
 
5
5
  gemspec
6
6
 
7
- gem 'frappuccino'
8
7
  gem 'activesupport'
9
8
  gem 'passive_record'
9
+ gem 'redis'
10
10
 
11
11
  group :test do
12
12
  gem 'rspec-its'
data/gemspec.yml CHANGED
@@ -7,7 +7,7 @@ email: jweissman1986@gmail.com
7
7
  homepage: https://rubygems.org/gems/metacosm
8
8
  dependencies:
9
9
  passive_record: ~> 0.3
10
- frappuccino: ~> 0.3
10
+ redis: ~> 3.2
11
11
  development_dependencies:
12
12
  bundler: ~> 1.10
13
13
  codeclimate-test-reporter: ~> 0.1
data/lib/metacosm.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'passive_record'
2
- require 'frappuccino'
3
2
 
4
3
  require 'metacosm/version'
5
4
  require 'metacosm/model'
@@ -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
- Simulation.current.watch(self)
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
@@ -0,0 +1,6 @@
1
+ module Metacosm
2
+ # class RedisSimulation < Simulation
3
+ # # need to override remote command/event queue logic
4
+ # # and use redis pub/sub instead...
5
+ # end
6
+ end
@@ -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
- else
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
- handler = handler_for(command)
47
- handler.handle(command.attrs)
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 event_stream
52
- @event_stream ||= EventStream.new(self)
53
- end
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
- def has_event_stream?
56
- !@event_stream.nil?
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 receive(event, record: true)
60
- if record
61
- events.push(event)
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
- listener = listener_for(event)
66
- if event.attrs.any?
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 #class.name.deconstantize
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
@@ -1,4 +1,4 @@
1
1
  module Metacosm
2
2
  # metacosm version
3
- VERSION = "0.2.11"
3
+ VERSION = "0.2.12"
4
4
  end
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.11
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: frappuccino
28
+ name: redis
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.3'
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: '0.3'
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