nofxx-annotate 2.2.5 → 2.3.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.
- data/.gitignore +6 -0
- data/History.txt +16 -16
- data/README.rdoc +59 -18
- data/Rakefile +48 -28
- data/bin/annotate +10 -8
- data/lib/annotate/annotate_models.rb +65 -28
- data/lib/annotate.rb +9 -9
- data/lib/tasks/annotate_models.rake +9 -4
- data/spec/annotate/annotate_models_spec.rb +10 -2
- data/spec/annotate/annotate_routes_spec.rb +1 -1
- data/spec/annotate_spec.rb +3 -4
- metadata +18 -43
- data/License.txt +0 -21
- data/Manifest.txt +0 -66
- data/annotate.gemspec +0 -39
- data/script/console +0 -10
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/setup.rb +0 -1585
- data/tasks/rspec.rake +0 -21
data/.gitignore
ADDED
data/History.txt
CHANGED
@@ -1,19 +1,4 @@
|
|
1
|
-
==
|
2
|
-
|
3
|
-
* Add contributions from Michael Bumann (http://github.com/bumi)
|
4
|
-
* added an option "position" to choose to put the annotation,
|
5
|
-
* spec/fixtures now also get annotated
|
6
|
-
* added a task to remove the annotations
|
7
|
-
* these options can be specified from command line as -d and -p [before|after]
|
8
|
-
|
9
|
-
== 1.0.3 2008-05-02
|
10
|
-
|
11
|
-
* Add misc changes from Dustin Sallings and Henrik N
|
12
|
-
* Remove trailing whitespace
|
13
|
-
* More intuitive info messages
|
14
|
-
* Update README file with update-to-date example
|
15
|
-
|
16
|
-
== 2.0.0 2008-12-25
|
1
|
+
== 2.0 2009-02-03
|
17
2
|
|
18
3
|
* Add annotate_models plugin fork additions
|
19
4
|
* Annotates Rspec and Test Unit models
|
@@ -22,6 +7,21 @@
|
|
22
7
|
* Add AnnotateRoutes rake task
|
23
8
|
* Up gem structure to newgem defaults
|
24
9
|
|
10
|
+
== 1.0.4 2008-09-04
|
11
|
+
|
12
|
+
* Only update modified models since last run, thanks to sant0sk1
|
25
13
|
|
14
|
+
== 1.0.3 2008-05-02
|
26
15
|
|
16
|
+
* Add misc changes from Dustin Sallings and Henrik N
|
17
|
+
* Remove trailing whitespace
|
18
|
+
* More intuitive info messages
|
19
|
+
* Update README file with update-to-date example
|
27
20
|
|
21
|
+
== 1.0.2 2008-03-22
|
22
|
+
|
23
|
+
* Add contributions from Michael Bumann (http://github.com/bumi)
|
24
|
+
* added an option "position" to choose to put the annotation,
|
25
|
+
* spec/fixtures now also get annotated
|
26
|
+
* added a task to remove the annotations
|
27
|
+
* these options can be specified from command line as -d and -p [before|after]
|
data/README.rdoc
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
_
|
2
|
-
/_| _/__/_
|
2
|
+
/_| _/__/_
|
3
3
|
( |/)/)()/(//(-
|
4
4
|
________________
|
5
5
|
|
6
6
|
|
7
|
-
Add a comment summarizing the current schema to the bottom of each
|
8
|
-
ActiveRecord model,
|
7
|
+
Add a comment summarizing the current schema to the bottom of each
|
8
|
+
ActiveRecord model, fixture file.
|
9
|
+
|
9
10
|
If you are using Object Daddy, it`ll annotate your example files too.
|
10
11
|
|
11
12
|
# == Schema Info
|
12
|
-
# Schema version: 20081001061831
|
13
13
|
#
|
14
|
-
# Table name:
|
14
|
+
# Table name: line_items
|
15
15
|
#
|
16
16
|
# id :integer(11) not null, primary key
|
17
17
|
# quantity :integer(11) not null
|
@@ -23,17 +23,16 @@ If you are using Object Daddy, it`ll annotate your example files too.
|
|
23
23
|
class LineItem < ActiveRecord::Base
|
24
24
|
belongs_to :product
|
25
25
|
. . .
|
26
|
-
|
26
|
+
|
27
27
|
Annotates geometrical columns, geom type and srid, when using SpatialAdapter or PostgisAdapter:
|
28
28
|
|
29
29
|
# == Schema Info
|
30
|
-
# Schema version: 20081213204851
|
31
30
|
#
|
32
31
|
# Table name: trips
|
33
32
|
#
|
34
33
|
# local :geometry point, 4326
|
35
34
|
# path :geometry line_string, 4326
|
36
|
-
|
35
|
+
|
37
36
|
|
38
37
|
== INSTALL
|
39
38
|
|
@@ -41,6 +40,28 @@ Annotates geometrical columns, geom type and srid, when using SpatialAdapter or
|
|
41
40
|
|
42
41
|
|
43
42
|
== HOW TO USE:
|
43
|
+
=======
|
44
|
+
== Warning
|
45
|
+
|
46
|
+
Note that this code will blow away the initial/final comment
|
47
|
+
block in your models if it looks like it was previously added
|
48
|
+
by annotate models, so you don't want to add additional text
|
49
|
+
to an automatically created comment block.
|
50
|
+
|
51
|
+
* * Back up your model files before using... * *
|
52
|
+
|
53
|
+
== Install
|
54
|
+
|
55
|
+
From rubyforge:
|
56
|
+
|
57
|
+
sudo gem install annotate
|
58
|
+
|
59
|
+
From github:
|
60
|
+
|
61
|
+
gem sources -a http://gems.github.com
|
62
|
+
sudo gem install ctran-annotate
|
63
|
+
|
64
|
+
== Usage
|
44
65
|
|
45
66
|
To annotate all your models:
|
46
67
|
|
@@ -51,7 +72,6 @@ To annotate routes.rb:
|
|
51
72
|
|
52
73
|
annotate -r
|
53
74
|
|
54
|
-
|
55
75
|
More:
|
56
76
|
|
57
77
|
annotate -h
|
@@ -66,7 +86,7 @@ Annotate on the head of the file:
|
|
66
86
|
|
67
87
|
annotate -p [before|after]
|
68
88
|
|
69
|
-
|
89
|
+
|
70
90
|
== WARNING
|
71
91
|
|
72
92
|
Note that this code will blow away the initial/final comment
|
@@ -75,7 +95,7 @@ by annotate models, so you don't want to add additional text
|
|
75
95
|
to an automatically created comment block.
|
76
96
|
|
77
97
|
* * Back up your model files before using... * *
|
78
|
-
|
98
|
+
|
79
99
|
== LINKS
|
80
100
|
|
81
101
|
* Factory Girl => http://github.com/thoughtbot/factory_girl (NOT IMPLEMENTED)
|
@@ -87,18 +107,31 @@ to an automatically created comment block.
|
|
87
107
|
|
88
108
|
== TODO
|
89
109
|
|
90
|
-
* Spec
|
110
|
+
* Spec
|
91
111
|
|
92
112
|
|
93
113
|
== LICENSE:
|
114
|
+
=======
|
115
|
+
More options:
|
116
|
+
|
117
|
+
Usage: annotate [options]
|
118
|
+
-d, --delete Remove annotations from all model files
|
119
|
+
-p, --position [before|after] Place the annotations at the top (before) or the bottom (after) of the model file
|
120
|
+
-r, --routes Annotate routes.rb with the output of 'rake routes'
|
121
|
+
-v, --version Show the current version of this gem
|
122
|
+
-m, --show-migration Include the migration version number in the annotation
|
123
|
+
-i, --show-indexes List the table's database indexes in the annotation
|
124
|
+
--model-dir dir Annotate model files stored in dir rather than app/models
|
94
125
|
|
95
|
-
|
126
|
+
== LICENSE:
|
96
127
|
|
97
|
-
|
128
|
+
Released under the same license as Ruby. No Support. No Warranty.
|
98
129
|
|
99
|
-
|
130
|
+
== Author:
|
100
131
|
|
101
|
-
|
132
|
+
Original code by:
|
133
|
+
|
134
|
+
Dave Thomas -- Pragmatic Programmers, LLC
|
102
135
|
|
103
136
|
AnnotateModels mods by:
|
104
137
|
|
@@ -112,14 +145,22 @@ AnnotateRoutes originally by:
|
|
112
145
|
== Forked from:
|
113
146
|
|
114
147
|
http://github.com/ctran/annotate_models
|
115
|
-
|
148
|
+
|
116
149
|
|
117
150
|
== Modifications
|
118
151
|
- alex@pivotallabs.com
|
152
|
+
=======
|
153
|
+
Modifications by:
|
154
|
+
|
155
|
+
- Alex Chaffee - http://github.com/alexch - alex@pivotallabs.com
|
119
156
|
- Cuong Tran - http://github.com/ctran
|
120
157
|
- Jack Danger - http://github.com/JackDanger
|
121
158
|
- Michael Bumann - http://github.com/bumi
|
122
159
|
- Henrik Nyh - http://github.com/henrik
|
160
|
+
- Marcos Piccinini - http://github.com/nofxx
|
123
161
|
|
162
|
+
and many others that I may have missed to add.
|
124
163
|
|
125
|
-
|
164
|
+
== This fork
|
165
|
+
|
166
|
+
Marcos Piccinini ( http://github.com/nofxx/annotate )
|
data/Rakefile
CHANGED
@@ -1,28 +1,48 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "annotate"
|
8
|
+
gem.summary = "Annotates Rails Models, routes, and others"
|
9
|
+
gem.email = "x@nofxx.com"
|
10
|
+
gem.homepage = "http://github.com/nofxx/annotate"
|
11
|
+
gem.authors = ['Cuong Tran',"Marcos Piccinini"]
|
12
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
13
|
+
end
|
14
|
+
|
15
|
+
rescue LoadError
|
16
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'spec/rake/spectask'
|
20
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
21
|
+
spec.libs << 'lib' << 'spec'
|
22
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
23
|
+
end
|
24
|
+
|
25
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
26
|
+
spec.libs << 'lib' << 'spec'
|
27
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
28
|
+
spec.rcov = true
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
task :default => :spec
|
33
|
+
|
34
|
+
require 'rake/rdoctask'
|
35
|
+
Rake::RDocTask.new do |rdoc|
|
36
|
+
if File.exist?('VERSION.yml')
|
37
|
+
config = YAML.load(File.read('VERSION.yml'))
|
38
|
+
version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
|
39
|
+
else
|
40
|
+
version = ""
|
41
|
+
end
|
42
|
+
|
43
|
+
rdoc.rdoc_dir = 'rdoc'
|
44
|
+
rdoc.title = "annotate #{version}"
|
45
|
+
rdoc.rdoc_files.include('README*')
|
46
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
47
|
+
end
|
48
|
+
|
data/bin/annotate
CHANGED
@@ -7,15 +7,17 @@ task = :annotate_models
|
|
7
7
|
|
8
8
|
OptionParser.new do |opts|
|
9
9
|
opts.banner = "Usage: annotate [options]"
|
10
|
-
opts.on('-d', '--delete') { task = :remove_annotation }
|
11
|
-
opts.on('-p', '--position [before|after]', ['before', 'after']) { |p| ENV['position'] = p }
|
12
|
-
opts.on('-r', '--routes') { task = :annotate_routes }
|
13
|
-
opts.on('-v', '--version') { puts "Annotate v#{Annotate::VERSION}"; exit }
|
10
|
+
opts.on('-d', '--delete', "Remove annotations from all model files") { task = :remove_annotation }
|
11
|
+
opts.on('-p', '--position [before|after]', ['before', 'after'], "Place the annotations at the top (before) or the bottom (after) of the model file") { |p| ENV['position'] = p }
|
12
|
+
opts.on('-r', '--routes', "Annotate routes.rb with the output of 'rake routes'") { task = :annotate_routes }
|
13
|
+
opts.on('-v', '--version', "Show the current version of this gem") { puts "Annotate v#{Annotate::VERSION}"; exit }
|
14
|
+
opts.on('-m', '--show-migration', "Include the migration version number in the annotation") { ENV['include_version'] = "yes" }
|
15
|
+
opts.on('-i', '--show-indexes', "List the table's database indexes in the annotation") { ENV['show_indexes'] = "yes" }
|
16
|
+
opts.on('--model-dir dir', "Annotate model files stored in dir rather than app/models") {|dir| ENV['model_dir'] = dir }
|
14
17
|
end.parse!
|
15
18
|
|
16
|
-
|
19
|
+
if Annotate.load_tasks
|
17
20
|
Rake::Task[task].invoke
|
18
|
-
|
19
|
-
|
20
|
-
puts "Can`t find Rake. Are we in a Rails folder?"
|
21
|
+
else
|
22
|
+
STDERR.puts "Can't find Rakefile. Are we in a Rails folder?"
|
21
23
|
end
|
@@ -3,8 +3,6 @@ module AnnotateModels
|
|
3
3
|
# Annotate Models plugin use this header
|
4
4
|
COMPAT_PREFIX = "== Schema Info"
|
5
5
|
PREFIX = "== Schema Information"
|
6
|
-
|
7
|
-
MODEL_DIR = "app/models"
|
8
6
|
FIXTURE_DIRS = ["test/fixtures","spec/fixtures"]
|
9
7
|
# File.join for windows reverse bar compat?
|
10
8
|
# I dont use windows, can`t test
|
@@ -12,7 +10,14 @@ module AnnotateModels
|
|
12
10
|
SPEC_MODEL_DIR = File.join("spec", "models")
|
13
11
|
# Object Daddy http://github.com/flogic/object_daddy/tree/master
|
14
12
|
EXEMPLARS_DIR = File.join("spec", "exemplars")
|
15
|
-
|
13
|
+
|
14
|
+
def model_dir
|
15
|
+
@model_dir || "app/models"
|
16
|
+
end
|
17
|
+
|
18
|
+
def model_dir=(dir)
|
19
|
+
@model_dir = dir
|
20
|
+
end
|
16
21
|
|
17
22
|
# Simple quoting for the default column value
|
18
23
|
def quote(value)
|
@@ -32,14 +37,14 @@ module AnnotateModels
|
|
32
37
|
# to create a comment block containing a line for
|
33
38
|
# each column. The line contains the column name,
|
34
39
|
# the type (and length), and any optional attributes
|
35
|
-
def get_schema_info(klass, header)
|
40
|
+
def get_schema_info(klass, header, options = {})
|
36
41
|
info = "# #{header}\n#\n"
|
37
42
|
info << "# Table name: #{klass.table_name}\n#\n"
|
38
43
|
|
39
44
|
max_size = klass.column_names.collect{|name| name.size}.max + 1
|
40
45
|
klass.columns.each do |col|
|
41
46
|
attrs = []
|
42
|
-
attrs << "default(#{quote(col.default)})"
|
47
|
+
attrs << "default(#{quote(col.default)})" unless col.default.nil?
|
43
48
|
attrs << "not null" unless col.null
|
44
49
|
attrs << "primary key" if col.name == klass.primary_key
|
45
50
|
|
@@ -49,19 +54,36 @@ module AnnotateModels
|
|
49
54
|
else
|
50
55
|
col_type << "(#{col.limit})" if col.limit
|
51
56
|
end
|
52
|
-
|
57
|
+
|
53
58
|
# Check out if we got a geometric column
|
54
59
|
# and print the type and SRID
|
55
60
|
if col.respond_to?(:geometry_type)
|
56
61
|
attrs << "#{col.geometry_type}, #{col.srid}"
|
57
|
-
end
|
58
|
-
|
62
|
+
end
|
63
|
+
|
59
64
|
info << sprintf("# %-#{max_size}.#{max_size}s:%-15.15s %s", col.name, col_type, attrs.join(", ")).rstrip + "\n"
|
60
65
|
end
|
61
66
|
|
67
|
+
if options[:show_indexes]
|
68
|
+
info << get_index_info(klass)
|
69
|
+
end
|
70
|
+
|
62
71
|
info << "#\n\n"
|
63
72
|
end
|
64
73
|
|
74
|
+
def get_index_info(klass)
|
75
|
+
index_info = "#\n# Indexes\n#\n"
|
76
|
+
|
77
|
+
indexes = klass.connection.indexes(klass.table_name)
|
78
|
+
return "" if indexes.empty?
|
79
|
+
|
80
|
+
max_size = indexes.collect{|index| index.name.size}.max + 1
|
81
|
+
indexes.each do |index|
|
82
|
+
index_info << sprintf("# %-#{max_size}.#{max_size}s %s %s", index.name, "(#{index.columns.join(",")})", index.unique ? "UNIQUE" : "").rstrip + "\n"
|
83
|
+
end
|
84
|
+
return index_info
|
85
|
+
end
|
86
|
+
|
65
87
|
# Add a schema block to a file. If the file already contains
|
66
88
|
# a schema info block (a comment starting with "== Schema Information"), check if it
|
67
89
|
# matches the block that is already there. If so, leave it be. If not, remove the old
|
@@ -69,10 +91,12 @@ module AnnotateModels
|
|
69
91
|
# Returns true or false depending on whether the file was modified.
|
70
92
|
#
|
71
93
|
# === Options (opts)
|
72
|
-
# :position<Symbol>:: where to place the annotated section in fixture or model file,
|
94
|
+
# :position<Symbol>:: where to place the annotated section in fixture or model file,
|
73
95
|
# "before" or "after". Default is "before".
|
74
96
|
# :position_in_class<Symbol>:: where to place the annotated section in model file
|
75
97
|
# :position_in_fixture<Symbol>:: where to place the annotated section in fixture file
|
98
|
+
# :position_in_others<Symbol>:: where to place the annotated section in the rest of
|
99
|
+
# supported files
|
76
100
|
#
|
77
101
|
def annotate_one_file(file_name, info_block, options={})
|
78
102
|
if File.exist?(file_name)
|
@@ -82,7 +106,7 @@ module AnnotateModels
|
|
82
106
|
header = Regexp.new(/(^# Table name:.*?\n(#.*\n)*\n)/)
|
83
107
|
old_header = old_content.match(header).to_s
|
84
108
|
new_header = info_block.match(header).to_s
|
85
|
-
|
109
|
+
|
86
110
|
if old_header == new_header
|
87
111
|
false
|
88
112
|
else
|
@@ -90,20 +114,20 @@ module AnnotateModels
|
|
90
114
|
old_content.sub!(/^# #{COMPAT_PREFIX}.*?\n(#.*\n)*\n/, '')
|
91
115
|
|
92
116
|
# Write it back
|
93
|
-
new_content = options[:position] ==
|
117
|
+
new_content = options[:position].to_sym == :before ? (info_block + old_content) : (old_content + "\n" + info_block)
|
94
118
|
|
95
119
|
File.open(file_name, "wb") { |f| f.puts new_content }
|
96
120
|
true
|
97
121
|
end
|
98
122
|
end
|
99
123
|
end
|
100
|
-
|
124
|
+
|
101
125
|
def remove_annotation_of_file(file_name)
|
102
126
|
if File.exist?(file_name)
|
103
127
|
content = File.read(file_name)
|
104
128
|
|
105
129
|
content.sub!(/^# #{COMPAT_PREFIX}.*?\n(#.*\n)*\n/, '')
|
106
|
-
|
130
|
+
|
107
131
|
File.open(file_name, "wb") { |f| f.puts content }
|
108
132
|
end
|
109
133
|
end
|
@@ -116,10 +140,10 @@ module AnnotateModels
|
|
116
140
|
# files were modified.
|
117
141
|
|
118
142
|
def annotate(klass, file, header,options={})
|
119
|
-
info = get_schema_info(klass, header)
|
143
|
+
info = get_schema_info(klass, header, options)
|
120
144
|
annotated = false
|
121
145
|
model_name = klass.name.underscore
|
122
|
-
model_file_name = File.join(
|
146
|
+
model_file_name = File.join(model_dir, file)
|
123
147
|
if annotate_one_file(model_file_name, info, options.merge(
|
124
148
|
:position=>(options[:position_in_class] || options[:position])))
|
125
149
|
annotated = true
|
@@ -128,7 +152,7 @@ module AnnotateModels
|
|
128
152
|
[
|
129
153
|
File.join(UNIT_TEST_DIR, "#{model_name}_test.rb"), # test
|
130
154
|
File.join(SPEC_MODEL_DIR, "#{model_name}_spec.rb"), # spec
|
131
|
-
File.join(EXEMPLARS_DIR, "#{model_name}_exemplar.rb"), # Object Daddy
|
155
|
+
File.join(EXEMPLARS_DIR, "#{model_name}_exemplar.rb"), # Object Daddy
|
132
156
|
].each { |file| annotate_one_file(file, info) }
|
133
157
|
|
134
158
|
FIXTURE_DIRS.each do |dir|
|
@@ -142,23 +166,24 @@ module AnnotateModels
|
|
142
166
|
# command line arguments, they're assumed to be either
|
143
167
|
# the underscore or CamelCase versions of model names.
|
144
168
|
# Otherwise we take all the model files in the
|
145
|
-
#
|
169
|
+
# model_dir directory.
|
146
170
|
def get_model_files
|
147
171
|
models = ARGV.dup
|
148
172
|
models.shift
|
149
173
|
models.reject!{|m| m.starts_with?("position=")}
|
150
174
|
if models.empty?
|
151
|
-
Dir.chdir(
|
175
|
+
Dir.chdir(model_dir) do
|
152
176
|
models = Dir["**/*.rb"]
|
153
177
|
end
|
154
178
|
end
|
155
179
|
models
|
156
180
|
end
|
157
|
-
|
181
|
+
|
158
182
|
# Retrieve the classes belonging to the model names we're asked to process
|
159
183
|
# Check for namespaced models in subdirectories as well as models
|
160
184
|
# in subdirectories without namespacing.
|
161
185
|
def get_model_class(file)
|
186
|
+
require "#{model_dir}/#{file}" # this is for non-rails projects, which don't get Rails auto-require magic
|
162
187
|
model = file.gsub(/\.rb$/, '').camelize
|
163
188
|
parts = model.split('::')
|
164
189
|
begin
|
@@ -174,9 +199,16 @@ module AnnotateModels
|
|
174
199
|
# then pas it to the associated block
|
175
200
|
def do_annotations(options={})
|
176
201
|
header = PREFIX.dup
|
177
|
-
|
178
|
-
if
|
179
|
-
|
202
|
+
|
203
|
+
if options[:include_version]
|
204
|
+
version = ActiveRecord::Migrator.current_version rescue 0
|
205
|
+
if version > 0
|
206
|
+
header << "\n# Schema version: #{version}"
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
if options[:model_dir]
|
211
|
+
self.model_dir = options[:model_dir]
|
180
212
|
end
|
181
213
|
|
182
214
|
annotated = []
|
@@ -189,7 +221,7 @@ module AnnotateModels
|
|
189
221
|
end
|
190
222
|
end
|
191
223
|
rescue Exception => e
|
192
|
-
puts "Unable to annotate #{file}: #{e.message}"
|
224
|
+
puts "Unable to annotate #{file}: #{e.message} (#{e.backtrace.first})"
|
193
225
|
end
|
194
226
|
end
|
195
227
|
if annotated.empty?
|
@@ -198,18 +230,23 @@ module AnnotateModels
|
|
198
230
|
puts "Annotated (#{annotated.length}): #{annotated.join(', ')}"
|
199
231
|
end
|
200
232
|
end
|
201
|
-
|
202
|
-
def remove_annotations
|
233
|
+
|
234
|
+
def remove_annotations(options={})
|
235
|
+
p options
|
236
|
+
if options[:model_dir]
|
237
|
+
puts "removing"
|
238
|
+
self.model_dir = options[:model_dir]
|
239
|
+
end
|
203
240
|
deannotated = []
|
204
241
|
get_model_files.each do |file|
|
205
242
|
begin
|
206
243
|
klass = get_model_class(file)
|
207
244
|
if klass < ActiveRecord::Base && !klass.abstract_class?
|
208
245
|
deannotated << klass
|
209
|
-
|
210
|
-
model_file_name = File.join(
|
246
|
+
|
247
|
+
model_file_name = File.join(model_dir, file)
|
211
248
|
remove_annotation_of_file(model_file_name)
|
212
|
-
|
249
|
+
|
213
250
|
FIXTURE_DIRS.each do |dir|
|
214
251
|
fixture_file_name = File.join(dir,klass.table_name + ".yml")
|
215
252
|
remove_annotation_of_file(fixture_file_name) if File.exist?(fixture_file_name)
|
data/lib/annotate.rb
CHANGED
@@ -2,13 +2,13 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
2
2
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
3
|
|
4
4
|
module Annotate
|
5
|
-
|
5
|
+
def self.load_tasks
|
6
|
+
if File.exists?('Rakefile')
|
7
|
+
load 'Rakefile'
|
8
|
+
Dir[File.join(File.dirname(__FILE__), 'tasks', '**/*.rake')].each { |rake| load rake }
|
9
|
+
return true
|
10
|
+
else
|
11
|
+
return false
|
12
|
+
end
|
13
|
+
end
|
6
14
|
end
|
7
|
-
|
8
|
-
begin
|
9
|
-
load 'Rakefile'
|
10
|
-
Dir[File.join(File.dirname(__FILE__), 'tasks', '**/*.rake')].each { |rake| load rake }
|
11
|
-
rescue LoadError => e
|
12
|
-
nil
|
13
|
-
end
|
14
|
-
|
@@ -2,13 +2,18 @@ desc "Add schema information (as comments) to model and fixture files"
|
|
2
2
|
task :annotate_models => :environment do
|
3
3
|
require 'annotate/annotate_models'
|
4
4
|
options={}
|
5
|
-
options[:position_in_class] = ENV['position_in_class'] || ENV['position']
|
6
|
-
options[:position_in_fixture] = ENV['position_in_fixture'] || ENV['position']
|
5
|
+
options[:position_in_class] = ENV['position_in_class'] || ENV['position'] || :before
|
6
|
+
options[:position_in_fixture] = ENV['position_in_fixture'] || ENV['position'] || :before
|
7
|
+
options[:show_indexes] = ENV['show_indexes']
|
8
|
+
options[:model_dir] = ENV['model_dir']
|
9
|
+
options[:include_version] = ENV['include_version']
|
7
10
|
AnnotateModels.do_annotations(options)
|
8
11
|
end
|
9
12
|
|
10
13
|
desc "Remove schema information from model and fixture files"
|
11
14
|
task :remove_annotation => :environment do
|
12
|
-
require 'annotate_models'
|
13
|
-
|
15
|
+
require 'annotate/annotate_models'
|
16
|
+
options={}
|
17
|
+
options[:model_dir] = ENV['model_dir']
|
18
|
+
AnnotateModels.remove_annotations(options)
|
14
19
|
end
|
@@ -27,8 +27,16 @@ describe AnnotateModels do
|
|
27
27
|
:columns => [
|
28
28
|
mock_column(:type => "integer", :default => nil, :null => false, :name => "id", :limit => nil),
|
29
29
|
mock_column(:type => "string", :default => nil, :null => false, :name => "name", :limit => 50)
|
30
|
-
]), "
|
31
|
-
|
30
|
+
]), "Schema Info").should eql(<<-EOS)
|
31
|
+
# Schema Info
|
32
|
+
#
|
33
|
+
# Table name: users
|
34
|
+
#
|
35
|
+
# id :integer not null, primary key
|
36
|
+
# id :integer not null, primary key
|
37
|
+
#
|
38
|
+
|
39
|
+
EOS
|
32
40
|
|
33
41
|
end
|
34
42
|
|
@@ -25,7 +25,7 @@ describe AnnotateRoutes do
|
|
25
25
|
File.should_receive(:exists?).with("config/routes.rb").and_return(true)
|
26
26
|
AnnotateRoutes.should_receive(:`).with("rake routes").and_return("bad line\ngood line")
|
27
27
|
File.should_receive(:open).with("config/routes.rb", "wb").and_yield(mock_file)
|
28
|
-
AnnotateRoutes.should_receive(:puts).with("Route
|
28
|
+
AnnotateRoutes.should_receive(:puts).with("Route file annotated.")
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should annotate and add a newline!" do
|