annotate_models 0.0.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.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/README.md +38 -0
- data/lib/annotate_models/model_annotation_generator.rb +108 -0
- data/lib/annotate_models/railtie.rb +11 -0
- data/lib/annotate_models/version.rb +3 -0
- data/lib/annotate_models.rb +3 -0
- data/lib/tasks/annotate_models.rake +55 -0
- metadata +55 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 53b7a0a3bcc8c72bbecf825408c5a3abed24ce81
|
4
|
+
data.tar.gz: 144c14334120433ef0a61f6fdee4aa1ee3ebdb67
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6b11348c86f2bac0d9e009649e5c2f95b28b5ec77dbe0db50fd96617e4e962df5da063f17a614389d310cbeb90a348ff7dd962c55e4c1926b9d4b2cd14b5c789
|
7
|
+
data.tar.gz: 11faa9d4fcef539177fdba0619ccad7ffb349513152018dc50e2268a565d4faa361d5b5e729fa63018ef1f6aa11ba1e9ff068d67063fafd9b99813200ec1037a
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 Nathan Brazil
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
|
data/README.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# annotate_models
|
2
|
+
|
3
|
+
This is my own re-write of an earlier version [ctran/annoate_models](https://github.com/ctran/annotate_models) when
|
4
|
+
work on it waned. This work started out as a Rails plugin; I am now re-bundling it as a gem since plugin support for Rails has
|
5
|
+
long been deprecated.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
If you are using Bundler, add this line to your Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem "annotate_models"
|
13
|
+
```
|
14
|
+
|
15
|
+
Otherwise, run this command:
|
16
|
+
|
17
|
+
```
|
18
|
+
gem install annotate_models"
|
19
|
+
```
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
Run this command from the root folder of your Rails application:
|
24
|
+
|
25
|
+
```
|
26
|
+
rake annotate:all
|
27
|
+
```
|
28
|
+
|
29
|
+
For details, run ```rake -T```.
|
30
|
+
|
31
|
+
## Credit
|
32
|
+
|
33
|
+
I first learned to love the functionality of Dave Thomas' annotate_models plugin (you can find a repo for it
|
34
|
+
[here](https://github.com/alsemyonov/annotate_models)). Later, when it became un-maintained and broke, I switched over to
|
35
|
+
[ctran/annoate](https://github.com/ctran/annotate_models). Then, when work on it waned and broke as well, I decided to write my own
|
36
|
+
as an exercise.
|
37
|
+
|
38
|
+
So thanks go out to Pragmatic Dave as well as to the author and contributors of ctran/annotate_models.
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module AnnotateModels
|
2
|
+
|
3
|
+
##
|
4
|
+
# Class contains the Ruby code to generate the annotations
|
5
|
+
#
|
6
|
+
|
7
|
+
class ModelAnnotationGenerator
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@annotations = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
##
|
14
|
+
# Apply annotations to a file
|
15
|
+
#
|
16
|
+
# @param path [String] Relative path (from root of application) of directory to apply annotations to.
|
17
|
+
# @param suffix [String] Optionally specify suffix of files to apply annotation to (e.g. "<model.name>_<suffix>.rb").
|
18
|
+
# @param extension [String] Optionally specify extension of files to apply annotaations to (e.g. "<model.name>_<suffix>.<extension>").
|
19
|
+
|
20
|
+
def apply_annotation(path, suffix=nil, extension="rb", plural=false)
|
21
|
+
pn_models = Pathname.new(path)
|
22
|
+
return unless pn_models.exist?
|
23
|
+
suffix = "_#{suffix}" unless suffix == nil
|
24
|
+
extension = (extension == nil) ? "" : ".#{extension}"
|
25
|
+
@annotations.each do |model, annotation|
|
26
|
+
prefix = (plural) ? model.name.pluralize : model.name
|
27
|
+
pn = pn_models + "#{ActiveSupport::Inflector.underscore(prefix)}#{suffix}#{extension}"
|
28
|
+
text = File.open(pn.to_path) { |fp| fp.read }
|
29
|
+
re = Regexp.new("^#-(?:--)+-\n# #{model.name}.*\n(?:#.+\n)+#-(?:--)+-\n", Regexp::MULTILINE)
|
30
|
+
if re =~ text
|
31
|
+
text = text.sub(re, annotation)
|
32
|
+
else
|
33
|
+
text = "#{text}\n#{annotation}"
|
34
|
+
end
|
35
|
+
File.open(pn.to_path, "w") { |fp| fp.write(text) }
|
36
|
+
puts "Annotated #{pn.to_path}."
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def apply_to_factories
|
41
|
+
self.apply_annotation("test/factories", suffix="factory")
|
42
|
+
end
|
43
|
+
|
44
|
+
def apply_to_fixtures
|
45
|
+
self.apply_annotation("test/fixtures", suffix=nil, extension="yml", plural=true)
|
46
|
+
end
|
47
|
+
|
48
|
+
def apply_to_models
|
49
|
+
self.apply_annotation("app/models")
|
50
|
+
end
|
51
|
+
|
52
|
+
def apply_to_model_tests
|
53
|
+
self.apply_annotation("test/models", suffix="test")
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# Gather model classes and generate annotation for each one.
|
58
|
+
|
59
|
+
def generate
|
60
|
+
Dir["app/models/*.rb"].each do |path|
|
61
|
+
result = File.basename(path).scan(/^(.+)\.rb/)[0][0]
|
62
|
+
model = eval(ActiveSupport::Inflector.camelize(result))
|
63
|
+
next unless model < ActiveRecord::Base
|
64
|
+
@annotations[model] = generate_annotation(model) unless @annotations.keys.include?(model)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
##
|
69
|
+
# Print out the annotation text.
|
70
|
+
|
71
|
+
def print
|
72
|
+
@annotations.values.sort.each do |annotation|
|
73
|
+
puts annotation
|
74
|
+
puts
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
##
|
81
|
+
# Generate annotation text.
|
82
|
+
# @param model [Class] An ActiveRecord model class.
|
83
|
+
|
84
|
+
def generate_annotation(model)
|
85
|
+
annotation = []
|
86
|
+
annotation << "#-#{'--' * 38}-"
|
87
|
+
annotation << "# #{model.name}"
|
88
|
+
annotation << "#"
|
89
|
+
annotation << "# Name SQL Type Null Default Primary"
|
90
|
+
annotation << "# ------------------------------ -------------------- ------- ------- -------"
|
91
|
+
model.columns.each do |column|
|
92
|
+
annotation << sprintf(
|
93
|
+
"# %-30s %-20s %-7s %-7s %-7s",
|
94
|
+
column.name,
|
95
|
+
column.sql_type,
|
96
|
+
column.null,
|
97
|
+
(column.default || ""),
|
98
|
+
column.name == model.primary_key
|
99
|
+
)
|
100
|
+
end
|
101
|
+
annotation << "#"
|
102
|
+
annotation << "#-#{'--' * 38}-"
|
103
|
+
annotation.join("\n") + "\n"
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require "annotate_models/model_annotation_generator"
|
2
|
+
|
3
|
+
#-----
|
4
|
+
# Ruby tasks
|
5
|
+
#-----
|
6
|
+
|
7
|
+
task annotate: "annotate:all"
|
8
|
+
|
9
|
+
namespace :annotate do
|
10
|
+
|
11
|
+
desc "Annotate everything"
|
12
|
+
task :all => [:factories, :fixtures, :models, "test:models"]
|
13
|
+
|
14
|
+
desc "Annotate factories"
|
15
|
+
task :factories do
|
16
|
+
puts "Annotating factories..."
|
17
|
+
am = AnnotateModels::ModelAnnotationGenerator.new
|
18
|
+
am.generate
|
19
|
+
am.apply_to_factories
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "Annotate fixtures"
|
23
|
+
task :fixtures do
|
24
|
+
puts "Annotating fixtures..."
|
25
|
+
am = AnnotateModels::ModelAnnotationGenerator.new
|
26
|
+
am.generate
|
27
|
+
am.apply_to_fixtures
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Annotate ActiveRecord models"
|
31
|
+
task :models do
|
32
|
+
puts "Annotating models..."
|
33
|
+
am = AnnotateModels::ModelAnnotationGenerator.new
|
34
|
+
am.generate
|
35
|
+
am.apply_to_models
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Print annotations"
|
39
|
+
task :print do
|
40
|
+
am = AnnotateModels::ModelAnnotationGenerator.new
|
41
|
+
am.generate
|
42
|
+
am.print
|
43
|
+
end
|
44
|
+
|
45
|
+
namespace :test do
|
46
|
+
desc "Annotate model tests"
|
47
|
+
task :models do
|
48
|
+
puts "Annotating model tests..."
|
49
|
+
am = AnnotateModels::ModelAnnotationGenerator.new
|
50
|
+
am.generate
|
51
|
+
am.apply_to_model_tests
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: annotate_models
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nathan Brazil
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-02-08 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: |-
|
14
|
+
This is my own re-write of an earlier version [ctran/annoate](https://github.com/ctran/annotate_models) when
|
15
|
+
work on it waned. This work started out as a Rails plugin; I am now re-bundling it as a gem since plugin support for Rails has
|
16
|
+
long been deprecated.
|
17
|
+
email: nb@bitaxis.com
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- LICENSE
|
23
|
+
- README.md
|
24
|
+
- lib/annotate_models.rb
|
25
|
+
- lib/annotate_models/model_annotation_generator.rb
|
26
|
+
- lib/annotate_models/railtie.rb
|
27
|
+
- lib/annotate_models/version.rb
|
28
|
+
- lib/tasks/annotate_models.rake
|
29
|
+
homepage: https://github.com/bitaxis/annotate_models.git
|
30
|
+
licenses:
|
31
|
+
- MIT
|
32
|
+
metadata: {}
|
33
|
+
post_install_message:
|
34
|
+
rdoc_options: []
|
35
|
+
require_paths:
|
36
|
+
- lib
|
37
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
requirements: []
|
48
|
+
rubyforge_project:
|
49
|
+
rubygems_version: 2.4.5
|
50
|
+
signing_key:
|
51
|
+
specification_version: 4
|
52
|
+
summary: Simple gem that adds several rake tasks to annotate Rails source files with
|
53
|
+
model schema.
|
54
|
+
test_files: []
|
55
|
+
has_rdoc:
|