janus-ar 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 02c92206a54d203c923936849e6fd8c5621c8da702c4f0e327680a6084f86a75
4
- data.tar.gz: b0e4746b02cf9e1bdf123cf7ad8b0e5ec0485bbb1433d6e9b6e98483b2afd132
3
+ metadata.gz: c7f4d589060d390c2a1c0697cdde34bb36e92a4daed4ab477d8fa543de113ae1
4
+ data.tar.gz: dd3e5fc8957cc36e5a06684934b7a9e41f37b5f5a2c749c686e42d77d49a650b
5
5
  SHA512:
6
- metadata.gz: 228491371a233938062950c382d31e5a68bbf6e60c20c659ffd97920e2b2b8beaab5df874ddc6d4ce5eee15a7efab7776eae5fe6e547e60a91173ba72341d654
7
- data.tar.gz: 9bd2c0749f350bfe663d4d64b2125c6fcc7bb10293b712178b2a6361f6f5a7ae4178b3651c0bca332e35a9180e555af9fb6c7f6e618a1f5911eb8427daf3b34b
6
+ metadata.gz: 68e6fab5ad4a07f4b872f9ddd76d0c74847380d6a2f690d98646a7d2b2d9110eb4fb9a095b8f42bd7912aaeb0774e239bbd9a9cbef9c65fa9fb6e9a9b386b54e
7
+ data.tar.gz: df1f1b37c36dea944d5ce6c1f05080eb119461f0e180edd6dcdb63768bf1f16101644eebc41d302f46c414219fd5cf28cddf6c7a2e9a3ac0632b2cd46627e494
@@ -19,8 +19,10 @@ jobs:
19
19
  mysql:
20
20
  image: mysql:5.7
21
21
  env:
22
- MYSQL_ALLOW_EMPTY_PASSWORD: yes
23
- MYSQL_DATABASE: janus_test
22
+ MYSQL_DATABASE: test
23
+ MYSQL_ROOT_PASSWORD: password
24
+ MYSQL_USER: primary
25
+ MYSQL_PASSWORD: primary_password
24
26
  ports:
25
27
  - 3306:3306
26
28
  options: >-
@@ -34,6 +36,8 @@ jobs:
34
36
  with:
35
37
  ruby-version: ${{ matrix.ruby }}
36
38
  bundler-cache: true
39
+ - run: |
40
+ mysql -u root -p${{ env.MYSQL_PASSWORD || 'password' }} -h 127.0.0.1 -e "CREATE USER 'replica'@'%' IDENTIFIED BY 'replica_password';GRANT SELECT ON test.* TO 'replica'@'%';FLUSH PRIVILEGES;"
37
41
  - run: |
38
42
  bundle exec rspec
39
43
  env:
@@ -0,0 +1,20 @@
1
+ name: Publish GEM
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - v*
7
+ jobs:
8
+ build:
9
+ runs-on: ubuntu-latest
10
+
11
+ steps:
12
+ - uses: actions/checkout@v3
13
+
14
+ - name: Release GEM
15
+ if: contains(github.ref, 'refs/tags/v')
16
+ uses: cadwallion/publish-rubygems-action@master
17
+ env:
18
+ GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
19
+ RUBYGEMS_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}
20
+ RELEASE_COMMAND: gem build && gem push janus-ar-*.gem
data/.gitignore CHANGED
@@ -1 +1,3 @@
1
1
  janus-ar-*.gem
2
+ .bundle/
3
+ .rubocop-*
data/.rubocop.yml CHANGED
@@ -1,3 +1,6 @@
1
+ inherit_from:
2
+ - https://tech.olioex.com/.support/rubocop-styling-v1.0
3
+
1
4
  require:
2
5
  - rubocop-rails
3
6
 
@@ -11,5 +14,9 @@ Metrics/BlockLength:
11
14
  Exclude:
12
15
  - spec/**/*
13
16
 
17
+ Style/GlobalVars:
18
+ Exclude:
19
+ - 'spec/**/*'
20
+
14
21
  Metrics/AbcSize:
