annotaterb 4.4.1 → 4.6.0

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +43 -0
  3. data/README.md +29 -0
  4. data/VERSION +1 -1
  5. data/lib/annotate_rb/config_generator.rb +28 -0
  6. data/lib/annotate_rb/eager_loader.rb +6 -2
  7. data/lib/annotate_rb/model_annotator/annotated_file/generator.rb +92 -0
  8. data/lib/annotate_rb/model_annotator/annotated_file/updater.rb +46 -0
  9. data/lib/annotate_rb/model_annotator/annotated_file.rb +10 -0
  10. data/lib/annotate_rb/model_annotator/annotator.rb +2 -2
  11. data/lib/annotate_rb/model_annotator/file_name_resolver.rb +5 -0
  12. data/lib/annotate_rb/model_annotator/file_parser/annotation_finder.rb +103 -0
  13. data/lib/annotate_rb/model_annotator/file_parser/custom_parser.rb +217 -0
  14. data/lib/annotate_rb/model_annotator/file_parser/parsed_file.rb +94 -0
  15. data/lib/annotate_rb/model_annotator/file_parser/parsed_file_result.rb +54 -0
  16. data/lib/annotate_rb/model_annotator/file_parser.rb +12 -0
  17. data/lib/annotate_rb/model_annotator/model_class_getter.rb +7 -0
  18. data/lib/annotate_rb/model_annotator/model_files_getter.rb +4 -8
  19. data/lib/annotate_rb/model_annotator/model_wrapper.rb +11 -2
  20. data/lib/annotate_rb/model_annotator/pattern_getter.rb +2 -0
  21. data/lib/annotate_rb/model_annotator/related_files_list_builder.rb +3 -3
  22. data/lib/annotate_rb/model_annotator/single_file_annotation_remover.rb +10 -12
  23. data/lib/annotate_rb/model_annotator/single_file_annotator.rb +15 -8
  24. data/lib/annotate_rb/model_annotator/single_file_annotator_instruction.rb +1 -1
  25. data/lib/annotate_rb/model_annotator/single_file_remove_annotation_instruction.rb +1 -1
  26. data/lib/annotate_rb/model_annotator/zeitwerk_class_getter.rb +113 -0
  27. data/lib/annotate_rb/model_annotator.rb +3 -4
  28. data/lib/annotate_rb/options.rb +4 -0
  29. data/lib/annotate_rb/parser.rb +9 -3
  30. data/lib/annotate_rb/runner.rb +5 -4
  31. data/lib/annotate_rb/tasks/annotate_models_migrate.rake +5 -0
  32. data/lib/annotate_rb.rb +1 -0
  33. data/lib/generators/annotate_rb/config/USAGE +6 -0
  34. data/lib/generators/annotate_rb/config/config_generator.rb +15 -0
  35. data/lib/generators/annotate_rb/hook/USAGE +7 -0
  36. data/lib/generators/annotate_rb/hook/hook_generator.rb +15 -0
  37. data/lib/generators/annotate_rb/install/install_generator.rb +3 -4
  38. data/lib/generators/annotate_rb/update_config/USAGE +6 -0
  39. data/lib/generators/annotate_rb/update_config/update_config_generator.rb +15 -0
  40. metadata +20 -8
  41. data/lib/annotate_rb/model_annotator/annotation_pattern_generator.rb +0 -19
  42. data/lib/annotate_rb/model_annotator/file_builder.rb +0 -57
  43. data/lib/annotate_rb/model_annotator/file_components.rb +0 -81
  44. data/lib/annotate_rb/model_annotator/magic_comment_parser.rb +0 -32
  45. /data/lib/generators/annotate_rb/{install → hook}/templates/annotate_rb.rake +0 -0
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.4.1
4
+ version: 4.6.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-09-11 00:00:00.000000000 Z
11
+ date: 2024-02-27 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.
@@ -31,16 +31,19 @@ files:
31
31
  - lib/annotate_rb/commands/print_help.rb
32
32
  - lib/annotate_rb/commands/print_version.rb
