evt-event_source-postgres 0.10.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/event_source/loader.rb +1 -0
- data/lib/event_source/postgres.rb +20 -0
- data/lib/event_source/postgres/controls.rb +7 -0
- data/lib/event_source/postgres/controls/category.rb +7 -0
- data/lib/event_source/postgres/controls/event_data.rb +7 -0
- data/lib/event_source/postgres/controls/put.rb +19 -0
- data/lib/event_source/postgres/controls/stream.rb +7 -0
- data/lib/event_source/postgres/controls/stream_name.rb +7 -0
- data/lib/event_source/postgres/get.rb +91 -0
- data/lib/event_source/postgres/get/select_statement.rb +89 -0
- data/lib/event_source/postgres/log.rb +11 -0
- data/lib/event_source/postgres/put.rb +137 -0
- data/lib/event_source/postgres/read.rb +11 -0
- data/lib/event_source/postgres/session.rb +120 -0
- data/lib/event_source/postgres/settings.rb +30 -0
- data/lib/event_source/postgres/write.rb +11 -0
- metadata +143 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cbb3a9b61a7f4a379cd86bc1fca7462a767dce24
|
4
|
+
data.tar.gz: d47872d6c1d73a06db41da3bc77cbf06ac652e16
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 96ab2094cec2f21a4b38967f76ca90c7b97cf11050b496d3aee119878d4d7b5550921126b6693e1cee9367580ed82709767f379a17cc1ea3a41e7403b51e39e5
|
7
|
+
data.tar.gz: 579b568775c5a3ed2b9542d5c10f0208c07f3896996fb2b2aacb70e172434b6d9b531c17bbe0470a0c6bddcfe8167746300a003441f35deaf31f0caca2c490bf
|
@@ -0,0 +1 @@
|
|
1
|
+
postgres.rb
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'pg'
|
2
|
+
|
3
|
+
require 'event_source'
|
4
|
+
require 'cycle'
|
5
|
+
|
6
|
+
require 'log'
|
7
|
+
require 'telemetry'
|
8
|
+
require 'settings'; Settings.activate
|
9
|
+
|
10
|
+
require 'event_source/postgres/log'
|
11
|
+
|
12
|
+
require 'event_source/postgres/settings'
|
13
|
+
require 'event_source/postgres/session'
|
14
|
+
|
15
|
+
require 'event_source/postgres/put'
|
16
|
+
require 'event_source/postgres/write'
|
17
|
+
|
18
|
+
require 'event_source/postgres/get/select_statement'
|
19
|
+
require 'event_source/postgres/get'
|
20
|
+
require 'event_source/postgres/read'
|
@@ -0,0 +1,7 @@
|
|
1
|
+
require 'event_source/controls'
|
2
|
+
|
3
|
+
require 'event_source/postgres/controls/category'
|
4
|
+
require 'event_source/postgres/controls/stream_name'
|
5
|
+
require 'event_source/postgres/controls/stream'
|
6
|
+
require 'event_source/postgres/controls/event_data'
|
7
|
+
require 'event_source/postgres/controls/put'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module EventSource
|
2
|
+
module Postgres
|
3
|
+
module Controls
|
4
|
+
module Put
|
5
|
+
def self.call(instances: nil, stream_name: nil, event: nil, category: nil)
|
6
|
+
instances ||= 1
|
7
|
+
stream_name ||= StreamName.example(category: category)
|
8
|
+
event ||= EventData::Write.example
|
9
|
+
|
10
|
+
instances.times do
|
11
|
+
EventSource::Postgres::Put.(event, stream_name)
|
12
|
+
end
|
13
|
+
|
14
|
+
stream_name
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module EventSource
|
2
|
+
module Postgres
|
3
|
+
class Get
|
4
|
+
include Log::Dependency
|
5
|
+
|
6
|
+
initializer :batch_size, :precedence
|
7
|
+
|
8
|
+
dependency :session, Session
|
9
|
+
|
10
|
+
def self.build(batch_size: nil, precedence: nil, session: nil)
|
11
|
+
new(batch_size, precedence).tap do |instance|
|
12
|
+
instance.configure(session: session)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.configure(receiver, attr_name: nil, position: nil, batch_size: nil, precedence: nil, session: nil)
|
17
|
+
attr_name ||= :get
|
18
|
+
instance = build(batch_size: batch_size, precedence: precedence, session: session)
|
19
|
+
receiver.public_send "#{attr_name}=", instance
|
20
|
+
end
|
21
|
+
|
22
|
+
def configure(session: nil)
|
23
|
+
Session.configure self, session: session
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.call(stream_name, position: nil, batch_size: nil, precedence: nil, session: nil)
|
27
|
+
instance = build(batch_size: batch_size, precedence: precedence, session: session)
|
28
|
+
instance.(stream_name, position: position)
|
29
|
+
end
|
30
|
+
|
31
|
+
def call(stream_name, position: nil)
|
32
|
+
logger.trace { "Getting event data (Position: #{position.inspect}, Stream Name: #{stream_name}, Batch Size: #{batch_size.inspect}, Precedence: #{precedence.inspect})" }
|
33
|
+
|
34
|
+
records = get_records(stream_name, position)
|
35
|
+
|
36
|
+
events = convert(records)
|
37
|
+
|
38
|
+
logger.info { "Finished getting event data (Count: #{events.length}, Position: #{position.inspect}, Stream Name: #{stream_name}, Batch Size: #{batch_size.inspect}, Precedence: #{precedence.inspect})" }
|
39
|
+
logger.info(tags: [:data, :event_data]) { events.pretty_inspect }
|
40
|
+
|
41
|
+
events
|
42
|
+
end
|
43
|
+
|
44
|
+
def get_records(stream_name, position)
|
45
|
+
logger.trace { "Getting records (Stream: #{stream_name}, Position: #{position.inspect}, Batch Size: #{batch_size.inspect}, Precedence: #{precedence.inspect})" }
|
46
|
+
|
47
|
+
select_statement = SelectStatement.build(stream_name, offset: position, batch_size: batch_size, precedence: precedence)
|
48
|
+
|
49
|
+
records = session.execute(select_statement.sql)
|
50
|
+
|
51
|
+
logger.debug { "Finished getting records (Count: #{records.ntuples}, Stream: #{stream_name}, Position: #{position.inspect}, Batch Size: #{batch_size.inspect}, Precedence: #{precedence.inspect})" }
|
52
|
+
|
53
|
+
records
|
54
|
+
end
|
55
|
+
|
56
|
+
def convert(records)
|
57
|
+
logger.trace { "Converting records to event data (Records Count: #{records.ntuples})" }
|
58
|
+
|
59
|
+
events = records.map do |record|
|
60
|
+
record['data'] = Deserialize.data(record['data'])
|
61
|
+
record['metadata'] = Deserialize.metadata(record['metadata'])
|
62
|
+
record['time'] = Time.utc_coerced(record['time'])
|
63
|
+
|
64
|
+
EventData::Read.build record
|
65
|
+
end
|
66
|
+
|
67
|
+
logger.debug { "Converted records to event data (Event Data Count: #{events.length})" }
|
68
|
+
|
69
|
+
events
|
70
|
+
end
|
71
|
+
|
72
|
+
module Deserialize
|
73
|
+
def self.data(serialized_data)
|
74
|
+
return nil if serialized_data.nil?
|
75
|
+
Transform::Read.(serialized_data, EventData::Hash, :json)
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.metadata(serialized_metadata)
|
79
|
+
return nil if serialized_metadata.nil?
|
80
|
+
Transform::Read.(serialized_metadata, EventData::Hash, :json)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
module Time
|
85
|
+
def self.utc_coerced(local_time)
|
86
|
+
Clock::UTC.coerce(local_time)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module EventSource
|
2
|
+
module Postgres
|
3
|
+
class Get
|
4
|
+
class SelectStatement
|
5
|
+
include Log::Dependency
|
6
|
+
|
7
|
+
initializer :stream, w(:offset), w(:batch_size), w(:precedence)
|
8
|
+
|
9
|
+
def offset
|
10
|
+
@offset ||= Defaults.offset
|
11
|
+
end
|
12
|
+
|
13
|
+
def batch_size
|
14
|
+
@batch_size ||= Defaults.batch_size
|
15
|
+
end
|
16
|
+
|
17
|
+
def precedence
|
18
|
+
@precedence ||= Defaults.precedence
|
19
|
+
end
|
20
|
+
|
21
|
+
def stream_name
|
22
|
+
stream.name
|
23
|
+
end
|
24
|
+
|
25
|
+
def stream_type
|
26
|
+
stream.type
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.build(stream_name, offset: nil, batch_size: nil, precedence: nil)
|
30
|
+
stream = Stream.new(stream_name)
|
31
|
+
new(stream, offset, batch_size, precedence)
|
32
|
+
end
|
33
|
+
|
34
|
+
def sql
|
35
|
+
logger.trace(tag: :sql) { "Composing select statement (Stream: #{stream_name}, Category: #{stream.category?}, Type: #{stream_type}, Position: #{offset}, Batch Size: #{batch_size}, Precedence: #{precedence})" }
|
36
|
+
|
37
|
+
statement = <<-SQL
|
38
|
+
SELECT
|
39
|
+
stream_name::varchar,
|
40
|
+
position::int,
|
41
|
+
type::varchar,
|
42
|
+
global_position::bigint,
|
43
|
+
data::varchar,
|
44
|
+
metadata::varchar,
|
45
|
+
time::timestamp
|
46
|
+
FROM
|
47
|
+
events
|
48
|
+
WHERE
|
49
|
+
#{where_clause_field} = '#{stream_name}'
|
50
|
+
ORDER BY
|
51
|
+
global_position #{precedence.to_s.upcase}
|
52
|
+
LIMIT
|
53
|
+
#{batch_size}
|
54
|
+
OFFSET
|
55
|
+
#{offset}
|
56
|
+
;
|
57
|
+
SQL
|
58
|
+
|
59
|
+
logger.debug(tag: :sql) { "Composed select statement (Stream: #{stream_name}, Category: #{stream.category?}, Type: #{stream_type}, Position: #{offset}, Batch Size: #{batch_size}, Precedence: #{precedence})" }
|
60
|
+
logger.debug(tags: [:data, :sql]) { "Statement: #{statement}" }
|
61
|
+
|
62
|
+
statement
|
63
|
+
end
|
64
|
+
|
65
|
+
def where_clause_field
|
66
|
+
unless stream.category?
|
67
|
+
'stream_name'
|
68
|
+
else
|
69
|
+
'category(stream_name)'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
module Defaults
|
74
|
+
def self.offset
|
75
|
+
0
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.batch_size
|
79
|
+
1000
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.precedence
|
83
|
+
:asc
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
module EventSource
|
2
|
+
module Postgres
|
3
|
+
class Put
|
4
|
+
include Log::Dependency
|
5
|
+
|
6
|
+
dependency :session, Session
|
7
|
+
|
8
|
+
def self.build(session: nil)
|
9
|
+
new.tap do |instance|
|
10
|
+
instance.configure(session: session)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def configure(session: nil)
|
15
|
+
Session.configure(self, session: session)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.configure(receiver, session: nil, attr_name: nil)
|
19
|
+
attr_name ||= :put
|
20
|
+
instance = build(session: session)
|
21
|
+
receiver.public_send "#{attr_name}=", instance
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.call(write_event, stream_name, expected_version: nil, session: nil)
|
25
|
+
instance = build(session: session)
|
26
|
+
instance.(write_event, stream_name, expected_version: expected_version)
|
27
|
+
end
|
28
|
+
|
29
|
+
def call(write_event, stream_name, expected_version: nil)
|
30
|
+
logger.trace { "Putting event data (Stream Name: #{stream_name}, Type: #{write_event.type}, Expected Version: #{expected_version.inspect})" }
|
31
|
+
logger.trace(tags: [:data, :event_data]) { write_event.pretty_inspect }
|
32
|
+
|
33
|
+
type, data, metadata = destructure_event(write_event)
|
34
|
+
expected_version = ExpectedVersion.canonize(expected_version)
|
35
|
+
|
36
|
+
insert_event(stream_name, type, data, metadata, expected_version).tap do |position|
|
37
|
+
logger.info { "Put event data (Position: #{position}, Stream Name: #{stream_name}, Type: #{write_event.type}, Expected Version: #{expected_version.inspect})" }
|
38
|
+
logger.info(tags: [:data, :event_data]) { write_event.pretty_inspect }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def destructure_event(write_event)
|
43
|
+
type = write_event.type
|
44
|
+
data = write_event.data
|
45
|
+
metadata = write_event.metadata
|
46
|
+
|
47
|
+
logger.debug(tags: [:data, :event_data]) { "Data: #{data.pretty_inspect}" }
|
48
|
+
logger.debug(tags: [:data, :event_data]) { "Metadata: #{metadata.pretty_inspect}" }
|
49
|
+
|
50
|
+
return type, data, metadata
|
51
|
+
end
|
52
|
+
|
53
|
+
def insert_event(stream_name, type, data, metadata, expected_version)
|
54
|
+
serialized_data = serialized_data(data)
|
55
|
+
serialized_metadata = serialized_metadata(metadata)
|
56
|
+
records = execute_query(stream_name, type, serialized_data, serialized_metadata, expected_version)
|
57
|
+
position(records)
|
58
|
+
end
|
59
|
+
|
60
|
+
def execute_query(stream_name, type, serialized_data, serialized_metadata, expected_version)
|
61
|
+
logger.trace { "Executing insert (Stream Name: #{stream_name}, Type: #{type}, Expected Version: #{expected_version.inspect})" }
|
62
|
+
|
63
|
+
params = [
|
64
|
+
stream_name,
|
65
|
+
type,
|
66
|
+
serialized_data,
|
67
|
+
serialized_metadata,
|
68
|
+
expected_version
|
69
|
+
]
|
70
|
+
|
71
|
+
begin
|
72
|
+
records = session.execute(self.class.statement, params)
|
73
|
+
rescue PG::RaiseException => e
|
74
|
+
raise_error e
|
75
|
+
end
|
76
|
+
|
77
|
+
logger.debug { "Executed insert (Stream Name: #{stream_name}, Type: #{type}, Expected Version: #{expected_version.inspect})" }
|
78
|
+
|
79
|
+
records
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.statement
|
83
|
+
@statement ||= "SELECT write_event($1::varchar, $2::varchar, $3::jsonb, $4::jsonb, $5::int);"
|
84
|
+
end
|
85
|
+
|
86
|
+
def serialized_data(data)
|
87
|
+
serialized_data = nil
|
88
|
+
|
89
|
+
if data.is_a?(Hash) && data.empty?
|
90
|
+
data = nil
|
91
|
+
end
|
92
|
+
|
93
|
+
unless data.nil?
|
94
|
+
serializable_data = EventData::Hash[data]
|
95
|
+
serialized_data = Transform::Write.(serializable_data, :json)
|
96
|
+
end
|
97
|
+
|
98
|
+
logger.debug(tags: [:data, :serialize]) { "Serialized Data: #{serialized_data.inspect}" }
|
99
|
+
serialized_data
|
100
|
+
end
|
101
|
+
|
102
|
+
def serialized_metadata(metadata)
|
103
|
+
serialized_metadata = nil
|
104
|
+
|
105
|
+
if metadata.is_a?(Hash) && metadata.empty?
|
106
|
+
metadata = nil
|
107
|
+
end
|
108
|
+
|
109
|
+
unless metadata.nil?
|
110
|
+
serializable_metadata = EventData::Hash[metadata]
|
111
|
+
serialized_metadata = Transform::Write.(serializable_metadata, :json)
|
112
|
+
end
|
113
|
+
|
114
|
+
logger.debug(tags: [:data, :serialize]) { "Serialized Metadata: #{serialized_metadata.inspect}" }
|
115
|
+
serialized_metadata
|
116
|
+
end
|
117
|
+
|
118
|
+
def position(records)
|
119
|
+
position = nil
|
120
|
+
unless records[0].nil?
|
121
|
+
position = records[0].values[0]
|
122
|
+
end
|
123
|
+
position
|
124
|
+
end
|
125
|
+
|
126
|
+
def raise_error(pg_error)
|
127
|
+
error_message = pg_error.message
|
128
|
+
if error_message.include? 'Wrong expected version'
|
129
|
+
error_message.gsub!('ERROR:', '').strip!
|
130
|
+
logger.error { error_message }
|
131
|
+
raise ExpectedVersion::Error, error_message
|
132
|
+
end
|
133
|
+
raise pg_error
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module EventSource
|
2
|
+
module Postgres
|
3
|
+
class Session
|
4
|
+
include Log::Dependency
|
5
|
+
|
6
|
+
def self.settings
|
7
|
+
Settings.names
|
8
|
+
end
|
9
|
+
|
10
|
+
settings.each do |s|
|
11
|
+
setting s
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_accessor :connection
|
15
|
+
|
16
|
+
def self.build(settings: nil)
|
17
|
+
new.tap do |instance|
|
18
|
+
settings ||= Settings.instance
|
19
|
+
settings.set(instance)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.configure(receiver, session: nil, attr_name: nil)
|
24
|
+
attr_name ||= :session
|
25
|
+
|
26
|
+
instance = session || build
|
27
|
+
receiver.public_send "#{attr_name}=", instance
|
28
|
+
instance
|
29
|
+
end
|
30
|
+
|
31
|
+
def connect
|
32
|
+
logger.trace "Connecting to database"
|
33
|
+
|
34
|
+
if connected?
|
35
|
+
logger.debug { "Already connected. A new connection will not be built." }
|
36
|
+
return
|
37
|
+
end
|
38
|
+
|
39
|
+
logger.debug { "Not connected. A new connection will be built." }
|
40
|
+
connection = self.class.build_connection(self)
|
41
|
+
self.connection = connection
|
42
|
+
|
43
|
+
logger.debug { "Connected to database" }
|
44
|
+
|
45
|
+
connection
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.build_connection(instance)
|
49
|
+
settings = instance.settings
|
50
|
+
logger.trace { "Building new connection to database (Settings: #{LogText.settings(settings).inspect})" }
|
51
|
+
|
52
|
+
connection = PG::Connection.open(settings)
|
53
|
+
connection.type_map_for_results = PG::BasicTypeMapForResults.new(connection)
|
54
|
+
|
55
|
+
logger.trace { "Built new connection to database (Settings: #{LogText.settings(settings).inspect})" }
|
56
|
+
|
57
|
+
connection
|
58
|
+
end
|
59
|
+
|
60
|
+
def connected?
|
61
|
+
!connection.nil? && connection.status == PG::CONNECTION_OK
|
62
|
+
end
|
63
|
+
alias :open? :connected?
|
64
|
+
|
65
|
+
def close
|
66
|
+
connection.close
|
67
|
+
connection = nil
|
68
|
+
end
|
69
|
+
|
70
|
+
def reset
|
71
|
+
connection.reset
|
72
|
+
end
|
73
|
+
|
74
|
+
def settings
|
75
|
+
settings = {}
|
76
|
+
self.class.settings.each do |s|
|
77
|
+
val = public_send(s)
|
78
|
+
settings[s] = val unless val.nil?
|
79
|
+
end
|
80
|
+
settings
|
81
|
+
end
|
82
|
+
|
83
|
+
def execute(statement, params=nil)
|
84
|
+
unless connected?
|
85
|
+
connect
|
86
|
+
end
|
87
|
+
|
88
|
+
if params.nil?
|
89
|
+
connection.exec(statement)
|
90
|
+
else
|
91
|
+
connection.exec_params(statement, params)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def transaction(&blk)
|
96
|
+
unless connected?
|
97
|
+
connect
|
98
|
+
end
|
99
|
+
|
100
|
+
connection.transaction(&blk)
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.logger
|
104
|
+
@logger ||= Log.get self
|
105
|
+
end
|
106
|
+
|
107
|
+
module LogText
|
108
|
+
def self.settings(settings)
|
109
|
+
s = settings.dup
|
110
|
+
|
111
|
+
if s.has_key?(:password)
|
112
|
+
s[:password] = '(hidden)'
|
113
|
+
end
|
114
|
+
|
115
|
+
s
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module EventSource
|
2
|
+
module Postgres
|
3
|
+
class Settings < ::Settings
|
4
|
+
def self.instance
|
5
|
+
@instance ||= build
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.data_source
|
9
|
+
'settings/event_source_postgres.json'
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.names
|
13
|
+
[
|
14
|
+
:dbname,
|
15
|
+
:host,
|
16
|
+
:hostaddr,
|
17
|
+
:port,
|
18
|
+
:user,
|
19
|
+
:password,
|
20
|
+
:connect_timeout,
|
21
|
+
:options,
|
22
|
+
:sslmode,
|
23
|
+
:krbsrvname,
|
24
|
+
:gsslib,
|
25
|
+
:service
|
26
|
+
]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: evt-event_source-postgres
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.10.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- The Eventide Project
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-12-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: evt-event_source
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: evt-log
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: evt-cycle
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
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: evt-settings
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
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: pg
|
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: test_bench
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: " "
|
98
|
+
email: opensource@eventide-project.org
|
99
|
+
executables: []
|
100
|
+
extensions: []
|
101
|
+
extra_rdoc_files: []
|
102
|
+
files:
|
103
|
+
- lib/event_source/loader.rb
|
104
|
+
- lib/event_source/postgres.rb
|
105
|
+
- lib/event_source/postgres/controls.rb
|
106
|
+
- lib/event_source/postgres/controls/category.rb
|
107
|
+
- lib/event_source/postgres/controls/event_data.rb
|
108
|
+
- lib/event_source/postgres/controls/put.rb
|
109
|
+
- lib/event_source/postgres/controls/stream.rb
|
110
|
+
- lib/event_source/postgres/controls/stream_name.rb
|
111
|
+
- lib/event_source/postgres/get.rb
|
112
|
+
- lib/event_source/postgres/get/select_statement.rb
|
113
|
+
- lib/event_source/postgres/log.rb
|
114
|
+
- lib/event_source/postgres/put.rb
|
115
|
+
- lib/event_source/postgres/read.rb
|
116
|
+
- lib/event_source/postgres/session.rb
|
117
|
+
- lib/event_source/postgres/settings.rb
|
118
|
+
- lib/event_source/postgres/write.rb
|
119
|
+
homepage: https://github.com/eventide-project/event-source-postgres
|
120
|
+
licenses:
|
121
|
+
- MIT
|
122
|
+
metadata: {}
|
123
|
+
post_install_message:
|
124
|
+
rdoc_options: []
|
125
|
+
require_paths:
|
126
|
+
- lib
|
127
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 2.3.3
|
132
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - ">="
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
requirements: []
|
138
|
+
rubyforge_project:
|
139
|
+
rubygems_version: 2.5.2
|
140
|
+
signing_key:
|
141
|
+
specification_version: 4
|
142
|
+
summary: Event source client for PostgreSQL
|
143
|
+
test_files: []
|