http_eventstore 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a6d79d7fa69ffc2f0244660f573a7abe3df25867
4
+ data.tar.gz: 48e64de34b0a6465cb652695a2753c635511376f
5
+ SHA512:
6
+ metadata.gz: f4c08e0f66ab32e400083f93dc0d9a992ca21cd07711b430884752ed5aa934bc6f6cc2dea373225fbf39fee14473ea3fea970021f3f2da149913e2e8bf6e7105
7
+ data.tar.gz: 942926179e12ef3ab9a2ddca512ad2dff6a1595cf82dae2915f9dd0ac55f5140e0c711dc44423e127f2f30305ea761aa665cc16d9db16f7b45b02d632c471ea3
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .ruby-gemset
11
+ .ruby-version
12
+ .idea/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in http_eventstore.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,134 @@
1
+ # HttpEventstore
2
+
3
+ HttpEventstore is a HTTP connector to the Greg's [Event Store](https://geteventstore.com/).
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'http_eventstore'
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ To communicate with ES you have to create instance of `HttpEventstore::Connection` class. After configuring a client, you can do the following things.
16
+
17
+ ```ruby
18
+ client = HttpEventstore::Connection.new do |config|
19
+ #default value is '127.0.0.1'
20
+ config.endpoint = 'your_endpoint'
21
+ #default value is 2113
22
+ config.port = 'your_port'
23
+ #default value is 20 entries per page
24
+ config.page_size = 'your_page_size'
25
+ end
26
+ ```
27
+
28
+ #### Creating new event
29
+
30
+ Creating a single event:
31
+
32
+ ```ruby
33
+ stream_name = "order_1"
34
+ event_data = { event_type: "OrderCreated",
35
+ data: { data: "sample" },
36
+ event_id: "b2d506fd-409d-4ec7-b02f-c6d2295c7edd" }
37
+ client.append_to_stream(stream_name, event_data)
38
+ ```
39
+
40
+ OR
41
+
42
+ ```ruby
43
+ EventData = Struct.new(:data, :event_type)
44
+ stream_name = "order_1"
45
+ event_data = EventData.new({ data: "sample" }, "OrderCreated")
46
+ client.append_to_stream(stream_name, event_data)
47
+ ```
48
+
49
+ Creating a single event with optimistic locking:
50
+
51
+ ```ruby
52
+ stream_name = "order_1"
53
+ event_data = { event_type: "OrderCreated", data: { data: "sample" }}
54
+ expected_version = 1
55
+ client.append_to_stream(stream_name, event_data, expected_version)
56
+ ```
57
+
58
+ #### Deleting stream
59
+
60
+ The soft delete of single stream:
61
+
62
+ ```ruby
63
+ stream_name = "order_1"
64
+ client.delete_stream("stream_name")
65
+ ```
66
+
67
+ The hard delete of single stream:
68
+
69
+ ```ruby
70
+ stream_name = "order_1"
71
+ hard_delete = true
72
+ client.delete_stream("stream_name", hard_delete)
73
+ ```
74
+
75
+ The soft delete cause that you will be allowed to recreate the stream by creating new event. If you recreate soft deleted stream all events are lost.
76
+ After an hard delete any try to load the stream or create event will result in a 410 response.
77
+
78
+ #### Reading stream's event forward
79
+
80
+ ```ruby
81
+ stream_name = "order_1"
82
+ start = 21
83
+ count = 40
84
+ client.read_events_forward(stream_name, start, count)
85
+ ```
86
+
87
+ If you call following method to get the newest entries and no data is available the server wait some specified period of time.
88
+
89
+ ```ruby
90
+ stream_name = "order_1"
91
+ start = 21
92
+ count = 40
93
+ pool_time = 15
94
+ client.read_events_forward(stream_name, start, count, poll_time)
95
+ ```
96
+
97
+ #### Reading stream's event backward
98
+
99
+ ```ruby
100
+ stream_name = "order_1"
101
+ start = 21
102
+ count = 40
103
+ client.read_events_backward(stream_name, start, count)
104
+ ```
105
+
106
+ #### Reading all stream's event forward
107
+
108
+ This method allows us to load all stream's events ascending.
109
+
110
+ ```ruby
111
+ stream_name = "order_1"
112
+ client.read_all_events_forward(stream_name)
113
+ ```
114
+
115
+ #### Reading all stream's event backward
116
+
117
+ This method allows us to load all stream's events descending.
118
+
119
+ ```ruby
120
+ stream_name = "order_1"
121
+ client.read_all_events_backward(stream_name)
122
+ ```
123
+
124
+ ## Supported version's of Event Store
125
+
126
+ To take advantage of all the functionality offered by our gem the minimum recommended version of Event Store is **2.1**
127
+
128
+ ## Contributing
129
+
130
+ 1. Fork it ( https://github.com/[my-github-username]/http_eventstore/fork )
131
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
132
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
133
+ 4. Push to the branch (`git push origin my-new-feature`)
134
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'http_eventstore'
7
+ spec.version = '0.1.0'
8
+ spec.authors = ['Arkency']
9
+ spec.email = ['andrzejkrzywda@gmail.com']
10
+
11
+ spec.summary = %q{HttpEventstore is a HTTP connector to the Greg's Event Store.}
12
+ spec.description = %q{HttpEventstore is a HTTP connector to the Greg's Event Store.}
13
+ spec.homepage = "https://github.com/arkency/http_eventstore"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.bindir = 'exe'
17
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.add_development_dependency 'bundler', '~> 1.8'
21
+ spec.add_development_dependency 'rake', '~> 10.0'
22
+ spec.add_development_dependency 'rspec'
23
+ spec.add_development_dependency 'pry'
24
+
25
+ spec.add_dependency 'faraday'
26
+ spec.add_dependency 'faraday_middleware'
27
+ spec.add_dependency 'json'
28
+ spec.add_dependency 'hashie'
29
+ end
@@ -0,0 +1,38 @@
1
+ module HttpEventstore
2
+ module Actions
3
+ class AppendEventToStream
4
+
5
+ def initialize(client)
6
+ @client = client
7
+ end
8
+
9
+ def call(stream_name, event_data, expected_version = nil)
10
+ event_data = OpenStruct.new(event_data) if event_data.is_a?(Hash)
11
+ event = create_event(event_data)
12
+ raise IncorrectStreamData if event.validate || stream_name_incorrect?(stream_name)
13
+ create_event_in_es(stream_name, event, expected_version)
14
+ rescue ClientError => e
15
+ raise WrongExpectedEventNumber if e.code == 400
16
+ raise StreamAlreadyDeleted if e.code == 410
17
+ end
18
+
19
+ private
20
+ attr_reader :client
21
+
22
+ def create_event(event_data)
23
+ type = event_data.event_type
24
+ data = event_data.data
25
+ event_id = event_data.event_id if event_data.respond_to?(:event_id)
26
+ Event.new(type, data, event_id)
27
+ end
28
+
29
+ def create_event_in_es(stream_name, event, expected_version)
30
+ client.append_to_stream(stream_name, event, expected_version)
31
+ end
32
+
33
+ def stream_name_incorrect?(stream_name)
34
+ stream_name.nil? || stream_name.empty?
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,24 @@
1
+ module HttpEventstore
2
+ module Actions
3
+ class DeleteStream
4
+
5
+ def initialize(client)
6
+ @client = client
7
+ end
8
+
9
+ def call(stream_name, hard_delete)
10
+ raise IncorrectStreamData if stream_name.nil? || stream_name.empty?
11
+ delete_stream(stream_name, hard_delete)
12
+ rescue ClientError => e
13
+ raise StreamAlreadyDeleted
14
+ end
15
+
16
+ private
17
+ attr_reader :client
18
+
19
+ def delete_stream(stream_name, hard_delete)
20
+ client.delete_stream(stream_name, hard_delete)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,34 @@
1
+ module HttpEventstore
2
+ module Actions
3
+ class ReadAllStreamEvents
4
+
5
+ def initialize(client)
6
+ @client = client
7
+ end
8
+
9
+ def call(stream_name)
10
+ raise IncorrectStreamData if stream_name.nil? || stream_name.empty?
11
+ entries = get_all_stream_entries(stream_name)
12
+ return_events(entries)
13
+ rescue ClientError => e
14
+ raise StreamAlreadyDeleted if e.code == 410
15
+ raise StreamNotFound if e.code == 404
16
+ end
17
+
18
+ private
19
+ attr_reader :client
20
+
21
+ def get_all_stream_entries(stream_name, start_point = nil, entries = [])
22
+ stream_data = get_stream_batch(stream_name, start_point)
23
+ entries = append_entries(entries, stream_data['entries'])
24
+ start_point = get_next_start_point(stream_data['links'])
25
+ return entries if start_point.nil?
26
+ get_all_stream_entries(stream_name, start_point, entries)
27
+ end
28
+
29
+ def return_events(entries)
30
+ Helpers::ParseEntries.new.call(entries)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,43 @@
1
+ module HttpEventstore
2
+ module Actions
3
+ class ReadAllStreamEventsBackward < ReadAllStreamEvents
4
+
5
+ def initialize(client, page_size)
6
+ super(client)
7
+ @start_point = :head
8
+ @count = page_size
9
+ end
10
+
11
+ private
12
+ attr_reader :start_point, :count
13
+
14
+ def append_entries(entries, batch)
15
+ entries + batch
16
+ end
17
+
18
+ def get_stream_batch(stream_name, start)
19
+ if start.nil?
20
+ read_stream_backward(stream_name, start_point, count)
21
+ else
22
+ read_stream_by_url(start)
23
+ end
24
+ end
25
+
26
+ def read_stream_backward(stream_name, next_id, count)
27
+ client.read_stream_backward(stream_name, next_id, count)
28
+ end
29
+
30
+ def read_stream_by_url(uri)
31
+ client.read_stream_page(uri)
32
+ end
33
+
34
+ def get_next_start_point(links)
35
+ link = links.detect { |link| link['relation'] == 'next' }
36
+ unless link.nil?
37
+ link['uri'].slice! client.endpoint.url
38
+ link['uri']
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ module HttpEventstore
2
+ module Actions
3
+ class ReadAllStreamEventsForward < ReadAllStreamEvents
4
+
5
+ def initialize(client, page_size)
6
+ super(client)
7
+ @start_point = 0
8
+ @count = page_size
9
+ end
10
+
11
+ private
12
+ attr_reader :start_point, :count
13
+
14
+ def append_entries(entries, batch)
15
+ entries + batch.reverse!
16
+ end
17
+
18
+ def get_stream_batch(stream_name, start)
19
+ if start.nil?
20
+ read_stream_forward(stream_name, start_point, count)
21
+ else
22
+ read_stream_by_url(start)
23
+ end
24
+ end
25
+
26
+ def read_stream_forward(stream_name, next_id, count)
27
+ client.read_stream_forward(stream_name, next_id, count)
28
+ end
29
+
30
+ def read_stream_by_url(uri)
31
+ client.read_stream_page(uri)
32
+ end
33
+
34
+ def get_next_start_point(links)
35
+ link = links.detect { |link| link['relation'] == 'previous' }
36
+ unless link.nil?
37
+ link['uri'].slice! client.endpoint.url
38
+ link['uri']
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,29 @@
1
+ module HttpEventstore
2
+ module Actions
3
+ class ReadStreamEventsBackward
4
+
5
+ def initialize(client)
6
+ @client = client
7
+ end
8
+
9
+ def call(stream_name, start, count)
10
+ response = get_stream_batch(stream_name, start, count)
11
+ return_events(response['entries'])
12
+ rescue ClientError => e
13
+ raise StreamAlreadyDeleted if e.code == 410
14
+ raise StreamNotFound if e.code == 404
15
+ end
16
+
17
+ private
18
+ attr_reader :client
19
+
20
+ def get_stream_batch(stream_name, start, count)
21
+ client.read_stream_backward(stream_name, start, count)
22
+ end
23
+
24
+ def return_events(entries)
25
+ Helpers::ParseEntries.new.call(entries)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ module HttpEventstore
2
+ module Actions
3
+ class ReadStreamEventsForward
4
+
5
+ def initialize(client)
6
+ @client = client
7
+ end
8
+
9
+ def call(stream_name, start, count, pool)
10
+ response = get_stream_batch(stream_name, start, count, pool)
11
+ return_events(response['entries'])
12
+ rescue ClientError => e
13
+ raise StreamAlreadyDeleted if e.code == 410
14
+ raise StreamNotFound if e.code == 404
15
+ end
16
+
17
+ private
18
+ attr_reader :client
19
+
20
+ def get_stream_batch(stream_name, start, count, pool)
21
+ client.read_stream_forward(stream_name, start, count, pool)
22
+ end
23
+
24
+ def return_events(entries)
25
+ Helpers::ParseEntries.new.call(entries)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,49 @@
1
+ module HttpEventstore
2
+ module Api
3
+ class Client
4
+
5
+ def initialize(endpoint, port, page_size)
6
+ @endpoint = Endpoint.new(endpoint, port)
7
+ @page_size = page_size
8
+ end
9
+ attr_reader :endpoint, :page_size
10
+
11
+ def append_to_stream(stream_name, event, expected_version = nil)
12
+ headers = {"ES-EventType" => event.type, "ES-EventId" => event.event_id, "ES-ExpectedVersion" => "#{expected_version}"}.reject { |key, val| val.empty? }
13
+ make_request(:post, "/streams/#{stream_name}", event.data, headers)
14
+ end
15
+
16
+ def delete_stream(stream_name, hard_delete)
17
+ headers = {"ES-HardDelete" => "#{hard_delete}"}
18
+ make_request(:delete, "/streams/#{stream_name}", {}, headers)
19
+ end
20
+
21
+ def read_stream_backward(stream_name, start, count)
22
+ make_request(:get, "/streams/#{stream_name}/#{start}/backward/#{count}")
23
+ end
24
+
25
+ def read_stream_forward(stream_name, start, count, long_pool = 0)
26
+ headers = long_pool > 0 ? {"ES-LongPoll" => "#{long_pool}"} : {}
27
+ make_request(:get, "/streams/#{stream_name}/#{start}/forward/#{count}", {}, headers)
28
+ end
29
+
30
+ def read_stream_page(uri)
31
+ make_request(:get, uri)
32
+ end
33
+
34
+ private
35
+
36
+ def make_request(method, path, body={}, headers={})
37
+ connection.send(method, path) do |req|
38
+ req.headers = req.headers.merge(headers)
39
+ req.body = body.to_json
40
+ req.params['embed'] = 'body' if method == :get
41
+ end.body
42
+ end
43
+
44
+ def connection
45
+ @connection ||= Api::Connection.new(endpoint).call
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,29 @@
1
+ module HttpEventstore
2
+ module Api
3
+ class Connection
4
+ APP_JSON = 'application/json'.freeze
5
+
6
+ def initialize(endpoint)
7
+ @endpoint = endpoint
8
+ end
9
+
10
+ def call
11
+ Faraday.new(
12
+ url: endpoint.url,
13
+ headers: {
14
+ accept: APP_JSON,
15
+ content_type: APP_JSON
16
+ }
17
+ ) do |builder|
18
+ builder.adapter Faraday.default_adapter
19
+ builder.response :json, content_type: APP_JSON
20
+ builder.response :mashify
21
+ builder.use ErrorsHandler
22
+ end
23
+ end
24
+
25
+ private
26
+ attr_reader :endpoint
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,19 @@
1
+ require 'faraday'
2
+ require 'faraday_middleware'
3
+
4
+ module HttpEventstore
5
+ module Api
6
+ class ErrorsHandler < Faraday::Response::Middleware
7
+
8
+ def on_complete(env)
9
+ code = env[:status]
10
+ case code
11
+ when (400..499)
12
+ raise ClientError.new(code)
13
+ when (500..599)
14
+ raise ServerError.new(code)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,47 @@
1
+ module HttpEventstore
2
+ class Connection
3
+ attr_accessor :endpoint, :port, :page_size
4
+
5
+ def initialize
6
+ setup_defaults
7
+ yield(self) if block_given?
8
+ end
9
+
10
+ def append_to_stream(stream_name, event_data, expected_version = nil)
11
+ Actions::AppendEventToStream.new(client).call(stream_name, event_data, expected_version)
12
+ end
13
+
14
+ def delete_stream(stream_name, hard_delete = false)
15
+ Actions::DeleteStream.new(client).call(stream_name, hard_delete)
16
+ end
17
+
18
+ def read_events_forward(stream_name, start, count, pool = 0)
19
+ Actions::ReadStreamEventsForward.new(client).call(stream_name, start, count, pool)
20
+ end
21
+
22
+ def read_events_backward(stream_name, start, count)
23
+ Actions::ReadStreamEventsBackward.new(client).call(stream_name, start, count)
24
+ end
25
+
26
+ def read_all_events_forward(stream_name)
27
+ Actions::ReadAllStreamEventsForward.new(client, page_size).call(stream_name)
28
+ end
29
+
30
+ def read_all_events_backward(stream_name)
31
+ Actions::ReadAllStreamEventsBackward.new(client, page_size).call(stream_name)
32
+ end
33
+
34
+ private
35
+
36
+ def client
37
+ @client ||= Api::Client.new(endpoint, port, page_size)
38
+ end
39
+
40
+ def setup_defaults
41
+ @endpoint = 'localhost'
42
+ @port = 2113
43
+ @page_size = 20
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,16 @@
1
+ module HttpEventstore
2
+ class Endpoint
3
+
4
+ def initialize(endpoint, port)
5
+ @endpoint = endpoint
6
+ @port = port
7
+ end
8
+
9
+ def url
10
+ "http://#{endpoint}:#{port.to_s}"
11
+ end
12
+
13
+ private
14
+ attr_reader :endpoint, :port
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ module HttpEventstore
2
+ class ClientError < StandardError
3
+ attr_accessor :code
4
+ def initialize(code)
5
+ @code = code
6
+ super()
7
+ end
8
+ end
9
+ class ServerError < StandardError
10
+ attr_accessor :code
11
+ def initialize(code)
12
+ @code = code
13
+ super()
14
+ end
15
+ end
16
+ IncorrectStreamData = Class.new(StandardError)
17
+ WrongExpectedEventNumber = Class.new(StandardError)
18
+ StreamAlreadyDeleted = Class.new(StandardError)
19
+ StreamNotFound = Class.new(StandardError)
20
+ end
@@ -0,0 +1,14 @@
1
+ class Event < Struct.new(:type, :data, :event_id, :id)
2
+ def initialize(type, data, event_id = nil, id = nil)
3
+ event_id = SecureRandom.uuid if event_id.nil?
4
+ super
5
+ end
6
+
7
+ def validate
8
+ [self.event_id, self.type, self.data].any? { |var| var.nil? || var.empty? }
9
+ end
10
+
11
+ def to_json(options)
12
+ self.to_h.to_json
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ module HttpEventstore
2
+ module Helpers
3
+ class ParseEntries
4
+
5
+ def call(entries)
6
+ entries.collect do |entry|
7
+ create_event(entry)
8
+ end
9
+ end
10
+
11
+ private
12
+
13
+ def create_event(entry)
14
+ id = entry['positionEventNumber']
15
+ event_id = entry['eventId']
16
+ type = entry['eventType']
17
+ data = JSON.parse(entry['data'])
18
+ Event.new(type, data, event_id, id)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ require 'http_eventstore/api/client'
2
+ require 'http_eventstore/api/connection'
3
+ require 'http_eventstore/api/errors_handler'
4
+ require 'http_eventstore/connection'
5
+ require 'http_eventstore/event'
6
+ require 'http_eventstore/errors'
7
+ require 'http_eventstore/endpoint'
8
+ require 'http_eventstore/helpers/parse_entries'
9
+ require 'http_eventstore/actions/append_event_to_stream'
10
+ require 'http_eventstore/actions/delete_stream'
11
+ require 'http_eventstore/actions/read_all_stream_events'
12
+ require 'http_eventstore/actions/read_all_stream_events_backward'
13
+ require 'http_eventstore/actions/read_all_stream_events_forward'
14
+ require 'http_eventstore/actions/read_stream_events_backward'
15
+ require 'http_eventstore/actions/read_stream_events_forward'
metadata ADDED
@@ -0,0 +1,176 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: http_eventstore
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Arkency
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-03-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.8'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: faraday
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: faraday_middleware
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: json
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: hashie
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: HttpEventstore is a HTTP connector to the Greg's Event Store.
126
+ email:
127
+ - andrzejkrzywda@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - Gemfile
134
+ - README.md
135
+ - Rakefile
136
+ - http_eventstore.gemspec
137
+ - lib/http_eventstore.rb
138
+ - lib/http_eventstore/actions/append_event_to_stream.rb
139
+ - lib/http_eventstore/actions/delete_stream.rb
140
+ - lib/http_eventstore/actions/read_all_stream_events.rb
141
+ - lib/http_eventstore/actions/read_all_stream_events_backward.rb
142
+ - lib/http_eventstore/actions/read_all_stream_events_forward.rb
143
+ - lib/http_eventstore/actions/read_stream_events_backward.rb
144
+ - lib/http_eventstore/actions/read_stream_events_forward.rb
145
+ - lib/http_eventstore/api/client.rb
146
+ - lib/http_eventstore/api/connection.rb
147
+ - lib/http_eventstore/api/errors_handler.rb
148
+ - lib/http_eventstore/connection.rb
149
+ - lib/http_eventstore/endpoint.rb
150
+ - lib/http_eventstore/errors.rb
151
+ - lib/http_eventstore/event.rb
152
+ - lib/http_eventstore/helpers/parse_entries.rb
153
+ homepage: https://github.com/arkency/http_eventstore
154
+ licenses: []
155
+ metadata: {}
156
+ post_install_message:
157
+ rdoc_options: []
158
+ require_paths:
159
+ - lib
160
+ required_ruby_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ required_rubygems_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ requirements: []
171
+ rubyforge_project:
172
+ rubygems_version: 2.4.6
173
+ signing_key:
174
+ specification_version: 4
175
+ summary: HttpEventstore is a HTTP connector to the Greg's Event Store.
176
+ test_files: []