33
33
  - lib/annotate_rb/config_finder.rb
34
+ - lib/annotate_rb/config_generator.rb
34
35
  - lib/annotate_rb/config_loader.rb
35
36
  - lib/annotate_rb/core.rb
36
37
  - lib/annotate_rb/eager_loader.rb
37
38
  - lib/annotate_rb/helper.rb
38
39
  - lib/annotate_rb/model_annotator.rb
40
+ - lib/annotate_rb/model_annotator/annotated_file.rb
41
+ - lib/annotate_rb/model_annotator/annotated_file/generator.rb
42
+ - lib/annotate_rb/model_annotator/annotated_file/updater.rb
39
43
  - lib/annotate_rb/model_annotator/annotation_builder.rb
40
44
  - lib/annotate_rb/model_annotator/annotation_decider.rb
41
45
  - lib/annotate_rb/model_annotator/annotation_diff.rb
42
46
  - lib/annotate_rb/model_annotator/annotation_diff_generator.rb
43
- - lib/annotate_rb/model_annotator/annotation_pattern_generator.rb
44
47
  - lib/annotate_rb/model_annotator/annotator.rb
45
48
  - lib/annotate_rb/model_annotator/bad_model_file_error.rb
46
49
  - lib/annotate_rb/model_annotator/column_annotation.rb
@@ -49,14 +52,16 @@ files:
49
52
  - lib/annotate_rb/model_annotator/column_annotation/column_wrapper.rb
50
53
  - lib/annotate_rb/model_annotator/column_annotation/default_value_builder.rb
51
54
  - 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
55
  - lib/annotate_rb/model_annotator/file_name_resolver.rb
56
+ - lib/annotate_rb/model_annotator/file_parser.rb
57
+ - lib/annotate_rb/model_annotator/file_parser/annotation_finder.rb
58
+ - lib/annotate_rb/model_annotator/file_parser/custom_parser.rb
59
+ - lib/annotate_rb/model_annotator/file_parser/parsed_file.rb
60
+ - lib/annotate_rb/model_annotator/file_parser/parsed_file_result.rb
55
61
  - lib/annotate_rb/model_annotator/foreign_key_annotation.rb
56
62
  - lib/annotate_rb/model_annotator/foreign_key_annotation/annotation_builder.rb
57
63
  - lib/annotate_rb/model_annotator/index_annotation.rb
58
64
  - lib/annotate_rb/model_annotator/index_annotation/annotation_builder.rb
59
- - lib/annotate_rb/model_annotator/magic_comment_parser.rb
60
65
  - lib/annotate_rb/model_annotator/model_class_getter.rb
61
66
  - lib/annotate_rb/model_annotator/model_files_getter.rb
62
67
  - lib/annotate_rb/model_annotator/model_wrapper.rb
@@ -68,6 +73,7 @@ files:
68
73
  - lib/annotate_rb/model_annotator/single_file_annotator.rb
69
74
  - lib/annotate_rb/model_annotator/single_file_annotator_instruction.rb
70
75
  - lib/annotate_rb/model_annotator/single_file_remove_annotation_instruction.rb
76
+ - lib/annotate_rb/model_annotator/zeitwerk_class_getter.rb
71
77
  - lib/annotate_rb/options.rb
72
78
  - lib/annotate_rb/parser.rb
73
79
  - lib/annotate_rb/rake_bootstrapper.rb
@@ -80,9 +86,15 @@ files:
80
86
  - lib/annotate_rb/route_annotator/removal_processor.rb
81
87
  - lib/annotate_rb/runner.rb
82
88
  - lib/annotate_rb/tasks/annotate_models_migrate.rake
89
+ - lib/generators/annotate_rb/config/USAGE
90
+ - lib/generators/annotate_rb/config/config_generator.rb
91
+ - lib/generators/annotate_rb/hook/USAGE
92
+ - lib/generators/annotate_rb/hook/hook_generator.rb
93
+ - lib/generators/annotate_rb/hook/templates/annotate_rb.rake
83
94
  - lib/generators/annotate_rb/install/USAGE
