annotate 2.5.0 → 2.6.0.beta2

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.
@@ -5,37 +5,143 @@
5
5
  #
6
6
  #
7
7
  # Prepends the output of "rake routes" to the top of your routes.rb file.
8
- # Yes, it's simple but I'm thick and often need a reminder of what my routes mean.
8
+ # Yes, it's simple but I'm thick and often need a reminder of what my routes
9
+ # mean.
9
10
  #
10
- # Running this task will replace any exising route comment generated by the task.
11
- # Best to back up your routes file before running:
11
+ # Running this task will replace any exising route comment generated by the
12
+ # task. Best to back up your routes file before running:
12
13
  #
13
14
  # Author:
14
15
  # Gavin Montague
15
16
  # gavin@leftbrained.co.uk
16
17
  #
17
- # Released under the same license as Ruby. No Support. No Warranty.module AnnotateRoutes
18
+ # Released under the same license as Ruby. No Support. No Warranty.
18
19
  #
19
20
  module AnnotateRoutes
20
- PREFIX = "#== Route Map"
21
-
22
- def self.do_annotate
23
- routes_rb = File.join("config", "routes.rb")
24
- header = PREFIX + "\n# Generated on #{Time.now.strftime("%d %b %Y %H:%M")}\n#"
25
- if File.exists? routes_rb
26
- routes_map = `rake routes`
27
- routes_map = routes_map.split("\n")
28
- routes_map.shift # remove the first line of rake routes which is just a file path
29
- routes_map = routes_map.inject(header){|sum, line| sum<<"\n# "<<line}
30
- content = File.read(routes_rb)
31
- content, old = content.split(/^#== Route .*?\n/)
32
- File.open(routes_rb, "wb") do |f|
33
- f.puts content.sub!(/\n?\z/, "\n") + routes_map
21
+ PREFIX = "# == Route Map"
22
+
23
+ def self.do_annotations(options={})
24
+ return unless(routes_exists?)
25
+
26
+ position_after = options[:position_in_routes] != 'before'
27
+
28
+ routes_map = `rake routes`.split(/\n/, -1)
29
+
30
+ # In old versions of Rake, the first line of output was the cwd. Not so
31
+ # much in newer ones. We ditch that line if it exists, and if not, we
32
+ # keep the line around.
33
+ routes_map.shift if(routes_map.first =~ /^\(in \//)
34
+
35
+ header = [
36
+ "#{PREFIX} (Updated #{Time.now.strftime("%Y-%m-%d %H:%M")})",
37
+ "#"
38
+ ] + routes_map.map { |line| "# #{line}".rstrip }
39
+
40
+ (content, where_header_found) = strip_annotations(File.read(routes_file))
41
+ changed = where_header_found != 0 # This will either be :before, :after, or
42
+ # a number. If the number is > 0, the
43
+ # annotation was found somewhere in the
44
+ # middle of the file. If the number is
45
+ # zero, no annotation was found.
46
+
47
+ if(position_after)
48
+ # Ensure we have adequate trailing newlines at the end of the file to
49
+ # ensure a blank line separating the content from the annotation.
50
+ content << '' if(content.last != '')
51
+
52
+ # We're moving something from the top of the file to the bottom, so ditch
53
+ # the spacer we put in the first time around.
54
+ if(changed && where_header_found == :before)
55
+ content.shift if(content.first == '')
34
56
  end
35
- puts "Route file annotated."
36
57
  else
37
- puts "Can`t find routes.rb"
58
+ header = header << '' if(content.first != '' || changed)
38
59
  end
60
+
61
+ content = position_after ? (content + header) : header + content
62
+
63
+ write_contents(content)
64
+
65
+ puts "Route file annotated."
66
+ end
67
+
68
+ def self.remove_annotations(options={})
69
+ return unless(routes_exists?)
70
+
71
+ (content, where_header_found) = strip_annotations(File.read(routes_file))
72
+
73
+ content = strip_on_removal(content, where_header_found)
74
+
75
+ write_contents(content)
76
+
77
+ puts "Removed annotations from routes file."
39
78
  end
40
79
 
80
+ protected
81
+
82
+ def self.routes_file
83
+ @routes_rb ||= File.join("config", "routes.rb")
84
+ end
85
+
86
+ def self.routes_exists?
87
+ routes_exists = File.exists?(routes_file)
88
+ puts "Can`t find routes.rb" if(!routes_exists)
89
+ return routes_exists
90
+ end
91
+
92
+ def self.write_contents(content)
93
+ content << '' unless(content.last == '') # Make sure we end on a trailing
94
+ # newline.
95
+
96
+ File.open(routes_file, "wb") { |f| f.puts(content.join("\n")) }
97
+ end
98
+
99
+ def self.strip_annotations(content)
100
+ real_content = []
101
+ mode = :content
102
+ line_number = 0
103
+ header_found_at = 0
104
+ content.split(/\n/, -1).each do |line|
105
+ line_number += 1
106
+ begin
107
+ if(mode == :header)
108
+ if(line !~ /\s*#/)
109
+ mode = :content
110
+ raise unless (line == '')
111
+ end
112
+ elsif(mode == :content)
113
+ if(line =~ /^\s*#\s*== Route.*$/)
114
+ header_found_at = line_number
115
+ mode = :header
116
+ else
117
+ real_content << line
118
+ end
119
+ end
120
+ rescue
121
+ retry
122
+ end
123
+ end
124
+ content_lines = real_content.count
125
+
126
+ # By default assume the annotation was found in the middle of the file...
127
+ where_header_found = header_found_at
128
+ # ... unless we have evidence it was at the beginning ...
129
+ where_header_found = :before if(header_found_at == 1)
130
+ # ... or that it was at the end.
131
+ where_header_found = :after if(header_found_at >= content_lines)
132
+
133
+ return real_content, where_header_found
134
+ end
135
+
136
+ def self.strip_on_removal(content, where_header_found)
137
+ if(where_header_found == :before)
138
+ content.shift while(content.first == '')
139
+ elsif(where_header_found == :after)
140
+ content.pop while(content.last == '')
141
+ end
142
+ # TODO: If the user buried it in the middle, we should probably see about
143
+ # TODO: preserving a single line of space between the content above and
144
+ # TODO: below...
145
+ return content
146
+ end
41
147
  end
@@ -1,5 +1,5 @@
1
1
  module Annotate
2
2
  def self.version
3
- "2.5.0"
3
+ '2.6.0.beta2'
4
4
  end
5
5
  end
@@ -1,4 +1,4 @@
1
1
  Add a .rake file that automatically annotates models when you do a db:migrate
2
2
  in development mode:
3
3
 
4
- rails generate annotate_models:install
4
+ rails generate annotate:install
@@ -1,4 +1,4 @@
1
- module AnnotateModels
1
+ module Annotate
2
2
  module Generators
3
3
  class InstallGenerator < Rails::Generators::Base
4
4
  desc "Copy annotate_models rakefiles for automatic annotation"
@@ -11,4 +11,4 @@ module AnnotateModels
11
11
 
12
12
  end
13
13
  end
14
- end
14
+ end
@@ -0,0 +1,34 @@
1
+ # NOTE: only doing this in development as some production environments (Heroku)
2
+ # NOTE: are sensitive to local FS writes, and besides -- it's just not proper
3
+ # NOTE: to have a dev-mode tool do its thing in production.
4
+ if(Rails.env.development?)
5
+ task :set_annotation_options do
6
+ # You can override any of these by setting an environment variable of the
7
+ # same name.
8
+ Annotate.set_defaults({
9
+ 'position_in_routes' => "before",
10
+ 'position_in_class' => "before",
11
+ 'position_in_test' => "before",
12
+ 'position_in_fixture' => "before",
13
+ 'position_in_factory' => "before",
14
+ 'show_indexes' => "true",
15
+ 'simple_indexes' => "false",
16
+ 'model_dir' => "app/models",
17
+ 'include_version' => "false",
18
+ 'require' => "",
19
+ 'exclude_tests' => "false",
20
+ 'exclude_fixtures' => "false",
21
+ 'exclude_factories' => "false",
22
+ 'ignore_model_sub_dir' => "false",
23
+ 'skip_on_db_migrate' => "false",
24
+ 'format_bare' => "true",
25
+ 'format_rdoc' => "false",
26
+ 'format_markdown' => "false",
27
+ 'sort' => "false",
28
+ 'force' => "false",
29
+ 'trace' => "false",
30
+ })
31
+ end
32
+
33
+ Annotate.load_tasks
34
+ end
@@ -10,25 +10,27 @@ task :annotate_models => :environment do
10
10
  require "#{annotate_lib}/annotate/annotate_models"
11
11
  require "#{annotate_lib}/annotate/active_record_patch"
12
12
 
13
- true_re = /(true|t|yes|y|1)$/i
14
-
15
13
  options={ :is_rake => true }
16
- options[:position_in_class] = ENV['position_in_class'] || ENV['position'] || 'before'
17
- options[:position_in_fixture] = ENV['position_in_fixture'] || ENV['position'] || 'before'
18
- options[:position_in_factory] = ENV['position_in_factory'] || ENV['position'] || 'before'
19
- options[:show_indexes] = ENV['show_indexes'] =~ true_re
20
- options[:simple_indexes] = ENV['simple_indexes'] =~ true_re
14
+ ENV['position'] = options[:position] = Annotate.fallback(ENV['position'], 'before')
15
+ options[:position_in_class] = Annotate.fallback(ENV['position_in_class'], ENV['position'])
16
+ options[:position_in_fixture] = Annotate.fallback(ENV['position_in_fixture'], ENV['position'])
17
+ options[:position_in_factory] = Annotate.fallback(ENV['position_in_factory'], ENV['position'])
18
+ options[:position_in_test] = Annotate.fallback(ENV['position_in_test'], ENV['position'])
19
+ options[:show_indexes] = Annotate.true?(ENV['show_indexes'])
20
+ options[:simple_indexes] = Annotate.true?(ENV['simple_indexes'])
21
21
  options[:model_dir] = ENV['model_dir']
22
- options[:include_version] = ENV['include_version'] =~ true_re
22
+ options[:include_version] = Annotate.true?(ENV['include_version'])
23
23
  options[:require] = ENV['require'] ? ENV['require'].split(',') : []
24
- options[:exclude_tests] = ENV['exclude_tests'] =~ true_re
25
- options[:exclude_fixtures] = ENV['exclude_fixtures'] =~ true_re
26
- options[:ignore_model_sub_dir] = ENV['ignore_model_sub_dir'] =~ true_re
27
- options[:format_rdoc] = ENV['format_rdoc'] =~ true_re
28
- options[:format_markdown] = ENV['format_markdown'] =~ true_re
29
- options[:sort] = ENV['sort'] =~ true_re
30
- options[:force] = ENV['force'] =~ true_re
31
- options[:trace] = ENV['trace'] =~ true_re
24
+ options[:exclude_tests] = Annotate.true?(ENV['exclude_tests'])
25
+ options[:exclude_factories] = Annotate.true?(ENV['exclude_factories'])
26
+ options[:exclude_fixtures] = Annotate.true?(ENV['exclude_fixtures'])
27
+ options[:ignore_model_sub_dir] = Annotate.true?(ENV['ignore_model_sub_dir'])
28
+ options[:format_bare] = Annotate.true?(ENV['format_bare'])
29
+ options[:format_rdoc] = Annotate.true?(ENV['format_rdoc'])
30
+ options[:format_markdown] = Annotate.true?(ENV['format_markdown'])
31
+ options[:sort] = Annotate.true?(ENV['sort'])
32
+ options[:force] = Annotate.true?(ENV['force'])
33
+ options[:trace] = Annotate.true?(ENV['trace'])
32
34
  AnnotateModels.do_annotations(options)
33
35
  end
34
36
 
@@ -36,7 +38,10 @@ desc "Remove schema information from model and fixture files"
36
38
  task :remove_annotation => :environment do
37
39
  require "#{annotate_lib}/annotate/annotate_models"
38
40
  require "#{annotate_lib}/annotate/active_record_patch"
41
+
39
42
  options={ :is_rake => true }
40
43
  options[:model_dir] = ENV['model_dir']
44
+ options[:require] = ENV['require'] ? ENV['require'].split(',') : []
45
+ options[:trace] = Annotate.true?(ENV['trace'])
41
46
  AnnotateModels.remove_annotations(options)
42
47
  end
@@ -1,6 +1,21 @@
1
- desc "Prepends the route map to the top of routes.rb"
1
+ desc "Adds the route map to routes.rb"
2
2
  task :annotate_routes => :environment do
3
3
  annotate_lib = File.expand_path(File.dirname(File.dirname(__FILE__)))
4
4
  require "#{annotate_lib}/annotate/annotate_routes"
5
- AnnotateRoutes.do_annotate
5
+
6
+ options={}
7
+ ENV['position'] = options[:position] = Annotate.fallback(ENV['position'], 'before')
8
+ options[:position_in_routes] = Annotate.fallback(ENV['position_in_routes'], ENV['position'])
9
+ options[:require] = ENV['require'] ? ENV['require'].split(',') : []
10
+ AnnotateRoutes.do_annotations(options)
11
+ end
12
+
13
+ desc "Removes the route map from routes.rb"
14
+ task :remove_routes => :environment do
15
+ annotate_lib = File.expand_path(File.dirname(File.dirname(__FILE__)))
16
+ require "#{annotate_lib}/annotate/annotate_routes"
17
+
18
+ options={}
19
+ options[:require] = ENV['require'] ? ENV['require'].split(',') : []
20
+ AnnotateRoutes.remove_annotations(options)
6
21
  end
metadata CHANGED
@@ -1,35 +1,47 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: annotate
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.0
5
- prerelease:
4
+ version: 2.6.0.beta2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Cuong Tran
9
8
  - Alex Chaffee
10
9
  - Marcos Piccinini
11
10
  - Turadg Aleahmad
11
+ - Jon Frisby
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2012-07-28 00:00:00.000000000 Z
15
+ date: 2013-06-21 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rake
19
19
  requirement: !ruby/object:Gem::Requirement
20
- none: false
21
20
  requirements:
22
- - - ! '>='
21
+ - - '>='
23
22
  - !ruby/object:Gem::Version
24
- version: '0'
23
+ version: 0.8.7
25
24
  type: :runtime
26
25
  prerelease: false
27
26
  version_requirements: !ruby/object:Gem::Requirement
28
- none: false
29
27
  requirements:
30
- - - ! '>='
28
+ - - '>='
31
29
  - !ruby/object:Gem::Version
32
- version: '0'
30
+ version: 0.8.7
31
+ - !ruby/object:Gem::Dependency
32
+ name: activerecord
33
+ requirement: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 2.3.0
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - '>='
43
+ - !ruby/object:Gem::Version
44
+ version: 2.3.0
33
45
  description: Annotates Rails/ActiveRecord Models, routes, fixtures, and others based
34
46
  on the database schema.
35
47
  email:
@@ -37,55 +49,56 @@ email:
37
49
  - ctran@pragmaquest.com
38
50
  - x@nofxx.com
39
51
  - turadg@aleahmad.net
52
+ - jon@cloudability.com
40
53
  executables:
41
54
  - annotate
42
55
  extensions: []
43
56
  extra_rdoc_files:
44
57
  - README.rdoc
58
+ - CHANGELOG.rdoc
59
+ - TODO.rdoc
45
60
  files:
61
+ - CHANGELOG.rdoc
46
62
  - README.rdoc
47
- - History.txt
48
- - !binary |-
49
- YmluL2Fubm90YXRl
63
+ - TODO.rdoc
64
+ - annotate.gemspec
65
+ - bin/annotate
66
+ - lib/annotate.rb
50
67
  - lib/annotate/active_record_patch.rb
51
68
  - lib/annotate/annotate_models.rb
52
69
  - lib/annotate/annotate_routes.rb
53
70
  - lib/annotate/tasks.rb
54
71
  - lib/annotate/version.rb
55
- - lib/annotate.rb
56
- - lib/generators/annotate_models/install_generator.rb
57
- - lib/generators/annotate_models/templates/auto_annotate_models.rake
58
- - lib/generators/annotate_models/USAGE
72
+ - lib/generators/annotate/USAGE
73
+ - lib/generators/annotate/install_generator.rb
74
+ - lib/generators/annotate/templates/auto_annotate_models.rake
59
75
  - lib/tasks/annotate_models.rake
60
76
  - lib/tasks/annotate_routes.rake
61
77
  - tasks/migrate.rake
62
78
  homepage: http://github.com/ctran/annotate_models
63
- licenses: []
79
+ licenses:
80
+ - Ruby
81
+ metadata: {}
64
82
  post_install_message:
65
- rdoc_options:
66
- - --charset=UTF-8
83
+ rdoc_options: []
67
84
  require_paths:
68
85
  - lib
69
86
  required_ruby_version: !ruby/object:Gem::Requirement
70
- none: false
71
87
  requirements:
72
- - - ! '>='
88
+ - - '>='
73
89
  - !ruby/object:Gem::Version
74
90
  version: '0'
75
- segments:
76
- - 0
77
- hash: 3303794202298947958
78
91
  required_rubygems_version: !ruby/object:Gem::Requirement
79
- none: false
80
92
  requirements:
81
- - - ! '>='
93
+ - - '>'
82
94
  - !ruby/object:Gem::Version
83
- version: '0'
95
+ version: 1.3.1
84
96
  requirements: []
85
97
  rubyforge_project: annotate
86
- rubygems_version: 1.8.21
98
+ rubygems_version: 2.0.3
87
99
  signing_key:
88
- specification_version: 3
100
+ specification_version: 4
89
101
  summary: Annotates Rails Models, routes, fixtures, and others based on the database
90
102
  schema.
91
103
  test_files: []
104
+ has_rdoc:
@@ -1,20 +0,0 @@
1
- # NOTE: only doing this in development as some production environments (Heroku)
2
- # NOTE: are sensitive to local FS writes, and besides -- it's just not proper
3
- # NOTE: to have a dev-mode tool do its thing in production.
4
- if(Rails.env.development?)
5
- task :set_annotation_options do
6
- ENV['position_in_class'] = "before"
7
- ENV['position_in_fixture'] = "before"
8
- ENV['position_in_factory'] = "before"
9
- ENV['show_indexes'] = "true"
10
- ENV['include_version'] = "false"
11
- ENV['exclude_tests'] = "false"
12
- ENV['exclude_fixtures'] = "false"
13
- ENV['ignore_model_sub_dir'] = "false"
14
- ENV['skip_on_db_migrate'] = "false"
15
- ENV['format_rdoc'] = "false"
16
- ENV['format_markdown'] = "false"
17
- ENV['no_sort'] = "false"
18
- ENV['force'] = "false"
19
- end
20
- end