annotaterb 4.10.0 → 4.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/VERSION +1 -1
  4. data/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb +84 -0
  5. data/lib/annotate_rb/model_annotator/annotation/main_header.rb +38 -0
  6. data/lib/annotate_rb/model_annotator/annotation/markdown_header.rb +39 -0
  7. data/lib/annotate_rb/model_annotator/annotation/schema_footer.rb +23 -0
  8. data/lib/annotate_rb/model_annotator/annotation/schema_header.rb +65 -0
  9. data/lib/annotate_rb/model_annotator/annotation.rb +13 -0
  10. data/lib/annotate_rb/model_annotator/annotation_decider.rb +2 -2
  11. data/lib/annotate_rb/model_annotator/check_constraint_annotation/annotation.rb +32 -0
  12. data/lib/annotate_rb/model_annotator/check_constraint_annotation/annotation_builder.rb +11 -35
  13. data/lib/annotate_rb/model_annotator/check_constraint_annotation/check_constraint_component.rb +31 -0
  14. data/lib/annotate_rb/model_annotator/check_constraint_annotation.rb +2 -0
  15. data/lib/annotate_rb/model_annotator/column_annotation/annotation_builder.rb +1 -83
  16. data/lib/annotate_rb/model_annotator/column_annotation/attributes_builder.rb +2 -0
  17. data/lib/annotate_rb/model_annotator/column_annotation/column_component.rb +94 -0
  18. data/lib/annotate_rb/model_annotator/column_annotation.rb +1 -0
  19. data/lib/annotate_rb/model_annotator/components.rb +63 -0
  20. data/lib/annotate_rb/model_annotator/foreign_key_annotation/annotation.rb +32 -0
  21. data/lib/annotate_rb/model_annotator/foreign_key_annotation/annotation_builder.rb +10 -42
  22. data/lib/annotate_rb/model_annotator/foreign_key_annotation/foreign_key_component.rb +34 -0
  23. data/lib/annotate_rb/model_annotator/foreign_key_annotation/foreign_key_component_builder.rb +56 -0
  24. data/lib/annotate_rb/model_annotator/foreign_key_annotation.rb +3 -0
  25. data/lib/annotate_rb/model_annotator/index_annotation/annotation.rb +32 -0
  26. data/lib/annotate_rb/model_annotator/index_annotation/annotation_builder.rb +6 -90
  27. data/lib/annotate_rb/model_annotator/index_annotation/index_component.rb +90 -0
  28. data/lib/annotate_rb/model_annotator/index_annotation.rb +2 -0
  29. data/lib/annotate_rb/model_annotator/project_annotator.rb +1 -1
  30. data/lib/annotate_rb/model_annotator.rb +2 -0
  31. data/lib/annotate_rb/rake_bootstrapper.rb +1 -17
  32. metadata +17 -3
  33. data/lib/annotate_rb/model_annotator/annotation_builder.rb +0 -124
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ab40ea1034e6f377865be3de919a8df7f32cd6b655def53590b4061389ce518a
4
- data.tar.gz: 1cc47f8f90e22930b7267727de068bacda45f0596df6bd15459c9d935e86f1f0
3
+ metadata.gz: a5dbaac7f2e0a75991b8d45ab6fdc6cd3de88493e045c9fdc166b86154d99054
4
+ data.tar.gz: 9902039f9f2a7a19e77201de2a197eb3f015effb9a7b59a108601d4d355227e6
5
5
  SHA512:
6
- metadata.gz: fed4abbcf53babf0b3854eacfb85078eb36716e2ddaaefa112e174c28f8a9694137f4fbe5b3e4ac73fc30f7b9786308a6770f62e692e101c676fee7ff3af6801
7
- data.tar.gz: b41107dd5b24a83f3c50e890eb24491665aa07253be3bf6e79caec4ab1ee898888ef84192ba691064a158cc4672ccfb7db18416970f61ce0add026a81e9116b9
6
+ metadata.gz: 4e7d023754cdc71278b597fcd8010deb199c776835953c0bcf39fb5371088cf38b565da58ff6942fc51a88a218512bbe7297aeb9dfe32776fa2fc36ac8b44601
7
+ data.tar.gz: 4c14de66314768ac83dcbd275e56f8627c5ecd82f10da63595c23bbd31c7a5cdb4318a6075f3f98787edf3a319ed7d22dc260b8b5aa70527de93fb7e62b9d53f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # Changelog
2
2
 
