bundler-cache: true
- name: Run brakeman
run: bundle exec brakeman -q
+ annotate_models:
+ env:
+ RAILS_ENV: test
+ name: Rails Annotate Models
+ runs-on: ubuntu-22.04
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+ - name: Setup ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: ${{ env.ruby }}
+ bundler-cache: true
+ - name: Setup database
+ run: |
+ sudo systemctl start postgresql
+ sudo -u postgres createuser -s $(id -un)
+ createdb openstreetmap
+ cp config/github.database.yml config/database.yml
+ bundle exec rails db:test:load
+ - name: Run Annotate Models
+ run: bundle exec rails annotate_models
+ - name: Fail if model annotations are out of date
+ run: git diff --exit-code
# Gems useful for development
group :development do
- gem "annotate"
gem "better_errors"
gem "binding_of_caller"
gem "debug_inspector"
gem "simplecov-lcov", :require => false
gem "webmock"
end
+
+group :development, :test do
+ gem "annotate"
+end
#
# Indexes
#
-# index_changeset_comments_on_created_at (created_at)
+# index_changeset_comments_on_author_id_and_created_at (author_id,created_at)
+# index_changeset_comments_on_changeset_id_and_created_at (changeset_id,created_at)
+# index_changeset_comments_on_created_at (created_at)
#
# Foreign Keys
#
# k :string default(""), not null, primary key
# v :string default(""), not null
#
-# Indexes
-#
-# changeset_tags_id_idx (changeset_id)
-#
# Foreign Keys
#
# changeset_tags_id_fkey (changeset_id => changesets.id)
# id :bigint(8) not null, primary key
# user_id :bigint(8) not null
# friend_user_id :bigint(8) not null
+# created_at :datetime
#
# Indexes
#
-# friends_user_id_idx (user_id)
-# user_id_idx (friend_user_id)
+# index_friends_on_user_id_and_created_at (user_id,created_at)
+# user_id_idx (friend_user_id)
#
# Foreign Keys
#
#
# Indexes
#
-# index_note_comments_on_body (to_tsvector('english'::regconfig, body)) USING gin
-# index_note_comments_on_created_at (created_at)
-# note_comments_note_id_idx (note_id)
+# index_note_comments_on_author_id_and_created_at (author_id,created_at)
+# index_note_comments_on_body (to_tsvector('english'::regconfig, body)) USING gin
+# index_note_comments_on_created_at (created_at)
+# note_comments_note_id_idx (note_id)
#
# Foreign Keys
#
+# == Schema Information
+#
+# Table name: oauth_applications
+#
+# id :bigint(8) not null, primary key
+# owner_type :string not null
+# owner_id :bigint(8) not null
+# name :string not null
+# uid :string not null
+# secret :string not null
+# redirect_uri :text not null
+# scopes :string default(""), not null
+# confidential :boolean default(TRUE), not null
+# created_at :datetime not null
+# updated_at :datetime not null
+#
+# Indexes
+#
+# index_oauth_applications_on_owner_type_and_owner_id (owner_type,owner_id)
+# index_oauth_applications_on_uid (uid) UNIQUE
+#
+# Foreign Keys
+#
+# fk_rails_... (owner_id => users.id)
+#
class Oauth2Application < Doorkeeper::Application
belongs_to :owner, :polymorphic => true
#
# Table name: oauth_nonces
#
-# id :bigint not null, primary key
+# id :bigint(8) not null, primary key
# nonce :string
# timestamp :integer
# created_at :datetime
#
# Table name: relations
#
-# relation_id :bigint(8) default(0), not null, primary key
+# relation_id :bigint(8) not null, primary key
# changeset_id :bigint(8) not null
# timestamp :datetime not null
# version :bigint(8) not null, primary key
#
# Table name: relation_members
#
-# relation_id :bigint(8) default(0), not null, primary key
+# relation_id :bigint(8) not null, primary key
# member_type :enum not null
# member_id :bigint(8) not null
# member_role :string not null
#
# Table name: relation_tags
#
-# relation_id :bigint(8) default(0), not null, primary key
+# relation_id :bigint(8) not null, primary key
# k :string default(""), not null, primary key
# v :string default(""), not null
# version :bigint(8) not null, primary key
#
# Table name: ways
#
-# way_id :bigint(8) default(0), not null, primary key
+# way_id :bigint(8) not null, primary key
# changeset_id :bigint(8) not null
# timestamp :datetime not null
# version :bigint(8) not null, primary key
#
# Table name: way_tags
#
-# way_id :bigint(8) default(0), not null, primary key
+# way_id :bigint(8) not null, primary key
# k :string not null, primary key
# v :string not null
# version :bigint(8) not null, primary key
#
# Table name: gpx_file_tags
#
-# gpx_id :bigint(8) default(0), not null
+# gpx_id :bigint(8) not null
# tag :string not null
# id :bigint(8) not null, primary key
#
# home_lat :float
# home_lon :float
# home_zoom :integer default(3)
-# nearby :integer default(50)
# pass_salt :string
# email_valid :boolean default(FALSE), not null
# new_email :string
if defined?(ActiveRecord::ConnectionAdapters::AbstractAdapter)
module OpenStreetMap
- module ActiveRecord
- module PostgreSQLAdapter
+ module PostgreSQL
+ module Quoting
def quote_column_name(name)
Array(name).map { |n| super(n) }.join(", ")
end
+ end
- def add_primary_key(table_name, column_name, _options = {})
- table_name = quote_table_name(table_name)
- column_name = quote_column_name(column_name)
+ module SchemaStatements
+ def add_primary_key(table_name, column_name, options = {})
+ constraint_name = "#{table_name}_pkey"
+
+ options = options.merge(:name => constraint_name, :unique => true)
- execute "ALTER TABLE #{table_name} ADD PRIMARY KEY (#{column_name})"
+ add_index(table_name, column_name, **options)
+ set_primary_key table_name, constraint_name
end
def remove_primary_key(table_name)
+ constraint_name = quote_table_name("#{table_name}_pkey")
table_name = quote_table_name(table_name)
- execute "ALTER TABLE #{table_name} DROP PRIMARY KEY"
+ execute "ALTER TABLE #{table_name} DROP CONSTRAINT #{constraint_name}"
end
- def alter_primary_key(table_name, new_columns)
- constraint_name = quote_table_name("#{table_name}_pkey")
+ def alter_primary_key(table_name, column_name, options = {})
+ constraint_name = "#{table_name}_pkey"
+ tmp_constraint_name = "#{table_name}_pkey_tmp"
+
+ options = options.merge(:name => tmp_constraint_name, :unique => true)
+
+ add_index(table_name, column_name, **options)
+ remove_primary_key table_name
+ set_primary_key table_name, tmp_constraint_name
+ rename_index table_name, tmp_constraint_name, constraint_name
+ end
+
+ def set_primary_key(table_name, constraint_name)
+ constraint_name = quote_table_name(constraint_name)
table_name = quote_table_name(table_name)
- new_columns = quote_column_name(new_columns)
- execute "ALTER TABLE #{table_name} DROP CONSTRAINT #{constraint_name}"
- execute "ALTER TABLE #{table_name} ADD PRIMARY KEY (#{new_columns})"
+ execute "ALTER TABLE #{table_name} ADD PRIMARY KEY USING INDEX #{constraint_name}"
end
def create_enumeration(enumeration_name, values)
end
end
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(OpenStreetMap::ActiveRecord::PostgreSQLAdapter)
+ ActiveRecord::ConnectionAdapters::PostgreSQL::Quoting.prepend(OpenStreetMap::PostgreSQL::Quoting)
+ ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements.prepend(OpenStreetMap::PostgreSQL::SchemaStatements)
end
--- /dev/null
+class AddPrimaryKeyToChangesetTags < ActiveRecord::Migration[7.0]
+ disable_ddl_transaction!
+
+ def up
+ add_primary_key :changeset_tags, [:changeset_id, :k], :algorithm => :concurrently
+ remove_index :changeset_tags, [:changeset_id]
+ end
+
+ def down
+ add_index :changeset_tags, [:changeset_id], :algorithm => :concurrently
+ remove_primary_key :changeset_tags
+ end
+end
ADD CONSTRAINT changeset_comments_pkey PRIMARY KEY (id);
+--
+-- Name: changeset_tags changeset_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY public.changeset_tags
+ ADD CONSTRAINT changeset_tags_pkey PRIMARY KEY (changeset_id, k);
+
+
--
-- Name: changesets changesets_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
CREATE INDEX acls_k_idx ON public.acls USING btree (k);
---
--- Name: changeset_tags_id_idx; Type: INDEX; Schema: public; Owner: -
---
-
-CREATE INDEX changeset_tags_id_idx ON public.changeset_tags USING btree (changeset_id);
-
-
--
-- Name: changesets_bbox_idx; Type: INDEX; Schema: public; Owner: -
--
('20230825162137'),
('20230830115219'),
('20230830115220'),
+('20231007141103'),
('21'),
('22'),
('23'),
# NOTE: only doing this in development as some production environments (Heroku)
# NOTE: are sensitive to local FS writes, and besides -- it's just not proper
# NOTE: to have a dev-mode tool do its thing in production.
-if Rails.env.development?
+if Rails.env.development? || Rails.env.test?
task :set_annotation_options => :environment do
# You can override any of these by setting an environment variable of the
# same name.