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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 435583124333c725e4b522409cf600c4c06cb655
4
- data.tar.gz: 64d0e7a7018f8077278611715a46db584a7f39f6
3
+ metadata.gz: 7cf49a845b2891de79c5be6b742089243f0a8afb
4
+ data.tar.gz: 872a3a6f385f8262afa37a8fe53c2c96c14dc861
5
5
  SHA512:
6
- metadata.gz: f61e292ab57ccd54ad77665f3a45b952304f90e57ffaadcba5aa30a6d09bcbe01edfa0e4022d4d99b5019fda097a136aa05bef57f31710e1393a5ed0b06d195f
7
- data.tar.gz: 0c1c454ba16eda1d4b466c2fa693261b03604986a44514a79218e89c40d224ed9283d8bbdedec2625a15a240fe6fb208361f5e5b68f2f16bd4491929f006d0a6
6
+ metadata.gz: 89f984a4f66ed78410a7a0dee95c3fbe484de11c246ea837a0b3f18815edcb905eb2da6a3d34f0e1b1352070e6509f09d8f3f477c6d406c05568d2ba0a09a0c3
7
+ data.tar.gz: 84dee31899fca106b31c004b1490c728ba1c5bd69b1053c6197b97af14e96fb99b0727f539a5c7941c1f33a7ca02cb076682067a6858d5ddcb2ce3e96dbc5188
data/.gitignore CHANGED
@@ -8,3 +8,4 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
  /.idea/
11
+ *.gem
data/.rubocop.yml CHANGED
@@ -72,3 +72,7 @@ Style/TrivialAccessors:
72
72
  Style/FileName:
73
73
  Exclude:
74
74
  - lib/rom-event_store.rb
75
+
76
+ # Rescue modificar is useful sometimes
77
+ Style/RescueModifier:
78
+ Enabled: false
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=e5f7d153e6fdf6dbd413b18aefe31b20f03e954e9decd46d251431bd43c99fb7
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,13 @@
1
+ require 'rom/commands/create'
2
+
3
+ module ROM
4
+ module EventStore
5
+ module Commands
6
+ class Append < ROM::Commands::Create
7
+ def call(stream, *events)
8
+ relation.from_stream(stream).append(events)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -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,9 @@
1
+ require 'rom/relation'
2
+
3
+ module ROM
4
+ module EventStore
5
+ class Relation < ROM::Relation
6
+ forward :from_stream, :append
7
+ end
8
+ end
9
+ 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
@@ -1,5 +1,5 @@
1
1
  module Rom
2
2
  module EventStore
3
- VERSION = '0.0.1'
3
+ VERSION = '0.0.2'
4
4
  end
5
5
  end
@@ -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
- module Rom
4
- module EventStore
5
- # Your code goes here...
6
- end
7
- end
8
+ ROM.register_adapter(:event_store, ROM::EventStore)
@@ -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.1
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-30 00:00:00.000000000 Z
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