replay 0.0.1 → 0.1.0

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