replay 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/.rvmrc +1 -1
  3. data/Gemfile +7 -3
  4. data/Guardfile +10 -0
  5. data/LICENSE +21 -0
  6. data/README.md +153 -0
  7. data/Rakefile +15 -0
  8. data/lib/replay.rb +39 -10
  9. data/lib/replay/backends.rb +50 -0
  10. data/lib/replay/event_declarations.rb +36 -0
  11. data/lib/replay/event_decorator.rb +13 -0
  12. data/lib/replay/events.rb +24 -0
  13. data/lib/replay/inflector.rb +55 -0
  14. data/lib/replay/observer.rb +18 -0
  15. data/lib/replay/publisher.rb +72 -0
  16. data/lib/replay/repository.rb +61 -0
  17. data/lib/replay/repository/configuration.rb +30 -0
  18. data/lib/replay/repository/identity_map.rb +25 -0
  19. data/lib/replay/router.rb +5 -0
  20. data/lib/replay/router/default_router.rb +21 -0
  21. data/lib/replay/rspec.rb +50 -0
  22. data/lib/replay/subscription_manager.rb +28 -0
  23. data/lib/replay/test.rb +64 -0
  24. data/lib/replay/test/test_event_stream.rb +19 -0
  25. data/lib/replay/version.rb +1 -1
  26. data/proofs/all.rb +7 -0
  27. data/proofs/proofs_init.rb +10 -0
  28. data/proofs/replay/inflector_proof.rb +32 -0
  29. data/proofs/replay/publisher_proof.rb +170 -0
  30. data/proofs/replay/repository_configuration_proof.rb +67 -0
  31. data/proofs/replay/repository_proof.rb +46 -0
  32. data/proofs/replay/subscriber_manager_proof.rb +39 -0
  33. data/proofs/replay/test_proof.rb +28 -0
  34. data/replay.gemspec +5 -4
  35. data/test/replay/observer_spec.rb +37 -0
  36. data/test/replay/router/default_router_spec.rb +43 -0
  37. data/test/test_helper.rb +10 -0
  38. metadata +65 -48
  39. data/README +0 -27
  40. data/lib/replay/active_record_event_store.rb +0 -32
  41. data/lib/replay/domain.rb +0 -33
  42. data/lib/replay/event.rb +0 -27
  43. data/lib/replay/event_store.rb +0 -55
  44. data/lib/replay/projector.rb +0 -19
  45. data/lib/replay/test_storage.rb +0 -8
  46. data/lib/replay/unknown_event_error.rb +0 -2
  47. data/test/spec_helper.rb +0 -6
  48. data/test/test_events.sqlite3 +0 -0
  49. data/test/unit/active_record_event_store_spec.rb +0 -24
  50. data/test/unit/domain_spec.rb +0 -53
  51. data/test/unit/event_spec.rb +0 -13
  52. data/test/unit/event_store_spec.rb +0 -28
  53. data/test/unit/projector_spec.rb +0 -19
@@ -0,0 +1,10 @@
1
+ gem 'minitest'
2
+ gem 'replay'
3
+ gem 'byebug'
4
+
5
+ require 'minitest/autorun'
6
+ require 'minitest/spec'
7
+ require 'replay'
8
+ require 'replay/router'
9
+
10
+ require 'replay/test'
metadata CHANGED
@@ -1,64 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: replay
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - karmajunkie
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-05-06 00:00:00.000000000 Z
11
+ date: 2014-04-14 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- name: activerecord
14
+ name: bundler
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
20
32
  - !ruby/object:Gem::Version
21
33
  version: '0'
22
34
  type: :development
23
35
  prerelease: false
24
36
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
37
  requirements:
27
- - - ! '>='
38
+ - - '>='
28
39
  - !ruby/object:Gem::Version
29
40
  version: '0'
30
41
  - !ruby/object:Gem::Dependency
31
- name: sqlite3-ruby
42
+ name: minitest
32
43
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
44
  requirements:
35
- - - ! '>='
45
+ - - '>='
36
46
  - !ruby/object:Gem::Version
