annotaterb 4.4.1 → 4.6.0

Sign up to get free protection for your applications and to get access to all the features.
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