annotaterb 4.6.0 → 4.7.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2c9e326fa73164a6a2e43edc402e6990cfbb5d953ac5fd1ccf8c71fa6d358ee1
4
- data.tar.gz: dabf1afd54a8dec7a96ed8c259ca84e0a6085618713be78f43f075a51a22db7f
3
+ metadata.gz: e7b61329d5886c3d24def7469ff273e6692c08a5f8f2340a7f6471f993190e17
4
+ data.tar.gz: 8fcb5a79d2be122867131b8a3779318958326564f6c3c36e4c53e4e0ee7b4250
5
5
  SHA512:
6
- metadata.gz: 12e277c2d09e37e1001e64b0f08542ff03981bf5bbe37e86ed3dca01b1ec52c5b1805ce6f5cb1a8e5b25c3b9d655cb2345d0c9d878ecf4ae6bbfd265870445ac
7
- data.tar.gz: 88d7c9ba17c3abbf38e635365314d1c4b372e67ec5ef0dcba9f7f4f5b6ef90d0e285a2150887127fa75f847a1ee2e8e4c7a30548729a4f903cf71f42be793177
6
+ metadata.gz: 2c9fe857ae8f3627ff4fe42a419c6123cf9697419d766798abc81b3cf40c6cfb23ad6978d9daab4db7e6888fdfbf9574f4562a9949ab5344b7d3f6df168aff80
7
+ data.tar.gz: 3cf70f50b4c9ef6f97b08ab91dc7b538806dce0be9a1b4b45be68d132afa74828b306e63544f1be18739a7a85149f4af19f033feeb5899ae575ef61726be27d5
data/CHANGELOG.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # Changelog
2
2
 
