annotaterb 4.4.1 → 4.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/README.md +29 -0
- data/VERSION +1 -1
- data/lib/annotate_rb/config_generator.rb +28 -0
- data/lib/annotate_rb/model_annotator/annotated_file/generator.rb +49 -0
- data/lib/annotate_rb/model_annotator/annotated_file/updater.rb +46 -0
- data/lib/annotate_rb/model_annotator/annotated_file.rb +10 -0
- data/lib/annotate_rb/model_annotator/annotation_pattern_generator.rb +1 -1
- data/lib/annotate_rb/model_annotator/annotator.rb +2 -2
- data/lib/annotate_rb/model_annotator/file_components.rb +2 -2
- data/lib/annotate_rb/model_annotator/file_parser/magic_comment_parser.rb +34 -0
- data/lib/annotate_rb/model_annotator/file_parser.rb +9 -0
- data/lib/annotate_rb/model_annotator/model_files_getter.rb +4 -8
- data/lib/annotate_rb/model_annotator/model_wrapper.rb +1 -1
- data/lib/annotate_rb/model_annotator/pattern_getter.rb +2 -0
- data/lib/annotate_rb/model_annotator/single_file_annotator.rb +3 -4
- data/lib/annotate_rb/model_annotator/single_file_annotator_instruction.rb +1 -1
- data/lib/annotate_rb/model_annotator/single_file_remove_annotation_instruction.rb +1 -1
- data/lib/annotate_rb/model_annotator.rb +2 -2
- data/lib/annotate_rb/options.rb +4 -0
- data/lib/annotate_rb/parser.rb +9 -3
- data/lib/annotate_rb/runner.rb +5 -4
- data/lib/annotate_rb.rb +1 -0
- data/lib/generators/annotate_rb/config/USAGE +6 -0
- data/lib/generators/annotate_rb/config/config_generator.rb +15 -0
- data/lib/generators/annotate_rb/hook/USAGE +7 -0
- data/lib/generators/annotate_rb/hook/hook_generator.rb +15 -0
- data/lib/generators/annotate_rb/install/install_generator.rb +3 -4
- data/lib/generators/annotate_rb/update_config/USAGE +6 -0
- data/lib/generators/annotate_rb/update_config/update_config_generator.rb +15 -0
- metadata +15 -5
- data/lib/annotate_rb/model_annotator/file_builder.rb +0 -57
- data/lib/annotate_rb/model_annotator/magic_comment_parser.rb +0 -32
- /data/lib/generators/annotate_rb/{install → hook}/templates/annotate_rb.rake +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab5413ba1fb4c02274c37e7629b0553deed339067624ef96e1ad9a59ecf726d1
|
4
|
+
data.tar.gz: 6439540d1c152651735313e80839acddc79d202d8b0171edb6c424e932dde37a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40353034b577b5a44a1204edbb02e25d01b4d99efcb8de1a50fd8698981767c4f5444079b851441db60d16c175237e63f80453370f38007613aae1da5b613f71
|
7
|
+
data.tar.gz: 5edb0a811149b9187fd0b2066cf1843a84fde281239e2628ba643fa1ce4c906e914b387d4f461e62c84d5323e21a51223f3d5e838f5f4da300743180d6dabb8e
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,20 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [v4.4.1](https://github.com/drwl/annotaterb/tree/v4.4.1) (2023-09-11)
|
4
|
+
|
5
|
+
[Full Changelog](https://github.com/drwl/annotaterb/compare/v4.4.0...v4.4.1)
|
6
|
+
|
7
|
+
**Merged pull requests:**
|
8
|
+
|
9
|
+
- Bump version to v4.4.1 [\#62](https://github.com/drwl/annotaterb/pull/62) ([drwl](https://github.com/drwl))
|
10
|
+
- Fix annotation for columns with `Date` and `DateTime` default values [\#61](https://github.com/drwl/annotaterb/pull/61) ([drwl](https://github.com/drwl))
|
11
|
+
- Add integration tests [\#60](https://github.com/drwl/annotaterb/pull/60) ([drwl](https://github.com/drwl))
|
12
|
+
- Fix the default array value from being escaped [\#58](https://github.com/drwl/annotaterb/pull/58) ([drwl](https://github.com/drwl))
|
13
|
+
- Update dummyapp Rails version [\#56](https://github.com/drwl/annotaterb/pull/56) ([drwl](https://github.com/drwl))
|
14
|
+
- Bump puma from 5.6.5 to 6.3.1 in /dummyapp [\#55](https://github.com/drwl/annotaterb/pull/55) ([dependabot[bot]](https://github.com/apps/dependabot))
|
15
|
+
- Generate changelog for v4.4.0 [\#53](https://github.com/drwl/annotaterb/pull/53) ([drwl](https://github.com/drwl))
|
16
|
+
- Add CLI specs using `aruba` gem [\#43](https://github.com/drwl/annotaterb/pull/43) ([drwl](https://github.com/drwl))
|
17
|
+
|
3
18
|
## [v4.4.0](https://github.com/drwl/annotaterb/tree/v4.4.0) (2023-06-24)
|
4
19
|
|
5
20
|
[Full Changelog](https://github.com/drwl/annotaterb/compare/v4.3.1...v4.4.0)
|
data/README.md
CHANGED
@@ -65,6 +65,35 @@ To skip the automatic annotation that happens after a db task, pass the environm
|
|
65
65
|
$ ANNOTATERB_SKIP_ON_DB_TASKS=1 bin/rails db:migrate
|
66
66
|
```
|
67
67
|
|
68
|
+
### Added Rails generators
|
69
|
+
The following Rails generator commands get added.
|
70
|
+
|
71
|
+
```sh
|
72
|
+
$ bin/rails generator --help
|
73
|
+
|
74
|
+
...
|
75
|
+
|
76
|
+
AnnotateRb:
|
77
|
+
annotate_rb:config
|
78
|
+
annotate_rb:hook
|
79
|
+
annotate_rb:install
|
80
|
+
annotate_rb:update_config
|
81
|
+
...
|
82
|
+
|
83
|
+
```
|
84
|
+
|
85
|
+
`bin/rails g annotate_rb:config`
|
86
|
+
- Generates a new configuration file, `.annotaterb.yml`, using defaults from the gem.
|
87
|
+
|
88
|
+
`bin/rails g annotate_rb:hook`
|
89
|
+
- Installs the Rake file to automatically annotate Rails models on a database task (e.g. AnnotateRb will automatically run after running `bin/rails db:migrate`).
|
90
|
+
|
91
|
+
`bin/rails g annotate_rb:install`
|
92
|
+
- Runs the `config` and `hook` generator commands
|
93
|
+
|
94
|
+
`bin/rails g annotate_rb:update_config`
|
95
|
+
- Appends to `.annotaterb.yml` any configuration key-value pairs that are used by the Gem. This is useful when there's a drift between the config file values and the gem defaults (i.e. when new features get added).
|
96
|
+
|
68
97
|
## Migrating from the annotate gem
|
69
98
|
Refer to the [migration guide](MIGRATION_GUIDE.md).
|
70
99
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
4.
|
1
|
+
4.5.0
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AnnotateRb
|
4
|
+
class ConfigGenerator
|
5
|
+
class << self
|
6
|
+
# Returns unset configuration key-value pairs as yaml.
|
7
|
+
# Useful when a config file was generated an older version of gem and new
|
8
|
+
# settings get added.
|
9
|
+
def unset_config_defaults
|
10
|
+
user_defaults = ConfigLoader.load_config
|
11
|
+
defaults = Options.from({}, {}).to_h
|
12
|
+
|
13
|
+
differences = defaults.keys - user_defaults.keys
|
14
|
+
result = defaults.slice(*differences)
|
15
|
+
|
16
|
+
# Generates proper YAML including the leading hyphens `---` header
|
17
|
+
yml_content = YAML.dump(result, StringIO.new).string
|
18
|
+
# Remove the header
|
19
|
+
yml_content.sub("---", "")
|
20
|
+
end
|
21
|
+
|
22
|
+
def default_config_yml
|
23
|
+
defaults_hash = Options.from({}, {}).to_h
|
24
|
+
_yml_content = YAML.dump(defaults_hash, StringIO.new).string
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AnnotateRb
|
4
|
+
module ModelAnnotator
|
5
|
+
module AnnotatedFile
|
6
|
+
# Generates the file with fresh annotations
|
7
|
+
class Generator
|
8
|
+
def initialize(file_components, annotation_position, options)
|
9
|
+
@file_components = file_components
|
10
|
+
@annotation_position = annotation_position
|
11
|
+
@options = options
|
12
|
+
|
13
|
+
@new_wrapped_annotations = wrapped_content(@file_components.new_annotations)
|
14
|
+
end
|
15
|
+
|
16
|
+
def generate
|
17
|
+
# Need to keep `.to_s` for now since the it can be either a String or Symbol
|
18
|
+
annotation_write_position = @options[@annotation_position].to_s
|
19
|
+
|
20
|
+
_content = if %w[after bottom].include?(annotation_write_position)
|
21
|
+
@file_components.magic_comments + (@file_components.pure_file_content.rstrip + "\n\n" + @new_wrapped_annotations)
|
22
|
+
elsif @file_components.magic_comments.empty?
|
23
|
+
@file_components.magic_comments + @new_wrapped_annotations + @file_components.pure_file_content.lstrip
|
24
|
+
else
|
25
|
+
@file_components.magic_comments + "\n" + @new_wrapped_annotations + @file_components.pure_file_content.lstrip
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def wrapped_content(content)
|
32
|
+
wrapper_open = if @options[:wrapper_open]
|
33
|
+
"# #{@options[:wrapper_open]}\n"
|
34
|
+
else
|
35
|
+
""
|
36
|
+
end
|
37
|
+
|
38
|
+
wrapper_close = if @options[:wrapper_close]
|
39
|
+
"# #{@options[:wrapper_close]}\n"
|
40
|
+
else
|
41
|
+
""
|
42
|
+
end
|
43
|
+
|
44
|
+
_wrapped_info_block = "#{wrapper_open}#{content}#{wrapper_close}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AnnotateRb
|
4
|
+
module ModelAnnotator
|
5
|
+
module AnnotatedFile
|
6
|
+
# Updates existing annotations
|
7
|
+
class Updater
|
8
|
+
def initialize(file_components, annotation_position, options)
|
9
|
+
@file_components = file_components
|
10
|
+
@annotation_position = annotation_position
|
11
|
+
@options = options
|
12
|
+
|
13
|
+
@new_wrapped_annotations = wrapped_content(@file_components.new_annotations)
|
14
|
+
end
|
15
|
+
|
16
|
+
def update
|
17
|
+
return "" if !@file_components.has_annotations?
|
18
|
+
|
19
|
+
annotation_pattern = AnnotationPatternGenerator.call(@options)
|
20
|
+
|
21
|
+
new_annotation = @file_components.space_before_annotation + @new_wrapped_annotations + @file_components.space_after_annotation
|
22
|
+
|
23
|
+
_content = @file_components.current_file_content.sub(annotation_pattern, new_annotation)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def wrapped_content(content)
|
29
|
+
wrapper_open = if @options[:wrapper_open]
|
30
|
+
"# #{@options[:wrapper_open]}\n"
|
31
|
+
else
|
32
|
+
""
|
33
|
+
end
|
34
|
+
|
35
|
+
wrapper_close = if @options[:wrapper_close]
|
36
|
+
"# #{@options[:wrapper_close]}\n"
|
37
|
+
else
|
38
|
+
""
|
39
|
+
end
|
40
|
+
|
41
|
+
_wrapped_info_block = "#{wrapper_open}#{content}#{wrapper_close}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AnnotateRb
|
4
|
+
module ModelAnnotator
|
5
|
+
module AnnotatedFile
|
6
|
+
autoload :Generator, "annotate_rb/model_annotator/annotated_file/generator"
|
7
|
+
autoload :Updater, "annotate_rb/model_annotator/annotated_file/updater"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -7,7 +7,7 @@ module AnnotateRb
|
|
7
7
|
COMPAT_PREFIX_MD = "## Schema Info"
|
8
8
|
|
9
9
|
class << self
|
10
|
-
def call(options
|
10
|
+
def call(options)
|
11
11
|
if options[:wrapper_open]
|
12
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
13
|
end
|
@@ -4,11 +4,11 @@ module AnnotateRb
|
|
4
4
|
module ModelAnnotator
|
5
5
|
class Annotator
|
6
6
|
class << self
|
7
|
-
def do_annotations(options
|
7
|
+
def do_annotations(options)
|
8
8
|
new(options).do_annotations
|
9
9
|
end
|
10
10
|
|
11
|
-
def remove_annotations(options
|
11
|
+
def remove_annotations(options)
|
12
12
|
new(options).remove_annotations
|
13
13
|
end
|
14
14
|
end
|
@@ -43,7 +43,7 @@ module AnnotateRb
|
|
43
43
|
def pure_file_content
|
44
44
|
@pure_file_content ||=
|
45
45
|
begin
|
46
|
-
content_without_magic_comments = @file_content.gsub(MagicCommentParser::MAGIC_COMMENTS_REGEX, "")
|
46
|
+
content_without_magic_comments = @file_content.gsub(FileParser::MagicCommentParser::MAGIC_COMMENTS_REGEX, "")
|
47
47
|
content_without_annotations = content_without_magic_comments.sub(@annotation_pattern, "")
|
48
48
|
|
49
49
|
content_without_annotations
|
@@ -51,7 +51,7 @@ module AnnotateRb
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def magic_comments
|
54
|
-
@magic_comments ||= MagicCommentParser.call(@file_content)
|
54
|
+
@magic_comments ||= FileParser::MagicCommentParser.call(@file_content)
|
55
55
|
end
|
56
56
|
|
57
57
|
def has_skip_string?
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AnnotateRb
|
4
|
+
module ModelAnnotator
|
5
|
+
module FileParser
|
6
|
+
# Extracts magic comments strings and returns them
|
7
|
+
class MagicCommentParser
|
8
|
+
MAGIC_COMMENTS = [
|
9
|
+
HASH_ENCODING = /(^#\s*encoding:.*(?:\n|r\n))/,
|
10
|
+
HASH_CODING = /(^# coding:.*(?:\n|\r\n))/,
|
11
|
+
HASH_FROZEN_STRING = /(^#\s*frozen_string_literal:.+(?:\n|\r\n))/,
|
12
|
+
STAR_ENCODING = /(^# -\*- encoding\s?:.*(?:\n|\r\n))/,
|
13
|
+
STAR_CODING = /(^# -\*- coding:.*(?:\n|\r\n))/,
|
14
|
+
STAR_FROZEN_STRING = /(^# -\*- frozen_string_literal\s*:.+-\*-(?:\n|\r\n))/,
|
15
|
+
SORBET_TYPED_STRING = /(^#\s*typed:.*(?:\n|r\n))/.freeze
|
16
|
+
].freeze
|
17
|
+
|
18
|
+
MAGIC_COMMENTS_REGEX = Regexp.union(*MAGIC_COMMENTS).freeze
|
19
|
+
|
20
|
+
class << self
|
21
|
+
def call(content)
|
22
|
+
magic_comments = content.scan(MAGIC_COMMENTS_REGEX).flatten.compact
|
23
|
+
|
24
|
+
if magic_comments.any?
|
25
|
+
magic_comments.join
|
26
|
+
else
|
27
|
+
""
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -9,13 +9,9 @@ module AnnotateRb
|
|
9
9
|
# of model files from root dir. Otherwise we take all the model files
|
10
10
|
# in the model_dir directory.
|
11
11
|
def call(options)
|
12
|
-
model_files =
|
12
|
+
model_files = list_model_files_from_argument(options)
|
13
13
|
|
14
|
-
|
15
|
-
# It's an artifact from the old Annotate gem and how it did control flow.
|
16
|
-
model_files = list_model_files_from_argument(options) if !options[:is_rake]
|
17
|
-
|
18
|
-
return model_files if !model_files.empty?
|
14
|
+
return model_files if model_files.any?
|
19
15
|
|
20
16
|
options[:model_dir].each do |dir|
|
21
17
|
Dir.chdir(dir) do
|
@@ -41,9 +37,9 @@ module AnnotateRb
|
|
41
37
|
private
|
42
38
|
|
43
39
|
def list_model_files_from_argument(options)
|
44
|
-
return [] if
|
40
|
+
return [] if options.get_state(:working_args).empty?
|
45
41
|
|
46
|
-
specified_files =
|
42
|
+
specified_files = options.get_state(:working_args).map { |file| File.expand_path(file) }
|
47
43
|
|
48
44
|
model_files = options[:model_dir].flat_map do |dir|
|
49
45
|
absolute_dir_path = File.expand_path(dir)
|
@@ -6,7 +6,7 @@ module AnnotateRb
|
|
6
6
|
# Should be the wrapper for an ActiveRecord model that serves as the source of truth of the model
|
7
7
|
# of the model that we're annotating
|
8
8
|
|
9
|
-
def initialize(klass, options
|
9
|
+
def initialize(klass, options)
|
10
10
|
@klass = klass
|
11
11
|
@options = options
|
12
12
|
end
|
@@ -142,6 +142,8 @@ module AnnotateRb
|
|
142
142
|
File.join(root_directory, FilePatterns::FACTORY_BOT_SPEC_DIR, "%TABLE_NAME%.rb"), # (new style)
|
143
143
|
File.join(root_directory, FilePatterns::FACTORY_BOT_TEST_DIR, "%PLURALIZED_MODEL_NAME%.rb"), # (new style)
|
144
144
|
File.join(root_directory, FilePatterns::FACTORY_BOT_SPEC_DIR, "%PLURALIZED_MODEL_NAME%.rb"), # (new style)
|
145
|
+
File.join(root_directory, FilePatterns::FACTORY_BOT_TEST_DIR, "%PLURALIZED_MODEL_NAME%_factory.rb"), # (new style)
|
146
|
+
File.join(root_directory, FilePatterns::FACTORY_BOT_SPEC_DIR, "%PLURALIZED_MODEL_NAME%_factory.rb"), # (new style)
|
145
147
|
File.join(root_directory, FilePatterns::FABRICATORS_TEST_DIR, "%MODEL_NAME%_fabricator.rb"),
|
146
148
|
File.join(root_directory, FilePatterns::FABRICATORS_SPEC_DIR, "%MODEL_NAME%_fabricator.rb")
|
147
149
|
]
|
@@ -21,12 +21,11 @@ module AnnotateRb
|
|
21
21
|
# :position_in_*<Symbol>:: where to place the annotated section in fixture or model file,
|
22
22
|
# :before, :top, :after or :bottom. Default is :before.
|
23
23
|
#
|
24
|
-
def call(file_name, annotation, annotation_position, options
|
24
|
+
def call(file_name, annotation, annotation_position, options)
|
25
25
|
return false unless File.exist?(file_name)
|
26
26
|
old_content = File.read(file_name)
|
27
27
|
|
28
28
|
file_components = FileComponents.new(old_content, annotation, options)
|
29
|
-
builder = FileBuilder.new(file_components, annotation_position, options)
|
30
29
|
|
31
30
|
return false if file_components.has_skip_string?
|
32
31
|
return false if !file_components.annotations_changed? && !options[:force]
|
@@ -34,9 +33,9 @@ module AnnotateRb
|
|
34
33
|
abort "AnnotateRb error. #{file_name} needs to be updated, but annotaterb was run with `--frozen`." if options[:frozen]
|
35
34
|
|
36
35
|
updated_file_content = if !file_components.has_annotations? || options[:force]
|
37
|
-
|
36
|
+
AnnotatedFile::Generator.new(file_components, annotation_position, options).generate
|
38
37
|
else
|
39
|
-
|
38
|
+
AnnotatedFile::Updater.new(file_components, annotation_position, options).update
|
40
39
|
end
|
41
40
|
|
42
41
|
File.open(file_name, "wb") { |f| f.puts updated_file_content }
|
@@ -4,7 +4,7 @@ module AnnotateRb
|
|
4
4
|
module ModelAnnotator
|
5
5
|
# A plain old Ruby object (PORO) that contains all necessary information for SingleFileAnnotator
|
6
6
|
class SingleFileAnnotatorInstruction
|
7
|
-
def initialize(file, annotation, position, options
|
7
|
+
def initialize(file, annotation, position, options)
|
8
8
|
@file = file # Path to file
|
9
9
|
@annotation = annotation # Annotation string
|
10
10
|
@position = position # Position in the file where to write the annotation to
|
@@ -4,7 +4,7 @@ module AnnotateRb
|
|
4
4
|
module ModelAnnotator
|
5
5
|
# A plain old Ruby object (PORO) that contains all necessary information for SingleFileAnnotationRemover
|
6
6
|
class SingleFileRemoveAnnotationInstruction
|
7
|
-
def initialize(file, options
|
7
|
+
def initialize(file, options)
|
8
8
|
@file = file # Path to file
|
9
9
|
@options = options
|
10
10
|
end
|
@@ -22,10 +22,10 @@ module AnnotateRb
|
|
22
22
|
autoload :SingleFileRemoveAnnotationInstruction, "annotate_rb/model_annotator/single_file_remove_annotation_instruction"
|
23
23
|
autoload :AnnotationDiffGenerator, "annotate_rb/model_annotator/annotation_diff_generator"
|
24
24
|
autoload :AnnotationDiff, "annotate_rb/model_annotator/annotation_diff"
|
25
|
-
autoload :FileBuilder, "annotate_rb/model_annotator/file_builder"
|
26
|
-
autoload :MagicCommentParser, "annotate_rb/model_annotator/magic_comment_parser"
|
27
25
|
autoload :FileComponents, "annotate_rb/model_annotator/file_components"
|
28
26
|
autoload :ProjectAnnotator, "annotate_rb/model_annotator/project_annotator"
|
29
27
|
autoload :ProjectAnnotationRemover, "annotate_rb/model_annotator/project_annotation_remover"
|
28
|
+
autoload :AnnotatedFile, "annotate_rb/model_annotator/annotated_file"
|
29
|
+
autoload :FileParser, "annotate_rb/model_annotator/file_parser"
|
30
30
|
end
|
31
31
|
end
|
data/lib/annotate_rb/options.rb
CHANGED
data/lib/annotate_rb/parser.rb
CHANGED
@@ -3,7 +3,7 @@ require "optparse"
|
|
3
3
|
module AnnotateRb
|
4
4
|
# Class for handling command line arguments
|
5
5
|
class Parser # rubocop:disable Metrics/ClassLength
|
6
|
-
def self.parse(args, existing_options
|
6
|
+
def self.parse(args, existing_options)
|
7
7
|
new(args, existing_options).parse
|
8
8
|
end
|
9
9
|
|
@@ -35,11 +35,11 @@ module AnnotateRb
|
|
35
35
|
}.freeze
|
36
36
|
|
37
37
|
def initialize(args, existing_options)
|
38
|
-
@args = args
|
38
|
+
@args = args.clone
|
39
39
|
base_options = DEFAULT_OPTIONS.dup
|
40
40
|
@options = base_options.merge(existing_options)
|
41
41
|
@commands = []
|
42
|
-
@options[:original_args] = args.
|
42
|
+
@options[:original_args] = args.clone
|
43
43
|
end
|
44
44
|
|
45
45
|
def parse
|
@@ -52,6 +52,12 @@ module AnnotateRb
|
|
52
52
|
@options
|
53
53
|
end
|
54
54
|
|
55
|
+
def remaining_args
|
56
|
+
# `@args` gets modified throughout the lifecycle of this class.
|
57
|
+
# It starts as a shallow clone of ARGV, then arguments matching commands and options are removed in #parse
|
58
|
+
@args
|
59
|
+
end
|
60
|
+
|
55
61
|
private
|
56
62
|
|
57
63
|
def parse_command(args)
|
data/lib/annotate_rb/runner.rb
CHANGED
@@ -9,14 +9,15 @@ module AnnotateRb
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def run(args)
|
12
|
-
_original_args = args.dup
|
13
|
-
|
14
12
|
config_file_options = ConfigLoader.load_config
|
15
|
-
|
13
|
+
parser = Parser.new(args, {})
|
14
|
+
|
15
|
+
parsed_options = parser.parse
|
16
|
+
remaining_args = parser.remaining_args
|
16
17
|
|
17
18
|
options = config_file_options.merge(parsed_options)
|
18
19
|
|
19
|
-
@options = Options.from(options, {})
|
20
|
+
@options = Options.from(options, {working_args: remaining_args})
|
20
21
|
AnnotateRb::RakeBootstrapper.call(@options)
|
21
22
|
|
22
23
|
if @options[:command]
|
data/lib/annotate_rb.rb
CHANGED
@@ -22,6 +22,7 @@ require_relative "annotate_rb/eager_loader"
|
|
22
22
|
require_relative "annotate_rb/rake_bootstrapper"
|
23
23
|
require_relative "annotate_rb/config_finder"
|
24
24
|
require_relative "annotate_rb/config_loader"
|
25
|
+
require_relative "annotate_rb/config_generator"
|
25
26
|
|
26
27
|
module AnnotateRb
|
27
28
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "annotate_rb"
|
4
|
+
|
5
|
+
module AnnotateRb
|
6
|
+
module Generators
|
7
|
+
class ConfigGenerator < ::Rails::Generators::Base
|
8
|
+
def generate_config
|
9
|
+
create_file ::AnnotateRb::ConfigFinder::DOTFILE do
|
10
|
+
::AnnotateRb::ConfigGenerator.default_config_yml
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "annotate_rb"
|
4
|
+
|
5
|
+
module AnnotateRb
|
6
|
+
module Generators
|
7
|
+
class HookGenerator < ::Rails::Generators::Base
|
8
|
+
source_root File.expand_path("templates", __dir__)
|
9
|
+
|
10
|
+
def copy_hook_file
|
11
|
+
copy_file "annotate_rb.rake", "lib/tasks/annotate_rb.rake"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -5,10 +5,9 @@ require "annotate_rb"
|
|
5
5
|
module AnnotateRb
|
6
6
|
module Generators
|
7
7
|
class InstallGenerator < ::Rails::Generators::Base
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
copy_file "annotate_rb.rake", "lib/tasks/annotate_rb.rake"
|
8
|
+
def install_hook_and_generate_defaults
|
9
|
+
generate "annotate_rb:hook"
|
10
|
+
generate "annotate_rb:config"
|
12
11
|
end
|
13
12
|
end
|
14
13
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "annotate_rb"
|
4
|
+
|
5
|
+
module AnnotateRb
|
6
|
+
module Generators
|
7
|
+
class UpdateConfigGenerator < ::Rails::Generators::Base
|
8
|
+
def generate_config
|
9
|
+
insert_into_file ::AnnotateRb::ConfigFinder::DOTFILE do
|
10
|
+
::AnnotateRb::ConfigGenerator.unset_config_defaults
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
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.
|
4
|
+
version: 4.5.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:
|
11
|
+
date: 2024-02-08 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,11 +31,15 @@ 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
|
@@ -49,14 +53,14 @@ files:
|
|
49
53
|
- lib/annotate_rb/model_annotator/column_annotation/column_wrapper.rb
|
50
54
|
- lib/annotate_rb/model_annotator/column_annotation/default_value_builder.rb
|
51
55
|
- lib/annotate_rb/model_annotator/column_annotation/type_builder.rb
|
52
|
-
- lib/annotate_rb/model_annotator/file_builder.rb
|
53
56
|
- lib/annotate_rb/model_annotator/file_components.rb
|
54
57
|
- lib/annotate_rb/model_annotator/file_name_resolver.rb
|
58
|
+
- lib/annotate_rb/model_annotator/file_parser.rb
|
59
|
+
- lib/annotate_rb/model_annotator/file_parser/magic_comment_parser.rb
|
55
60
|
- lib/annotate_rb/model_annotator/foreign_key_annotation.rb
|
56
61
|
- lib/annotate_rb/model_annotator/foreign_key_annotation/annotation_builder.rb
|
57
62
|
- lib/annotate_rb/model_annotator/index_annotation.rb
|
58
63
|
- lib/annotate_rb/model_annotator/index_annotation/annotation_builder.rb
|
59
|
-
- lib/annotate_rb/model_annotator/magic_comment_parser.rb
|
60
64
|
- lib/annotate_rb/model_annotator/model_class_getter.rb
|
61
65
|
- lib/annotate_rb/model_annotator/model_files_getter.rb
|
62
66
|
- lib/annotate_rb/model_annotator/model_wrapper.rb
|
@@ -80,9 +84,15 @@ files:
|
|
80
84
|
- lib/annotate_rb/route_annotator/removal_processor.rb
|
81
85
|
- lib/annotate_rb/runner.rb
|
82
86
|
- lib/annotate_rb/tasks/annotate_models_migrate.rake
|
87
|
+
- lib/generators/annotate_rb/config/USAGE
|
88
|
+
- lib/generators/annotate_rb/config/config_generator.rb
|
89
|
+
- lib/generators/annotate_rb/hook/USAGE
|
90
|
+
- lib/generators/annotate_rb/hook/hook_generator.rb
|
91
|
+
- lib/generators/annotate_rb/hook/templates/annotate_rb.rake
|
83
92
|
- lib/generators/annotate_rb/install/USAGE
|
84
93
|
- lib/generators/annotate_rb/install/install_generator.rb
|
85
|
-
- lib/generators/annotate_rb/
|
94
|
+
- lib/generators/annotate_rb/update_config/USAGE
|
95
|
+
- lib/generators/annotate_rb/update_config/update_config_generator.rb
|
86
96
|
homepage: https://github.com/drwl/annotaterb
|
87
97
|
licenses:
|
88
98
|
- BSD-2-Clause
|
@@ -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,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
|
File without changes
|