annotaterb 4.1.1 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +68 -0
  3. data/VERSION +1 -1
  4. data/exe/annotaterb +7 -7
  5. data/lib/annotate_rb/active_record_patch.rb +2 -0
  6. data/lib/annotate_rb/commands/annotate_models.rb +0 -1
  7. data/lib/annotate_rb/commands/annotate_routes.rb +0 -1
  8. data/lib/annotate_rb/commands/print_help.rb +0 -1
  9. data/lib/annotate_rb/commands/print_version.rb +0 -1
  10. data/lib/annotate_rb/commands.rb +4 -4
  11. data/lib/annotate_rb/config_finder.rb +1 -1
  12. data/lib/annotate_rb/config_loader.rb +2 -2
  13. data/lib/annotate_rb/core.rb +3 -3
  14. data/lib/annotate_rb/helper.rb +16 -0
  15. data/lib/annotate_rb/model_annotator/{annotation_generator.rb → annotation_builder.rb} +18 -14
  16. data/lib/annotate_rb/model_annotator/annotation_decider.rb +10 -12
  17. data/lib/annotate_rb/model_annotator/annotation_diff.rb +1 -1
  18. data/lib/annotate_rb/model_annotator/annotation_diff_generator.rb +9 -9
  19. data/lib/annotate_rb/model_annotator/annotation_pattern_generator.rb +3 -3
  20. data/lib/annotate_rb/model_annotator/annotator.rb +12 -53
  21. data/lib/annotate_rb/model_annotator/column_annotation/annotation_builder.rb +135 -0
  22. data/lib/annotate_rb/model_annotator/column_annotation/attributes_builder.rb +104 -0
  23. data/lib/annotate_rb/model_annotator/column_annotation/column_wrapper.rb +103 -0
  24. data/lib/annotate_rb/model_annotator/column_annotation/type_builder.rb +54 -0
  25. data/lib/annotate_rb/model_annotator/column_annotation.rb +12 -0
  26. data/lib/annotate_rb/model_annotator/file_builder.rb +58 -0
  27. data/lib/annotate_rb/model_annotator/file_components.rb +78 -0
  28. data/lib/annotate_rb/model_annotator/file_name_resolver.rb +3 -3
  29. data/lib/annotate_rb/model_annotator/foreign_key_annotation/annotation_builder.rb +57 -0
  30. data/lib/annotate_rb/model_annotator/foreign_key_annotation.rb +9 -0
  31. data/lib/annotate_rb/model_annotator/index_annotation/annotation_builder.rb +113 -0
  32. data/lib/annotate_rb/model_annotator/index_annotation.rb +9 -0
  33. data/lib/annotate_rb/model_annotator/magic_comment_parser.rb +32 -0
  34. data/lib/annotate_rb/model_annotator/model_class_getter.rb +6 -6
  35. data/lib/annotate_rb/model_annotator/model_files_getter.rb +12 -10
  36. data/lib/annotate_rb/model_annotator/model_wrapper.rb +44 -37
  37. data/lib/annotate_rb/model_annotator/pattern_getter.rb +142 -10
  38. data/lib/annotate_rb/model_annotator/project_annotation_remover.rb +65 -0
  39. data/lib/annotate_rb/model_annotator/project_annotator.rb +63 -0
  40. data/lib/annotate_rb/model_annotator/related_files_list_builder.rb +16 -18
  41. data/lib/annotate_rb/model_annotator/single_file_annotation_remover.rb +37 -0
  42. data/lib/annotate_rb/model_annotator/single_file_annotator.rb +49 -0
  43. data/lib/annotate_rb/model_annotator/{file_annotator_instruction.rb → single_file_annotator_instruction.rb} +2 -2
  44. data/lib/annotate_rb/model_annotator/single_file_remove_annotation_instruction.rb +15 -0
  45. data/lib/annotate_rb/model_annotator.rb +25 -26
  46. data/lib/annotate_rb/options.rb +20 -25
  47. data/lib/annotate_rb/parser.rb +150 -142
  48. data/lib/annotate_rb/rake_bootstrapper.rb +8 -8
  49. data/lib/annotate_rb/route_annotator/annotation_processor.rb +7 -8
  50. data/lib/annotate_rb/route_annotator/annotator.rb +2 -2
  51. data/lib/annotate_rb/route_annotator/base_processor.rb +3 -3
  52. data/lib/annotate_rb/route_annotator/header_generator.rb +15 -15
  53. data/lib/annotate_rb/route_annotator/helper.rb +9 -9
  54. data/lib/annotate_rb/route_annotator/removal_processor.rb +4 -4
  55. data/lib/annotate_rb/route_annotator.rb +6 -6
  56. data/lib/annotate_rb/runner.rb +0 -4
  57. data/lib/annotate_rb/tasks/annotate_models_migrate.rake +5 -5
  58. data/lib/annotate_rb.rb +19 -19
  59. data/lib/generators/annotate_rb/install/install_generator.rb +3 -2
  60. data/lib/generators/annotate_rb/install/templates/annotate_rb.rake +1 -1
  61. metadata +22 -16
  62. data/lib/annotate_rb/model_annotator/column_annotation_builder.rb +0 -92
  63. data/lib/annotate_rb/model_annotator/column_attributes_builder.rb +0 -102
  64. data/lib/annotate_rb/model_annotator/column_type_builder.rb +0 -51
  65. data/lib/annotate_rb/model_annotator/column_wrapper.rb +0 -84
  66. data/lib/annotate_rb/model_annotator/constants.rb +0 -22
  67. data/lib/annotate_rb/model_annotator/file_annotation_remover.rb +0 -25
  68. data/lib/annotate_rb/model_annotator/file_annotator.rb +0 -77
  69. data/lib/annotate_rb/model_annotator/file_patterns.rb +0 -129
  70. data/lib/annotate_rb/model_annotator/foreign_key_annotation_builder.rb +0 -55
  71. data/lib/annotate_rb/model_annotator/helper.rb +0 -107
  72. data/lib/annotate_rb/model_annotator/index_annotation_builder.rb +0 -74
  73. data/lib/annotate_rb/model_annotator/model_file_annotator.rb +0 -55
