messaging 3.6.2 → 3.7.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '049d3a3eac021195a546e67f3ce5351fa93a105a86a7bddc10b6fcb140533e43'
4
- data.tar.gz: bce77446512ba9f31d3b21739ef2af2c59ac8bd89c2ff7d15006459aff3cd387
3
+ metadata.gz: 33403486d5e5dad21b6ed8b8d5c8e99d090ce19d79f5278e0aa5ee43dd43c8d5
4
+ data.tar.gz: d174552154912fe26401443c8b5e74b202c0faeb054f8ed6affad299843da91d
5
5
  SHA512:
6
- metadata.gz: 2b54e3f6633fa243b6fba4d20e2359c8018cbb37634a7420c75f9e2e8cf6a9da44aa0bebc139ed06ded0b887a35383be72c38c8a58ee6f3e6d288d5527b73e28
7
- data.tar.gz: f45a5fb8cee52d26d0ef769a5557ac2fcabebc0b27bc5374a2bd5b25c930a3731b80238efc22429290bfdb0be14b915e2fc995af299d2580b1a6f2160462512f
6
+ metadata.gz: 4477a3ec21fd27ca4735741ec690c8a9f9308c14b18b4c2236a04ba3991dec1fe16359896d1058bb5cf36fda9b2d119cdb8f79870237d1a4d4bed05be6561ac7
7
+ data.tar.gz: b8ec79f61ac86766d586f166053f829e7329f06e57366cfc88586ffd4a9d28d5047958f9fcf35f1c8ba50f489d48404b623d572197e10b7cdc8f654def0cb5f6
data/.circleci/config.yml CHANGED
@@ -2,51 +2,53 @@
2
2
  #
3
3
  # Check https://circleci.com/docs/2.0/language-ruby/ for more details
4
4
  #
5
- version: 2
6
- jobs:
7
- build:
8
- docker:
9
- - image: circleci/ruby:2.4.1-node-browsers
10
- environment:
11
- - CC_TEST_REPORTER_ID: 94ada9b95ee3f232a6e984809d37917cfee90ac47805429e8c49742b2e8d2276
12
- - RAILS_ENV: test
13
- - image: circleci/postgres:12.5-ram
14
- environment:
15
- - POSTGRES_HOST_AUTH_METHOD: trust
16
- - POSTGRES_PASSWORD: password
5
+ version: 2.1
6
+ orbs:
7
+ slack: circleci/slack@4.8.2
17
8
 
18
- working_directory: ~/repo
9
+ shared: &shared
10
+ docker:
11
+ # https://github.com/bukowskis/fineart/wiki/Updating-the-development-docker-image-for-Circle-CI
12
+ - image: ghcr.io/bukowskis/base-image/development:ruby-2.6.6-v5
13
+ auth:
14
+ username: $GHCR_USER
15
+ password: $GHCR_PASSWORD
16
+ - image: cimg/postgres:12.11
17
+ environment:
18
+ - POSTGRES_HOST_AUTH_METHOD: trust
19
+ resource_class: large
20
+ environment:
21
+ - CC_TEST_REPORTER_ID: 94ada9b95ee3f232a6e984809d37917cfee90ac47805429e8c49742b2e8d2276
22
+ - DISABLE_SPRING: 1
23
+ - RACK_ENV: test
19
24
 
25
+ commands:
26
+ bundle_install:
20
27
  steps:
21
- - run:
22
- name: Install aptitude because it has much more helpful error messages when ending up in dependency hell
23
- command: sudo apt-get install --assume-yes aptitude
24
-
25
- - run:
26
- name: Install Postgres Client
27
- command: sudo aptitude -y install postgresql-client
28
-
29
- - checkout
30
-
31
- - run:
32
- name: Setup Code Climate test-reporter
33
- command: |
34
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
35
- chmod +x ./cc-test-reporter
36
-
37
28
  - restore_cache:
38
29
  name: Restore Bundler Cache
39
- key: messaging-bundle-{{ checksum "Gemfile.lock" }}
30
+ key: bukowskis-bundle-{{ .Environment.CACHE_VERSION }}-{{ checksum "Gemfile.lock" }}
40
31
 
41
32
  - run:
