Maintenance: Added rubocop to make sure that migration reset their column information if needed.

This commit is contained in:
Rolf Schmidt 2020-11-13 09:02:02 +01:00 committed by Thorsten Eckel
parent 09d2d4df58
commit e7039d7046
5 changed files with 144 additions and 2 deletions

View file

@ -3,7 +3,7 @@ module RuboCop
module Zammad
class ExistsDateTimePrecision < Cop
def_node_matcher :column?, <<-PATTERN
$(send _ {:create_column :change_column} (sym _) (sym _) (sym :datetime) ... )
$(send _ {:add_column :change_column} (sym _) (sym _) (sym :datetime) ... )
PATTERN
def_node_matcher :column_limit?, <<-PATTERN
@ -25,7 +25,7 @@ module RuboCop
=begin
This rubocop will match all change_column/create_column/create_table/alter_table statements
This rubocop will match all change_column/add_column/create_table/alter_table statements
and check if there are :datetime or :timestamps column which do not have the limit: 3 setting.
good:

View file

@ -0,0 +1,88 @@
module RuboCop
module Cop
module Zammad
class ExistsResetColumnInformation < Cop
def_node_matcher :table?, <<-PATTERN
$(send _ {:create_table :change_table} ... )
PATTERN
def_node_matcher :column?, <<-PATTERN
$(send _ {:add_column :change_column :rename_column :remove_column} ... )
PATTERN
def_node_matcher :reset?, <<-PATTERN
$( ... :reset_column_information )
PATTERN
def message(class_name)
"Changes of the schema need to be followed by a #{class_name}.reset_column_information to have the right state of the db in the migration and future migrations."
end
=begin
This rubocop will match all add, change, rename and remove column statements
and check if there are reset_column_information function calls existing for the model.
good:
change_column :smime_certificates, :not_after_at, :datetime, limit: 3
SMIMECertificate.reset_column_information
bad:
change_column :smime_certificates, :not_after_at, :datetime, limit: 3
=end
def column_classes
@column_classes ||= {}
end
def table_classes
@table_classes ||= {}
end
def reset_classes
@reset_classes ||= {}
end
def column_class(node)
node.children[2].children[0].to_s.classify
end
def reset_class(node)
node.children[0].children[1].to_s
end
def table_class(node)
node.children[2].children[0].to_s.classify
end
def on_send(node)
if column?(node)
column_classes[column_class(node)] = node
elsif table?(node)
table_classes[table_class(node)] = node
elsif reset?(node)
reset_classes[reset_class(node)] = node
end
end
def on_investigation_end
column_classes.each do |key, value|
next if reset_classes.key?(key)
add_offense(value, message: message(key))
end
table_classes.each do |key, value|
next if reset_classes.key?(key)
add_offense(value, message: message(key))
end
super
end
end
end
end
end

View file

@ -312,3 +312,11 @@ Lint/UnusedMethodArgument:
Zammad/PreferNegatedIfOverUnless:
Exclude:
- 'bin/rspec'
Zammad/ExistsDateTimePrecision:
Include:
- "db/migrate/*.rb"
Zammad/ExistsResetColumnInformation:
Include:
- "db/migrate/*.rb"

View file

@ -1,5 +1,6 @@
require_relative 'cop/zammad/exists_condition'
require_relative 'cop/zammad/exists_date_time_precision'
require_relative 'cop/zammad/exists_reset_column_information'
require_relative 'cop/zammad/have_no_over_not_to'
require_relative 'cop/zammad/no_to_sym_on_string'
require_relative 'cop/zammad/prefer_negated_if_over_unless'

View file

@ -751,3 +751,48 @@ RSpec/MultipleMemoizedHelpers:
Description: Checks if example groups contain too many `let` and `subject` calls.
Enabled: false
StyleGuide: https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/MultipleMemoizedHelpers
Zammad/ExistsResetColumnInformation:
Exclude:
- 'db/migrate/20120101000001_create_base.rb'
- 'db/migrate/20120101000010_create_ticket.rb'
- 'db/migrate/20150979000001_update_timestamps.rb'
- 'db/migrate/20160921000001_permission_active.rb'
- 'db/migrate/20160921000001_permission_active.rb.rb'
- 'db/migrate/20161101131409_create_doorkeeper_tables.rb'
- 'db/migrate/20161112000001_organization_domain_based_assignment.rb'
- 'db/migrate/20161117000001_job_unable_to_create_issue_432.rb'
- 'db/migrate/20161228000001_add_taskbar_meta.rb'
- 'db/migrate/20170116000001_add_ticket_time_accounting_373.rb'
- 'db/migrate/20170119000001_login_email_length_650.rb'
- 'db/migrate/20170207081400_ticket_state_priority_defaults.rb'
- 'db/migrate/20170419000001_ldap_support.rb'
- 'db/migrate/20170419000002_overview_role_ids.rb'
- 'db/migrate/20170420000001_chat_increase_message_size.rb'
- 'db/migrate/20170421110000_add_origin_by_id.rb'
- 'db/migrate/20170426135500_add_reply_to.rb'
- 'db/migrate/20170515000001_scheduler_status.rb'
- 'db/migrate/20170531144425_foreign_keys.rb'
- 'db/migrate/20170608151442_enhanced_permissions.rb'
- 'db/migrate/20170619000001_tree_select.rb'
- 'db/migrate/20170626000001_locale_add_direction.rb'
- 'db/migrate/20171002091043_change_note_char_limit_for_users_and_organizations.rb'
- 'db/migrate/20171213000001_change_authorization_token_size.rb'
- 'db/migrate/20180128000001_chat_add_ip_country.rb'
- 'db/migrate/20180709020509_add_group_direction_to_overviews.rb'
- 'db/migrate/20180719033247_add_confidential_to_doorkeeper_application.rb'
- 'db/migrate/20180809000001_cti_generic_api.rb'
- 'db/migrate/20181017000001_cti_generic_api2.rb'
- 'db/migrate/20190409000001_setting_ticket_overview_priority_icon_and_color.rb'
- 'db/migrate/20190531180304_initialize_knowledge_base.rb'
- 'db/migrate/20190713000001_group_dependent_macros.rb'
- 'db/migrate/20190717210244_issue_2641_kb_color_change_limit.rb'
- 'db/migrate/20190724000001_rename_reserved_words.rb'
- 'db/migrate/20190918114553_issue_2867_footer_header_public_link.rb'
- 'db/migrate/20191001090809_create_active_job_locks.rb'
- 'db/migrate/20200121000001_smime_support.rb'
- 'db/migrate/20200205000001_chat_add_allow_website.rb'
- 'db/migrate/20200707000001_data_privacy_init.rb'
- 'db/migrate/20200911070327_data_privacy_delete_name.rb'
- 'db/migrate/20201002094932_datetime_precision.rb'
- 'db/migrate/20201006131231_stats_store_polymorphic_association.rb'