Class: Hoe

Inherits:
Object
  • Object
show all
Includes:
Rake::DSL
Defined in:
lib/hoe.rb

Overview

Hoe is a simple rake/rubygems helper for project Rakefiles. It helps generate rubygems and includes a dynamic plug-in system allowing for easy extensibility. Hoe ships with plug-ins for all your usual project tasks including rdoc generation, testing, packaging, and deployment.

Using Hoe

Basics

Sow generates a new project from scratch. Sow uses a simple ERB templating system allowing you to capture patterns common to your projects. Run ‘sow` and then see ~/.hoe_template for more info:

% sow project_name
...
% cd project_name

and have at it.

Extra Configuration Options:

Hoe maintains a config file for cross-project values. The file is located at ~/.hoerc. The file is a YAML formatted config file with the following settings (extended by plugins):

exclude

A regular expression of files to exclude from check_manifest.

Run `rake config_hoe` and see ~/.hoerc for examples.

Extending Hoe

Hoe can be extended via its plugin system. Hoe searches out all installed files matching 'hoe/*.rb' and loads them. Those files are expected to define a module matching the file name. The module must define a define task method and can optionally define an initialize method. Both methods must be named to match the file. eg

module Hoe::Blah
  def initialize_blah # optional
    # ...
  end

  def define_blah_tasks
    # ...
  end
end

Hoe Plugin Loading Sequence

Hoe.spec
  Hoe.load_plugins
    require
  activate_plugins
    extend plugin_module
    initialize_plugins
      initialize_XXX
    activate_plugin_deps
      activate_XXX_deps
  yield spec
  post_initialize
    define_spec # gemspec, not hoespec
    load_plugin_tasks
    add_dependencies

Defined Under Namespace

Modules: Clean, Compiler, Debug, Deps, Flay, Flog, GemPreludeSucks, Gemcutter, Inline, Newb, Package, Publish, RCov, Racc, Rdoc, Signing, Test

Constant Summary collapse

VERSION =

duh

"3.22.1"
RUBY_DEBUG =

Used to add extra flags to RUBY_FLAGS.

RUBY_FLAGS =

Used to specify flags to ruby [has smart default].

ENV["RUBY_FLAGS"] || default_ruby_flags
URLS_TO_META_MAP =

Map from the commonly used url names to gemspec’s metadata keys See guides.rubygems.org/specification-reference/#metadata

{
  "bugs" => "bug_tracker_uri",
  "clog" => "changelog_uri",
  "doco" => "documentation_uri",
  "docs" => "documentation_uri",
  "home" => "homepage_uri",
  "code" => "source_code_uri",
  "wiki" => "wiki_uri",
  "mail" => "mailing_list_uri",
}
DEFAULT_CONFIG =

Default configuration values for .hoerc. Plugins should populate this on load.

{
  "exclude" => /\/tmp\/|CVS|\.svn|\.git|TAGS|extconf.h|\.bundle$|\.o$|\.log$/,
}
WINDOZE =

True if you’re a masochistic developer. Used for building commands.

RbConfig::CONFIG["host_os"] =~ /mswin|mingw/
@@plugins =
[:clean, :debug, :deps, :flay, :flog, :newb, :package,
:publish, :gemcutter, :signing, :test]

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, version = nil) ⇒ Hoe

Create a newly initialized hoe spec.



621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
# File 'lib/hoe.rb', line 621

def initialize name, version = nil # :nodoc:
  self.name                 = name
  self.version              = version

  self.author               = []
  self.changes              = nil
  self.description          = nil
  self.description_sections = %w[description]
  self.email                = []
  self.extra_deps           = []
  self.extra_dev_deps       = []
  self.extra_rdoc_files     = []
  self.licenses             = []
  self.post_install_message = nil
  self.group_name           = name.downcase
  self.spec                 = nil
  self.spec_extras          = {}
  self.summary              = nil
  self.summary_sentences    = 1
  self.test_globs           = ["test/**/{test,spec}_*.rb",
                               "test/**/*_{test,spec}.rb"]

  manifest = read_manifest

  if manifest then
    self.readme_file  = manifest.grep(/^README\./).first
    self.history_file = manifest.grep(/^History\./).first
  end

  self.history_file ||= Dir.glob("History.{rdoc,txt,md}").first || "History.txt"
  self.readme_file  ||= Dir.glob("README.{rdoc,txt,md}").first || "README.txt"

  abort "Hoe.new {...} removed. Switch to Hoe.spec." if block_given?
end

Instance Attribute Details

#authorObject

MANDATORY: The author(s) of the package. (can be array)

Use the #developer method to fill in both author and email cleanly.



143
144
145
# File 'lib/hoe.rb', line 143

def author
  @author
end

#changesObject

Optional: A description of the release’s latest changes. Auto-populates to the top entry of History.txt.



149
150
151
# File 'lib/hoe.rb', line 149

def changes
  @changes
end

#descriptionObject

Optional: A description of the project. Auto-populates from the first paragraph of the DESCRIPTION section of README.txt.

See also: Hoe#summary and Hoe.paragraphs_of.



157
158
159
# File 'lib/hoe.rb', line 157

def description
  @description
end

#description_sectionsObject

Optional: What sections from the readme to use for auto-description. Defaults to %w(description).



163
164
165
# File 'lib/hoe.rb', line 163

def description_sections
  @description_sections
end

#emailObject

MANDATORY: The author’s email address(es). (can be array)

Use the #developer method to fill in both author and email cleanly.



170
171
172
# File 'lib/hoe.rb', line 170

def email
  @email
end

#extra_depsObject

Optional: An array of rubygem dependencies.

extra_deps << ['blah', '~> 1.0']


177
178
179
# File 'lib/hoe.rb', line 177

def extra_deps
  @extra_deps
end

#extra_dev_depsObject

Optional: An array of rubygem developer dependencies.



182
183
184
# File 'lib/hoe.rb', line 182

def extra_dev_deps
  @extra_dev_deps
end

#extra_rdoc_filesObject

Optional: Extra files you want to add to RDoc.

.txt files are automatically included (excluding the obvious).



189
190
191
# File 'lib/hoe.rb', line 189

def extra_rdoc_files
  @extra_rdoc_files
end

#group_nameObject

Optional: The name of the group authoring the project. [default: name.downcase]



223
224
225
# File 'lib/hoe.rb', line 223

def group_name
  @group_name
end

#history_fileObject

Optional: The filename for the project history. [default: History.txt]



194
195
196
# File 'lib/hoe.rb', line 194

def history_file
  @history_file
end

#licensesObject

Optional: An array containing the license(s) under which this gem is released.

Warns and defaults to “MIT” if not set.



201
202
203
# File 'lib/hoe.rb', line 201

def licenses
  @licenses
end

#nameObject

MANDATORY: The name of the release.

Set via Hoe.spec.



208
209
210
# File 'lib/hoe.rb', line 208

def name
  @name
end

#post_install_messageObject

Optional: A post-install message to be displayed when gem is installed.



213
214
215
# File 'lib/hoe.rb', line 213

def post_install_message
  @post_install_message
end

#readme_fileObject

Optional: The filename for the project readme. [default: README.txt]



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

def readme_file
  @readme_file
end

#specObject

The Gem::Specification.



228
229
230
# File 'lib/hoe.rb', line 228

def spec
  @spec
end

#spec_extrasObject

Optional: A hash of extra values to set in the gemspec. Value may be a proc.

spec_extras[:required_rubygems_version] = '>= 1.3.2'

(tho, see #pluggable! if that’s all you want to do)



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

def spec_extras
  @spec_extras
end

#summaryObject

Optional: A short summary of the project. Auto-populates from the first sentence of the description.

See also: Hoe#description and Hoe.paragraphs_of.



245
246
247
# File 'lib/hoe.rb', line 245

def summary
  @summary
end

#summary_sentencesObject

Optional: Number of sentences from description for summary. Defaults to 1.



250
251
252
# File 'lib/hoe.rb', line 250

def summary_sentences
  @summary_sentences
end

#test_globsObject

Optional: An array of test file patterns [default: test/*/test_.rb]



255
256
257
# File 'lib/hoe.rb', line 255

def test_globs
  @test_globs
end

#urlsObject

Optional: The urls of the project. This can be an array or (preferably) a hash. Auto-populates to the urls read from the beginning of README.txt.

See parse_urls for more details



264
265
266
# File 'lib/hoe.rb', line 264

def urls
  @urls
end

#versionObject

MANDATORY: The version. Don’t hardcode! use a constant in the project.



269
270
271
# File 'lib/hoe.rb', line 269

def version
  @version
end

Class Method Details

.add_include_dirs(*dirs) ⇒ Object

Add extra dirs to both $: and RUBY_FLAGS (for test runs and rakefile deps)



284
285
286
287
288
289
290
# File 'lib/hoe.rb', line 284

def self.add_include_dirs(*dirs)
  dirs = dirs.flatten
  include_dirs.concat dirs
  $:.unshift(*dirs)
  s = File::PATH_SEPARATOR
  RUBY_FLAGS.sub!(/-I/, "-I#{dirs.join(s)}#{s}")
end

.bad_pluginsObject

Returns plugins that could not be loaded by Hoe.load_plugins.



295
296
297
# File 'lib/hoe.rb', line 295

def self.bad_plugins
  @bad_plugins
end

.load_plugins(plugins = Hoe.plugins) ⇒ Object

Find and load all plugin files.

It is called at the end of hoe.rb



304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
# File 'lib/hoe.rb', line 304

def self.load_plugins plugins = Hoe.plugins
  @found  ||= {}
  @loaded ||= {}
  @files  ||= Gem.find_files "hoe/*.rb"

  @files.reverse.each do |path| # reverse so first one wins
    @found[File.basename(path, ".rb").intern] = path
  end

  :keep_doing_this while @found.map { |name, plugin|
    next unless plugins.include? name
    next if @loaded[name]
    begin
      warn "loading #{plugin}" if $DEBUG
      @loaded[name] = require plugin
    rescue LoadError => e
      warn "error loading #{plugin.inspect}: #{e.message}. skipping..."
    end
  }.any?

  bad_plugins = plugins - @loaded.keys
  bad_plugins.each do |bad_plugin|
    plugins.delete bad_plugin
  end

  @bad_plugins.concat bad_plugins
  @bad_plugins.uniq!

  return @loaded, @found
end

.normalize_names(project) ⇒ Object

Normalize a project name into the project, file, klass and test names that follow Ruby package naming guidelines.

Project names are lowercase with _ separating package parts and - separating extension parts.

File names are lowercase with _ separating pacagke parts and / separating extension parts. net-http-persistent becomes net/http/persistent.

Klass names are CamelCase with

separating extension parts.

Test klass names are same as Klass with Test prepended to each part.



349
350
351
352
353
354
355
356
357
# File 'lib/hoe.rb', line 349

def self.normalize_names project # :nodoc:
  project    = project.gsub(/([A-Z])/, '_\1').downcase.sub(/^_/, "")
  klass      = project.gsub(/(?:^|_)([a-z])/) { $1.upcase }
  klass      = klass.  gsub(/(?:^|-)([a-z])/) { "::#{$1.upcase}" }
  test_klass = klass.  gsub(/(^|::)([A-Z])/) { "#{$1}Test#{$2}" }
  file_name  = project.gsub(/-/, "/")

  return project, file_name, klass, test_klass
end

.plugin(*plugins) ⇒ Object

Activates plugins. If a plugin cannot be loaded it will be ignored.

Plugins may also be activated through a plugins array in ~/.hoerc. This should only be used for plugins that aren’t critical to your project and plugins that you want to use on other projects.



367
368
369
370
# File 'lib/hoe.rb', line 367

def self.plugin *plugins
  self.plugins.concat plugins
  self.plugins.uniq!
end

.pluginsObject

The list of active plugins.



375
376
377
# File 'lib/hoe.rb', line 375

def self.plugins
  @@plugins
end

.spec(name, &block) ⇒ Object

Execute the Hoe DSL to define your project’s Hoe specification (which interally creates a gem specification). All hoe attributes and methods are available within block. Eg:

Hoe.spec name do
  # ... project specific data ...
end


388
389
390
391
392
393
394
395
396
# File 'lib/hoe.rb', line 388

def self.spec name, &block
  Hoe.load_plugins

  spec = self.new name
  spec.activate_plugins
  spec.instance_eval(&block)
  spec.post_initialize
  spec # TODO: remove?
end

Instance Method Details

#activate_plugin_depsObject

Run all activate_*_deps methods for plugins



436
437
438
439
440
441
442
# File 'lib/hoe.rb', line 436

def activate_plugin_deps
  Hoe.plugins.each do |plugin|
    msg = "activate_#{plugin}_deps"
    warn msg if $DEBUG
    send msg if self.respond_to? msg
  end
end

#activate_pluginsObject

Activate plugin modules and add them to the current instance.



401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
# File 'lib/hoe.rb', line 401

def activate_plugins
  with_config do |config, _|
    config_plugins = config["plugins"]
    break unless config_plugins
    Hoe.plugins.concat config_plugins.map(&:intern)
  end

  Hoe.load_plugins Hoe.plugins

  names = Hoe.constants.map(&:to_s)
  names.reject! { |n| n =~ /^[A-Z_]+$/ }

  names.each do |name|
    next unless Hoe.plugins.include? name.downcase.intern
    warn "extend #{name}" if $DEBUG
    self.extend Hoe.const_get(name)
  end

  initialize_plugins
end

#add_dependenciesObject

Add standard and user defined dependencies to the spec.



472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
# File 'lib/hoe.rb', line 472

def add_dependencies
  self.extra_deps     = normalize_deps extra_deps
  self.extra_dev_deps = normalize_deps extra_dev_deps

  case name
  when "hoe" then
    dependency "rake", [">= 0.8", "< 13.0"]
  else
    version = VERSION.split(/\./).first(2).join(".")
    dependency "hoe", "~> #{version}", :development
  end

  seen = {}

  extra_deps.each do |dep|
    next if seen[dep.first]
    seen[dep.first] = true

    spec.add_dependency(*dep)
  end

  extra_dev_deps.each do |dep|
    next if seen[dep.first]
    seen[dep.first] = true

    spec.add_development_dependency(*dep)
  end
end

#attr_accessorObject

Optional: Extra directories to use (eg for test runs). See Hoe.add_include_dirs.



279
# File 'lib/hoe.rb', line 279

mc.send :attr_accessor, :include_dirs

#check_for_versionObject

:nodoc:



567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
# File 'lib/hoe.rb', line 567

def check_for_version # :nodoc:
  return if self.version

  version    = nil
  version_re = /VERSION += +([\"\'])([\d][\w\.]+)\1/

  spec.files.each do |file|
    next unless File.exist? file
    version = File.read_utf(file)[version_re, 2] rescue nil
    break if version
  end

  spec.version = self.version = version if version

  unless self.version then
    spec.version = self.version = "0.borked"
    warn "** Add 'VERSION = \"x.y.z\"' to your code,"
    warn "   add a version to your hoe spec,"
    warn "   or fix your Manifest.txt"
  end
end

#define_specObject

Define the Gem::Specification.



511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
# File 'lib/hoe.rb', line 511

def define_spec
  self.spec = Gem::Specification.new do |s|
    dirs = Dir["lib"]

    manifest = read_manifest

    abort [
           "Manifest is missing or couldn't be read.",
           "The Manifest is kind of a big deal.",
           "Maybe you're using a gem packaged by a linux project.",
           "It seems like they enjoy breaking other people's code.",
           ].join "\n" unless manifest

    s.name                 = name
    s.version              = version if version
    s.summary              = summary
    s.email                = email
    s.homepage             = urls["home"] || urls.values.first
    s.description          = description
    s.files                = manifest
    s.executables          = s.files.grep(/^bin/) { |f| File.basename(f) }
    s.bindir               = "bin"
    s.require_paths        = dirs unless dirs.empty?
    s.rdoc_options         = ["--main", readme_file]
    s.post_install_message = post_install_message
    s.             = (urls.keys & URLS_TO_META_MAP.keys).map { |name|
      [URLS_TO_META_MAP[name], urls[name]]
    }.to_h

    missing "Manifest.txt" if s.files.empty?

    case author
    when Array
      s.authors = author
    else
      s.author  = author
    end

    s.extra_rdoc_files += s.files.grep(/\.(txt|rdoc|md)$/)
    s.extra_rdoc_files.reject! { |f| f =~ %r%^(test|spec|vendor|template|data|tmp)/% }
    s.extra_rdoc_files += @extra_rdoc_files
  end

  check_for_version

  if licenses.empty?
    warn "Defaulting gemspec to MIT license."
    warn "Call license in hoe spec to change."
    license "MIT"
  end

  spec.licenses = licenses

  run_spec_extras
end

#dependency(name, version, type = :runtime) ⇒ Object

Add a dependency declaration to your spec. Pass :dev to type for developer dependencies.



456
457
458
459
460
461
462
463
464
465
466
467
# File 'lib/hoe.rb', line 456

def dependency name, version, type = :runtime
  raise "Unknown dependency type: #{type}" unless
    [:runtime, :dev, :development, :developer].include? type

  ary = if type == :runtime then
          extra_deps
        else
          extra_dev_deps
        end

  ary << [name, version]
end

#dependency_targetObject

Returns the proper dependency list for the thingy.



504
505
506
# File 'lib/hoe.rb', line 504

def dependency_target
  self.name == "hoe" ? extra_deps : extra_dev_deps
end

#developer(name, email) ⇒ Object

Convenience method to set add to both the author and email fields.



604
605
606
607
# File 'lib/hoe.rb', line 604

def developer name, email
  self.author << name
  self.email  << email
end

#have_gem?(name) ⇒ Boolean

Returns true if the gem name is installed.

Returns:

  • (Boolean)


612
613
614
615
616
# File 'lib/hoe.rb', line 612

def have_gem? name
  Gem::Specification.find_by_name name.to_s
rescue Gem::LoadError
  false
end

#initialize_pluginsObject

Run all initialize_* methods for plugins



425
426
427
428
429
430
431
# File 'lib/hoe.rb', line 425

def initialize_plugins
  Hoe.plugins.each do |plugin|
    msg = "initialize_#{plugin}"
    warn msg if $DEBUG
    send msg if self.respond_to? msg
  end
end

#intuit_values(input) ⇒ Object

Intuit values from the readme and history files.



659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
# File 'lib/hoe.rb', line 659

def intuit_values input
  readme = input
             .lines
             .chunk { |l| l[/^(?:=+|#+)/] || "" }
             .map(&:last)
             .each_slice(2)
             .map { |k, v|
                kp = k.join
                kp = kp.strip.chomp(":").split.last.downcase if k.size == 1
                [kp, v.join.strip]
              }
             .to_h

  unless readme.empty? then
    desc     = readme.values_at(*description_sections).join("\n\n")
    summ     = desc.split(/\.\s+/).first(summary_sentences).join(". ")

    self.urls        ||= parse_urls(readme.values.first)
    self.description ||= desc
    self.summary     ||= summ
  else
    missing readme_file
  end

  self.changes ||= begin
                     h = File.read_utf(history_file)
                     h.split(/^(={2,}|\#{2,})/)[1..2].join.strip
                   rescue
                     missing history_file
                     ""
                   end
end

#license(name) ⇒ Object

Specify a license for your gem.

Call it multiple times if you are releasing under multiple licenses.


448
449
450
# File 'lib/hoe.rb', line 448

def license name
  self.licenses << name
end

#load_plugin_tasksObject

Load activated plugins by calling their define tasks method.



726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
# File 'lib/hoe.rb', line 726

def load_plugin_tasks
  bad = []

  $plugin_max = self.class.plugins.map { |s| s.to_s.size }.max

  self.class.plugins.each do |plugin|
    warn "define: #{plugin}" if $DEBUG

    old_tasks = Rake::Task.tasks.dup

    begin
      send "define_#{plugin}_tasks"
    rescue NoMethodError
      warn "warning: couldn't activate the #{plugin} plugin, skipping"

      bad << plugin
      next
    end

    (Rake::Task.tasks - old_tasks).each do |task|
      task.plugin = plugin
    end
  end
  @@plugins -= bad
end

#missing(name) ⇒ Object

Bitch about a file that is missing data or unparsable for intuiting values.



755
756
757
758
# File 'lib/hoe.rb', line 755

def missing name
  warn "** #{name} is missing or in the wrong format for auto-intuiting."
  warn "   run `sow blah` and look at its text files"
end

#normalize_deps(deps) ⇒ Object

Normalize the dependencies.



763
764
765
766
767
768
769
770
771
# File 'lib/hoe.rb', line 763

def normalize_deps deps
  deps = Array(deps)

  deps.each do |o|
    abort "ERROR: Add '~> x.y' to the '#{o}' dependency." if String === o
  end

  deps
end

#paragraphs_of(path, *paragraphs) ⇒ Object

Reads a file at path and spits out an array of the paragraphs specified.

changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
summary, *description = p.paragraphs_of('README.txt', 3, 3..8)


779
780
781
# File 'lib/hoe.rb', line 779

def paragraphs_of path, *paragraphs
  File.read_utf(path).delete("\r").split(/\n\n+/).values_at(*paragraphs)
end

#parse_urls(text) ⇒ Object

Parse the urls section of the readme file. Returns a hash or an array depending on the format of the section.

label1 :: url1
label2 :: url2
label3 :: url3

vs:

* url1
* url2
* url3

The hash format is preferred as it will be used to populate gem metadata. The array format will work, but will warn that you should update the readme.



710
711
712
713
714
715
716
717
718
719
720
721
# File 'lib/hoe.rb', line 710

def parse_urls text
  lines = text.gsub(/^\* /, "").delete("<>").split(/\n/).grep(/\S+/)

  if lines.first =~ /::/ then
    Hash[lines.map { |line| line.split(/\s*::\s*/) }]
  else
    warn "DEPRECATED: Please switch readme to hash format for urls."
    warn "  Only defining 'home' url."
    warn "  This will be removed on or after 2020-10-28."
    { "home" => lines.first }
  end
end

#pluggable!Object

Tell the world you’re a pluggable package (ie you require rubygems 1.3.1+)

This uses require_rubygems_version. Last one wins. Make sure you account for that.



789
790
791
792
# File 'lib/hoe.rb', line 789

def pluggable!
  abort "update rubygems to >= 1.3.1" unless  Gem.respond_to? :find_files
  require_rubygems_version ">= 1.3.1"
end

#plugin?(name) ⇒ Boolean

Is a plugin activated? Used for guarding missing plugins in your hoe spec:

Hoe.spec "blah" do
  if plugin? :enhancement then
    self.enhancement = true # or whatever...
  end
end

Returns:

  • (Boolean)


804
805
806
# File 'lib/hoe.rb', line 804

def plugin? name
  self.class.plugins.include? name
end

#post_initializeObject

Finalize configuration



811
812
813
814
815
816
817
818
# File 'lib/hoe.rb', line 811

def post_initialize
  activate_plugin_deps
  intuit_values File.read_utf readme_file if readme_file
  validate_fields
  define_spec
  load_plugin_tasks
  add_dependencies
end

#read_manifestObject

Reads Manifest.txt and returns an Array of lines in the manifest.

Returns nil if no manifest was found.



825
826
827
# File 'lib/hoe.rb', line 825

def read_manifest
  File.read_utf("Manifest.txt").split(/\r?\n\r?/) rescue nil
end

#require_ruby_version(*versions) ⇒ Object

Declare that your gem requires a specific ruby version. Last one wins.



839
840
841
# File 'lib/hoe.rb', line 839

def require_ruby_version *versions
  spec_extras[:required_ruby_version] = versions
end

#require_rubygems_version(*versions) ⇒ Object

Declare that your gem requires a specific rubygems version. Last one wins.



832
833
834
# File 'lib/hoe.rb', line 832

def require_rubygems_version *versions
  spec_extras[:required_rubygems_version] = versions
end

#ruby18!Object

Declare that this gem requires ruby to be in the 1.8+ family.



846
847
848
# File 'lib/hoe.rb', line 846

def ruby18!
  require_ruby_version "~> 1.8"
end

#ruby19!Object

Declare that this gem requires ruby to be in the 1.9 family.



853
854
855
# File 'lib/hoe.rb', line 853

def ruby19!
  require_ruby_version "~> 1.9"
end

#ruby20!Object

Declare that this gem requires ruby to be in the 2.0+ family.



860
861
862
# File 'lib/hoe.rb', line 860

def ruby20!
  require_ruby_version "~> 2.0"
end

#ruby21!Object

Declare that this gem requires ruby to be in the 2.1+ family.



867
868
869
# File 'lib/hoe.rb', line 867

def ruby21!
  require_ruby_version "~> 2.1"
end

#ruby22!Object

Declare that this gem requires ruby to be in the 2.2+ family.



874
875
876
# File 'lib/hoe.rb', line 874

def ruby22!
  require_ruby_version "~> 2.2"
end

#ruby23!Object

Declare that this gem requires ruby to be in the 2.3+ family.



881
882
883
# File 'lib/hoe.rb', line 881

def ruby23!
  require_ruby_version "~> 2.3"
end

#run_spec_extrasObject

:nodoc:



589
590
591
592
593
594
595
596
597
598
599
# File 'lib/hoe.rb', line 589

def run_spec_extras # :nodoc:
  # Do any extra stuff the user wants
  self.spec_extras.each do |msg, val|
    case val
    when Proc
      val.call spec.send(msg)
    else
      spec.send "#{msg}=", val
    end
  end
end

#timebomb(n, m, finis = nil, start = nil) ⇒ Object

Provide a linear degrading value from n to m over start to finis dates. If not provided, start and finis will default to 1/1 and 12/31 of the current year.



890
891
892
893
894
895
896
897
898
# File 'lib/hoe.rb', line 890

def timebomb n, m, finis = nil, start = nil
  require "time"
  finis = Time.parse(finis || "#{Time.now.year}-12-31")
  start = Time.parse(start || "#{Time.now.year}-01-01")
  rest  = (finis - Time.now)
  full  = (finis - start)

  [((n - m) * rest / full).to_i + m, m].max
end

#validate_fieldsObject

Verify that mandatory fields are set.



903
904
905
906
907
908
# File 'lib/hoe.rb', line 903

def validate_fields
  %w[email author].each do |field|
    value = self.send(field)
    abort "Hoe #{field} value not set. aborting" if value.nil? or value.empty?
  end
end

#with_config {|config, rc| ... } ⇒ Object

Loads ~/.hoerc, merges it with a .hoerc in the current pwd (if any) and yields the configuration and its path

Yields:

  • (config, rc)


914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
# File 'lib/hoe.rb', line 914

def with_config
  config = Hoe::DEFAULT_CONFIG

  rc = File.expand_path("~/.hoerc")
  exists = File.exist? rc
  homeconfig = exists ? YAML.load_file(rc) : {}

  config = config.merge homeconfig

  localrc = File.join Dir.pwd, ".hoerc"
  exists = File.exist? localrc
  localconfig = exists ? YAML.load_file(localrc) : {}

  config = config.merge localconfig

  yield config, rc
end