Class: RDoc::RubygemsHook

Inherits:
Object
  • Object
show all
Extended by:
Gem::UserInteraction
Includes:
Gem::UserInteraction
Defined in:
lib/rdoc/rubygems_hook.rb

Overview

Gem::RDoc provides methods to generate RDoc and ri data for installed gems upon gem installation.

This file is automatically required by RubyGems 1.9 and newer.

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(spec, generate_rdoc = false, generate_ri = true) ⇒ RubygemsHook

Creates a new documentation generator for spec. RDoc and ri data generation can be enabled or disabled through generate_rdoc and generate_ri respectively.

Only generate_ri is enabled by default.



86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/rdoc/rubygems_hook.rb', line 86

def initialize spec, generate_rdoc = false, generate_ri = true
  @doc_dir   = spec.doc_dir
  @force     = false
  @rdoc      = nil
  @spec      = spec

  @generate_rdoc = generate_rdoc
  @generate_ri   = generate_ri

  @rdoc_dir = spec.doc_dir 'rdoc'
  @ri_dir   = spec.doc_dir 'ri'
end

Class Attribute Details

.rdoc_versionObject (readonly)

Loaded version of RDoc. Set by ::load_rdoc



41
42
43
# File 'lib/rdoc/rubygems_hook.rb', line 41

def rdoc_version
  @rdoc_version
end

Instance Attribute Details

#forceObject

Force installation of documentation?



24
25
26
# File 'lib/rdoc/rubygems_hook.rb', line 24

def force
  @force
end

#generate_rdocObject

Generate rdoc?



29
30
31
# File 'lib/rdoc/rubygems_hook.rb', line 29

def generate_rdoc
  @generate_rdoc
end

#generate_riObject

Generate ri data?



34
35
36
# File 'lib/rdoc/rubygems_hook.rb', line 34

def generate_ri
  @generate_ri
end

Class Method Details

.generation_hook(installer, specs) ⇒ Object

Post installs hook that generates documentation for each specification in specs



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/rdoc/rubygems_hook.rb', line 49

def self.generation_hook installer, specs
  start = Time.now
  types = installer.document

  generate_rdoc = types.include? 'rdoc'
  generate_ri   = types.include? 'ri'

  specs.each do |spec|
    new(spec, generate_rdoc, generate_ri).generate
  end

  return unless generate_rdoc or generate_ri

  duration = (Time.now - start).to_i
  names    = specs.map(&:name).join ', '

  say "Done installing documentation for #{names} after #{duration} seconds"
end

.load_rdocObject

Loads the RDoc generator



71
72
73
74
75
76
77
# File 'lib/rdoc/rubygems_hook.rb', line 71

def self.load_rdoc
  return if @rdoc_version

  require 'rdoc/rdoc'

  @rdoc_version = Gem::Version.new ::RDoc::VERSION
end

Instance Method Details

#delete_legacy_args(args) ⇒ Object

Removes legacy rdoc arguments from args – TODO move to RDoc::Options



104
105
106
107
108
109
# File 'lib/rdoc/rubygems_hook.rb', line 104

def delete_legacy_args args
  args.delete '--inline-source'
  args.delete '--promiscuous'
  args.delete '-p'
  args.delete '--one-file'
end

#document(generator, options, destination) ⇒ Object

Generates documentation using the named generator (“darkfish” or “ri”) and following the given options.

Documentation will be generated into destination



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/rdoc/rubygems_hook.rb', line 117

def document generator, options, destination
  generator_name = generator

  options = options.dup
  options.exclude ||= [] # TODO maybe move to RDoc::Options#finish
  options.setup_generator generator
  options.op_dir = destination
  options.finish

  generator = options.generator.new @rdoc.store, options

  @rdoc.options = options
  @rdoc.generator = generator

  say "Installing #{generator_name} documentation for #{@spec.full_name}"

  FileUtils.mkdir_p options.op_dir

  Dir.chdir options.op_dir do
    begin
      @rdoc.class.current = @rdoc
      @rdoc.generator.generate
    ensure
      @rdoc.class.current = nil
    end
  end
end

#generateObject

Generates RDoc and ri data



148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'lib/rdoc/rubygems_hook.rb', line 148

def generate
  return if @spec.default_gem?
  return unless @generate_ri or @generate_rdoc

  setup

  options = nil

  args = @spec.rdoc_options

  if @spec.respond_to? :source_paths then
    args.concat @spec.source_paths
  else
    args.concat @spec.require_paths
  end

  args.concat @spec.extra_rdoc_files

  case config_args = Gem.configuration[:rdoc]
  when String then
    args = args.concat config_args.split
  when Array then
    args = args.concat config_args
  end

  delete_legacy_args args

  Dir.chdir @spec.full_gem_path do
    options = ::RDoc::Options.new
    options.default_title = "#{@spec.full_name} Documentation"
    options.parse args
  end

  options.quiet = !Gem.configuration.really_verbose

  @rdoc = new_rdoc
  @rdoc.options = options

  store = RDoc::Store.new
  store.encoding = options.encoding if options.respond_to? :encoding
  store.dry_run  = options.dry_run
  store.main     = options.main_page
  store.title    = options.title

  @rdoc.store = store

  say "Parsing documentation for #{@spec.full_name}"

  Dir.chdir @spec.full_gem_path do
    @rdoc.parse_files options.files
  end

  document 'ri',       options, @ri_dir if
    @generate_ri   and (@force or not File.exist? @ri_dir)

  document 'darkfish', options, @rdoc_dir if
    @generate_rdoc and (@force or not File.exist? @rdoc_dir)
end

#new_rdocObject

#new_rdoc creates a new RDoc instance. This method is provided only to make testing easier.



211
212
213
# File 'lib/rdoc/rubygems_hook.rb', line 211

def new_rdoc # :nodoc:
  ::RDoc::RDoc.new
end

#rdoc_installed?Boolean

Is rdoc documentation installed?

Returns:

  • (Boolean)


218
219
220
# File 'lib/rdoc/rubygems_hook.rb', line 218

def rdoc_installed?
  File.exist? @rdoc_dir
end

#removeObject

Removes generated RDoc and ri data

Raises:

  • (Gem::FilePermissionError)


225
226
227
228
229
230
231
232
# File 'lib/rdoc/rubygems_hook.rb', line 225

def remove
  base_dir = @spec.base_dir

  raise Gem::FilePermissionError, base_dir unless File.writable? base_dir

  FileUtils.rm_rf @rdoc_dir
  FileUtils.rm_rf @ri_dir
end

#ri_installed?Boolean

Is ri data installed?

Returns:

  • (Boolean)


237
238
239
# File 'lib/rdoc/rubygems_hook.rb', line 237

def ri_installed?
  File.exist? @ri_dir
end

#setupObject

Prepares the spec for documentation generation

Raises:

  • (Gem::FilePermissionError)


244
245
246
247
248
249
250
251
# File 'lib/rdoc/rubygems_hook.rb', line 244

def setup
  self.class.load_rdoc

  raise Gem::FilePermissionError, @doc_dir if
    File.exist?(@doc_dir) and not File.writable?(@doc_dir)

  FileUtils.mkdir_p @doc_dir unless File.exist? @doc_dir
end