3
+ ## [v4.7.0](https://github.com/drwl/annotaterb/tree/v4.7.0) (2024-03-27)
4
+
5
+ [Full Changelog](https://github.com/drwl/annotaterb/compare/v4.6.0...v4.7.0)
6
+
7
+ **Closed issues:**
8
+
9
+ - Feature request: better custom type representation [\#97](https://github.com/drwl/annotaterb/issues/97)
10
+
11
+ **Merged pull requests:**
12
+
13
+ - Bump version to v4.7.0 [\#100](https://github.com/drwl/annotaterb/pull/100) ([drwl](https://github.com/drwl))
14
+ - Add configurable classes list with `to_s` representation [\#98](https://github.com/drwl/annotaterb/pull/98) ([viralpraxis](https://github.com/viralpraxis))
15
+ - Generate changelog for v4.6.0 [\#96](https://github.com/drwl/annotaterb/pull/96) ([drwl](https://github.com/drwl))
16
+
17
+ ## [v4.6.0](https://github.com/drwl/annotaterb/tree/v4.6.0) (2024-02-27)
18
+
19
+ [Full Changelog](https://github.com/drwl/annotaterb/compare/v4.5.0...v4.6.0)
20
+
21
+ **Closed issues:**
22
+
23
+ - Add support for `data_migrate` gem [\#89](https://github.com/drwl/annotaterb/issues/89)
24
+
25
+ **Merged pull requests:**
26
+
27
+ - Bump version to v4.6.0 [\#95](https://github.com/drwl/annotaterb/pull/95) ([drwl](https://github.com/drwl))
28
+ - Add support for parsing RSpec files [\#94](https://github.com/drwl/annotaterb/pull/94) ([drwl](https://github.com/drwl))
29
+ - Add support for model name without namespace in resolver [\#93](https://github.com/drwl/annotaterb/pull/93) ([drwl](https://github.com/drwl))
30
+ - Fixes for `RelatedFilesListBuilder` [\#92](https://github.com/drwl/annotaterb/pull/92) ([drwl](https://github.com/drwl))
31
+ - Refactor `AnnotatedFile` classes [\#91](https://github.com/drwl/annotaterb/pull/91) ([drwl](https://github.com/drwl))
32
+ - Add support for data\_migrate gem [\#90](https://github.com/drwl/annotaterb/pull/90) ([cmer](https://github.com/cmer))
33
+ - Support non-model files in `CustomParser` [\#88](https://github.com/drwl/annotaterb/pull/88) ([drwl](https://github.com/drwl))
34
+ - Fix flakey integration test [\#87](https://github.com/drwl/annotaterb/pull/87) ([drwl](https://github.com/drwl))
35
+ - Improve integration tests [\#86](https://github.com/drwl/annotaterb/pull/86) ([drwl](https://github.com/drwl))
36
+ - Add Zeitwerk support [\#85](https://github.com/drwl/annotaterb/pull/85) ([drwl](https://github.com/drwl))
37
+ - Improve annotate after adding new migration integration test [\#84](https://github.com/drwl/annotaterb/pull/84) ([drwl](https://github.com/drwl))
38
+ - Add integration test using force [\#81](https://github.com/drwl/annotaterb/pull/81) ([drwl](https://github.com/drwl))
39
+ - Generate changelog for v4.5.0 [\#80](https://github.com/drwl/annotaterb/pull/80) ([drwl](https://github.com/drwl))
40
+ - Fix annotations swallowing comments [\#72](https://github.com/drwl/annotaterb/pull/72) ([drwl](https://github.com/drwl))
41
+
3
42
  ## [v4.5.0](https://github.com/drwl/annotaterb/tree/v4.5.0) (2024-02-08)
4
43
 
5
44
  [Full Changelog](https://github.com/drwl/annotaterb/compare/v4.4.1...v4.5.0)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 4.6.0
1
+ 4.7.1
@@ -44,6 +44,10 @@ module AnnotateRb
44
44
  @info += ForeignKeyAnnotation::AnnotationBuilder.new(@model, @options).build
45
45
  end
46
46
 
47
+ if @options[:show_check_constraints] && @model.table_exists?
48
+ @info += CheckConstraintAnnotation::AnnotationBuilder.new(@model, @options).build
49
+ end
50
+
47
51
  @info += schema_footer_text
48
52
 
49
53
  @info
@@ -52,12 +56,19 @@ module AnnotateRb
52
56
  def header
53
57
  header = @options[:format_markdown] ? PREFIX_MD.dup : PREFIX.dup
54
58
  header = "# #{header}"
55
- version = begin
56
- ActiveRecord::Migrator.current_version
57
- rescue
58
- 0
59
+
60
+ if @options.get_state(:current_version).nil?
61
+ migration_version = begin
62
+ ActiveRecord::Migrator.current_version
63
+ rescue
64
+ 0
65
+ end
66
+
67
+ @options.set_state(:current_version, migration_version)
59
68
  end
60
69
 
70
+ version = @options.get_state(:current_version)
71
+
61
72
  if @options[:include_version] && version > 0
62
73
  header += "\n# Schema version: #{version}"
63
74
  end
@@ -18,6 +18,10 @@ module AnnotateRb
18
18
  klass = ModelClassGetter.call(@file, @options)
19
19
 
20
20
  klass_is_a_class = klass.is_a?(Class)
21
+ # Methods such as #superclass only exist on a class. Because of how the code is structured, `klass` could be a
22
+ # module that does not support the #superclass method, so we want to return early.
23
+ return false if !klass_is_a_class
24
+
21
25
  klass_inherits_active_record_base = klass < ActiveRecord::Base
22
26
  klass_is_not_abstract = klass.respond_to?(:abstract_class) && !klass.abstract_class?
23
27
  klass_table_exists = klass.respond_to?(:abstract_class) && klass.table_exists?
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AnnotateRb
4
+ module ModelAnnotator
5
+ module CheckConstraintAnnotation
6
+ class AnnotationBuilder
7
+ def initialize(model, options)
8
+ @model = model
9
+ @options = options
10
+ end
11
+
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?) &&
20
+ @model.connection.supports_check_constraints? && @model.connection.respond_to?(:check_constraints)
21
+
22
+ check_constraints = @model.connection.check_constraints(@model.table_name)
23
+ return "" if check_constraints.empty?
24
+
25
+ max_size = check_constraints.map { |check_constraint| check_constraint.name.size }.max + 1
26
+ check_constraints.sort_by(&:name).each do |check_constraint|
27
+ expression = check_constraint.expression ? "(#{check_constraint.expression.squish})" : nil
28
+
29
+ constraint_info += if @options[:format_markdown]
30
+ cc_info_in_markdown(check_constraint.name, expression)
31
+ else
32
+ cc_info_string(check_constraint.name, expression, max_size)
33
+ end
34
+ end
35
+
36
+ constraint_info
37
+ end
38
+
39
+ private
40
+
41
+ def cc_info_in_markdown(name, expression)
42
+ cc_info_markdown = sprintf("# * `%s`", name)
43
+ cc_info_markdown += sprintf(": `%s`", expression) if expression
44
+ cc_info_markdown += "\n"
45
+
46
+ cc_info_markdown
47
+ end
48
+
49
+ def cc_info_string(name, expression, max_size)
50
+ # standard:disable Lint/FormatParameterMismatch
51
+ sprintf("# %-#{max_size}.#{max_size}s %s", name, expression).rstrip + "\n"
52
+ # standard:enable Lint/FormatParameterMismatch
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AnnotateRb
4
+ module ModelAnnotator
5
+ module CheckConstraintAnnotation
6
+ autoload :AnnotationBuilder, "annotate_rb/model_annotator/check_constraint_annotation/annotation_builder"
7
+ end
8
+ end
9
+ end
@@ -8,7 +8,7 @@ module AnnotateRb
8
8
  NO_DEFAULT_COL_TYPES = %w[json jsonb hstore].freeze
9
9
 
10
10
  def initialize(column, options, is_primary_key, column_indices, column_defaults)
11
- @column = ColumnWrapper.new(column, column_defaults)
11
+ @column = ColumnWrapper.new(column, column_defaults, options)
12
12
  @options = options
13
13
  @is_primary_key = is_primary_key
14
14
  @column_indices = column_indices
@@ -4,9 +4,10 @@ module AnnotateRb
4
4
  module ModelAnnotator
5
5
  module ColumnAnnotation
6
6
  class ColumnWrapper
7
- def initialize(column, column_defaults)
7
+ def initialize(column, column_defaults, options)
8
8
  @column = column
9
9
  @column_defaults = column_defaults
10
+ @options = options
10
11
  end
11
12
 
12
13
  def raw_default
@@ -88,7 +89,7 @@ module AnnotateRb
88
89
 
89
90
  # Simple quoting for the default column value
90
91
  def quote(value)
91
- DefaultValueBuilder.new(value).build
92
+ DefaultValueBuilder.new(value, @options).build
92
93
  end
93
94
  end
94
95
  end
@@ -4,8 +4,9 @@ module AnnotateRb
4
4
  module ModelAnnotator
5
5
  module ColumnAnnotation
6
6
  class DefaultValueBuilder
7
- def initialize(value)
7
+ def initialize(value, options)
8
8
  @value = value
9
+ @options = options
9
10
  end
10
11
 
11
12
  # @return [String]
@@ -27,6 +28,8 @@ module AnnotateRb
27
28
  private
28
29
 
29
30
  def quote(value)
31
+ return value.to_s.inspect if @options[:classes_default_to_s]&.include?(value.class.name)
32
+
30
33
  case value
31
34
  when NilClass then "NULL"
32
35
  when TrueClass then "TRUE"
@@ -10,7 +10,7 @@ module AnnotateRb
10
10
 
11
11
  def initialize(column, options, column_defaults)
12
12
  # Passing `column_defaults` for posterity, don't actually need it here since it's not used
13
- @column = ColumnWrapper.new(column, column_defaults)
13
+ @column = ColumnWrapper.new(column, column_defaults, options)
14
14
  @options = options
15
15
  end
16
16
 
@@ -26,5 +26,6 @@ module AnnotateRb
26
26
  autoload :AnnotatedFile, "annotate_rb/model_annotator/annotated_file"
27
27
  autoload :FileParser, "annotate_rb/model_annotator/file_parser"
28
28
  autoload :ZeitwerkClassGetter, "annotate_rb/model_annotator/zeitwerk_class_getter"
29
+ autoload :CheckConstraintAnnotation, "annotate_rb/model_annotator/check_constraint_annotation"
29
30
  end
30
31
  end
@@ -45,6 +45,7 @@ module AnnotateRb
45
45
  ignore_unknown_models: false, # ModelAnnotator
46
46
  include_version: false, # ModelAnnotator
47
47
  show_complete_foreign_keys: false, # ModelAnnotator
48
+ show_check_constraints: false, # ModelAnnotator
48
49
  show_foreign_keys: true, # ModelAnnotator
49
50
  show_indexes: true, # ModelAnnotator
50
51
  simple_indexes: false, # ModelAnnotator
@@ -76,7 +77,8 @@ module AnnotateRb
76
77
  target_action: :do_annotations, # Core; Possible values: :do_annotations, :remove_annotations
77
78
  wrapper: nil, # ModelAnnotator, RouteAnnotator
78
79
  wrapper_close: nil, # ModelAnnotator, RouteAnnotator
79
- wrapper_open: nil # ModelAnnotator, RouteAnnotator
80
+ wrapper_open: nil, # ModelAnnotator, RouteAnnotator,
81
+ classes_default_to_s: [] # ModelAnnotator
80
82
  }.freeze
81
83
 
82
84
  PATH_OPTIONS = {
@@ -108,6 +110,7 @@ module AnnotateRb
108
110
  :ignore_model_sub_dir,
109
111
  :ignore_unknown_models,
110
112
  :include_version,
113
+ :show_check_constraints,
111
114
  :show_complete_foreign_keys,
112
115
  :show_foreign_keys,
113
116
  :show_indexes,
@@ -135,7 +138,8 @@ module AnnotateRb
135
138
  :target_action,
136
139
  :wrapper,
137
140
  :wrapper_close,
138
- :wrapper_open
141
+ :wrapper_open,
142
+ :classes_default_to_s
139
143
  ].freeze
140
144
 
141
145
  PATH_OPTION_KEYS = [
@@ -9,7 +9,7 @@ module AnnotateRb
9
9
 
10
10
  BANNER_STRING = <<~BANNER.freeze
11
11
  Usage: annotaterb [command] [options]
12
-
12
+
13
13
  Commands:
14
14
  models [options]
15
15
  routes [options]
@@ -198,6 +198,12 @@ module AnnotateRb
198
198
  @options[:simple_indexes] = true
199
199
  end
200
200
 
201
+ option_parser.on("-c",
202
+ "--show-check-constraints",
203
+ "List the table's check constraints in the annotation") do
204
+ @options[:show_check_constraints] = true
205
+ end
206
+
201
207
  option_parser.on("--hide-limit-column-types VALUES",
202
208
  "don't show limit for given column types, separated by commas (i.e., `integer,boolean,text`)") do |values|
203
209
  @options[:hide_limit_column_types] = values.to_s
@@ -248,6 +254,15 @@ module AnnotateRb
248
254
  "exclude table comments in model annotations") do
249
255
  @options[:with_table_comments] = false
250
256
  end
257
+
258
+ option_parser.on("--classes-default-to-s class",
259
+ "Custom classes to be represented with `to_s`, may be used multiple times") do |klass|
260
+ @options[:classes_default_to_s] = if @options[:classes_default_to_s].present?
261
+ [*@options[:classes_default_to_s], klass]
262
+ else
263
+ [klass]
264
+ end
265
+ end
251
266
  end
252
267
 
253
268
  def add_route_options_to_parser(option_parser)
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.6.0
4
+ version: 4.7.1
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: 2024-02-27 00:00:00.000000000 Z
11
+ date: 2024-05-09 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.
@@ -46,6 +46,8 @@ files:
46
46
  - lib/annotate_rb/model_annotator/annotation_diff_generator.rb
47
47
  - lib/annotate_rb/model_annotator/annotator.rb
48
48
  - lib/annotate_rb/model_annotator/bad_model_file_error.rb
49
+ - lib/annotate_rb/model_annotator/check_constraint_annotation.rb
50
+ - lib/annotate_rb/model_annotator/check_constraint_annotation/annotation_builder.rb
49
51
  - lib/annotate_rb/model_annotator/column_annotation.rb
50
52
  - lib/annotate_rb/model_annotator/column_annotation/annotation_builder.rb
51
53
  - lib/annotate_rb/model_annotator/column_annotation/attributes_builder.rb