42
- name: install dependencies
43
- command: bundle install --jobs=4 --retry=3 --path vendor/bundle
33
+ name: Bundle Install
34
+ command: bundle install --path=vendor/bundle --jobs=4 --retry=3
44
35
 
45
36
  - save_cache:
46
- key: messagin-bundle-{{ checksum "Gemfile.lock" }}
37
+ key: bukowskis-bundle-{{ .Environment.CACHE_VERSION }}-{{ checksum "Gemfile.lock" }}
47
38
  paths:
48
39
  - vendor/bundle
49
40
 
41
+ jobs:
42
+ specs:
43
+ <<: *shared
44
+ steps:
45
+ - checkout
46
+ - bundle_install
47
+ - run:
48
+ name: Setup Code Climate test-reporter
49
+ command: |
50
+ curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
51
+ chmod +x ./cc-test-reporter
50
52
  - run:
51
53
  name: Database Setup
52
54
  command: |
@@ -65,4 +67,4 @@ workflows:
65
67
  version: 2
66
68
  messaging_specs:
67
69
  jobs:
68
- - build
70
+ - specs
data/.env ADDED
@@ -0,0 +1 @@
1
+ PG_VERSION=12
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- messaging (3.5.7)
4
+ messaging (3.7.1)
5
5
  activerecord
6
6
  activesupport
7
7
  after_transaction
@@ -45,8 +45,8 @@ GEM
45
45
  tzinfo (~> 1.1)
46
46
  addressable (2.7.0)
47
47
  public_suffix (>= 2.0.2, < 5.0)
48
- after_transaction (0.0.3)
49
- activerecord (< 6.0)
48
+ after_transaction (0.0.5)
49
+ activerecord
50
50
  arel (9.0.0)
51
51
  axiom-types (0.1.1)
52
52
  descendants_tracker (~> 0.0.4)
@@ -73,24 +73,23 @@ GEM
73
73
  descendants_tracker (0.0.4)
74
74
  thread_safe (~> 0.3, >= 0.3.1)
75
75
  diff-lcs (1.3)
76
- digest-crc (0.5.1)
76
+ digest-crc (0.6.0)
77
77
  dnsruby (1.61.3)
78
78
  addressable (~> 2.5)
79
79
  docile (1.3.2)
80
- dry-configurable (0.8.3)
80
+ dry-configurable (0.13.0)
81
81
  concurrent-ruby (~> 1.0)
82
- dry-core (~> 0.4, >= 0.4.7)
83
- dry-container (0.7.2)
82
+ dry-core (~> 0.6)
83
+ dry-container (0.9.0)
84
84
  concurrent-ruby (~> 1.0)
85
- dry-configurable (~> 0.1, >= 0.1.3)
86
- dry-core (0.4.9)
85
+ dry-configurable (~> 0.13, >= 0.13.0)
86
+ dry-core (0.7.1)
87
87
  concurrent-ruby (~> 1.0)
88
- dry-equalizer (0.2.2)
89
- dry-initializer (3.0.3)
88
+ dry-equalizer (0.3.0)
89
+ dry-initializer (3.0.4)
90
90
  em-websocket (0.5.1)
91
91
  eventmachine (>= 0.12.9)
92
92
  http_parser.rb (~> 0.6.0)
93
- equalizer (0.0.11)
94
93
  erubi (1.9.0)
95
94
  ethon (0.12.0)
96
95
  ffi (>= 1.3.0)
@@ -101,7 +100,6 @@ GEM
101
100
  ffi (1.11.3)
102
101
  forwardable-extended (2.6.0)
103
102
  gemoji (3.0.1)
104
- geocoder (1.2.13)
105
103
  github-pages (203)
106
104
  github-pages-health-check (= 1.16.1)
107
105
  jekyll (= 3.8.5)
@@ -151,7 +149,6 @@ GEM
151
149
  octokit (~> 4.0)
152
150
  public_suffix (~> 3.0)
153
151
  typhoeus (~> 1.3)
154
- hashie (4.1.0)
155
152
  html-pipeline (2.12.2)
156
153
  activesupport (>= 2)
157
154
  nokogiri (>= 1.4)