3
+ ## [v4.10.1](https://github.com/drwl/annotaterb/tree/v4.10.1) (2024-07-07)
4
+
5
+ [Full Changelog](https://github.com/drwl/annotaterb/compare/v4.10.0...v4.10.1)
6
+
7
+ **Merged pull requests:**
8
+
9
+ - Bump version to v4.10.1 [\#132](https://github.com/drwl/annotaterb/pull/132) ([drwl](https://github.com/drwl))
10
+ - Correct uses of `respond_to` in AnnotationDecider [\#131](https://github.com/drwl/annotaterb/pull/131) ([andreccosta](https://github.com/andreccosta))
11
+ - Generate changelog for v4.10.0 [\#129](https://github.com/drwl/annotaterb/pull/129) ([drwl](https://github.com/drwl))
12
+
13
+ ## [v4.10.0](https://github.com/drwl/annotaterb/tree/v4.10.0) (2024-06-28)
14
+
15
+ [Full Changelog](https://github.com/drwl/annotaterb/compare/v4.9.0...v4.10.0)
16
+
17
+ **Closed issues:**
18
+
19
+ - Feature Request: add support for arrays when using StoreModel [\#125](https://github.com/drwl/annotaterb/issues/125)
20
+ - Error on composite foreign key constraints [\#121](https://github.com/drwl/annotaterb/issues/121)
21
+
22
+ **Merged pull requests:**
23
+
24
+ - Bump version to v4.10.0 [\#128](https://github.com/drwl/annotaterb/pull/128) ([drwl](https://github.com/drwl))
25
+ - Support composite foreign keys [\#126](https://github.com/drwl/annotaterb/pull/126) ([drwl](https://github.com/drwl))
26
+ - Add files to improve other's ability to help the project [\#123](https://github.com/drwl/annotaterb/pull/123) ([drwl](https://github.com/drwl))
27
+ - Add database and adapter to issue template [\#122](https://github.com/drwl/annotaterb/pull/122) ([drwl](https://github.com/drwl))
28
+ - Generate changelog for v4.9.0 [\#120](https://github.com/drwl/annotaterb/pull/120) ([drwl](https://github.com/drwl))
29
+
3
30
  ## [v4.9.0](https://github.com/drwl/annotaterb/tree/v4.9.0) (2024-05-29)
4
31
 
5
32
  [Full Changelog](https://github.com/drwl/annotaterb/compare/v4.8.0...v4.9.0)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 4.10.0
1
+ 4.10.2
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AnnotateRb
4
+ module ModelAnnotator
5
+ module Annotation
6
+ class AnnotationBuilder
7
+ class Annotation < Components::Base
8
+ attr_reader :version, :table_name, :table_comment, :max_size
9
+
10
+ def initialize(options, **input)
11
+ @options = options
12
+
13
+ @version = input[:version]
14
+ @table_name = input[:table_name]
15
+ @table_comment = input[:table_comment]
16
+ @max_size = input[:max_size]
17
+ @model = input[:model]
18
+ end
19
+
20
+ def body
21
+ [
22
+ MainHeader.new(version, @options[:include_version]),
23
+ SchemaHeader.new(table_name, table_comment, @options),
24
+ MarkdownHeader.new(max_size),
25
+ *columns,
26
+ IndexAnnotation::AnnotationBuilder.new(@model, @options).build,
27
+ ForeignKeyAnnotation::AnnotationBuilder.new(@model, @options).build,
28
+ CheckConstraintAnnotation::AnnotationBuilder.new(@model, @options).build,
29
+ SchemaFooter.new
30
+ ]
31
+ end
32
+
33
+ def build
34
+ components = body.flatten
35
+
36
+ if @options[:format_rdoc]
37
+ components.map(&:to_rdoc).compact.join("\n")
38
+ elsif @options[:format_yard]
39
+ components.map(&:to_yard).compact.join("\n")
40
+ elsif @options[:format_markdown]
41
+ components.map(&:to_markdown).compact.join("\n")
42
+ else
43
+ components.map(&:to_default).compact.join("\n")
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def columns
50
+ @model.columns.map do |col|
51
+ _component = ColumnAnnotation::AnnotationBuilder.new(col, @model, max_size, @options).build
52
+ end
53
+ end
54
+ end
55
+
56
+ def initialize(klass, options)
57
+ @model = ModelWrapper.new(klass, options)
58
+ @options = options
59
+ end
60
+
61
+ def build
62
+ if @options.get_state(:current_version).nil?
63
+ migration_version = begin
64
+ ActiveRecord::Migrator.current_version
65
+ rescue
66
+ 0
67
+ end
68
+
69
+ @options.set_state(:current_version, migration_version)
70
+ end
71
+
72
+ version = @options.get_state(:current_version)
73
+ table_name = @model.table_name
74
+ table_comment = @model.connection.try(:table_comment, @model.table_name)
75
+ max_size = @model.max_schema_info_width
76
+
77
+ _annotation = Annotation.new(@options,
78
+ version: version, table_name: table_name, table_comment: table_comment,
79
+ max_size: max_size, model: @model).build
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AnnotateRb
4
+ module ModelAnnotator
5
+ module Annotation
6
+ class MainHeader < Components::Base
7
+ # Annotate Models plugin use this header
8
+ PREFIX = "== Schema Information"
9
+ PREFIX_MD = "## Schema Information"
10
+
11
+ attr_reader :version
12
+
13
+ def initialize(version, include_version)
14
+ @version = version
15
+ @include_version = include_version
16
+ end
17
+
18
+ def to_markdown
19
+ header = "# #{PREFIX_MD}"
20
+ if @include_version && version > 0
21
+ header += "\n# Schema version: #{version}"
22
+ end
23
+
24
+ header
25
+ end
26
+
27
+ def to_default
28
+ header = "# #{PREFIX}"
29
+ if @include_version && version > 0
30
+ header += "\n# Schema version: #{version}"
31
+ end
32
+
33
+ header
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AnnotateRb
4
+ module ModelAnnotator
5
+ module Annotation
6
+ class MarkdownHeader < Components::Base
7
+ MD_NAMES_OVERHEAD = 6
8
+ MD_TYPE_ALLOWANCE = 18
9
+
10
+ attr_reader :max_size
11
+
12
+ def initialize(max_size)
13
+ @max_size = max_size
14
+ end
15
+
16
+ def to_markdown
17
+ name_padding = max_size + MD_NAMES_OVERHEAD
18
+ # standard:disable Lint/FormatParameterMismatch
19
+ formatted_headers = format("# %-#{name_padding}.#{name_padding}s | %-#{MD_TYPE_ALLOWANCE}.#{MD_TYPE_ALLOWANCE}s | %s",
20
+ "Name",
21
+ "Type",
22
+ "Attributes")
23
+ # standard:enable Lint/FormatParameterMismatch
24
+
25
+ <<~HEADER.strip
26
+ # ### Columns
27
+ #
28
+ #{formatted_headers}
29
+ # #{"-" * name_padding} | #{"-" * MD_TYPE_ALLOWANCE} | #{"-" * 27}
30
+ HEADER
31
+ end
32
+
33
+ def to_default
34
+ nil
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AnnotateRb
4
+ module ModelAnnotator
5
+ module Annotation
6
+ class SchemaFooter < Components::Base
7
+ def to_rdoc
8
+ <<~OUTPUT
9
+ #--
10
+ # == Schema Information End
11
+ #++
12
+ OUTPUT
13
+ end
14
+
15
+ def to_default
16
+ <<~OUTPUT
17
+ #
18
+ OUTPUT
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AnnotateRb
4
+ module ModelAnnotator
5
+ module Annotation
6
+ class SchemaHeader < Components::Base
7
+ class TableName < Components::Base
8
+ attr_reader :name
9
+
10
+ def initialize(name)
11
+ @name = name
12
+ end
13
+
14
+ def to_default
15
+ "# Table name: #{name}"
16
+ end
17
+
18
+ def to_markdown
19
+ "# Table name: `#{name}`"
20
+ end
21
+ end
22
+
23
+ attr_reader :table_name, :table_comment
24
+
25
+ def initialize(table_name, table_comment, options)
26
+ @table_name = table_name
27
+ @table_comment = table_comment
28
+ @options = options
29
+ end
30
+
31
+ def body
32
+ [
33
+ Components::BlankCommentLine.new,
34
+ TableName.new(name),
35
+ Components::BlankCommentLine.new
36
+ ]
37
+ end
38
+
39
+ def to_default
40
+ body.map(&:to_default).join("\n")
41
+ end
42
+
43
+ def to_markdown
44
+ body.map(&:to_markdown).join("\n")
45
+ end
46
+
47
+ private
48
+
49
+ def display_table_comments?
50
+ @options[:with_comment] && @options[:with_table_comments]
51
+ end
52
+
53
+ def name
54
+ if display_table_comments? && table_comment
55
+ formatted_comment = "(#{table_comment.gsub(/\n/, "\\n")})"
56
+
57
+ "#{table_name}#{formatted_comment}"
58
+ else
59
+ table_name
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AnnotateRb
4
+ module ModelAnnotator
5
+ module Annotation
6
+ autoload :AnnotationBuilder, "annotate_rb/model_annotator/annotation/annotation_builder"
7
+ autoload :MainHeader, "annotate_rb/model_annotator/annotation/main_header"
8
+ autoload :SchemaHeader, "annotate_rb/model_annotator/annotation/schema_header"
9
+ autoload :MarkdownHeader, "annotate_rb/model_annotator/annotation/markdown_header"
10
+ autoload :SchemaFooter, "annotate_rb/model_annotator/annotation/schema_footer"
11
+ end
12
+ end
13
+ end
@@ -23,8 +23,8 @@ module AnnotateRb
23
23
  return false if !klass_is_a_class
24
24
 
25
25
  klass_inherits_active_record_base = klass < ActiveRecord::Base
26
- klass_is_not_abstract = klass.respond_to?(:abstract_class) && !klass.abstract_class?
27
- klass_table_exists = klass.respond_to?(:abstract_class) && klass.table_exists?
26
+ klass_is_not_abstract = klass.respond_to?(:abstract_class?) && !klass.abstract_class?
27
+ klass_table_exists = klass.respond_to?(:table_exists?) && klass.table_exists?
28
28
 
29
29
  not_sure_this_conditional = (!@options[:exclude_sti_subclasses] || !(klass.superclass < ActiveRecord::Base && klass.table_name == klass.superclass.table_name))
30
30
 
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AnnotateRb
4
+ module ModelAnnotator
5
+ module CheckConstraintAnnotation
6
+ class Annotation
7
+ HEADER_TEXT = "Check Constraints"
8
+
9
+ def initialize(constraints)
10
+ @constraints = constraints
11
+ end
12
+
13
+ def body
14
+ [
15
+ Components::BlankCommentLine.new,
16
+ Components::Header.new(HEADER_TEXT),
17
+ Components::BlankCommentLine.new,
18
+ *@constraints
19
+ ]
20
+ end
21
+
22
+ def to_markdown
23
+ body.map(&:to_markdown).join("\n")
24
+ end
25
+
26
+ def to_default
27
+ body.map(&:to_default).join("\n")
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -10,52 +10,28 @@ module AnnotateRb
10
10
  end
11
11
 
12
12
  def build
13
- constraint_info = if @options[:format_markdown]
14
- "#\n# ### Check Constraints\n#\n"
15
- else
16
- "#\n# Check Constraints\n#\n"
17
- end
18
-
19
- return "" unless @model.connection.respond_to?(:supports_check_constraints?) &&
13
+ return Components::NilComponent.new if !@options[:show_check_constraints]
14
+ return Components::NilComponent.new unless @model.connection.respond_to?(:supports_check_constraints?) &&
20
15
  @model.connection.supports_check_constraints? && @model.connection.respond_to?(:check_constraints)
21
16
 
22
17
  check_constraints = @model.connection.check_constraints(@model.table_name)
23
- return "" if check_constraints.empty?
18
+ return Components::NilComponent.new if check_constraints.empty?
24
19
 
25
20
  max_size = check_constraints.map { |check_constraint| check_constraint.name.size }.max + 1
26
- check_constraints.sort_by(&:name).each do |check_constraint|
21
+
22
+ constraints = check_constraints.sort_by(&:name).map do |check_constraint|
27
23
  expression = if check_constraint.expression
28
- not_validated = if !check_constraint.validated?
29
- "NOT VALID"
24
+ if check_constraint.validated?
25
+ "(#{check_constraint.expression.squish})"
26
+ else
27
+ "(#{check_constraint.expression.squish}) NOT VALID".squish
30
28
  end
31
-
32
- "(#{check_constraint.expression.squish}) #{not_validated}".squish
33
29
  end
34
30
 
35
- constraint_info += if @options[:format_markdown]
36
- cc_info_in_markdown(check_constraint.name, expression)
37
- else
38
- cc_info_string(check_constraint.name, expression, max_size)
39
- end
31
+ CheckConstraintComponent.new(check_constraint.name, expression, max_size)
40
32
  end
41
33
 
42
- constraint_info
43
- end
44
-
45
- private
46
-
47
- def cc_info_in_markdown(name, expression)
48
- cc_info_markdown = sprintf("# * `%s`", name)
49
- cc_info_markdown += sprintf(": `%s`", expression) if expression
50
- cc_info_markdown += "\n"
51
-
52
- cc_info_markdown
53
- end
54
-
55
- def cc_info_string(name, expression, max_size)
56
- # standard:disable Lint/FormatParameterMismatch
57
- sprintf("# %-#{max_size}.#{max_size}s %s", name, expression).rstrip + "\n"
58
- # standard:enable Lint/FormatParameterMismatch
34
+ _annotation = Annotation.new(constraints)
59
35
  end
60
36
  end
61
37
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AnnotateRb
4
+ module ModelAnnotator
5
+ module CheckConstraintAnnotation
6
+ class CheckConstraintComponent < Components::Base
7
+ attr_reader :name, :expression, :max_size
8
+
9
+ def initialize(name, expression, max_size)
10
+ @name = name
11
+ @expression = expression
12
+ @max_size = max_size
13
+ end
14
+
15
+ def to_default
16
+ # standard:disable Lint/FormatParameterMismatch
17
+ sprintf("# %-#{max_size}.#{max_size}s %s", name, expression).rstrip
18
+ # standard:enable Lint/FormatParameterMismatch
19
+ end
20
+
21
+ def to_markdown
22
+ if expression
23
+ sprintf("# * `%s`: `%s`", name, expression)
24
+ else
25
+ sprintf("# * `%s`", name)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -4,6 +4,8 @@ module AnnotateRb
4
4
  module ModelAnnotator
5
5
  module CheckConstraintAnnotation
6
6
  autoload :AnnotationBuilder, "annotate_rb/model_annotator/check_constraint_annotation/annotation_builder"
7
+ autoload :Annotation, "annotate_rb/model_annotator/check_constraint_annotation/annotation"
8
+ autoload :CheckConstraintComponent, "annotate_rb/model_annotator/check_constraint_annotation/check_constraint_component"
7
9
  end
8
10
  end
9
11
  end
@@ -4,9 +4,6 @@ module AnnotateRb
4
4
  module ModelAnnotator
5
5
  module ColumnAnnotation
6
6
  class AnnotationBuilder
7
- BARE_TYPE_ALLOWANCE = 16
8
- MD_TYPE_ALLOWANCE = 18
9
-
10
7
  def initialize(column, model, max_size, options)
11
8
  @column = column
12
9
  @model = model
@@ -15,8 +12,6 @@ module AnnotateRb
15
12
  end
16
13
 
17
14
  def build
18
- result = ""
19
-
20
15
  is_primary_key = is_column_primary_key?(@model, @column.name)
21
16
 
22
17
  table_indices = @model.retrieve_indexes_from_table
@@ -33,88 +28,11 @@ module AnnotateRb
33
28
  @column.name
34
29
  end
35
30
 
36
- result += if @options[:format_rdoc]
37
- format_rdoc(col_name, @max_size, formatted_column_type, column_attributes)
38
- elsif @options[:format_yard]
39
- format_yard(col_name, @max_size, formatted_column_type, column_attributes)
40
- elsif @options[:format_markdown]
41
- format_markdown(col_name, @max_size, formatted_column_type, column_attributes)
42
- else
43
- format_default(col_name, @max_size, formatted_column_type, column_attributes)
44
- end
45
-
46
- result
31
+ _component = ColumnComponent.new(col_name, @max_size, formatted_column_type, column_attributes)
47
32
  end
48
33
 
49
34
  private
50
35
 
51
- def non_ascii_length(string)
52
- string.to_s.chars.count { |element| !element.ascii_only? }
53
- end
54
-
55
- def mb_chars_ljust(string, length)
56
- string = string.to_s
57
- padding = length - Helper.width(string)
58
- if padding.positive?
59
- string + (" " * padding)
60
- else
61
- string[0..(length - 1)]
62
- end
63
- end
64
-
65
- def map_col_type_to_ruby_classes(col_type)
66
- case col_type
67
- when "integer" then Integer.to_s
68
- when "float" then Float.to_s
69
- when "decimal" then BigDecimal.to_s
70
- when "datetime", "timestamp", "time" then Time.to_s
71
- when "date" then Date.to_s
72
- when "text", "string", "binary", "inet", "uuid" then String.to_s
73
- when "json", "jsonb" then Hash.to_s
74
- when "boolean" then "Boolean"
75
- end
76
- end
77
-
78
- def format_rdoc(col_name, max_size, formatted_column_type, column_attributes)
79
- format("# %-#{max_size}.#{max_size}s<tt>%s</tt>",
80
- "*#{col_name}*::",
81
- column_attributes.unshift(formatted_column_type).join(", ")).rstrip + "\n"
82
- end
83
-
84
- def format_yard(col_name, _max_size, formatted_column_type, _column_attributes)
85
- res = ""
86
- res += sprintf("# @!attribute #{col_name}") + "\n"
87
-
88
- ruby_class = if @column.respond_to?(:array) && @column.array
89
- "Array<#{map_col_type_to_ruby_classes(formatted_column_type)}>"
90
- else
91
- map_col_type_to_ruby_classes(formatted_column_type)
92
- end
93
-
94
- res += sprintf("# @return [#{ruby_class}]") + "\n"
95
-
96
- res
97
- end
98
-
99
- def format_markdown(col_name, max_size, formatted_column_type, column_attributes)
100
- name_remainder = max_size - col_name.length - non_ascii_length(col_name)
101
- type_remainder = (MD_TYPE_ALLOWANCE - 2) - formatted_column_type.length
102
-
103
- format("# **`%s`**%#{name_remainder}s | `%s`%#{type_remainder}s | `%s`",
104
- col_name,
105
- " ",
106
- formatted_column_type,
107
- " ",
108
- column_attributes.join(", ").rstrip).gsub("``", " ").rstrip + "\n"
109
- end
110
-
111
- def format_default(col_name, max_size, formatted_column_type, column_attributes)
112
- format("# %s:%s %s",
113
- mb_chars_ljust(col_name, max_size),
114
- mb_chars_ljust(formatted_column_type, BARE_TYPE_ALLOWANCE),
115
- column_attributes.join(", ")).rstrip + "\n"
116
- end
117
-
118
36
  # TODO: Simplify this conditional
119
37
  def is_column_primary_key?(model, column_name)
120
38
  if model.primary_key
@@ -88,6 +88,8 @@ module AnnotateRb
88
88
  _sorted_indices = sorted_indices.reject { |ind| ind.columns.is_a?(String) }
89
89
  end
90
90
 
91
+ # Historically, the old gem looked for the option being set to "skip"
92
+ # e.g. hide_default_column_types: "skip"
91
93
  def hide_default?
92
94
  excludes =
93
95
  if @options[:hide_default_column_types].blank?
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AnnotateRb
4
+ module ModelAnnotator
5
+ module ColumnAnnotation
6
+ class ColumnComponent < Components::Base
7
+ MD_TYPE_ALLOWANCE = 18
8
+ BARE_TYPE_ALLOWANCE = 16
9
+
10
+ attr_reader :name, :max_size, :type, :attributes
11
+
12
+ def initialize(name, max_size, type, attributes)
13
+ @name = name
14
+ @max_size = max_size
15
+ @type = type
16
+ @attributes = attributes
17
+ end
18
+
19
+ def to_rdoc
20
+ # standard:disable Lint/FormatParameterMismatch
21
+ format("# %-#{max_size}.#{max_size}s<tt>%s</tt>",
22
+ "*#{name}*::",
23
+ attributes.unshift(type).join(", ")).rstrip
24
+ # standard:enable Lint/FormatParameterMismatch
25
+ end
26
+
27
+ def to_yard
28
+ res = ""
29
+ res += sprintf("# @!attribute #{name}") + "\n"
30
+
31
+ ruby_class = if @column.respond_to?(:array) && @column.array
32
+ "Array<#{map_col_type_to_ruby_classes(type)}>"
33
+ else
34
+ map_col_type_to_ruby_classes(type)
35
+ end
36
+
37
+ res += sprintf("# @return [#{ruby_class}]")
38
+
39
+ res
40
+ end
41
+
42
+ def to_markdown
43
+ name_remainder = max_size - name.length - non_ascii_length(name)
44
+ type_remainder = (MD_TYPE_ALLOWANCE - 2) - type.length
45
+
46
+ # standard:disable Lint/FormatParameterMismatch
47
+ format("# **`%s`**%#{name_remainder}s | `%s`%#{type_remainder}s | `%s`",
48
+ name,
49
+ " ",
50
+ type,
51
+ " ",
52
+ attributes.join(", ").rstrip).gsub("``", " ").rstrip
53
+ # standard:enable Lint/FormatParameterMismatch
54
+ end
55
+
56
+ def to_default
57
+ format("# %s:%s %s",
58
+ mb_chars_ljust(name, max_size),
59
+ mb_chars_ljust(type, BARE_TYPE_ALLOWANCE),
60
+ attributes.join(", ")).rstrip
61
+ end
62
+
63
+ private
64
+
65
+ def mb_chars_ljust(string, length)
66
+ string = string.to_s
67
+ padding = length - Helper.width(string)
68
+ if padding.positive?
69
+ string + (" " * padding)
70
+ else
71
+ string[0..(length - 1)]
72
+ end
73
+ end
74
+
75
+ def map_col_type_to_ruby_classes(col_type)
76
+ case col_type
77
+ when "integer" then Integer.to_s
78
+ when "float" then Float.to_s
79
+ when "decimal" then BigDecimal.to_s
80
+ when "datetime", "timestamp", "time" then Time.to_s
81
+ when "date" then Date.to_s
82
+ when "text", "string", "binary", "inet", "uuid" then String.to_s
83
+ when "json", "jsonb" then Hash.to_s
84
+ when "boolean" then "Boolean"
85
+ end
86
+ end
87
+
88
+ def non_ascii_length(string)
89
+ string.to_s.chars.count { |element| !element.ascii_only? }
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end