37
47
  version: '0'
38
48
  type: :development
39
49
  prerelease: false
40
50
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
51
  requirements:
43
- - - ! '>='
52
+ - - '>='
44
53
  - !ruby/object:Gem::Version
45
54
  version: '0'
46
55
  - !ruby/object:Gem::Dependency
47
- name: activesupport
56
+ name: virtus
48
57
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
58
  requirements:
51
- - - ! '>='
59
+ - - ~>
52
60
  - !ruby/object:Gem::Version
53
- version: '0'
61
+ version: 1.0.0
54
62
  type: :runtime
55
63
  prerelease: false
56
64
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
65
  requirements:
59
- - - ! '>='
66
+ - - ~>
60
67
  - !ruby/object:Gem::Version
61
- version: '0'
68
+ version: 1.0.0
62
69
  description: Replay supports event-sourced data models.
63
70
  email:
64
71
  - keith.gaddis@gmail.com
@@ -69,55 +76,65 @@ files:
69
76
  - .gitignore
70
77
  - .rvmrc
71
78
  - Gemfile
72
- - README
79
+ - Guardfile
80
+ - LICENSE
81
+ - README.md
73
82
  - Rakefile
74
83
  - lib/replay.rb
75
- - lib/replay/active_record_event_store.rb
84
+ - lib/replay/backends.rb
76
85
  - lib/replay/configuration.rb
77
- - lib/replay/domain.rb
78
- - lib/replay/event.rb
79
- - lib/replay/event_store.rb
80
- - lib/replay/projector.rb
81
- - lib/replay/test_storage.rb
82
- - lib/replay/unknown_event_error.rb
86
+ - lib/replay/event_declarations.rb
87
+ - lib/replay/event_decorator.rb
88
+ - lib/replay/events.rb
89
+ - lib/replay/inflector.rb
90
+ - lib/replay/observer.rb
91
+ - lib/replay/publisher.rb
92
+ - lib/replay/repository.rb
93
+ - lib/replay/repository/configuration.rb
94
+ - lib/replay/repository/identity_map.rb
95
+ - lib/replay/router.rb
96
+ - lib/replay/router/default_router.rb
97
+ - lib/replay/rspec.rb
98
+ - lib/replay/subscription_manager.rb
99
+ - lib/replay/test.rb
100
+ - lib/replay/test/test_event_stream.rb
83
101
  - lib/replay/version.rb
102
+ - proofs/all.rb
103
+ - proofs/proofs_init.rb
104
+ - proofs/replay/inflector_proof.rb
105
+ - proofs/replay/publisher_proof.rb
106
+ - proofs/replay/repository_configuration_proof.rb
107
+ - proofs/replay/repository_proof.rb
108
+ - proofs/replay/subscriber_manager_proof.rb
109
+ - proofs/replay/test_proof.rb
84
110
  - replay.gemspec
85
- - test/spec_helper.rb
86
- - test/test_events.sqlite3
87
- - test/unit/active_record_event_store_spec.rb
88
- - test/unit/domain_spec.rb
89
- - test/unit/event_spec.rb
90
- - test/unit/event_store_spec.rb
91
- - test/unit/projector_spec.rb
111
+ - test/replay/observer_spec.rb
112
+ - test/replay/router/default_router_spec.rb
113
+ - test/test_helper.rb
92
114
  homepage: ''
93
115
  licenses: []
116
+ metadata: {}
94
117
  post_install_message:
95
118
  rdoc_options: []
96
119
  require_paths:
97
120
  - lib
98
121
  required_ruby_version: !ruby/object:Gem::Requirement
99
- none: false
100
122
  requirements:
101
- - - ! '>='
123
+ - - '>='
102
124
  - !ruby/object:Gem::Version
103
125
  version: '0'
104
126
  required_rubygems_version: !ruby/object:Gem::Requirement
105
- none: false
106
127
  requirements:
107
- - - ! '>='
128
+ - - '>='
108
129
  - !ruby/object:Gem::Version
109
130
  version: '0'