84
95
  - lib/generators/annotate_rb/install/install_generator.rb
85
- - lib/generators/annotate_rb/install/templates/annotate_rb.rake
96
+ - lib/generators/annotate_rb/update_config/USAGE
97
+ - lib/generators/annotate_rb/update_config/update_config_generator.rb
86
98
  homepage: https://github.com/drwl/annotaterb
87
99
  licenses:
88
100
  - BSD-2-Clause
@@ -106,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
118
  - !ruby/object:Gem::Version
107
119
  version: '0'
108
120
  requirements: []
109
- rubygems_version: 3.2.33
121
+ rubygems_version: 3.5.6
110
122
  signing_key:
111
123
  specification_version: 4
112
124
  summary: A gem for generating annotations for Rails projects.
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AnnotateRb
4
- module ModelAnnotator
5
- class AnnotationPatternGenerator
6
- COMPAT_PREFIX = "== Schema Info"
7
- COMPAT_PREFIX_MD = "## Schema Info"
8
-
9
- class << self
10
- def call(options = Options.from({}))
11
- if options[:wrapper_open]
12
- return /(?:^(\n|\r\n)?# (?:#{options[:wrapper_open]}).*(\n|\r\n)?# (?:#{COMPAT_PREFIX}|#{COMPAT_PREFIX_MD}).*?(\n|\r\n)(#.*(\n|\r\n))*(\n|\r\n)*)|^(\n|\r\n)?# (?:#{COMPAT_PREFIX}|#{COMPAT_PREFIX_MD}).*?(\n|\r\n)(#.*(\n|\r\n))*(\n|\r\n)*/
13
- end
14
- /^(\n|\r\n)?# (?:#{COMPAT_PREFIX}|#{COMPAT_PREFIX_MD}).*?(\n|\r\n)(#.*(\n|\r\n))*(\n|\r\n)*/o
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AnnotateRb
4
- module ModelAnnotator
5
- # Generates the text file content with annotations, these are then to be written to filesystem.
6
- class FileBuilder
7
- def initialize(file_components, annotation_position, options)
8
- @file_components = file_components
9
- @annotation_position = annotation_position
10
- @options = options
11
-
12
- @new_wrapped_annotations = wrapped_content(@file_components.new_annotations)
13
- end
14
-
15
- def generate_content_with_new_annotations
16
- # Need to keep `.to_s` for now since the it can be either a String or Symbol
17
- annotation_write_position = @options[@annotation_position].to_s
18
-
19
- _content = if %w[after bottom].include?(annotation_write_position)
20
- @file_components.magic_comments + (@file_components.pure_file_content.rstrip + "\n\n" + @new_wrapped_annotations)
21
- elsif @file_components.magic_comments.empty?
22
- @file_components.magic_comments + @new_wrapped_annotations + @file_components.pure_file_content.lstrip
23
- else
24
- @file_components.magic_comments + "\n" + @new_wrapped_annotations + @file_components.pure_file_content.lstrip
25
- end
26
- end
27
-
28
- def update_existing_annotations
29
- return "" if !@file_components.has_annotations?
30
-
31
- annotation_pattern = AnnotationPatternGenerator.call(@options)
32
-
33
- new_annotation = @file_components.space_before_annotation + @new_wrapped_annotations + @file_components.space_after_annotation
34
-
35
- _content = @file_components.current_file_content.sub(annotation_pattern, new_annotation)
36
- end
37
-
38
- private
39
-
40
- def wrapped_content(content)
41
- wrapper_open = if @options[:wrapper_open]
42
- "# #{@options[:wrapper_open]}\n"
43
- else
44
- ""
45
- end
46
-
47
- wrapper_close = if @options[:wrapper_close]
48
- "# #{@options[:wrapper_close]}\n"
49
- else
50
- ""
51
- end
52
-
53
- _wrapped_info_block = "#{wrapper_open}#{content}#{wrapper_close}"
54
- end
55
- end
56
- end
57
- end
@@ -1,81 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AnnotateRb
4
- module ModelAnnotator
5
- class FileComponents
6
- SKIP_ANNOTATION_STRING = "# -*- SkipSchemaAnnotations"
7
- SOME_PATTERN = /\A(?<start>\s*).*?\n(?<end>\s*)\z/m # Unsure what this pattern is
8
-
9
- attr_reader :new_annotations
10
-
11
- def initialize(file_content, new_annotations, options)
12
- @file_content = file_content
13
- @diff = AnnotationDiffGenerator.new(file_content, new_annotations).generate
14
- @options = options
15
- @annotation_pattern = AnnotationPatternGenerator.call(options)
16
- @new_annotations = new_annotations
17
- end
18
-
19
- def current_file_content
20
- @file_content
21
- end
22
-
23
- # TODO: Rename method once it's clear what this actually does
24
- def space_before_annotation
25
- return @space_before_annotation if defined?(@space_before_annotation)
26
-
27
- match = current_annotations.match(SOME_PATTERN)
28
- @space_before_annotation = if match
29
- match[:start]
30
- end
31
- end
32
-
33
- # TODO: Rename method once it's clear what this actually does
34
- def space_after_annotation
35
- return @space_after_annotation if defined?(@space_after_annotation)
36
-
37
- match = current_annotations.match(SOME_PATTERN)
38
- @space_after_annotation = if match
39
- match[:end]
40
- end
41
- end
42
-
43
- def pure_file_content
44
- @pure_file_content ||=
45
- begin
46
- content_without_magic_comments = @file_content.gsub(MagicCommentParser::MAGIC_COMMENTS_REGEX, "")
47
- content_without_annotations = content_without_magic_comments.sub(@annotation_pattern, "")
48
-
49
- content_without_annotations
50
- end
51
- end
52
-
53
- def magic_comments
54
- @magic_comments ||= MagicCommentParser.call(@file_content)
55
- end
56
-
57
- def has_skip_string?
58
- @has_skip_string ||= @file_content.include?(SKIP_ANNOTATION_STRING)
59
- end
60
-
61
- def has_annotations?
62
- @has_annotations ||= @diff.current_columns.present?
63
- end
64
-
65
- def annotations_changed?
66
- @has_annotations_changed ||= @diff.changed?
67
- end
68
-
69
- def current_annotations
70
- @current_annotations ||=
71
- if has_annotations?
72
- # `#has_annotations?` uses a different regex pattern than the one in `@annotation_pattern`,
73
- # this could lead to unexpected behavior
74
- @file_content.match(@annotation_pattern).to_s
75
- else
76
- ""
77
- end
78
- end
79
- end
80
- end
81
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AnnotateRb
4
- module ModelAnnotator
5
- # Extracts magic comments strings and returns them
6
- class MagicCommentParser
7
- MAGIC_COMMENTS = [
8
- HASH_ENCODING = /(^#\s*encoding:.*(?:\n|r\n))/,
9
- HASH_CODING = /(^# coding:.*(?:\n|\r\n))/,
10
- HASH_FROZEN_STRING = /(^#\s*frozen_string_literal:.+(?:\n|\r\n))/,
11
- STAR_ENCODING = /(^# -\*- encoding\s?:.*(?:\n|\r\n))/,
12
- STAR_CODING = /(^# -\*- coding:.*(?:\n|\r\n))/,
13
- STAR_FROZEN_STRING = /(^# -\*- frozen_string_literal\s*:.+-\*-(?:\n|\r\n))/,
14
- SORBET_TYPED_STRING = /(^#\s*typed:.*(?:\n|r\n))/.freeze
15
- ].freeze
16
-
17
- MAGIC_COMMENTS_REGEX = Regexp.union(*MAGIC_COMMENTS).freeze
18
-
19
- class << self
20
- def call(content)
21
- magic_comments = content.scan(MAGIC_COMMENTS_REGEX).flatten.compact
22
-
23
- if magic_comments.any?
24
- magic_comments.join
25
- else
26
- ""
27
- end
28
- end
29
- end
30
- end
31
- end
32
- end