@@ -272,21 +269,11 @@ GEM
272
269
  listen (3.2.1)
273
270
  rb-fsevent (~> 0.10, >= 0.10.3)
274
271
  rb-inotify (~> 0.9, >= 0.9.10)
275
- locality (1.1.0)
276
- activesupport
277
- geocoder (= 1.2.13)
278
- hashie
279
- i18n
280
- maxminddb (= 0.1.8)
281
- operation
282
- trouble
283
272
  loofah (2.4.0)
284
273
  crass (~> 1.0.2)
285
274
  nokogiri (>= 1.5.9)
286
- maxminddb (0.1.8)
287
275
  mercenary (0.3.6)
288
- meter (1.2.7)
289
- locality (~> 1.1.0)
276
+ meter (1.4.0)
290
277
  useragent (~> 0.16.3)
291
278
  method_object (1.0.0)
292
279
  dry-initializer
@@ -303,7 +290,6 @@ GEM
303
290
  mini_portile2 (~> 2.4.0)
304
291
  octokit (4.14.0)
305
292
  sawyer (~> 0.8.0, >= 0.5.3)
306
- operation (1.4.1)
307
293
  pathutil (0.16.2)
308
294
  forwardable-extended (~> 2.6)
309
295
  pg (1.1.4)
@@ -358,7 +344,7 @@ GEM
358
344
  rspec-support (3.9.0)
359
345
  ruby-enum (0.7.2)
360
346
  i18n
361
- ruby-kafka (1.0.0)
347
+ ruby-kafka (1.5.0)
362
348
  digest-crc
363
349
  rubyzip (1.3.0)
364
350
  safe_yaml (1.0.5)
@@ -384,18 +370,16 @@ GEM
384
370
  unicode-display_width (~> 1.1, >= 1.1.1)
385
371
  thor (0.20.3)
386
372
  thread_safe (0.3.6)
387
- trouble (0.0.13)
388
373
  typhoeus (1.3.1)
389
374
  ethon (>= 0.9.0)
390
375
  tzinfo (1.2.5)
391
376
  thread_safe (~> 0.1)
392
377
  unicode-display_width (1.6.0)
393
378
  useragent (0.16.10)
394
- virtus (1.0.5)
379
+ virtus (2.0.0)
395
380
  axiom-types (~> 0.1)
396
381
  coercible (~> 1.0)
397
382
  descendants_tracker (~> 0.0, >= 0.0.3)
398
- equalizer (~> 0.0, >= 0.0.9)
399
383
 
400
384
  PLATFORMS
401
385
  ruby
@@ -0,0 +1,62 @@
1
+ version: '3.4'
2
+
3
+ x-shared: &shared
4
+ tmpfs:
5
+ - /tmp
6
+ environment:
7
+ - RAILS_ENV=${RAILS_ENV:-development}
8
+ - BOOTSNAP_CACHE_DIR=/rails_cache/bootsnap
9
+ volumes:
10
+ - .:/app
11
+ - bundle:/usr/local/bundle
12
+ networks:
13
+ - ${NETWORK_NAME:-default}
14
+
15
+ services:
16
+ runner:
17
+ <<: *shared
18
+ image: ghcr.io/bukowskis/base-image/development:ruby-2.6.6-v5
19
+ stdin_open: true
20
+ tty: true
21
+ command: /bin/sh
22
+
23
+ postgres:
24
+ image: postgres:${PG_VERSION}
25
+ volumes:
26
+ - pg_data:/var/lib/postgresql/data
27
+ ports:
28
+ - 5432:5432
29
+ environment:
30
+ - POSTGRES_HOST_AUTH_METHOD=trust
31
+
32
+ zookeeper:
33
+ image: zookeeper
34
+ ports:
35
+ - "2181:2181"
36
+
37
+ kafka:
38
+ image: niks123123/kafka:2.7.0
39
+ ports:
40
+ - "9092:9092"
41
+ depends_on:
42
+ - zookeeper
43
+ environment:
44
+ KAFKA_ADVERTISED_HOST_NAME: kafka
45
+ KAFKA_ADVERTISED_PORT: 9092
46
+ KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
47
+ KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'
48
+ volumes:
49
+ - /var/run/docker.sock:/var/run/docker.sock
50
+
51
+ volumes:
52
+ bundle:
53
+ name: bundle
54
+ pg_data:
55
+ name: pg_data_${PG_VERSION}
56
+
57
+ networks:
58
+ default:
59
+ name: messaging_default
60
+ external:
61
+ name: ${EXTERNAL_NETWORK}
62
+ external: true
@@ -20,8 +20,8 @@ module Messaging
20
20
  def call(message)
