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 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