eventstore-http 0.1.6

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: 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,6 @@
1
+ module EventStore
2
+ class Client
3
+ end
4
+ end
5
+
6
+ require_relative 'eventstore/client'
@@ -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: []