@@ -1,9 +1,9 @@
1
1
  module AnnotateRb
2
2
  module RouteAnnotator
3
3
  class HeaderGenerator
4
- PREFIX = '== Route Map'.freeze
5
- PREFIX_MD = '## Route Map'.freeze
6
- HEADER_ROW = ['Prefix', 'Verb', 'URI Pattern', 'Controller#Action'].freeze
4
+ PREFIX = "== Route Map".freeze
5
+ PREFIX_MD = "## Route Map".freeze
6
+ HEADER_ROW = ["Prefix", "Verb", "URI Pattern", "Controller#Action"].freeze
7
7
 
8
8
  class << self
9
9
  def generate(options = {})
@@ -20,7 +20,7 @@ module AnnotateRb
20
20
  # In old versions of Rake, the first line of output was the cwd. Not so
21
21
  # much in newer ones. We ditch that line if it exists, and if not, we
22
22
  # keep the line around.
23
- result.shift if result.first =~ %r{^\(in \/}
23
+ result.shift if %r{^\(in /}.match?(result.first)
24
24
 
25
25
  ignore_routes = options[:ignore_routes]
26
26
  regexp_for_ignoring_routes = ignore_routes ? /#{ignore_routes}/ : nil
@@ -48,7 +48,7 @@ module AnnotateRb
48
48
  magic_comments_map.each do |magic_comment|
49
49
  out << magic_comment
50
50
  end
51
- out << '' if magic_comments_map.any?
51
+ out << "" if magic_comments_map.any?
52
52
 
53
53
  out << comment(options[:wrapper_open]) if options[:wrapper_open]
54
54
 
@@ -62,12 +62,12 @@ module AnnotateRb
62
62
  max = maxs.map(&:max).compact.max
63
63
 
64
64
  out << comment(content(HEADER_ROW, maxs))
65
- out << comment(content(['-' * max, '-' * max, '-' * max, '-' * max], maxs))
65
+ out << comment(content(["-" * max, "-" * max, "-" * max, "-" * max], maxs))
66
66
  else
67
67
  out << comment(content(contents_without_magic_comments[0], maxs))
68
68
  end
69
69
 
70
- out += contents_without_magic_comments[1..-1].map { |line| comment(content(markdown? ? line.split(' ') : line, maxs)) }
70
+ out += contents_without_magic_comments[1..-1].map { |line| comment(content(markdown? ? line.split(" ") : line, maxs)) }
71
71
  out << comment(options[:wrapper_close]) if options[:wrapper_close]
72
72
 
73
73
  out
@@ -77,9 +77,9 @@ module AnnotateRb
77
77
 
78
78
  attr_reader :options, :routes_map
79
79
 
80
- def comment(row = '')
81
- if row == ''
82
- '#'
80
+ def comment(row = "")
81
+ if row == ""
82
+ "#"
83
83
  else
84
84
  "# #{row}"
85
85
  end
@@ -88,12 +88,12 @@ module AnnotateRb
88
88
  def content(line, maxs)
89
89
  return line.rstrip unless markdown?
90
90
 
91
- line.each_with_index.map { |elem, index| format_line_element(elem, maxs, index) }.join(' | ')
91
+ line.each_with_index.map { |elem, index| format_line_element(elem, maxs, index) }.join(" | ")
92
92
  end
93
93
 
94
94
  def format_line_element(elem, maxs, index)
95
95
  min_length = maxs.map { |arr| arr[index] }.max || 0
96
- format("%-#{min_length}.#{min_length}s", elem.tr('|', '-'))
96
+ format("%-#{min_length}.#{min_length}s", elem.tr("|", "-"))
97
97
  end
98
98
 
99
99
  def markdown?
@@ -102,12 +102,12 @@ module AnnotateRb
102
102
 
103
103
  def timestamp_if_required(time = Time.now)
104
104
  if options[:timestamp]
105
- time_formatted = time.strftime('%Y-%m-%d %H:%M')
105
+ time_formatted = time.strftime("%Y-%m-%d %H:%M")
106
106
  " (Updated #{time_formatted})"
107
107
  else
108
- ''
108
+ ""
109
109
  end
110
110
  end
111
111
  end
112
112
  end
113
- end
113
+ end
@@ -3,7 +3,7 @@
3
3
  module AnnotateRb
4
4
  module RouteAnnotator
5
5
  module Helper
6
- MAGIC_COMMENT_MATCHER = Regexp.new(/(^#\s*encoding:.*)|(^# coding:.*)|(^# -\*- coding:.*)|(^# -\*- encoding\s?:.*)|(^#\s*frozen_string_literal:.+)|(^# -\*- frozen_string_literal\s*:.+-\*-)/).freeze
6
+ MAGIC_COMMENT_MATCHER = /(^#\s*encoding:.*)|(^# coding:.*)|(^# -\*- coding:.*)|(^# -\*- encoding\s?:.*)|(^#\s*frozen_string_literal:.+)|(^# -\*- frozen_string_literal\s*:.+-\*-)/.freeze
7
7
 
8
8
  class << self
9
9
  def routes_file_exist?
@@ -11,18 +11,18 @@ module AnnotateRb
11
11
  end
12
12
 
13
13
  def routes_file
14
- @routes_rb ||= File.join('config', 'routes.rb')
14
+ @routes_rb ||= File.join("config", "routes.rb")
15
15
  end
16
16
 
17
17
  def strip_on_removal(content, header_position)
18
18
  if header_position == :before
19
- content.shift while content.first == ''
19
+ content.shift while content.first == ""
20
20
  elsif header_position == :after
21
- content.pop while content.last == ''
21
+ content.pop while content.last == ""
22
22
  end
23
23
 
24
24
  # Make sure we end on a trailing newline.
25
- content << '' unless content.last == ''
25
+ content << "" unless content.last == ""
26
26
 
27
27
  # TODO: If the user buried it in the middle, we should probably see about
28
28
  # TODO: preserving a single line of space between the content above and
@@ -34,7 +34,7 @@ module AnnotateRb
34
34
  if existing_text == new_text
35
35
  false
36
36
  else
37
- File.open(routes_file, 'wb') { |f| f.puts(new_text) }
37
+ File.open(routes_file, "wb") { |f| f.puts(new_text) }
38
38
  true
39
39
  end
40
40
  end
@@ -47,7 +47,7 @@ module AnnotateRb
47
47
  new_content = []
48
48
 
49
49
  content_array.each do |row|
50
- if row =~ MAGIC_COMMENT_MATCHER
50
+ if MAGIC_COMMENT_MATCHER.match?(row)
51
51
  magic_comments << row.strip
52
52
  else
53
53
  new_content << row
@@ -74,7 +74,7 @@ module AnnotateRb
74
74
  mode = :content
75
75
  real_content << line unless line.blank?
76
76
  elsif mode == :content
77
- if line =~ /^\s*#\s*== Route.*$/
77
+ if /^\s*#\s*== Route.*$/.match?(line)
78
78
  header_position = line_number + 1 # index start's at 0
79
79
  mode = :header
80
80
  else
@@ -96,7 +96,7 @@ module AnnotateRb
96
96
  return real_content, :after if header_position >= real_content.count
97
97
 
98
98
  # and the default
99
- return real_content, header_position
99
+ [real_content, header_position]
100
100
  end
101
101
  end
102
102
  end
@@ -22,13 +22,13 @@ module AnnotateRb
22
22
 
23
23
  def generate_new_content_array(content, header_position)
24
24
  if header_position == :before
25
- content.shift while content.first == ''
25
+ content.shift while content.first == ""
26
26
  elsif header_position == :after
27
- content.pop while content.last == ''
27
+ content.pop while content.last == ""
28
28
  end
29
29
 
30
30
  # Make sure we end on a trailing newline.
31
- content << '' unless content.last == ''
31
+ content << "" unless content.last == ""
32
32
 
33
33
  # TODO: If the user buried it in the middle, we should probably see about
34
34
  # TODO: preserving a single line of space between the content above and
@@ -37,4 +37,4 @@ module AnnotateRb
37
37
  end
38
38
  end
39
39
  end
40
- end
40
+ end
@@ -2,11 +2,11 @@
2
2
 
3
3
  module AnnotateRb
4
4
  module RouteAnnotator
5
- autoload :Annotator, 'annotate_rb/route_annotator/annotator'
6
- autoload :Helper, 'annotate_rb/route_annotator/helper'
7
- autoload :HeaderGenerator, 'annotate_rb/route_annotator/header_generator'
8
- autoload :BaseProcessor, 'annotate_rb/route_annotator/base_processor'
9
- autoload :AnnotationProcessor, 'annotate_rb/route_annotator/annotation_processor'
10
- autoload :RemovalProcessor, 'annotate_rb/route_annotator/removal_processor'
5
+ autoload :Annotator, "annotate_rb/route_annotator/annotator"
6
+ autoload :Helper, "annotate_rb/route_annotator/helper"
7
+ autoload :HeaderGenerator, "annotate_rb/route_annotator/header_generator"
8
+ autoload :BaseProcessor, "annotate_rb/route_annotator/base_processor"
9
+ autoload :AnnotationProcessor, "annotate_rb/route_annotator/annotation_processor"
10
+ autoload :RemovalProcessor, "annotate_rb/route_annotator/removal_processor"
11
11
  end
12
12
  end
@@ -8,10 +8,6 @@ module AnnotateRb
8
8
  end
9
9
  end
10
10
 
11
- def initialize
12
-
13
- end
14
-
15
11
  def run(args)
16
12
  _original_args = args.dup
17
13
 
@@ -5,15 +5,15 @@
5
5
  # run after doing db:migrate.
6
6
 
7
7
  # Migration tasks are tasks that we'll "hook" into
8
- migration_tasks = %w(db:migrate db:migrate:up db:migrate:down db:migrate:reset db:migrate:redo db:rollback)
9
- if defined?(Rails::Application) && Rails.version.split('.').first.to_i >= 6
10
- require 'active_record'
8
+ migration_tasks = %w[db:migrate db:migrate:up db:migrate:down db:migrate:reset db:migrate:redo db:rollback]
9
+ if defined?(Rails::Application) && Rails.version.split(".").first.to_i >= 6
10
+ require "active_record"
11
11
 
12
12
  databases = ActiveRecord::Tasks::DatabaseTasks.setup_initial_database_yaml
13
13
 
14
14
  # If there's multiple databases, this appends database specific rake tasks to `migration_tasks`
15
15
  ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |database_name|
16
- migration_tasks.concat(%w(db:migrate db:migrate:up db:migrate:down).map { |task| "#{task}:#{database_name}" })
16
+ migration_tasks.concat(%w[db:migrate db:migrate:up db:migrate:down].map { |task| "#{task}:#{database_name}" })
17
17
  end
18
18
  end
19
19
 
@@ -24,7 +24,7 @@ migration_tasks.each do |task|
24
24
  task_name = Rake.application.top_level_tasks.last # The name of the task that was run, e.g. "db:migrate"
25
25
 
26
26
  Rake::Task[task_name].enhance do
27
- ::AnnotateRb::Runner.run(['models'])
27
+ ::AnnotateRb::Runner.run(["models"])
28
28
  end
29
29
  end
30
30
  end
data/lib/annotate_rb.rb CHANGED
@@ -1,29 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_record'
4
- require 'active_support'
3
+ require "active_record"
4
+ require "active_support"
5
5
 
6
6
  # Helper.fallback depends on this being required because it adds #present? to nil
7
- require 'active_support/core_ext/object/blank'
8
- require 'active_support/core_ext/class/subclasses'
9
- require 'active_support/core_ext/string/inflections'
7
+ require "active_support/core_ext/object/blank"
8
+ require "active_support/core_ext/class/subclasses"
9
+ require "active_support/core_ext/string/inflections"
10
10
 
11
- require 'rake'
11
+ require "rake"
12
12
 
13
- require 'annotate_rb/active_record_patch'
13
+ require "annotate_rb/active_record_patch"
14
14
 
15
- require_relative 'annotate_rb/core'
16
- require_relative 'annotate_rb/commands'
17
- require_relative 'annotate_rb/parser'
18
- require_relative 'annotate_rb/runner'
19
- require_relative 'annotate_rb/route_annotator'
20
- require_relative 'annotate_rb/model_annotator'
21
- require_relative 'annotate_rb/options'
22
- require_relative 'annotate_rb/eager_loader'
23
- require_relative 'annotate_rb/rake_bootstrapper'
24
- require_relative 'annotate_rb/config_finder'
25
- require_relative 'annotate_rb/config_loader'
15
+ require_relative "annotate_rb/helper"
16
+ require_relative "annotate_rb/core"
17
+ require_relative "annotate_rb/commands"
18
+ require_relative "annotate_rb/parser"
19
+ require_relative "annotate_rb/runner"
20
+ require_relative "annotate_rb/route_annotator"
21
+ require_relative "annotate_rb/model_annotator"
22
+ require_relative "annotate_rb/options"
23
+ require_relative "annotate_rb/eager_loader"
24
+ require_relative "annotate_rb/rake_bootstrapper"
25
+ require_relative "annotate_rb/config_finder"
26
+ require_relative "annotate_rb/config_loader"
26
27
 
27
28
  module AnnotateRb
28
-
29
29
  end
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
- require 'annotate_rb'
2
+
3
+ require "annotate_rb"
3
4
 
4
5
  module AnnotateRb
5
6
  module Generators
6
7
  class InstallGenerator < ::Rails::Generators::Base
7
- source_root File.expand_path('templates', __dir__)
8
+ source_root File.expand_path("templates", __dir__)
8
9
 
9
10
  def copy_task
10
11
  copy_file "annotate_rb.rake", "lib/tasks/annotate_rb.rake"
@@ -1,7 +1,7 @@
1
1
  # This rake task was added by annotate_rb gem.
2
2
 
3
3
  if Rails.env.development?
4
- require 'annotate_rb'
4
+ require "annotate_rb"
5
5
 
6
6
  AnnotateRb::Core.load_rake_tasks
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: annotaterb
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.1
4
+ version: 4.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew W. Lee
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-20 00:00:00.000000000 Z
11
+ date: 2023-06-02 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Annotates Rails/ActiveRecord Models, routes, fixtures, and others based
14
14
  on the database schema.
@@ -35,33 +35,39 @@ files:
35
35
  - lib/annotate_rb/config_loader.rb
36
36
  - lib/annotate_rb/core.rb
37
37
  - lib/annotate_rb/eager_loader.rb
38
+ - lib/annotate_rb/helper.rb
38
39
  - lib/annotate_rb/model_annotator.rb
40
+ - lib/annotate_rb/model_annotator/annotation_builder.rb
39
41
  - lib/annotate_rb/model_annotator/annotation_decider.rb
40
42
  - lib/annotate_rb/model_annotator/annotation_diff.rb
41
43
  - lib/annotate_rb/model_annotator/annotation_diff_generator.rb
42
- - lib/annotate_rb/model_annotator/annotation_generator.rb
43
44
  - lib/annotate_rb/model_annotator/annotation_pattern_generator.rb
44
45
  - lib/annotate_rb/model_annotator/annotator.rb
45
46
  - lib/annotate_rb/model_annotator/bad_model_file_error.rb
46
- - lib/annotate_rb/model_annotator/column_annotation_builder.rb
47
- - lib/annotate_rb/model_annotator/column_attributes_builder.rb
48
- - lib/annotate_rb/model_annotator/column_type_builder.rb
49
- - lib/annotate_rb/model_annotator/column_wrapper.rb
50
- - lib/annotate_rb/model_annotator/constants.rb
51
- - lib/annotate_rb/model_annotator/file_annotation_remover.rb
52
- - lib/annotate_rb/model_annotator/file_annotator.rb
53
- - lib/annotate_rb/model_annotator/file_annotator_instruction.rb
47
+ - lib/annotate_rb/model_annotator/column_annotation.rb
48
+ - lib/annotate_rb/model_annotator/column_annotation/annotation_builder.rb
49
+ - lib/annotate_rb/model_annotator/column_annotation/attributes_builder.rb
50
+ - lib/annotate_rb/model_annotator/column_annotation/column_wrapper.rb
51
+ - lib/annotate_rb/model_annotator/column_annotation/type_builder.rb
52
+ - lib/annotate_rb/model_annotator/file_builder.rb
53
+ - lib/annotate_rb/model_annotator/file_components.rb
54
54
  - lib/annotate_rb/model_annotator/file_name_resolver.rb
55
- - lib/annotate_rb/model_annotator/file_patterns.rb
56
- - lib/annotate_rb/model_annotator/foreign_key_annotation_builder.rb
57
- - lib/annotate_rb/model_annotator/helper.rb
58
- - lib/annotate_rb/model_annotator/index_annotation_builder.rb
55
+ - lib/annotate_rb/model_annotator/foreign_key_annotation.rb
56
+ - lib/annotate_rb/model_annotator/foreign_key_annotation/annotation_builder.rb
57
+ - lib/annotate_rb/model_annotator/index_annotation.rb
58
+ - lib/annotate_rb/model_annotator/index_annotation/annotation_builder.rb
59
+ - lib/annotate_rb/model_annotator/magic_comment_parser.rb
59
60
  - lib/annotate_rb/model_annotator/model_class_getter.rb
60
- - lib/annotate_rb/model_annotator/model_file_annotator.rb
61
61
  - lib/annotate_rb/model_annotator/model_files_getter.rb
62
62
  - lib/annotate_rb/model_annotator/model_wrapper.rb
63
63
  - lib/annotate_rb/model_annotator/pattern_getter.rb
64
+ - lib/annotate_rb/model_annotator/project_annotation_remover.rb
65
+ - lib/annotate_rb/model_annotator/project_annotator.rb
64
66
  - lib/annotate_rb/model_annotator/related_files_list_builder.rb
67
+ - lib/annotate_rb/model_annotator/single_file_annotation_remover.rb
68
+ - lib/annotate_rb/model_annotator/single_file_annotator.rb
69
+ - lib/annotate_rb/model_annotator/single_file_annotator_instruction.rb
70
+ - lib/annotate_rb/model_annotator/single_file_remove_annotation_instruction.rb
65
71
  - lib/annotate_rb/options.rb
66
72
  - lib/annotate_rb/parser.rb
67
73
  - lib/annotate_rb/rake_bootstrapper.rb
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AnnotateRb
4
- module ModelAnnotator
5
- class ColumnAnnotationBuilder
6
- BARE_TYPE_ALLOWANCE = 16
7
- MD_TYPE_ALLOWANCE = 18
8
-
9
- def initialize(column, model, max_size, options)
10
- @column = column
11
- @model = model
12
- @max_size = max_size
13
- @options = options
14
- end
15
-
16
- def build
17
- result = ''
18
-
19
- is_primary_key = is_column_primary_key?(@model, @column.name)
20
-
21
- table_indices = @model.retrieve_indexes_from_table
22
- column_indices = table_indices.select { |ind| ind.columns.include?(@column.name) }
23
-
24
- column_attributes = ColumnAttributesBuilder.new(@column, @options, is_primary_key, column_indices).build
25
- formatted_column_type = ColumnTypeBuilder.new(@column, @options).build
26
-
27
- col_name = if @model.with_comments? && @column.comment
28
- "#{@column.name}(#{@column.comment.gsub(/\n/, '\\n')})"
29
- else
30
- @column.name
31
- end
32
-
33
- if @options[:format_rdoc]
34
- result += format("# %-#{@max_size}.#{@max_size}s<tt>%s</tt>",
35
- "*#{col_name}*::",
36
- column_attributes.unshift(formatted_column_type).join(', ')).rstrip + "\n"
37
- elsif @options[:format_yard]
38
- result += sprintf("# @!attribute #{col_name}") + "\n"
39
-
40
- if @column.respond_to?(:array) && @column.array
41
- ruby_class = "Array<#{Helper.map_col_type_to_ruby_classes(formatted_column_type)}>"
42
- else
43
- ruby_class = Helper.map_col_type_to_ruby_classes(formatted_column_type)
44
- end
45
-
46
- result += sprintf("# @return [#{ruby_class}]") + "\n"
47
- elsif @options[:format_markdown]
48
- name_remainder = @max_size - col_name.length - Helper.non_ascii_length(col_name)
49
- type_remainder = (MD_TYPE_ALLOWANCE - 2) - formatted_column_type.length
50
- result += format("# **`%s`**%#{name_remainder}s | `%s`%#{type_remainder}s | `%s`",
51
- col_name,
52
- ' ',
53
- formatted_column_type,
54
- ' ',
55
- column_attributes.join(', ').rstrip).gsub('``', ' ').rstrip + "\n"
56
- else
57
- result += format_default(col_name, @max_size, formatted_column_type, column_attributes)
58
- end
59
-
60
- result
61
- end
62
-
63
- private
64
-
65
- def format_default(col_name, max_size, col_type, attrs)
66
- format('# %s:%s %s',
67
- Helper.mb_chars_ljust(col_name, max_size),
68
- Helper.mb_chars_ljust(col_type, BARE_TYPE_ALLOWANCE),
69
- attrs.join(', ')).rstrip + "\n"
70
- end
71
-
72
- # TODO: Simplify this conditional
73
- def is_column_primary_key?(model, column_name)
74
- if model.primary_key
75
- if model.primary_key.is_a?(Array)
76
- # If the model has multiple primary keys, check if this column is one of them
77
- if model.primary_key.collect(&:to_sym).include?(column_name.to_sym)
78
- return true
79
- end
80
- else
81
- # If model has 1 primary key, check if this column is it
82
- if column_name.to_sym == model.primary_key.to_sym
83
- return true
84
- end
85
- end
86
- end
87
-
88
- false
89
- end
90
- end
91
- end
92
- end
@@ -1,102 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AnnotateRb
4
- module ModelAnnotator
5
- class ColumnAttributesBuilder
6
- # Don't show default value for these column types
7
- NO_DEFAULT_COL_TYPES = %w[json jsonb hstore].freeze
8
-
9
- def initialize(column, options, is_primary_key, column_indices)
10
- @column = ColumnWrapper.new(column)
11
- @options = options
12
- @is_primary_key = is_primary_key
13
- @column_indices = column_indices
14
- end
15
-
16
- # Get the list of attributes that should be included in the annotation for
17
- # a given column.
18
- def build
19
- column_type = @column.column_type_string
20
- attrs = []
21
-
22
- unless @column.default.nil? || hide_default?
23
- schema_default = "default(#{@column.default_string})"
24
-
25
- attrs << schema_default
26
- end
27
-
28
- if @column.unsigned?
29
- attrs << 'unsigned'
30
- end
31
-
32
- if !@column.null
33
- attrs << 'not null'
34
- end
35
-
36
- if @is_primary_key
37
- attrs << 'primary key'
38
- end
39
-
40
- is_special_type = %w[spatial geometry geography].include?(column_type)
41
- is_decimal_type = column_type == 'decimal'
42
-
43
- if !is_decimal_type && !is_special_type
44
- if @column.limit && !@options[:format_yard]
45
- if @column.limit.is_a?(Array)
46
- attrs << "(#{@column.limit.join(', ')})"
47
- end
48
- end
49
- end
50
-
51
- # Check out if we got an array column
52
- if @column.array?
53
- attrs << 'is an Array'
54
- end
55
-
56
- # Check out if we got a geometric column
57
- # and print the type and SRID
58
- if @column.geometry_type?
59
- attrs << "#{@column.geometry_type}, #{@column.srid}"
60
- elsif @column.geometric_type? && @column.geometric_type.present?
61
- attrs << "#{@column.geometric_type.to_s.downcase}, #{@column.srid}"
62
- end
63
-
64
- # Check if the column has indices and print "indexed" if true
65
- # If the index includes another column, print it too.
66
- if @options[:simple_indexes]
67
- # Note: there used to be a klass.table_exists? call here, but removed it as it seemed unnecessary.
68
-
69
- sorted_column_indices&.each do |index|
70
- indexed_columns = index.columns.reject { |i| i == @column.name }
71
-
72
- if indexed_columns.empty?
73
- attrs << 'indexed'
74
- else
75
- attrs << "indexed => [#{indexed_columns.join(', ')}]"
76
- end
77
- end
78
- end
79
-
80
- attrs
81
- end
82
-
83
- def sorted_column_indices
84
- # Not sure why there were & safe accessors here, but keeping in for time being.
85
- sorted_indices = @column_indices&.sort_by(&:name)
86
-
87
- _sorted_indices = sorted_indices.reject { |ind| ind.columns.is_a?(String) }
88
- end
89
-
90
- def hide_default?
91
- excludes =
92
- if @options[:hide_default_column_types].blank?
93
- NO_DEFAULT_COL_TYPES
94
- else
95
- @options[:hide_default_column_types].split(',')
96
- end
97
-
98
- excludes.include?(@column.column_type_string)
99
- end
100
- end
101
- end
102
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AnnotateRb
4
- module ModelAnnotator
5
- class ColumnTypeBuilder
6
- # Don't show limit (#) on these column types
7
- # Example: show "integer" instead of "integer(4)"
8
- NO_LIMIT_COL_TYPES = %w[integer bigint boolean].freeze
9
-
10
- def initialize(column, options)
11
- @column = ColumnWrapper.new(column)
12
- @options = options
13
- end
14
-
15
- # Returns the formatted column type as a string.
16
- def build
17
- column_type = @column.column_type_string
18
-
19
- formatted_column_type = column_type
20
-
21
- is_special_type = %w[spatial geometry geography].include?(column_type)
22
- is_decimal_type = column_type == 'decimal'
23
-
24
- if is_decimal_type
25
- formatted_column_type = "decimal(#{@column.precision}, #{@column.scale})"
26
- elsif is_special_type
27
- # Do nothing. Kept as a code fragment in case we need to do something here.
28
- else
29
- if @column.limit && !@options[:format_yard]
30
- if !@column.limit.is_a?(Array) && !hide_limit?
31
- formatted_column_type = column_type + "(#{@column.limit})"
32
- end
33
- end
34
- end
35
-
36
- formatted_column_type
37
- end
38
-
39
- def hide_limit?
40
- excludes =
41
- if @options[:hide_limit_column_types].blank?
42
- NO_LIMIT_COL_TYPES
43
- else
44
- @options[:hide_limit_column_types].split(',')
45
- end
46
-
47
- excludes.include?(@column.column_type_string)
48
- end
49
- end
50
- end
51
- end