21
21
  reconnect if forked?
22
22
  producer.produce(message.to_json, key: message.message_key, topic: message.topic)
23
- rescue ::Kafka::BufferOverflow => exception
24
- Trouble.notify(exception, pid: Process.pid, message: message.to_json)
23
+ rescue ::Kafka::BufferOverflow => e
24
+ ExceptionHandler.call(e, message: message.to_json)
25
25
  end
26
26
 
27
27
  def shutdown
@@ -0,0 +1,30 @@
1
+ module Messaging
2
+ module Adapters
3
+ class Postgres
4
+ class Categories
5
+ class Row
6
+ extend Dry::Initializer
7
+
8
+ param :table_name
9
+ param :type
10
+ param :expression
11
+
12
+ def category_class
13
+ return CategoryWithPartitions if type == 'p'
14
+
15
+ Category
16
+ end
17
+
18
+ def category_name
19
+ regexp = /FOR VALUES IN \(\'(.*)\'\)/
20
+ expression.match(regexp)[1]
21
+ end
22
+
23
+ def to_category
24
+ category_class.new(category_name, table_name)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -5,9 +5,7 @@ module Messaging
5
5
  include Enumerable
6
6
 
7
7
  def each
8
- all_categories.each do |name|
9
- yield Category.new(name)
10
- end
8
+ all_categories.each { |c| yield c }
11
9
  end
12
10
 
13
11
  # Get a category by name
@@ -16,10 +14,7 @@ module Messaging
16
14
  # @return [nil] if no category exists with the given name
17
15
  # @return [Category]
18
16
  def [](name)
19
- category = all_categories.select { |c| c == name }
20
- return unless category
21
-
22
- Category.new(category)
17
+ all_categories.find { |c| c.name == name }
23
18
  end
24
19
 
25
20
  # Creates a table partition for the given category
@@ -27,20 +22,36 @@ module Messaging
27
22
  # @param name [String] the name of the category
28
23
  # @return [Category]
29
24
  def create(name)
30
- table_name = name.parameterize(separator: '_')
25
+ table_name = Category.table_name_for(name)
31
26
  sql = <<~SQL
32
27
  CREATE TABLE messaging.#{table_name}
33
28
  PARTITION OF messaging.messages FOR VALUES IN ('#{name}');
34
29
  SQL
35
30
  connection.execute sql
36
- Category.new(name)
31
+ Category.new(name, table_name)
32
+ end
33
+
34
+ # Creates a table partition for the given category
35
+ # that in turn is partitioned based on created_at
36
+ #
37
+ # @param name [String] the name of the category
38
+ # @return [CategoryWithPartitions]
39
+ def create_and_partition_by_day(name)
40
+ table_name = Category.table_name_for(name)
41
+ sql = <<~SQL
42
+ CREATE TABLE messaging.#{table_name}
43
+ PARTITION OF messaging.messages FOR VALUES IN ('#{name}')
44
+ PARTITION BY RANGE (created_at);
45
+ SQL
46
+ connection.execute sql
47
+ CategoryWithPartitions.new(name, table_name)
37
48
  end
38
49
 
39
50
  # Drops the table partition (including all messages) for the given category
40
51
  #
41
52
  # @param name [String] the name of the category
42
53
  def drop(name)
43
- table_name = name.parameterize(separator: '_')
54
+ table_name = Category.table_name_for(name)
44
55
  sql = <<~SQL
45
56
  drop TABLE messaging.#{table_name}
46
57
  SQL
@@ -55,15 +66,19 @@ module Messaging
55
66
 
56
67
  def fetch_categories
57
68
  sql = <<~SQL
58
- SELECT child.relname AS category
69
+ SELECT child.relname AS category,
70
+ child.relkind AS category_type,
71
+ pg_get_expr(child.relpartbound, child.oid, true) AS expression
59
72
  FROM pg_inherits
60
73
  JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
61
74
  JOIN pg_class child ON pg_inherits.inhrelid = child.oid
62
75
  JOIN pg_namespace ON pg_namespace.oid = parent.relnamespace
63
- WHERE pg_namespace.nspname = 'messaging' AND child.relkind in ('r', 'p')
76
+ WHERE pg_namespace.nspname = 'messaging'
77
+ AND parent.relname = 'messages'
78
+ AND child.relkind in ('r', 'p')
64
79
  ORDER BY category
65
80
  SQL
66
- connection.select_values(sql)
81
+ connection.select_rows(sql).map { |r| Row.new(*r).to_category }
67
82
  end
68
83
 
69
84
  def connection
@@ -2,16 +2,13 @@ module Messaging
2
2
  module Adapters
3
3
  class Postgres
4
4
  class Category
5
- # @return [String] the name of the category
6
- attr_reader :name
5
+ extend Dry::Initializer
7
6
 
8
- # Should not be used directly.
9
- # Use {Messaging.category} or {Store#category}
10
- # @api private
11
- # @see Messaging.category
12
- # @see Store.category
13
- def initialize(name)
14
- @name = name
7
+ param :name
8
+ param :table_name, default: -> { self.class.table_name_for(name) }
9
+
10
+ def self.table_name_for(name)
11
+ name.parameterize(separator: '_')
15
12
  end
16
13
 
17
14
  # Access to all messages in the category sorted by created_at
@@ -20,19 +17,8 @@ module Messaging
20
17
  SerializedMessage.where(stream_category: name).order(:created_at)
21
18
  end
22
19
 
23
- def messages_older_than(time)
24
- messages.where('created_at < ?', time)
25
- end
26
-
27
- def delete_messages_older_than!(time)
28
- SerializedMessage.transaction do
29
- ActiveRecord::Base.connection.execute "SET LOCAL statement_timeout = '0'"
30
- messages_older_than(time).delete_all
31
- end
32
- end
33
-
34
20
  def inspect
35
- "#<Category:#{name}>>"
21
+ "#<Category: #{name}>"
36
22
  end
37
23
  end
38
24
  end
@@ -0,0 +1,89 @@
1
+ module Messaging
2
+ module Adapters
3
+ class Postgres
4
+ class CategoryWithPartitions < Category
5
+ def add_partition(date:)
6
+ from, to = partition_range_for(date: date)
7
+ partition_name = partition_name_for(date: from)
8
+
9
+ return if partition_exists?(partition_name)
10
+
11
+ sql = <<~SQL
12
+ CREATE TABLE IF NOT EXISTS messaging.#{partition_name}
13
+ PARTITION OF messaging.#{table_name} FOR VALUES FROM ('#{from}') TO ('#{to}')
14
+ SQL
15
+
16
+ SerializedMessage.transaction do
17
+ AdvisoryTransactionLock.call key: partition_name
18
+ SerializedMessage.connection.execute sql
19
+ end
20
+ end
21
+
22
+ # Creates multiple partitions
23
+ #
24
+ # @param start_date [Date] from which date to create partitions
25
+ # @param days [Integer] how many days worth of partitions to create
26
+ def add_partitions(start_date:, days: 1)
27
+ first = start_date.to_date
28
+ last = first + (days - 1)
29
+
30
+ (first..last).each do |date|
31
+ add_partition(date: date)
32
+ end
33
+ end
34
+
35
+ # Removes a partition including the included messages
36
+ #
37
+ # @param partition_name [String] the name of the partition to drop
38
+ def drop_partition(partition_name)
39
+ return unless partition_name.match?(/^#{table_name}_\d{4}_\d{2}_\d{2}$/)
40
+
41
+ SerializedMessage.connection.execute "drop TABLE messaging.#{partition_name}"
42
+ end
43
+
44
+ # Removes all partitions older than the given date
45
+ #
46
+ # @param date [Date] the cutoff date
47
+ def drop_partitions_older_than(date)
48
+ max_partition_name = partition_name_for(date: date)
49
+ partitions.select { |p| p < max_partition_name }.each do |p|
50
+ drop_partition(p)
51
+ end
52
+ end
53
+
54
+ def partition_name_for(date:)
55
+ "#{name}_%d_%02d_%02d" % [date.year, date.month, date.day]
56
+ end
57
+
58
+ def partition_range_for(date:)
59
+ from = date.to_time.beginning_of_day
60
+ to = from + 1.day
61
+ [from, to]
62
+ end
63
+
64
+ def partition_exists?(partition_name)
65
+ partitions.include? partition_name
66
+ end
67
+
68
+ def partitions
69
+ sql = <<~SQL
70
+ SELECT child.relname AS name
71
+ FROM pg_inherits
72
+ JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
73
+ JOIN pg_class child ON pg_inherits.inhrelid = child.oid
74
+ JOIN pg_namespace ON pg_namespace.oid = parent.relnamespace
75
+ WHERE pg_namespace.nspname = 'messaging'
76
+ AND parent.relname = '#{table_name}'
77
+ AND child.relkind = 'r'
78
+ ORDER BY name
79
+ SQL
80
+ SerializedMessage.connection.select_values(sql)
81
+ end
82
+
83
+ def inspect
84
+ "#<CategoryWithPartitions: #{name}>"
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -1,5 +1,7 @@
1
1
  require_relative 'category'
2
+ require_relative 'category_with_partitions'
2
3
  require_relative 'categories'
4
+ require_relative 'categories/row'
3
5
  require_relative 'stream'
4
6
  require_relative 'streams'
5
7
 
@@ -83,6 +85,13 @@ module Messaging
83
85
  return message unless message.stream_name
84
86
 
85
87
  SerializedMessage.create!(message: message).to_message
88
+ rescue ActiveRecord::StatementInvalid => e
89
+ category = message.category
90
+ raise e unless e.message.include?('no partition of relation')
91
+ raise e unless category || category.is_a?(CategoryWithPartitions)
92
+
93
+ category.add_partition(date: Date.today)
94
+ retry
86
95
  end
87
96
  end
88
97
  end
@@ -11,10 +11,6 @@ module Messaging
11
11
  def messages
12
12
  @messages ||= []
13
13
  end
14
-
15
- def delete_messages_older_than!(time)
16
- messages.delete_if { |m| m.timestamp < time }
17
- end
18
14
  end
19
15
  end
20
16
  end
@@ -124,6 +124,10 @@ module Messaging
124
124
  stream_name.split('$').first
125
125
  end
126
126
 
127
+ def category
128
+ Messaging.category(stream_category)
129
+ end
130
+
127
131
  def stream_id
128
132
  return unless stream_name
129
133
 
@@ -1,3 +1,3 @@
1
1
  module Messaging
2
- VERSION = '3.6.2'.freeze
2
+ VERSION = '3.7.1'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: messaging
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.6.2
4
+ version: 3.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bukowskis
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-02-03 00:00:00.000000000 Z
11
+ date: 2023-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -271,6 +271,7 @@ extensions: []
271
271
  extra_rdoc_files: []
272
272
  files:
273
273
  - ".circleci/config.yml"
274
+ - ".env"
274
275
  - ".gitignore"
275
276
  - ".rspec"
276
277
  - Gemfile
@@ -282,6 +283,7 @@ files:
282
283
  - _layouts/single.html
283
284
  - bin/console
284
285
  - bin/setup
286
+ - docker-compose.yml
285
287
  - docs/adapters.md
286
288
  - docs/consuming.md
287
289
  - docs/installation.md
@@ -297,7 +299,9 @@ files:
297
299
  - lib/messaging/adapters/postgres.rb
298
300
  - lib/messaging/adapters/postgres/advisory_transaction_lock.rb
299
301
  - lib/messaging/adapters/postgres/categories.rb
302
+ - lib/messaging/adapters/postgres/categories/row.rb
300
303
  - lib/messaging/adapters/postgres/category.rb
304
+ - lib/messaging/adapters/postgres/category_with_partitions.rb
301
305
  - lib/messaging/adapters/postgres/serialized_message.rb
302
306
  - lib/messaging/adapters/postgres/store.rb
303
307
  - lib/messaging/adapters/postgres/stream.rb