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.



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

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



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

def rdoc_version
  @rdoc_version
end

Instance Attribute Details

#forceObject

Force installation of documentation?



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

def force
  @force
end

#generate_rdocObject

Generate rdoc?



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

def generate_rdoc
  @generate_rdoc
end

#generate_riObject

Generate ri data?



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

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



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

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



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

def self.load_rdoc
  return if @rdoc_version

  require_relative '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



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

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



116
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
# File 'lib/rdoc/rubygems_hook.rb', line 116

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



147
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
# File 'lib/rdoc/rubygems_hook.rb', line 147

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

  setup

  options = nil

  args = @spec.rdoc_options
  args.concat @spec.source_paths
  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
  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.



204
205
206
# File 'lib/rdoc/rubygems_hook.rb', line 204

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

#rdoc_installed?Boolean

Is rdoc documentation installed?

Returns:

  • (Boolean)


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

def rdoc_installed?
  File.exist? @rdoc_dir
end

#removeObject

Removes generated RDoc and ri data

Raises:

  • (Gem::FilePermissionError)


218
219
220
221
222
223
224
225
# File 'lib/rdoc/rubygems_hook.rb', line 218

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)


230
231
232
# File 'lib/rdoc/rubygems_hook.rb', line 230

def ri_installed?
  File.exist? @ri_dir
end

#setupObject

Prepares the spec for documentation generation

Raises:

  • (Gem::FilePermissionError)


237
238
239
240
241
242
243
244
# File 'lib/rdoc/rubygems_hook.rb', line 237

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