summaryrefslogtreecommitdiff
path: root/rubocop/migration_helpers.rb
blob: 5fa6f8c2a2c3cf87779b5a1cbf6613cc114cec9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
module RuboCop
  # Module containing helper methods for writing migration cops.
  module MigrationHelpers
    WHITELISTED_TABLES = %i[
      application_settings
      plan_limits
    ].freeze

    # Blacklisted tables due to:
    #   - size in GB (>= 10 GB on GitLab.com as of 02/2020)
    #   - number of records
    BLACKLISTED_TABLES = %i[
       audit_events
       ci_build_trace_sections
       ci_builds
       ci_builds_metadata
       ci_job_artifacts
       ci_pipeline_variables
       ci_pipelines
       ci_stages
       deployments
       events
       issues
       merge_request_diff_commits
       merge_request_diff_files
       merge_request_diffs
       merge_request_metrics
       merge_requests
       namespaces
       note_diff_files
       notes
       project_authorizations
       projects
       project_ci_cd_settings
       push_event_payloads
       resource_label_events
       routes
       sent_notifications
       services
       system_note_metadata
       taggings
       todos
       users
       web_hook_logs
    ].freeze

    # Blacklisted tables due to:
    #   - number of columns (> 50 on GitLab.com as of 03/2020)
    #   - number of records
    WIDE_TABLES = %i[
      users
      projects
      ci_builds
    ].freeze

    # Returns true if the given node originated from the db/migrate directory.
    def in_migration?(node)
      dirname(node).end_with?('db/migrate', 'db/geo/migrate') || in_post_deployment_migration?(node)
    end

    def in_post_deployment_migration?(node)
      dirname(node).end_with?('db/post_migrate', 'db/geo/post_migrate')
    end

    def version(node)
      File.basename(node.location.expression.source_buffer.name).split('_').first.to_i
    end

    private

    def dirname(node)
      File.dirname(node.location.expression.source_buffer.name)
    end
  end
end