mirror of
https://git.kescher.at/CatCatNya/catstodon.git
synced 2024-11-25 12:08:06 +01:00
annotate models (#2697)
* add annotate to Gemfile * rails g annotate:install * configure annotate_models * add schema info to models * fix rubocop to add frozen_string_literal
This commit is contained in:
parent
a4859446ab
commit
298796cc7b
23 changed files with 355 additions and 1 deletions
1
Gemfile
1
Gemfile
|
@ -90,6 +90,7 @@ group :development do
|
||||||
gem 'letter_opener_web'
|
gem 'letter_opener_web'
|
||||||
gem 'bullet'
|
gem 'bullet'
|
||||||
gem 'active_record_query_trace'
|
gem 'active_record_query_trace'
|
||||||
|
gem 'annotate'
|
||||||
|
|
||||||
gem 'capistrano', '3.8.0'
|
gem 'capistrano', '3.8.0'
|
||||||
gem 'capistrano-rails'
|
gem 'capistrano-rails'
|
||||||
|
|
|
@ -43,6 +43,9 @@ GEM
|
||||||
public_suffix (~> 2.0, >= 2.0.2)
|
public_suffix (~> 2.0, >= 2.0.2)
|
||||||
airbrussh (1.2.0)
|
airbrussh (1.2.0)
|
||||||
sshkit (>= 1.6.1, != 1.7.0)
|
sshkit (>= 1.6.1, != 1.7.0)
|
||||||
|
annotate (2.7.1)
|
||||||
|
activerecord (>= 3.2, < 6.0)
|
||||||
|
rake (>= 10.4, < 12.0)
|
||||||
arel (7.1.4)
|
arel (7.1.4)
|
||||||
ast (2.3.0)
|
ast (2.3.0)
|
||||||
attr_encrypted (3.0.3)
|
attr_encrypted (3.0.3)
|
||||||
|
@ -345,7 +348,7 @@ GEM
|
||||||
thor (>= 0.18.1, < 2.0)
|
thor (>= 0.18.1, < 2.0)
|
||||||
rainbow (2.2.2)
|
rainbow (2.2.2)
|
||||||
rake
|
rake
|
||||||
rake (12.0.0)
|
rake (11.3.0)
|
||||||
react-rails (1.11.0)
|
react-rails (1.11.0)
|
||||||
babel-transpiler (>= 0.7.0)
|
babel-transpiler (>= 0.7.0)
|
||||||
connection_pool
|
connection_pool
|
||||||
|
@ -483,6 +486,7 @@ PLATFORMS
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
active_record_query_trace
|
active_record_query_trace
|
||||||
addressable
|
addressable
|
||||||
|
annotate
|
||||||
autoprefixer-rails
|
autoprefixer-rails
|
||||||
aws-sdk (>= 2.0)
|
aws-sdk (>= 2.0)
|
||||||
best_in_place (~> 3.0.1)
|
best_in_place (~> 3.0.1)
|
||||||
|
|
|
@ -1,4 +1,42 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: accounts
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# username :string default(""), not null
|
||||||
|
# domain :string
|
||||||
|
# secret :string default(""), not null
|
||||||
|
# private_key :text
|
||||||
|
# public_key :text default(""), not null
|
||||||
|
# remote_url :string default(""), not null
|
||||||
|
# salmon_url :string default(""), not null
|
||||||
|
# hub_url :string default(""), not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# note :text default(""), not null
|
||||||
|
# display_name :string default(""), not null
|
||||||
|
# uri :string default(""), not null
|
||||||
|
# url :string
|
||||||
|
# avatar_file_name :string
|
||||||
|
# avatar_content_type :string
|
||||||
|
# avatar_file_size :integer
|
||||||
|
# avatar_updated_at :datetime
|
||||||
|
# header_file_name :string
|
||||||
|
# header_content_type :string
|
||||||
|
# header_file_size :integer
|
||||||
|
# header_updated_at :datetime
|
||||||
|
# avatar_remote_url :string
|
||||||
|
# subscription_expires_at :datetime
|
||||||
|
# silenced :boolean default(FALSE), not null
|
||||||
|
# suspended :boolean default(FALSE), not null
|
||||||
|
# locked :boolean default(FALSE), not null
|
||||||
|
# header_remote_url :string default(""), not null
|
||||||
|
# statuses_count :integer default(0), not null
|
||||||
|
# followers_count :integer default(0), not null
|
||||||
|
# following_count :integer default(0), not null
|
||||||
|
# last_webfingered_at :datetime
|
||||||
|
#
|
||||||
|
|
||||||
class Account < ApplicationRecord
|
class Account < ApplicationRecord
|
||||||
include Targetable
|
include Targetable
|
||||||
|
|
|
@ -1,4 +1,14 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: blocks
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# account_id :integer not null
|
||||||
|
# target_account_id :integer not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
#
|
||||||
|
|
||||||
class Block < ApplicationRecord
|
class Block < ApplicationRecord
|
||||||
include Paginable
|
include Paginable
|
||||||
|
|
|
@ -1,4 +1,15 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: domain_blocks
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# domain :string default(""), not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# severity :integer default("silence")
|
||||||
|
# reject_media :boolean
|
||||||
|
#
|
||||||
|
|
||||||
class DomainBlock < ApplicationRecord
|
class DomainBlock < ApplicationRecord
|
||||||
enum severity: [:silence, :suspend]
|
enum severity: [:silence, :suspend]
|
||||||
|
|
|
@ -1,4 +1,14 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: favourites
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# account_id :integer not null
|
||||||
|
# status_id :integer not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
#
|
||||||
|
|
||||||
class Favourite < ApplicationRecord
|
class Favourite < ApplicationRecord
|
||||||
include Paginable
|
include Paginable
|
||||||
|
|
|
@ -1,4 +1,14 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: follows
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# account_id :integer not null
|
||||||
|
# target_account_id :integer not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
#
|
||||||
|
|
||||||
class Follow < ApplicationRecord
|
class Follow < ApplicationRecord
|
||||||
include Paginable
|
include Paginable
|
||||||
|
|
|
@ -1,4 +1,14 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: follow_requests
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# account_id :integer not null
|
||||||
|
# target_account_id :integer not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
#
|
||||||
|
|
||||||
class FollowRequest < ApplicationRecord
|
class FollowRequest < ApplicationRecord
|
||||||
include Paginable
|
include Paginable
|
||||||
|
|
|
@ -1,4 +1,19 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: imports
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# account_id :integer not null
|
||||||
|
# type :integer not null
|
||||||
|
# approved :boolean
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# data_file_name :string
|
||||||
|
# data_content_type :string
|
||||||
|
# data_file_size :integer
|
||||||
|
# data_updated_at :datetime
|
||||||
|
#
|
||||||
|
|
||||||
class Import < ApplicationRecord
|
class Import < ApplicationRecord
|
||||||
FILE_TYPES = ['text/plain', 'text/csv'].freeze
|
FILE_TYPES = ['text/plain', 'text/csv'].freeze
|
||||||
|
|
|
@ -1,4 +1,22 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: media_attachments
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# status_id :integer
|
||||||
|
# file_file_name :string
|
||||||
|
# file_content_type :string
|
||||||
|
# file_file_size :integer
|
||||||
|
# file_updated_at :datetime
|
||||||
|
# remote_url :string default(""), not null
|
||||||
|
# account_id :integer
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# shortcode :string
|
||||||
|
# type :integer default("image"), not null
|
||||||
|
# file_meta :json
|
||||||
|
#
|
||||||
|
|
||||||
class MediaAttachment < ApplicationRecord
|
class MediaAttachment < ApplicationRecord
|
||||||
self.inheritance_column = nil
|
self.inheritance_column = nil
|
||||||
|
|
|
@ -1,4 +1,14 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: mentions
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# account_id :integer
|
||||||
|
# status_id :integer
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
#
|
||||||
|
|
||||||
class Mention < ApplicationRecord
|
class Mention < ApplicationRecord
|
||||||
belongs_to :account, inverse_of: :mentions, required: true
|
belongs_to :account, inverse_of: :mentions, required: true
|
||||||
|
|
|
@ -1,4 +1,14 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: mutes
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# account_id :integer not null
|
||||||
|
# target_account_id :integer not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
#
|
||||||
|
|
||||||
class Mute < ApplicationRecord
|
class Mute < ApplicationRecord
|
||||||
include Paginable
|
include Paginable
|
||||||
|
|
|
@ -1,4 +1,16 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: notifications
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# account_id :integer
|
||||||
|
# activity_id :integer
|
||||||
|
# activity_type :string
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# from_account_id :integer
|
||||||
|
#
|
||||||
|
|
||||||
class Notification < ApplicationRecord
|
class Notification < ApplicationRecord
|
||||||
include Paginable
|
include Paginable
|
||||||
|
|
|
@ -1,4 +1,28 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: preview_cards
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# status_id :integer
|
||||||
|
# url :string default(""), not null
|
||||||
|
# title :string
|
||||||
|
# description :string
|
||||||
|
# image_file_name :string
|
||||||
|
# image_content_type :string
|
||||||
|
# image_file_size :integer
|
||||||
|
# image_updated_at :datetime
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# type :integer default("link"), not null
|
||||||
|
# html :text default(""), not null
|
||||||
|
# author_name :string default(""), not null
|
||||||
|
# author_url :string default(""), not null
|
||||||
|
# provider_name :string default(""), not null
|
||||||
|
# provider_url :string default(""), not null
|
||||||
|
# width :integer default(0), not null
|
||||||
|
# height :integer default(0), not null
|
||||||
|
#
|
||||||
|
|
||||||
class PreviewCard < ApplicationRecord
|
class PreviewCard < ApplicationRecord
|
||||||
IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
|
IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
|
||||||
|
|
|
@ -1,4 +1,18 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: reports
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# account_id :integer not null
|
||||||
|
# target_account_id :integer not null
|
||||||
|
# status_ids :integer default([]), not null, is an Array
|
||||||
|
# comment :text default(""), not null
|
||||||
|
# action_taken :boolean default(FALSE), not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# action_taken_by_account_id :integer
|
||||||
|
#
|
||||||
|
|
||||||
class Report < ApplicationRecord
|
class Report < ApplicationRecord
|
||||||
belongs_to :account
|
belongs_to :account
|
||||||
|
|
|
@ -1,4 +1,16 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: settings
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# var :string not null
|
||||||
|
# value :text
|
||||||
|
# thing_type :string
|
||||||
|
# thing_id :integer
|
||||||
|
# created_at :datetime
|
||||||
|
# updated_at :datetime
|
||||||
|
#
|
||||||
|
|
||||||
class Setting < RailsSettings::Base
|
class Setting < RailsSettings::Base
|
||||||
source Rails.root.join('config/settings.yml')
|
source Rails.root.join('config/settings.yml')
|
||||||
|
|
|
@ -1,4 +1,27 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: statuses
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# uri :string
|
||||||
|
# account_id :integer not null
|
||||||
|
# text :text default(""), not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# in_reply_to_id :integer
|
||||||
|
# reblog_of_id :integer
|
||||||
|
# url :string
|
||||||
|
# sensitive :boolean default(FALSE)
|
||||||
|
# visibility :integer default("public"), not null
|
||||||
|
# in_reply_to_account_id :integer
|
||||||
|
# application_id :integer
|
||||||
|
# spoiler_text :text default(""), not null
|
||||||
|
# reply :boolean default(FALSE)
|
||||||
|
# favourites_count :integer default(0), not null
|
||||||
|
# reblogs_count :integer default(0), not null
|
||||||
|
# language :string default("en"), not null
|
||||||
|
#
|
||||||
|
|
||||||
class Status < ApplicationRecord
|
class Status < ApplicationRecord
|
||||||
include Paginable
|
include Paginable
|
||||||
|
|
|
@ -1,4 +1,16 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: stream_entries
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# account_id :integer
|
||||||
|
# activity_id :integer
|
||||||
|
# activity_type :string
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# hidden :boolean default(FALSE), not null
|
||||||
|
#
|
||||||
|
|
||||||
class StreamEntry < ApplicationRecord
|
class StreamEntry < ApplicationRecord
|
||||||
include Paginable
|
include Paginable
|
||||||
|
|
|
@ -1,4 +1,18 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: subscriptions
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# callback_url :string default(""), not null
|
||||||
|
# secret :string
|
||||||
|
# expires_at :datetime
|
||||||
|
# confirmed :boolean default(FALSE), not null
|
||||||
|
# account_id :integer not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# last_successful_delivery_at :datetime
|
||||||
|
#
|
||||||
|
|
||||||
class Subscription < ApplicationRecord
|
class Subscription < ApplicationRecord
|
||||||
MIN_EXPIRATION = 3600 * 24 * 7
|
MIN_EXPIRATION = 3600 * 24 * 7
|
||||||
|
|
|
@ -1,4 +1,13 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: tags
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# name :string default(""), not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
#
|
||||||
|
|
||||||
class Tag < ApplicationRecord
|
class Tag < ApplicationRecord
|
||||||
has_and_belongs_to_many :statuses
|
has_and_belongs_to_many :statuses
|
||||||
|
|
|
@ -1,4 +1,37 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: users
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# email :string default(""), not null
|
||||||
|
# account_id :integer not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# encrypted_password :string default(""), not null
|
||||||
|
# reset_password_token :string
|
||||||
|
# reset_password_sent_at :datetime
|
||||||
|
# remember_created_at :datetime
|
||||||
|
# sign_in_count :integer default(0), not null
|
||||||
|
# current_sign_in_at :datetime
|
||||||
|
# last_sign_in_at :datetime
|
||||||
|
# current_sign_in_ip :inet
|
||||||
|
# last_sign_in_ip :inet
|
||||||
|
# admin :boolean default(FALSE)
|
||||||
|
# confirmation_token :string
|
||||||
|
# confirmed_at :datetime
|
||||||
|
# confirmation_sent_at :datetime
|
||||||
|
# unconfirmed_email :string
|
||||||
|
# locale :string
|
||||||
|
# encrypted_otp_secret :string
|
||||||
|
# encrypted_otp_secret_iv :string
|
||||||
|
# encrypted_otp_secret_salt :string
|
||||||
|
# consumed_timestep :integer
|
||||||
|
# otp_required_for_login :boolean
|
||||||
|
# last_emailed_at :datetime
|
||||||
|
# otp_backup_codes :string is an Array
|
||||||
|
# allowed_languages :string default([]), not null, is an Array
|
||||||
|
#
|
||||||
|
|
||||||
class User < ApplicationRecord
|
class User < ApplicationRecord
|
||||||
include Settings::Extend
|
include Settings::Extend
|
||||||
|
|
|
@ -1,4 +1,14 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: web_settings
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# user_id :integer
|
||||||
|
# data :json
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
#
|
||||||
|
|
||||||
class Web::Setting < ApplicationRecord
|
class Web::Setting < ApplicationRecord
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
|
|
44
lib/tasks/auto_annotate_models.rake
Normal file
44
lib/tasks/auto_annotate_models.rake
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
if Rails.env.development?
|
||||||
|
task :set_annotation_options do
|
||||||
|
Annotate.set_defaults(
|
||||||
|
'routes' => 'false',
|
||||||
|
'position_in_routes' => 'before',
|
||||||
|
'position_in_class' => 'before',
|
||||||
|
'position_in_test' => 'before',
|
||||||
|
'position_in_fixture' => 'before',
|
||||||
|
'position_in_factory' => 'before',
|
||||||
|
'position_in_serializer' => 'before',
|
||||||
|
'show_foreign_keys' => 'false',
|
||||||
|
'show_indexes' => 'false',
|
||||||
|
'simple_indexes' => 'false',
|
||||||
|
'model_dir' => 'app/models',
|
||||||
|
'root_dir' => '',
|
||||||
|
'include_version' => 'false',
|
||||||
|
'require' => '',
|
||||||
|
'exclude_tests' => 'true',
|
||||||
|
'exclude_fixtures' => 'true',
|
||||||
|
'exclude_factories' => 'true',
|
||||||
|
'exclude_serializers' => 'true',
|
||||||
|
'exclude_scaffolds' => 'true',
|
||||||
|
'exclude_controllers' => 'true',
|
||||||
|
'exclude_helpers' => 'true',
|
||||||
|
'ignore_model_sub_dir' => 'false',
|
||||||
|
'ignore_columns' => nil,
|
||||||
|
'ignore_routes' => nil,
|
||||||
|
'ignore_unknown_models' => 'false',
|
||||||
|
'hide_limit_column_types' => 'integer,boolean',
|
||||||
|
'skip_on_db_migrate' => 'false',
|
||||||
|
'format_bare' => 'true',
|
||||||
|
'format_rdoc' => 'false',
|
||||||
|
'format_markdown' => 'false',
|
||||||
|
'sort' => 'false',
|
||||||
|
'force' => 'false',
|
||||||
|
'trace' => 'false',
|
||||||
|
'wrapper_open' => nil,
|
||||||
|
'wrapper_close' => nil
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
Annotate.load_tasks
|
||||||
|
end
|
Loading…
Reference in a new issue