eventstore-http 0.1.6
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 +7 -0
- data/lib/eventstore.rb +6 -0
- data/lib/eventstore/client.rb +141 -0
- metadata +101 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 8aacfa45f0996118803f32dde891fe637f4038d3
|
|
4
|
+
data.tar.gz: 74a3f6d6bd9becd447c4fc5bb4221a70f556740b
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 89fb0c75bd85cd0b4d4ce44ae9e80921d93d2c493c2b155c74a1240a2c278cc3efcc0038645e0d1baff285400252ae4dc4ccdb850df9751c6abebaabc3e64673
|
|
7
|
+
data.tar.gz: 58d7e856a819aaef735dafa1c1b291c6503d55d96ef0b813ea6ed93cbc4d77f441fb13e04da8266003a7d73b5a355cc17e6b6238afb60f47ef059e74044dc870
|
data/lib/eventstore.rb
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
require 'httparty'
|
|
2
|
+
require 'json'
|
|
3
|
+
require 'cql'
|
|
4
|
+
require 'feedjira'
|
|
5
|
+
require 'persistent_httparty'
|
|
6
|
+
|
|
7
|
+
module EventStore
|
|
8
|
+
class Client
|
|
9
|
+
include HTTParty
|
|
10
|
+
pool_size = ENV['HTTP_POOL_SIZE'] ? ENV['HTTP_POOL_SIZE'].to_i : 1
|
|
11
|
+
persistent_connection_adapter({ pool_size: pool_size })
|
|
12
|
+
|
|
13
|
+
def initialize conn_string
|
|
14
|
+
@conn_string = conn_string
|
|
15
|
+
@uuid_gen = Cql::TimeUuid::Generator.new
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def write_event stream, event_type, event_body, uuid=nil
|
|
19
|
+
uuid ||= new_uuid
|
|
20
|
+
json_body = event_body.to_json
|
|
21
|
+
response = self.class.post url_for(stream), {
|
|
22
|
+
body: json_body,
|
|
23
|
+
headers: {
|
|
24
|
+
'Content-Type' => 'application/json',
|
|
25
|
+
'ES-EventId' => uuid,
|
|
26
|
+
'ES-EventType' => event_type,
|
|
27
|
+
'ES-ResolveLinkTo' => 'true'
|
|
28
|
+
},
|
|
29
|
+
no_follow: true
|
|
30
|
+
}
|
|
31
|
+
[uuid, response]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def read_events stream, read_count=20
|
|
35
|
+
resume_read stream, 0, read_count
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def resume_read stream, last_event_id, read_count=20
|
|
39
|
+
stream = Stream.new url_for stream
|
|
40
|
+
stream.events_from(last_event_id).take(read_count)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
def url_for stream
|
|
45
|
+
URI.join(@conn_string,'/streams/',stream)
|
|
46
|
+
end
|
|
47
|
+
def new_uuid
|
|
48
|
+
@uuid_gen.next.to_s
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
class Util
|
|
53
|
+
def self.poll eventstore, stream, start_at=0, set_size=100, sleep_time=10
|
|
54
|
+
Enumerator.new do |yielder|
|
|
55
|
+
last_start_at = nil
|
|
56
|
+
begin
|
|
57
|
+
loop do
|
|
58
|
+
if last_start_at == start_at
|
|
59
|
+
sleep sleep_time
|
|
60
|
+
end
|
|
61
|
+
last_start_at = start_at
|
|
62
|
+
events = eventstore.resume_read(stream, start_at, set_size).drop(1)
|
|
63
|
+
events.each do |event|
|
|
64
|
+
yielder << event
|
|
65
|
+
start_at = event[:id]
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
class Stream
|
|
74
|
+
include HTTParty
|
|
75
|
+
pool_size = ENV['HTTP_POOL_SIZE'] ? ENV['HTTP_POOL_SIZE'].to_i : 1
|
|
76
|
+
persistent_connection_adapter({ pool_size: pool_size })
|
|
77
|
+
|
|
78
|
+
def initialize url
|
|
79
|
+
@page_url = url
|
|
80
|
+
@id_pointer = url
|
|
81
|
+
end
|
|
82
|
+
def events
|
|
83
|
+
event_from 0
|
|
84
|
+
end
|
|
85
|
+
def events_from event_id, direction=:newer
|
|
86
|
+
if event_id.is_a?(Fixnum)
|
|
87
|
+
event_id = "#{@page_url}/#{event_id}"
|
|
88
|
+
end
|
|
89
|
+
if direction == :newer
|
|
90
|
+
@id_pointer = "#{event_id}/forward/20"
|
|
91
|
+
else
|
|
92
|
+
@id_pointer = "#{event_id}/backward/20"
|
|
93
|
+
end
|
|
94
|
+
Enumerator.new do |yielder|
|
|
95
|
+
while @id_pointer
|
|
96
|
+
feed_data = feed_data_from_pointer
|
|
97
|
+
break if feed_data.chomp == ""
|
|
98
|
+
feed = Feedjira::Feed.parse feed_data
|
|
99
|
+
entries = feed.entries
|
|
100
|
+
if direction == :newer
|
|
101
|
+
entries = entries.reverse
|
|
102
|
+
end
|
|
103
|
+
entries.each do |entry|
|
|
104
|
+
yielder << { body: fetch_event_body(entry.url),
|
|
105
|
+
type: entry.summary,
|
|
106
|
+
updated: entry.updated,
|
|
107
|
+
id: entry.id
|
|
108
|
+
}
|
|
109
|
+
end
|
|
110
|
+
@id_pointer = entries.length == 0 ? nil : feed.send(direction)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
private
|
|
115
|
+
def feed_data
|
|
116
|
+
self.class.get(@page_url).body
|
|
117
|
+
end
|
|
118
|
+
def feed_data_from_pointer
|
|
119
|
+
self.class.get(@id_pointer).body
|
|
120
|
+
end
|
|
121
|
+
def fetch_event_body url
|
|
122
|
+
JSON.load(
|
|
123
|
+
self.class.get(url, {
|
|
124
|
+
headers: { 'Accept' => 'application/json' }}
|
|
125
|
+
).body
|
|
126
|
+
)
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
module Feedjira
|
|
132
|
+
module Parser
|
|
133
|
+
class Atom
|
|
134
|
+
element :"link", as: :first, value: :href, with: { rel: 'first' }
|
|
135
|
+
element :"link", as: :last, value: :href, with: { rel: 'last' }
|
|
136
|
+
|
|
137
|
+
element :"link", as: :newer, value: :href, with: { rel: 'previous' }
|
|
138
|
+
element :"link", as: :older, value: :href, with: { rel: 'next' }
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: eventstore-http
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.6
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Robby Ranshous
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2015-09-19 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: httparty
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0.13'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0.13'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: cql-rb
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '2.0'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '2.0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: feedjira
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '1.6'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '1.6'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: persistent_httparty
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0.1'
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0.1'
|
|
69
|
+
description: EventStore HTTP client for simple reading and writing
|
|
70
|
+
email: rranshous@gmail.com
|
|
71
|
+
executables: []
|
|
72
|
+
extensions: []
|
|
73
|
+
extra_rdoc_files: []
|
|
74
|
+
files:
|
|
75
|
+
- lib/eventstore.rb
|
|
76
|
+
- lib/eventstore/client.rb
|
|
77
|
+
homepage: https://github.com/rranshous/eventstore
|
|
78
|
+
licenses:
|
|
79
|
+
- Beerware
|
|
80
|
+
metadata: {}
|
|
81
|
+
post_install_message:
|
|
82
|
+
rdoc_options: []
|
|
83
|
+
require_paths:
|
|
84
|
+
- lib
|
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - ">="
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0'
|
|
90
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
91
|
+
requirements:
|
|
92
|
+
- - ">="
|
|
93
|
+
- !ruby/object:Gem::Version
|
|
94
|
+
version: '0'
|
|
95
|
+
requirements: []
|
|
96
|
+
rubyforge_project:
|
|
97
|
+
rubygems_version: 2.4.8
|
|
98
|
+
signing_key:
|
|
99
|
+
specification_version: 4
|
|
100
|
+
summary: EventStore HTTP client
|
|
101
|
+
test_files: []
|