15
22
  Max: 22
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- janus-ar (0.4.0)
4
+ janus-ar (0.7.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -25,6 +25,7 @@ GEM
25
25
  ast (2.4.2)
26
26
  base64 (0.2.0)
27
27
  bigdecimal (3.1.7)
28
+ coderay (1.1.3)
28
29
  concurrent-ruby (1.2.3)
29
30
  connection_pool (2.4.1)
30
31
  diff-lcs (1.5.1)
@@ -33,6 +34,7 @@ GEM
33
34
  concurrent-ruby (~> 1.0)
34
35
  json (2.7.2)
35
36
  language_server-protocol (3.17.0.3)
37
+ method_source (1.0.0)
36
38
  minitest (5.22.3)
37
39
  mutex_m (0.2.0)
38
40
  mysql2 (0.5.6)
@@ -40,6 +42,9 @@ GEM
40
42
  parser (3.3.0.5)
41
43
  ast (~> 2.4.1)
42
44
  racc
45
+ pry (0.14.2)
46
+ coderay (~> 1.1)
47
+ method_source (~> 1.0)
43
48
  racc (1.7.3)
44
49
  rack (3.0.10)
45
50
  rainbow (3.1.1)
@@ -72,11 +77,27 @@ GEM
72
77
  unicode-display_width (>= 2.4.0, < 3.0)
73
78
  rubocop-ast (1.31.2)
74
79
  parser (>= 3.3.0.4)
80
+ rubocop-capybara (2.20.0)
81
+ rubocop (~> 1.41)
82
+ rubocop-factory_bot (2.25.1)
83
+ rubocop (~> 1.41)
84
+ rubocop-performance (1.21.0)
85
+ rubocop (>= 1.48.1, < 2.0)
86
+ rubocop-ast (>= 1.31.1, < 2.0)
75
87
  rubocop-rails (2.24.1)
76
88
  activesupport (>= 4.2.0)
77
89
  rack (>= 1.1)
78
90
  rubocop (>= 1.33.0, < 2.0)
79
91
  rubocop-ast (>= 1.31.1, < 2.0)
92
+ rubocop-rspec (2.29.1)
93
+ rubocop (~> 1.40)
94
+ rubocop-capybara (~> 2.17)
95
+ rubocop-factory_bot (~> 2.22)
96
+ rubocop-rspec_rails (~> 2.28)
97
+ rubocop-rspec_rails (2.28.3)
98
+ rubocop (~> 1.40)
99
+ rubocop-thread_safety (0.5.1)
100
+ rubocop (>= 0.90.0)
80
101
  ruby-progressbar (1.13.0)
81
102
  timeout (0.4.1)
82
103
  tzinfo (2.0.6)
@@ -92,10 +113,14 @@ DEPENDENCIES
92
113
  activesupport (>= 7.1.0)
93
114
  janus-ar!
94
115
  mysql2
116
+ pry
95
117
  rake
96
118
  rspec (~> 3)
97
119
  rubocop (~> 1.63.0)
120
+ rubocop-performance
98
121
  rubocop-rails (~> 2.24.0)
122
+ rubocop-rspec
123
+ rubocop-thread_safety
99
124
 
100
125
  BUNDLED WITH
101
126
  2.4.22
data/README.md CHANGED
@@ -6,7 +6,8 @@
6
6
  style="float: left; margin: 0 auto; height: 500px;" />
7
7
  </p>
8
8
 
9
- ![Build Status](https://github.com/OLIOEX/janus-ar/actions/workflows/ci.yml/badge.svg)
9
+ [![CI](https://github.com/OLIOEX/janus-ar/actions/workflows/ci.yml/badge.svg)](https://github.com/OLIOEX/janus-ar/actions/workflows/ci.yml)
10
+ [![Gem Version](https://badge.fury.io/rb/janus-ar.svg)](https://badge.fury.io/rb/janus-ar)
10
11
 
11
12
  > In ancient Roman religion and myth, Janus (/ˈdʒeɪnəs/ JAY-nəs; Latin: Ianvs [ˈi̯aːnʊs]) is the god of beginnings, gates, transitions, time, duality, doorways,[2] passages, frames, and endings. [(wikipedia)](https://en.wikipedia.org/wiki/Janus)
12
13
 
data/janus-ar.gemspec CHANGED
@@ -5,18 +5,18 @@ require File.expand_path('lib/janus/version.rb', __dir__)
5
5
  Gem::Specification.new do |gem|
6
6
  gem.authors = ['Lloyd Watkin']
7
7
  gem.email = ['lloyd@olioex.com']
8
- gem.description = 'Read/Write proxy for ActiveRecord using primary/replca databases'
9
- gem.summary = 'Read/Write proxy for ActiveRecord using primary/replca databases'
8
+ gem.description = 'Read/Write proxy for ActiveRecord using primary/replica databases'
9
+ gem.summary = 'Read/Write proxy for ActiveRecord using primary/replica databases'
10
10
  gem.homepage = 'https://github.com/olioex/janus-ar'
11
- gem.licenses = ['MIT']
11
+ gem.licenses = %w(MIT)
12
12
  gem.metadata = {
13
- 'source_code_uri' => 'https://github.com/olioex/janus-ar'
13
+ 'source_code_uri' => 'https://github.com/olioex/janus-ar',
14
14
  }
15
15
 
16
16
  gem.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
17
17
  gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
18
18
  gem.name = 'janus-ar'
19
- gem.require_paths = ['lib']
19
+ gem.require_paths = %w(lib)
20
20
  gem.version = Janus::VERSION
21
21
 
22
22
  gem.required_ruby_version = '>= 3.2.0'
@@ -24,8 +24,12 @@ Gem::Specification.new do |gem|
24
24
  gem.add_development_dependency 'activerecord', '>= 7.1.0'
25
25
  gem.add_development_dependency 'activesupport', '>= 7.1.0'
26
26
  gem.add_development_dependency 'mysql2'
27
+ gem.add_development_dependency 'pry'
27
28
  gem.add_development_dependency 'rake'
28
29
  gem.add_development_dependency 'rspec', '~> 3'
29
30
  gem.add_development_dependency 'rubocop', '~> 1.63.0'
30
31
  gem.add_development_dependency 'rubocop-rails', '~> 2.24.0'
32
+ gem.add_development_dependency 'rubocop-rspec'
33
+ gem.add_development_dependency 'rubocop-thread_safety'
34
+ gem.add_development_dependency 'rubocop-performance'
31
35
  end
@@ -15,6 +15,7 @@ end
15
15
  module ActiveRecord
16
16
  module ConnectionAdapters
17
17
  class JanusMysql2Adapter < ActiveRecord::ConnectionAdapters::Mysql2Adapter
18
+ FOUND_ROWS = 'FOUND_ROWS'
18
19
  SQL_PRIMARY_MATCHERS = [
19
20
  /\A\s*select.+for update\Z/i, /select.+lock in share mode\Z/i,
20
21
  /\A\s*select.+(nextval|currval|lastval|get_lock|release_lock|pg_advisory_lock|pg_advisory_unlock)\(/i,
@@ -23,6 +24,9 @@ module ActiveRecord
23
24
  SQL_REPLICA_MATCHERS = [/\A\s*(select|with.+\)\s*select)\s/i].freeze
24
25
  SQL_ALL_MATCHERS = [/\A\s*set\s/i].freeze
25
26
  SQL_SKIP_ALL_MATCHERS = [/\A\s*set\s+local\s/i].freeze
27
+ WRITE_PREFIXES = %w(INSERT UPDATE DELETE LOCK CREATE GRANT DROP).freeze
28
+
29
+ attr_reader :config
26
30
 
27
31
  def initialize(*args)
28
32
  args[0][:janus]['replica']['database'] = args[0][:database]
@@ -30,6 +34,7 @@ module ActiveRecord
30
34
 
31
35
  @replica_config = args[0][:janus]['replica']
32
36
  args[0] = args[0][:janus]['primary']
37
+
33
38
  super(*args)
34
39
  @connection_parameters ||= args[0]
35
40
  update_config
@@ -48,7 +53,7 @@ module ActiveRecord
48
53
  super(sql)
49
54
  end
50
55
 
51
- def execute_and_free(sql, name = nil, async: false) # :nodoc:#
56
+ def execute_and_free(sql, name = nil, async: false)
52
57
  if should_send_to_all?(sql)
53
58
  send_to_replica(sql, name, connection: :all)
54
59
  return super(sql, name, async:)
@@ -81,6 +86,10 @@ module ActiveRecord
81
86
  super
82
87
  end
83
88
 
89
+ def replica_connection
90
+ @replica_connection ||= ActiveRecord::ConnectionAdapters::Mysql2Adapter.new(@replica_config)
91
+ end
92
+
84
93
  private
85
94
 
86
95
  def should_send_to_all?(sql)
@@ -108,18 +117,14 @@ module ActiveRecord
108
117
  end
109
118
 
110
119
  def write_query?(sql)
111
- %w[INSERT UPDATE DELETE LOCK CREATE GRANT].include?(sql.split(' ').first)
112
- end
113
-
114
- def replica_connection
115
- @replica_connection ||= ActiveRecord::ConnectionAdapters::Mysql2Adapter.new(@replica_config)
120
+ WRITE_PREFIXES.include?(sql.split(' ').first)
116
121
  end
117
122
 
118
123
  def update_config
119
124
  @config[:flags] ||= 0
120
125
 
121
126
  if @config[:flags].is_a? Array
122
- @config[:flags].push 'FOUND_ROWS'
127
+ @config[:flags].push FOUND_ROWS
123
128
  else
124
129
  @config[:flags] |= ::Mysql2::Client::FOUND_ROWS
125
130
  end
@@ -3,7 +3,7 @@
3
3
  module Janus
4
4
  module Logging
5
5
  module Subscriber
6
- IGNORE_PAYLOAD_NAMES = %w[SCHEMA EXPLAIN].freeze
6
+ IGNORE_PAYLOAD_NAMES = %w(SCHEMA EXPLAIN).freeze
7
7
 
8
8
  def sql(event)
9
9
  name = event.payload[:name]
data/lib/janus/version.rb CHANGED
@@ -4,7 +4,7 @@ module Janus
4
4
  unless defined?(::Janus::VERSION)
5
5
  module VERSION
6
6
  MAJOR = 0
7
- MINOR = 6
7
+ MINOR = 7
8
8
  PATCH = 0
9
9
  PRE = nil
10
10
 
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe ActiveRecord::ConnectionAdapters::JanusMysql2Adapter do
4
+ subject { described_class.new(config) }
5
+
6
+ it { expect(described_class::FOUND_ROWS).to eq 'FOUND_ROWS' }
7
+ it { expect(described_class::SQL_SKIP_ALL_MATCHERS).to eq [/\A\s*set\s+local\s/i] }
8
+ it {
9
+ expect(described_class::SQL_PRIMARY_MATCHERS).to eq(
10
+ [
11
+ /\A\s*select.+for update\Z/i, /select.+lock in share mode\Z/i,
12
+ /\A\s*select.+(nextval|currval|lastval|get_lock|release_lock|pg_advisory_lock|pg_advisory_unlock)\(/i,
13
+ /\A\s*show/i
14
+ ]
15
+ )
16
+ }
17
+ it { expect(described_class::SQL_REPLICA_MATCHERS).to eq([/\A\s*(select|with.+\)\s*select)\s/i]) }
18
+ it { expect(described_class::SQL_ALL_MATCHERS).to eq([/\A\s*set\s/i]) }
19
+ it { expect(described_class::WRITE_PREFIXES).to eq %w(INSERT UPDATE DELETE LOCK CREATE GRANT DROP) }
20
+
21
+ let(:database) { 'test' }
22
+ let(:primary_config) do
23
+ {
24
+ 'username' => 'primary',
25
+ 'password' => 'primary_password',
26
+ 'host' => '127.0.0.1',
27
+ }
28
+ end
29
+ let(:replica_config) do
30
+ {
31
+ 'username' => 'replica',
32
+ 'password' => 'replica_password',
33
+ 'host' => '127.0.0.1',
34
+ 'pool' => 500,
35
+ }
36
+ end
37
+ let(:config) do
38
+ {
39
+ database:,
40
+ adapter: 'janus_mysql2',
41
+ janus: {
42
+ 'primary' => primary_config,
43
+ 'replica' => replica_config,
44
+ },
45
+ }
46
+ end
47
+
48
+ describe 'Configuration' do
49
+ it 'creates primary connection as expected' do
50
+ config = primary_config.dup.freeze
51
+ expect(subject.config).to eq config.merge('database' => database,
52
+ 'flags' => ::Mysql2::Client::FOUND_ROWS).symbolize_keys
53
+ end
54
+
55
+ it 'creates replica connection as expected' do
56
+ config = replica_config.dup.freeze
57
+ expect(
58
+ subject.replica_connection.instance_variable_get(:@config)
59
+ ).to eq config.merge('database' => database, 'flags' => ::Mysql2::Client::FOUND_ROWS).symbolize_keys
60
+ end
61
+
62
+ context 'Rails sets empty database for server connection' do
63
+ let(:database) { nil }
64
+
65
+ it 'creates primary connection as expected' do
66
+ config = primary_config.dup.freeze
67
+ expect(subject.config).to eq config.merge(
68
+ 'database' => nil,
69
+ 'flags' => ::Mysql2::Client::FOUND_ROWS
70
+ ).symbolize_keys
71
+ end
72
+
73
+ it 'creates replica connection as expected' do
74
+ config = replica_config.dup.freeze
75
+ expect(
76
+ subject.replica_connection.instance_variable_get(:@config)
77
+ ).to eq config.merge('database' => nil, 'flags' => ::Mysql2::Client::FOUND_ROWS).symbolize_keys
78
+ end
79
+ end
80
+ end
81
+
82
+ describe 'Integration tests' do
83
+ let(:create_test_table) { ActiveRecord::Base.connection.execute('CREATE TABLE test_table (id INT);') }
84
+
85
+ before(:each) do
86
+ $query_logger.flush_all
87
+ ActiveRecord::Base.establish_connection(config)
88
+ end
89
+
90
+ after(:each) do
91
+ ActiveRecord::Base.connection.execute(<<-SQL
92
+ SELECT CONCAT('DROP TABLE IF EXISTS `', table_name, '`;')
93
+ FROM information_schema.tables
94
+ WHERE table_schema = '#{database}';
95
+ SQL
96
+ ).to_a.map { |row| ActiveRecord::Base.connection.execute(row[0]) }
97
+ end
98
+
99
+ it 'can list tables' do
100
+ expect(ActiveRecord::Base.connection.execute('SHOW TABLES;').to_a).to eq []
101
+ end
102
+
103
+ it 'can create table' do
104
+ create_test_table
105
+ expect(ActiveRecord::Base.connection.execute('SHOW TABLES;').to_a).to eq [%w(test_table)]
106
+ end
107
+
108
+ describe 'SELECT' do
109
+ it 'reads from `replica` by default' do
110
+ create_test_table
111
+ Janus::Context.release_all
112
+ $query_logger.flush_all
113
+ ActiveRecord::Base.connection.execute('SELECT * FROM test_table;')
114
+ expect($query_logger.queries.first).to include '[replica]'
115
+ end
116
+
117
+ it 'will read from primary after a write operation' do
118
+ create_test_table
119
+ $query_logger.flush_all
120
+ ActiveRecord::Base.connection.execute('SELECT * FROM test_table;')
121
+ expect($query_logger.queries.first).to include '[primary]'
122
+ end
123
+ end
124
+ end
125
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,40 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'pry'
4
+
5
+ require 'active_record'
6
+
3
7
  require './lib/janus'
8
+ require './lib/active_record/connection_adapters/janus_mysql2_adapter'
9
+
10
+ class QueryLogger
11
+ def initialize
12
+ @_logs = []
13
+ end
14
+
15
+ def flush_all
16
+ @_logs = []
17
+ end
18
+
19
+ def log(level, message)
20
+ @_logs << "#{level}: #{message}"
21
+ end
22
+
23
+ def error(message)
24
+ log('error', message)
25
+ end
26
+
27
+ def queries
28
+ @_logs
29
+ end
30
+
31
+ def debug?
32
+ true
33
+ end
34
+
35
+ def debug(message)
36
+ log('debug', message)
37
+ end
38
+ end
39
+
40
+ $query_logger = ActiveRecord::Base.logger = QueryLogger.new
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: janus-ar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lloyd Watkin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-09 00:00:00.000000000 Z
11
+ date: 2024-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -108,7 +122,49 @@ dependencies:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
124
  version: 2.24.0
111
- description: Read/Write proxy for ActiveRecord using primary/replca databases
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop-thread_safety
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubocop-performance
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: Read/Write proxy for ActiveRecord using primary/replica databases
112
168
  email:
113
169
  - lloyd@olioex.com
114
170
  executables: []
@@ -117,6 +173,7 @@ extra_rdoc_files: []
117
173
  files:
118
174
  - ".github/dependabot.yml"
119
175
  - ".github/workflows/ci.yml"
176
+ - ".github/workflows/publish.yml"
120
177
  - ".gitignore"
121
178
  - ".rspec"
122
179
  - ".rubocop.yml"
@@ -134,6 +191,7 @@ files:
134
191
  - lib/janus/logging/logger.rb
135
192
  - lib/janus/logging/subscriber.rb
136
193
  - lib/janus/version.rb
194
+ - spec/lib/active_record/connection_adapters/janus_mysql_adapter_spec.rb
137
195
  - spec/lib/janus/context_spec.rb
138
196
  - spec/lib/janus/logging/logger_spec.rb
139
197
  - spec/spec_helper.rb
@@ -160,5 +218,5 @@ requirements: []
160
218
  rubygems_version: 3.5.7
161
219
  signing_key:
162
220
  specification_version: 4
163
- summary: Read/Write proxy for ActiveRecord using primary/replca databases
221
+ summary: Read/Write proxy for ActiveRecord using primary/replica databases
164
222
  test_files: []