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 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: []