rom-event_store 0.0.1 → 0.0.2
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/.gitignore +1 -0
- data/.rubocop.yml +4 -0
- data/.travis.yml +7 -1
- data/lib/rom/event_store/commands.rb +13 -0
- data/lib/rom/event_store/connection.rb +104 -0
- data/lib/rom/event_store/dataset.rb +41 -0
- data/lib/rom/event_store/relation.rb +9 -0
- data/lib/rom/event_store/repository.rb +25 -0
- data/lib/rom/event_store/version.rb +1 -1
- data/lib/rom/event_store.rb +6 -5
- data/rom-event_store.gemspec +2 -0
- metadata +41 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7cf49a845b2891de79c5be6b742089243f0a8afb
|
4
|
+
data.tar.gz: 872a3a6f385f8262afa37a8fe53c2c96c14dc861
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89f984a4f66ed78410a7a0dee95c3fbe484de11c246ea837a0b3f18815edcb905eb2da6a3d34f0e1b1352070e6509f09d8f3f477c6d406c05568d2ba0a09a0c3
|
7
|
+
data.tar.gz: 84dee31899fca106b31c004b1490c728ba1c5bd69b1053c6197b97af14e96fb99b0727f539a5c7941c1f33a7ca02cb076682067a6858d5ddcb2ce3e96dbc5188
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
@@ -5,7 +5,13 @@ bundler_args: --without yard guard benchmarks tools
|
|
5
5
|
env:
|
6
6
|
global:
|
7
7
|
- JRUBY_OPTS='--dev -J-Xmx1024M'
|
8
|
-
- CODECLIMATE_REPO_TOKEN=
|
8
|
+
- CODECLIMATE_REPO_TOKEN=1180196768475653637086abfbc1c302a26abde3b8698a8e36c92b4004d193f3
|
9
|
+
install:
|
10
|
+
- "wget -nc http://download.geteventstore.com/binaries/EventStore-OSS-Linux-v3.0.3.tar.gz"
|
11
|
+
- "tar -xvzf EventStore-OSS-Linux-v3.0.3.tar.gz"
|
12
|
+
- "mv EventStore-OSS-Linux-v3.0.3 .event_store"
|
13
|
+
- "cd .event_store && ./run-node.sh --db ./ESData &"
|
14
|
+
- "bundle install"
|
9
15
|
script: "bundle exec rake ci"
|
10
16
|
rvm:
|
11
17
|
- 2.0
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'json'
|
3
|
+
require 'securerandom'
|
4
|
+
require 'transproc/all'
|
5
|
+
|
6
|
+
module ROM
|
7
|
+
module EventStore
|
8
|
+
class Connection
|
9
|
+
EVENTS_CONTENT_TYPE = 'application/vnd.eventstore.events+json'
|
10
|
+
|
11
|
+
def initialize(uri)
|
12
|
+
uri = URI("http://#{uri}")
|
13
|
+
@http = Net::HTTP.new(uri.host, uri.port)
|
14
|
+
end
|
15
|
+
|
16
|
+
def events(category, stream_id = nil)
|
17
|
+
events = __get__(stream_uri(category, stream_id))['entries'] || []
|
18
|
+
events.map { |event| AtomMapper[event] }
|
19
|
+
end
|
20
|
+
|
21
|
+
def append(category, stream_id, events)
|
22
|
+
__post__(stream_uri!(category, stream_id), events)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
ConnectionFailedError = Class.new(StandardError)
|
28
|
+
UndefinedStreamError = Class.new(StandardError)
|
29
|
+
|
30
|
+
def stream_uri(category, stream_id)
|
31
|
+
stream = stream_id ? "#{category}-#{stream_id}" : category
|
32
|
+
"/streams/#{stream}?embed=body"
|
33
|
+
end
|
34
|
+
|
35
|
+
def stream_uri!(category, stream_id)
|
36
|
+
raise UndefinedStreamError unless stream_id
|
37
|
+
stream_uri(category, stream_id)
|
38
|
+
end
|
39
|
+
|
40
|
+
def __get__(stream)
|
41
|
+
response = @http.get(stream, 'Accept' => 'application/json')
|
42
|
+
|
43
|
+
case response.code.to_i
|
44
|
+
when 200
|
45
|
+
JSON.parse(response.body)
|
46
|
+
when 404
|
47
|
+
nil
|
48
|
+
else
|
49
|
+
raise ConnectionFailedError
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def __post__(stream, events)
|
54
|
+
payload = events.map { |event| AtomMapper.prepare(event) }.to_json
|
55
|
+
response = @http.post(stream, payload,
|
56
|
+
'Content-Type' => EVENTS_CONTENT_TYPE)
|
57
|
+
|
58
|
+
case response.code.to_i
|
59
|
+
when 201
|
60
|
+
nil
|
61
|
+
else
|
62
|
+
raise ConnectionFailedError
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
module AtomMapper
|
67
|
+
extend Transproc::Composer
|
68
|
+
|
69
|
+
ALIASES = {
|
70
|
+
eventId: :id,
|
71
|
+
eventType: :type,
|
72
|
+
eventNumber: :number,
|
73
|
+
updated: :created_at
|
74
|
+
}.freeze
|
75
|
+
|
76
|
+
ATTRS = (ALIASES.values + [:data]).freeze
|
77
|
+
|
78
|
+
MAPPER = compose do |ops|
|
79
|
+
ops << t(:symbolize_keys!)
|
80
|
+
ops << t(:map_hash!, ALIASES)
|
81
|
+
ops << t(:map_key!, :created_at, t(:to_time))
|
82
|
+
ops << t(-> event { event.keep_if { |key| ATTRS.include?(key) } })
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.[](event)
|
86
|
+
if event['isJson']
|
87
|
+
event['data'] = JSON.parse(event['data'])
|
88
|
+
t(:symbolize_keys!)[event['data']]
|
89
|
+
end
|
90
|
+
|
91
|
+
MAPPER[event]
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.prepare(event)
|
95
|
+
{
|
96
|
+
eventId: SecureRandom.uuid,
|
97
|
+
eventType: event[:type],
|
98
|
+
data: event[:data]
|
99
|
+
}
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module ROM
|
2
|
+
module EventStore
|
3
|
+
class Dataset
|
4
|
+
def initialize(name, connection, options = {})
|
5
|
+
@name = name
|
6
|
+
@connection = connection
|
7
|
+
@options = options
|
8
|
+
end
|
9
|
+
|
10
|
+
def from_stream(id)
|
11
|
+
__new__(stream: id)
|
12
|
+
end
|
13
|
+
|
14
|
+
def stream
|
15
|
+
@options[:stream]
|
16
|
+
end
|
17
|
+
|
18
|
+
def events
|
19
|
+
@connection.events(@name, stream)
|
20
|
+
end
|
21
|
+
|
22
|
+
def append(events)
|
23
|
+
@connection.append(@name, stream, events)
|
24
|
+
end
|
25
|
+
|
26
|
+
def each
|
27
|
+
if block_given?
|
28
|
+
events.each { |event| yield(event) }
|
29
|
+
else
|
30
|
+
to_enum
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def __new__(new_opts = {})
|
37
|
+
self.class.new(@name, @connection, @options.merge(new_opts))
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'rom/event_store/connection'
|
2
|
+
require 'rom/event_store/dataset'
|
3
|
+
|
4
|
+
module ROM
|
5
|
+
module EventStore
|
6
|
+
class Repository < ROM::Repository
|
7
|
+
def initialize(uri)
|
8
|
+
@connection = Connection.new(uri)
|
9
|
+
@categories = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def [](name)
|
13
|
+
@categories[name]
|
14
|
+
end
|
15
|
+
|
16
|
+
def dataset(name)
|
17
|
+
@categories[name] = Dataset.new(name, connection)
|
18
|
+
end
|
19
|
+
|
20
|
+
def dataset?(name)
|
21
|
+
@categories.key?(name)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/rom/event_store.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
+
require 'rom'
|
2
|
+
|
1
3
|
require 'rom/event_store/version'
|
4
|
+
require 'rom/event_store/repository'
|
5
|
+
require 'rom/event_store/relation'
|
6
|
+
require 'rom/event_store/commands'
|
2
7
|
|
3
|
-
|
4
|
-
module EventStore
|
5
|
-
# Your code goes here...
|
6
|
-
end
|
7
|
-
end
|
8
|
+
ROM.register_adapter(:event_store, ROM::EventStore)
|
data/rom-event_store.gemspec
CHANGED
@@ -19,7 +19,9 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
|
+
spec.add_dependency 'inflecto', '~> 0.0.2'
|
22
23
|
spec.add_runtime_dependency 'rom', '~> 0.6'
|
24
|
+
spec.add_runtime_dependency 'transproc', '~> 0.1', '>= 0.1.2'
|
23
25
|
|
24
26
|
spec.add_development_dependency 'bundler'
|
25
27
|
spec.add_development_dependency 'rake'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rom-event_store
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Héctor Ramón
|
@@ -9,8 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-03-
|
12
|
+
date: 2015-03-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: inflecto
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 0.0.2
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 0.0.2
|
14
28
|
- !ruby/object:Gem::Dependency
|
15
29
|
name: rom
|
16
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -25,6 +39,26 @@ dependencies:
|
|
25
39
|
- - "~>"
|
26
40
|
- !ruby/object:Gem::Version
|
27
41
|
version: '0.6'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: transproc
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0.1'
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: 0.1.2
|
52
|
+
type: :runtime
|
53
|
+
prerelease: false
|
54
|
+
version_requirements: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - "~>"
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0.1'
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.1.2
|
28
62
|
- !ruby/object:Gem::Dependency
|
29
63
|
name: bundler
|
30
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,6 +118,11 @@ files:
|
|
84
118
|
- README.md
|
85
119
|
- Rakefile
|
86
120
|
- lib/rom/event_store.rb
|
121
|
+
- lib/rom/event_store/commands.rb
|
122
|
+
- lib/rom/event_store/connection.rb
|
123
|
+
- lib/rom/event_store/dataset.rb
|
124
|
+
- lib/rom/event_store/relation.rb
|
125
|
+
- lib/rom/event_store/repository.rb
|
87
126
|
- lib/rom/event_store/version.rb
|
88
127
|
- rom-event_store.gemspec
|
89
128
|
homepage: https://github.com/rom-eventstore/rom-event_store
|