110
131
  requirements: []
111
132
  rubyforge_project: replay
112
- rubygems_version: 1.8.24
133
+ rubygems_version: 2.2.2
113
134
  signing_key:
114
- specification_version: 3
135
+ specification_version: 4
115
136
  summary: Replay supports event-sourced data models.
116
137
  test_files:
117
- - test/spec_helper.rb
118
- - test/test_events.sqlite3
119
- - test/unit/active_record_event_store_spec.rb
120
- - test/unit/domain_spec.rb
121
- - test/unit/event_spec.rb
122
- - test/unit/event_store_spec.rb
123
- - test/unit/projector_spec.rb
138
+ - test/replay/observer_spec.rb
139
+ - test/replay/router/default_router_spec.rb
140
+ - test/test_helper.rb
data/README DELETED
@@ -1,27 +0,0 @@
1
- class Domain::Model
2
- include Replay::Domain
3
-
4
- def twitter_update
5
- #do stuff
6
- signal_event "twitter_updated", status
7
- self.save
8
- end
9
-
10
- apply "twitter_updated" do |status|
11
- model.twitter_status = status
12
- end
13
-
14
- end
15
-
16
-
17
- #usage
18
- model = Model.find(params[:model_id])
19
- model.twitter_update
20
-
21
- #listener
22
- class TweetReport
23
- include Replay::Projector
24
- listen :twitter_updated do |model_id, status|
25
- #update read model/report/whatever...
26
- end
27
- end
@@ -1,32 +0,0 @@
1
- if defined?(ActiveRecord)
2
- module Replay
3
- class ActiveRecordEvent < ::ActiveRecord::Base
4
- set_table_name "replay_events"
5
- serialize :arguments
6
- end
7
-
8
- #needs model id
9
- class ActiveRecordEventLogEntry < ::ActiveRecord::Base
10
- set_table_name "replay_event_log_entries"
11
- serialize :data
12
- end
13
-
14
- class ActiveRecordEventStore
15
- def store(event, model_id, *args)
16
- ar_event = Replay::ActiveRecordEvent.new
17
- ar_event.event = event
18
- ar_event.model_id = model_id
19
- ar_event.arguments = args
20
- ar_event.save
21
- end
22
-
23
- def log_event(event, model_id, *args)
24
- log_entry = Replay::ActiveRecordEventLogEntry.new
25
- log_entry.event = event
26
- log_entry.model_id = model_id
27
- log_entry.data = args
28
- log_entry.save
29
- end
30
- end
31
- end
32
- end
data/lib/replay/domain.rb DELETED
@@ -1,33 +0,0 @@
1
- module Replay::Domain
2
- extend ActiveSupport::Concern
3
- include Replay
4
-
5
- included do
6
- self.extend ClassMethods
7
- self.event_blocks = {}
8
- end
9
-
10
- def signal_event(event, *args)
11
- EventStore.handle_event(event, self.id, *args)
12
- apply_event(event, *args)
13
- end
14
-
15
- def apply_event(event, *args)
16
- event_block = event_blocks[event.to_sym]
17
- raise UnknownEventError.new("#{event} is not a known event on class #{self.class.name}") unless event_block
18
- EventStore.log_event(event, self.id, *args)
19
- self.instance_exec(*args, &event_block)
20
- end
21
-
22
- def event_blocks
23
- self.class.event_blocks
24
- end
25
-
26
- module ClassMethods
27
- def apply(event, &block)
28
- event_blocks[event.to_sym] = block
29
- end
30
-
31
- attr_accessor :event_blocks
32
- end
33
- end
data/lib/replay/event.rb DELETED
@@ -1,27 +0,0 @@
1
- module Replay
2
- class Event
3
- attr_accessor :event_type, :attributes
4
-
5
- def initialize(event_type, *data)
6
- @event_type = event_type
7
- if data.first.kind_of? Hash
8
- @attributes = HashWithIndifferentAccess.new data.first.dup
9
- else
10
- @attributes = HashWithIndifferentAccess.new({data.first => data.last})
11
- end
12
- end
13
-
14
- def method_missing(method, *args)
15
- method_root = method.to_s.gsub(/=$/, "")
16
- if @attributes && @attributes.has_key?(method_root)
17
- if method.to_s[/=$/]
18
- @attributes[method_root] = args.first
19
- else
20
- @attributes[method]
21
- end
22
- else
23
- nil
24
- end
25
- end
26
- end
27
- end
@@ -1,55 +0,0 @@
1
- module Replay
2
- class EventStore
3
- include Replay
4
-
5
- class << self
6
- attr_accessor :configuration
7
- attr_accessor :listeners
8
- attr_accessor :test_mode
9
- attr_accessor :event_stream
10
- end
11
- self.listeners = {}
12
- self.configuration = Replay::Configuration.new
13
- self.event_stream = []
14
-
15
- def self.configure(&block)
16
- block.call(self.configuration)
17
- end
18
-
19
- def self.storage
20
- configuration.storage
21
- end
22
-
23
- def self.add_listener(event, new_listener)
24
- self.listeners[event] = [] unless self.listeners[event]
25
- self.listeners[event] << new_listener
26
- end
27
-
28
- def self.clear_listeners
29
- listeners = {}
30
- end
31
-
32
- def self.log_event(event, model_id, *args)
33
- if configuration.storage
34
- configuration.storage.each do |event_store_adapter|
35
- event_store_adapter.log_event(event, model_id, *args)
36
- end
37
- end
38
- end
39
-
40
- def self.handle_event(event, model_id, *args)
41
- self.event_stream << Event.new(event, args.last) if self.test_mode
42
-
43
- if configuration.storage
44
- configuration.storage.each do |event_store_adapter|
45
- event_store_adapter.store(event, model_id, *args)
46
- end
47
- end
48
- if self.listeners[event]
49
- self.listeners[event].each do |listener|
50
- listener.handle_event(event, model_id, *args)
51
- end
52
- end
53
- end
54
- end
55
- end
@@ -1,19 +0,0 @@
1
- module Replay::Projector
2
- extend ActiveSupport::Concern
3
-
4
- included do
5
- self.extend(ClassMethods)
6
- self.listening_blocks = {}
7
- end
8
-
9
- module ClassMethods
10
- def listen(event, &block)
11
- listening_blocks[event] = [] unless listening_blocks[event]
12
- listening_blocks[event] << block
13
- Replay::EventStore.add_listener(event, self)
14
- end
15
-
16
- private
17
- attr_accessor :listening_blocks
18
- end
19
- end
@@ -1,8 +0,0 @@
1
- module Replay
2
- class TestStorage
3
- # To change this template use File | Settings | File Templates.
4
- def store(event, id, *args)
5
- true
6
- end
7
- end
8
- end
@@ -1,2 +0,0 @@
1
- class UnknownEventError < RuntimeError
2
- end
data/test/spec_helper.rb DELETED
@@ -1,6 +0,0 @@
1
- $:<<"lib"
2
- require 'active_record'
3
- require 'minitest/autorun'
4
- require 'replay'
5
- require 'ruby-debug'
6
- require 'mocha'
Binary file
@@ -1,24 +0,0 @@
1
- require './test/spec_helper'
2
-
3
- ::ActiveRecord::Base.establish_connection(
4
- :adapter => "sqlite3",
5
- :database => "test/test_events.sqlite3"
6
- )
7
- ::ActiveRecord::Base.connection.execute("create table if not exists replay_events(id primary key, event, model_id, arguments, created_at, updated_at)")
8
-
9
- describe Replay::ActiveRecordEventStore do
10
- before do
11
- @store = Replay::ActiveRecordEventStore.new
12
- end
13
- def action
14
- @store.store(:foo_event, 123, 'bar')
15
- end
16
- describe "#store" do
17
- it "should create an event in the database" do
18
- count = Replay::ActiveRecordEvent.count
19
- action
20
- (Replay::ActiveRecordEvent.count - count).must_equal 1
21
- end
22
-
23
- end
24
- end