koyo-postgres-replication 0.1.0.pre

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
+ SHA256:
3
+ metadata.gz: 78e654e0e390dedac52210540c5dafdb1c189b1bbb01968c8bd09b5bf5ee250f
4
+ data.tar.gz: 9dfdec20a290ae9d30ac91f7cfb404530053f883c9f12a57f678dd3665f4be8a
5
+ SHA512:
6
+ metadata.gz: 97987ad66fbed7a4c14124de1776e771c3e54fb1c70b8f7fca6f588fc054dd858af38b753d2578e65aaefc25e9c048d86af49d6d3f6822ccbdadc7a76d42fbb9
7
+ data.tar.gz: d3fd6f95478bbf33830f7f8c85fcc3b99d9599987fea81cdd639f997d625bfd8fdfc99e9b4881da9ee6f703665d2019f9824ffc5ce38474828918c457abf82c6
data/.DS_Store ADDED
Binary file
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,23 @@
1
+ Gemspec/RequiredRubyVersion:
2
+ Enabled: false
3
+
4
+ Metrics/AbcSize:
5
+ Enabled: false
6
+
7
+ Metrics/BlockLength:
8
+ Enabled: false
9
+
10
+ Metrics/ClassLength:
11
+ Enabled: false
12
+
13
+ Metrics/MethodLength:
14
+ Enabled: false
15
+
16
+ Layout/LineLength:
17
+ Max: 90
18
+
19
+ AllCops:
20
+ DisplayCopNames: true
21
+ Exclude:
22
+ - 'spec/dummy/config/**/*'
23
+ - 'spec/dummy/db/**/*'
data/.yardoc/checksums ADDED
@@ -0,0 +1,14 @@
1
+ lib/koyo.rb 0baca6fa8b0186eea9fee1eff1bba6853aa2e691
2
+ lib/koyo/repl/log.rb 811d21aa6f8843589b66da79a96a4e8b755fcc2d
3
+ lib/koyo/repl/mod.rb 92b54b56643b06fdc74adc65dc04460f631d4036
4
+ lib/koyo/repl/data.rb cb847585c0f439b9f645b5ebd7fa3b96e08b94ff
5
+ lib/koyo/repl/install.rb 9b19b7bb74d084882a1f726693bac2d693015daa
6
+ lib/koyo/repl/railtie.rb acb36cbbe1b386ece7567990945adecb6b6e5b80
7
+ lib/koyo/repl/version.rb 94239a7a9719294e13a38b878da1d328b44fb3f5
8
+ lib/koyo/repl/data_row.rb 321caf0b080621f2d319fa152948cbe864c77294
9
+ lib/koyo/repl/database.rb 39a304909ccf68d69d36c84e3036debd9f29f6ec
10
+ lib/koyo/repl/diagnostics.rb 03b91c5ea3dbe1e337f4427d8f3261ebedb45a70
11
+ lib/koyo/repl/configuration.rb 17858828602d696a584a9e3c239c0a5d94faa738
12
+ lib/koyo/repl/postgres_server.rb 2569fa642e55f6032e6ea73e9ab8762018d3cd6c
13
+ lib/koyo_postgres_replication.rb e3f4d905e3045b59f1f7c799d84cd9fde70eebd8
14
+ lib/koyo/repl/event_handler_service.rb 99b67bdcf3e0e92a04cd01bf8d05a4569b45d218
data/.yardoc/complete ADDED
File without changes
Binary file
Binary file
Binary file
data/Gemfile ADDED
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
5
+
6
+ # Specify your gem's dependencies in koyo_repl.gemspec
7
+ gemspec
8
+
9
+ gem 'rails', '~> 7.0'
10
+ gem 'rake', '~> 13.0'
11
+ gem 'pg', '~> 1.1'
12
+
13
+ group :development, :test do
14
+ gem 'debug', platforms: %i[mri mingw x64_mingw]
15
+ gem 'factory_bot_rails'
16
+ gem 'ffaker'
17
+ gem 'rspec-rails', '~> 6.0'
18
+ gem 'rubocop'
19
+ gem 'yard'
20
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,230 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ koyo-postgres-replication (0.1.0.pre)
5
+ pg (~> 1.1)
6
+ rack (~> 2.0, >= 2.0.0)
7
+ rails (~> 7.0)
8
+ rake (~> 13.0)
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ actioncable (7.0.7)
14
+ actionpack (= 7.0.7)
15
+ activesupport (= 7.0.7)
16
+ nio4r (~> 2.0)
17
+ websocket-driver (>= 0.6.1)
18
+ actionmailbox (7.0.7)
19
+ actionpack (= 7.0.7)
20
+ activejob (= 7.0.7)
21
+ activerecord (= 7.0.7)
22
+ activestorage (= 7.0.7)
23
+ activesupport (= 7.0.7)
24
+ mail (>= 2.7.1)
25
+ net-imap
26
+ net-pop
27
+ net-smtp
28
+ actionmailer (7.0.7)
29
+ actionpack (= 7.0.7)
30
+ actionview (= 7.0.7)
31
+ activejob (= 7.0.7)
32
+ activesupport (= 7.0.7)
33
+ mail (~> 2.5, >= 2.5.4)
34
+ net-imap
35
+ net-pop
36
+ net-smtp
37
+ rails-dom-testing (~> 2.0)
38
+ actionpack (7.0.7)
39
+ actionview (= 7.0.7)
40
+ activesupport (= 7.0.7)
41
+ rack (~> 2.0, >= 2.2.4)
42
+ rack-test (>= 0.6.3)
43
+ rails-dom-testing (~> 2.0)
44
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
45
+ actiontext (7.0.7)
46
+ actionpack (= 7.0.7)
47
+ activerecord (= 7.0.7)
48
+ activestorage (= 7.0.7)
49
+ activesupport (= 7.0.7)
50
+ globalid (>= 0.6.0)
51
+ nokogiri (>= 1.8.5)
52
+ actionview (7.0.7)
53
+ activesupport (= 7.0.7)
54
+ builder (~> 3.1)
55
+ erubi (~> 1.4)
56
+ rails-dom-testing (~> 2.0)
57
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
58
+ activejob (7.0.7)
59
+ activesupport (= 7.0.7)
60
+ globalid (>= 0.3.6)
61
+ activemodel (7.0.7)
62
+ activesupport (= 7.0.7)
63
+ activerecord (7.0.7)
64
+ activemodel (= 7.0.7)
65
+ activesupport (= 7.0.7)
66
+ activestorage (7.0.7)
67
+ actionpack (= 7.0.7)
68
+ activejob (= 7.0.7)
69
+ activerecord (= 7.0.7)
70
+ activesupport (= 7.0.7)
71
+ marcel (~> 1.0)
72
+ mini_mime (>= 1.1.0)
73
+ activesupport (7.0.7)
74
+ concurrent-ruby (~> 1.0, >= 1.0.2)
75
+ i18n (>= 1.6, < 2)
76
+ minitest (>= 5.1)
77
+ tzinfo (~> 2.0)
78
+ ast (2.4.2)
79
+ base64 (0.1.1)
80
+ builder (3.2.4)
81
+ concurrent-ruby (1.2.2)
82
+ crass (1.0.6)
83
+ date (3.3.3)
84
+ debug (1.8.0)
85
+ irb (>= 1.5.0)
86
+ reline (>= 0.3.1)
87
+ diff-lcs (1.5.0)
88
+ erubi (1.12.0)
89
+ factory_bot (6.2.1)
90
+ activesupport (>= 5.0.0)
91
+ factory_bot_rails (6.2.0)
92
+ factory_bot (~> 6.2.0)
93
+ railties (>= 5.0.0)
94
+ ffaker (2.21.0)
95
+ globalid (1.1.0)
96
+ activesupport (>= 5.0)
97
+ i18n (1.14.1)
98
+ concurrent-ruby (~> 1.0)
99
+ io-console (0.6.0)
100
+ irb (1.7.4)
101
+ reline (>= 0.3.6)
102
+ json (2.6.3)
103
+ language_server-protocol (3.17.0.3)
104
+ loofah (2.21.3)
105
+ crass (~> 1.0.2)
106
+ nokogiri (>= 1.12.0)
107
+ mail (2.8.1)
108
+ mini_mime (>= 0.1.1)
109
+ net-imap
110
+ net-pop
111
+ net-smtp
112
+ marcel (1.0.2)
113
+ method_source (1.0.0)
114
+ mini_mime (1.1.5)
115
+ minitest (5.19.0)
116
+ net-imap (0.3.7)
117
+ date
118
+ net-protocol
119
+ net-pop (0.1.2)
120
+ net-protocol
121
+ net-protocol (0.2.1)
122
+ timeout
123
+ net-smtp (0.3.3)
124
+ net-protocol
125
+ nio4r (2.5.9)
126
+ nokogiri (1.15.4-arm64-darwin)
127
+ racc (~> 1.4)
128
+ parallel (1.23.0)
129
+ parser (3.2.2.3)
130
+ ast (~> 2.4.1)
131
+ racc
132
+ pg (1.5.3)
133
+ racc (1.7.1)
134
+ rack (2.2.8)
135
+ rack-test (2.1.0)
136
+ rack (>= 1.3)
137
+ rails (7.0.7)
138
+ actioncable (= 7.0.7)
139
+ actionmailbox (= 7.0.7)
140
+ actionmailer (= 7.0.7)
141
+ actionpack (= 7.0.7)
142
+ actiontext (= 7.0.7)
143
+ actionview (= 7.0.7)
144
+ activejob (= 7.0.7)
145
+ activemodel (= 7.0.7)
146
+ activerecord (= 7.0.7)
147
+ activestorage (= 7.0.7)
148
+ activesupport (= 7.0.7)
149
+ bundler (>= 1.15.0)
150
+ railties (= 7.0.7)
151
+ rails-dom-testing (2.2.0)
152
+ activesupport (>= 5.0.0)
153
+ minitest
154
+ nokogiri (>= 1.6)
155
+ rails-html-sanitizer (1.6.0)
156
+ loofah (~> 2.21)
157
+ nokogiri (~> 1.14)
158
+ railties (7.0.7)
159
+ actionpack (= 7.0.7)
160
+ activesupport (= 7.0.7)
161
+ method_source
162
+ rake (>= 12.2)
163
+ thor (~> 1.0)
164
+ zeitwerk (~> 2.5)
165
+ rainbow (3.1.1)
166
+ rake (13.0.6)
167
+ regexp_parser (2.8.1)
168
+ reline (0.3.7)
169
+ io-console (~> 0.5)
170
+ rexml (3.2.6)
171
+ rspec-core (3.12.2)
172
+ rspec-support (~> 3.12.0)
173
+ rspec-expectations (3.12.3)
174
+ diff-lcs (>= 1.2.0, < 2.0)
175
+ rspec-support (~> 3.12.0)
176
+ rspec-mocks (3.12.6)
177
+ diff-lcs (>= 1.2.0, < 2.0)
178
+ rspec-support (~> 3.12.0)
179
+ rspec-rails (6.0.3)
180
+ actionpack (>= 6.1)
181
+ activesupport (>= 6.1)
182
+ railties (>= 6.1)
183
+ rspec-core (~> 3.12)
184
+ rspec-expectations (~> 3.12)
185
+ rspec-mocks (~> 3.12)
186
+ rspec-support (~> 3.12)
187
+ rspec-support (3.12.1)
188
+ rubocop (1.56.0)
189
+ base64 (~> 0.1.1)
190
+ json (~> 2.3)
191
+ language_server-protocol (>= 3.17.0)
192
+ parallel (~> 1.10)
193
+ parser (>= 3.2.2.3)
194
+ rainbow (>= 2.2.2, < 4.0)
195
+ regexp_parser (>= 1.8, < 3.0)
196
+ rexml (>= 3.2.5, < 4.0)
197
+ rubocop-ast (>= 1.28.1, < 2.0)
198
+ ruby-progressbar (~> 1.7)
199
+ unicode-display_width (>= 2.4.0, < 3.0)
200
+ rubocop-ast (1.29.0)
201
+ parser (>= 3.2.1.0)
202
+ ruby-progressbar (1.13.0)
203
+ thor (1.2.2)
204
+ timeout (0.4.0)
205
+ tzinfo (2.0.6)
206
+ concurrent-ruby (~> 1.0)
207
+ unicode-display_width (2.4.2)
208
+ websocket-driver (0.7.6)
209
+ websocket-extensions (>= 0.1.0)
210
+ websocket-extensions (0.1.5)
211
+ yard (0.9.34)
212
+ zeitwerk (2.6.11)
213
+
214
+ PLATFORMS
215
+ arm64-darwin-22
216
+
217
+ DEPENDENCIES
218
+ debug
219
+ factory_bot_rails
220
+ ffaker
221
+ koyo-postgres-replication!
222
+ pg (~> 1.1)
223
+ rails (~> 7.0)
224
+ rake (~> 13.0)
225
+ rspec-rails (~> 6.0)
226
+ rubocop
227
+ yard
228
+
229
+ BUNDLED WITH
230
+ 2.4.18
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2023 Ben Wiseley
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,192 @@
1
+ # Koyo::Postgres::Replication
2
+
3
+ ## Replcation slots
4
+
5
+ This gem tries to simplify dealing with a `replication slot` in Postgres.
6
+
7
+ ### What is a replication slot?
8
+
9
+ Please see [the wiki page that discusses replication
10
+ slots](https://github.com/wiseleyb/koyo-postgres-replication/wiki/What-is-replication%3F)
11
+
12
+ ### Why would you use this?
13
+
14
+ Example: You have a no-sql store (like Elastic-Search) that needs to be in-sync
15
+ with your database. You could do this "the Rails way" with `after-save` type
16
+ patterns. You could do this with a service type architecture that updates
17
+ things. But if you have non-rails teams updating data, or ever update the
18
+ database via SQL, this becomes more complex, duplicates delicate/error-prone
19
+ work between teams, or just isn't possible. Going the microservice approach
20
+ also isn't ideal for performance reasons (you never want to updating a really
21
+ busy DB via API).
22
+
23
+ Please see [the
24
+ wiki](https://github.com/wiseleyb/koyo-postgres-replication/wiki/What-is-replication%3F)
25
+ for more discussion on this.
26
+
27
+ ## Quick Start
28
+
29
+ You need to configure Postgres for this first. This isn't enabled by default.
30
+ See [Configuring Postgres for Replication in the
31
+ wiki](https://github.com/wiseleyb/koyo-postgres-replication/wiki/Configuring-Postgres-for-Replication)
32
+
33
+ Add to Gemfile:
34
+
35
+ ```
36
+ gem 'koyo-postgres-replication',
37
+ git: 'https://github.com/wiseleyb/koyo-postgres-replication',
38
+ require: 'koyo'
39
+ ```
40
+
41
+ Then:
42
+
43
+ ```
44
+ bundle install
45
+ bundle exec rake koyo:repl:install
46
+ ```
47
+
48
+ This adds files:
49
+
50
+ * `config/initializers/koyo_postgres_replication_config.rb`: which is commented
51
+ on various ways to override various settings.
52
+ * `app/models/koyo_repl_handler_service.rb`: which has call backs for every
53
+ replication event, log events, and errors. This file is also heavily
54
+ commented.
55
+ * `app/models/koyo_repl_model_example.rb`: is an example of how to add
56
+ replication monitoring on a model level. You can delete this file - it's just
57
+ there for a simple example.
58
+
59
+ ### Run Diagnostics
60
+
61
+ You need to create a replication slot for each database. This requires admin
62
+ access. In
63
+ [config](https://github.com/wiseleyb/koyo-postgres-replication/blob/main/lib/koyo/repl/templates/koyo_postgres_replication_config.txt)
64
+ you can setup a separate `config/database.yml` connection to limit admin level
65
+ postgres access if your company prefers that.
66
+
67
+ ```
68
+ # runs basic diagnostics - look for Error in this list and fix any issues
69
+ bundle exec rake koyo:repl:diagnostics
70
+ ```
71
+
72
+ Which will output something like:
73
+
74
+ ```
75
+ --------------------------------------------------------------------------------
76
+ Koyo::Repl::Diagnostic
77
+ source=KoyoReplication logid=f3a8f68d3e level=info message=Init: Finding models that support koyo_repl_handler
78
+ source=KoyoReplication logid=410b6fd0d0 level=info message=Init: ignoring model SchemaMigration
79
+ source=KoyoReplication logid=b429e47251 level=info message=Init: ignoring model ArInternalMetadatum
80
+ source=KoyoReplication logid=6532a8ec76 level=info message=Init: registering handler ["users", "User"]
81
+ Config settings:
82
+ auto_create_replication_slot: true
83
+ config_prefix: KOYO_REPL
84
+ db_conn:
85
+ slot: koyo_repl_rei_postgres_replication_development_development
86
+ sql_delay: 1
87
+ test_mode: false
88
+ Replication slot exists: true
89
+ Registered tables:
90
+ users: User
91
+ Can connect to db: true
92
+ Connection adapter: PostgreSQL
93
+ Wal Level (should be 'logical'): logical
94
+ Can access replication slot: true
95
+ Replication slot count: 0
96
+ --------------------------------------------------------------------------------
97
+ ```
98
+
99
+ If there are errors you'll need to fix those first before running the server.
100
+
101
+ ### Run the server
102
+
103
+ ```
104
+ bundle exec rake koyo:repl:run_server
105
+ ```
106
+
107
+ Now - when you create/update/delete data in the configured database you should
108
+ be getting callbacks in
109
+ `app/models/koyo_repl_handler_service.rb#koyo_handle_all_replication(row)` and
110
+ in any model `app/models/{some-model}#handle_replication(row)` that implements
111
+ callbacks.
112
+
113
+ # Row data in callbacks
114
+
115
+ See [wiki page on DataRow for raw data examples of what you get from
116
+ Postgres](https://github.com/wiseleyb/koyo-postgres-replication/wiki/Koyo::Repl::DataRow-data-spec)
117
+
118
+ # Processing callbacks
119
+
120
+ Both `koyo_repl_handler_service#koyo_handle_all_replication(row)` and
121
+ `{some-model}#handle_replication(row)` need to be REALLY fast. You shouldn't do
122
+ database updates from this code (or risk infinite loops) and, if you're doing
123
+ something like updating an API you should async that via Sidekiq, ActiveJob,
124
+ etc. Keep in mind that, if you're running multiple Sidekiq servers that things
125
+ might not be processed in the same order. Please see the [wiki page on
126
+ processing
127
+ callbacks](https://github.com/wiseleyb/koyo-postgres-replication/wiki/Processing-callbacks)
128
+ for more on this.
129
+
130
+ # Testing
131
+
132
+ The following assumes you're using rspec (open to PRs supporting other test
133
+ frameworks though - I just don't use those)
134
+
135
+ By default (and definitely the fastest way) specs run inside
136
+ transactions that are rolled back after each spec runs. You need to use
137
+ [Database Cleaner](https://github.com/DatabaseCleaner/database_cleaner)
138
+ truncation approach to test this stuff. Please see the wiki on
139
+ [testing](https://github.com/wiseleyb/koyo-postgres-replication/wiki/Testing)
140
+ for what's needed if you want to run replication slot tests.
141
+
142
+ # Sample apps
143
+
144
+ These are simple Rails version-specific demo apps with Docker files
145
+
146
+ * [Rails 7 Example](https://github.com/wiseleyb/rei-postgres-replication/tree/rails-7-example)
147
+ * Rails 6 Example: coming soon
148
+ * Rails 5 Example: coming soon
149
+ * Rails 4 Example: coming soon
150
+ * Rails 3 Example: probably won't do
151
+
152
+ # Technical
153
+
154
+ See wiki page on [creating this
155
+ gem](https://github.com/wiseleyb/koyo-postgres-replication/wiki/Creating-this-GEM)
156
+ if you're interested how to do gems like these.
157
+
158
+ ## Working with the gem
159
+
160
+ See wiki page on [working with this
161
+ gem](https://github.com/wiseleyb/koyo-postgres-replication/wiki/Developing-on-this-GEM)
162
+ for basics of debugging and working with.
163
+
164
+ ## Working with replication slots
165
+
166
+ See
167
+ [koyo::repl::database](https://github.com/wiseleyb/koyo-postgres-replication/blob/main/lib/koyo/repl/database.rb)
168
+ for sql examples on how to interact with replication slots.
169
+
170
+ ## Yard Doc
171
+
172
+ Cheat sheets:
173
+ * https://gist.github.com/chetan/1827484
174
+ * https://kapeli.com/cheat_sheets/Yard.docset/Contents/Resources/Documents/index
175
+
176
+ Build yard docs: `yard`
177
+ View docs: `yard server` then open https://localhost:8808
178
+
179
+ # Contributing
180
+
181
+ TODO: update
182
+
183
+ * follow github guide
184
+ * run/add specs
185
+ * run rubocop
186
+ * add/run yard
187
+
188
+ # TODO
189
+
190
+ * add monitoring helpers
191
+ * add support for multiple primary keys
192
+ * add badges like in https://raw.githubusercontent.com/rubocop/rubocop/master/README.md
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+
5
+ APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
6
+ load 'rails/tasks/engine.rake'
7
+
8
+ load 'rails/tasks/statistics.rake'
9
+
10
+ require 'bundler/gem_tasks'
data/changelog.md ADDED
@@ -0,0 +1,14 @@
1
+ # Koyo Postgres Replication Changelog
2
+
3
+ ## 0.1.0.pre
4
+
5
+ - rails 7 plugin
6
+ - postgres replication monitor
7
+ - install script
8
+ - documentation
9
+ - basic specs
10
+ - example rails project
11
+ - diagnostic tools
12
+ - utility class for working with replication slots
13
+ - functional - but not tested in real life yet
14
+
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/koyo'
4
+
5
+ burl = 'https://github.com/wiseleyb'
6
+ url = "#{burl}/koyo-postgres-replication"
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = 'koyo-postgres-replication'
10
+ spec.version = Koyo::Repl::VERSION
11
+ spec.authors = ['Ben Wiseley']
12
+ spec.email = ['wiseleyb@gmail.com']
13
+ spec.homepage = burl
14
+ spec.summary = 'Postgres Replication'
15
+ spec.description = 'Simple Postgres replication helper'
16
+ spec.license = 'MIT'
17
+
18
+ spec.required_ruby_version = '>= 2.7.0'
19
+
20
+ # spec.metadata["allowed_push_host"] = ''
21
+ spec.metadata['changelog_uri'] = "#{url}/changelog.md"
22
+ spec.metadata['homepage_uri'] = spec.homepage
23
+ spec.metadata['source_code_uri'] = url
24
+
25
+ spec.files = Dir.chdir(__dir__) do
26
+ `git ls-files -z`.split("\x0").reject do |f|
27
+ (File.expand_path(f) ==
28
+ __FILE__) ||
29
+ f.start_with?(*%w[bin/ test/ spec/ features/ .git .circleci appveyor])
30
+ end
31
+ end
32
+ spec.bindir = 'bin'
33
+ spec.require_paths = ['lib']
34
+
35
+ spec.add_dependency 'pg', '~> 1.1'
36
+ spec.add_dependency 'rack', '~> 2.0', '>= 2.0.0'
37
+ spec.add_dependency 'rails', '~> 7.0'
38
+ spec.add_dependency 'rake', '~> 13.0'
39
+ spec.add_development_dependency 'rspec-rails', '~> 3.1'
40
+ spec.add_development_dependency 'yard', '~> 0.9'
41
+
42
+ spec.has_rdoc = 'yard'
43
+ end