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.20.0"
RUBY_DEBUG =

Used to add extra flags to RUBY_FLAGS.

ENV["RUBY_DEBUG"]
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",
  "home" => "homepage_uri",
  "code" => "source_code_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.


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
655
# File 'lib/hoe.rb', line 622

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.{txt,md}").first || "History.txt"
  self.readme_file  ||= Dir.glob("README.{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.


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

def author
  @author
end

#changesObject

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


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

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.


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

def description
  @description
end

#description_sectionsObject

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


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

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.


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

def email
  @email
end

#extra_depsObject

Optional: An array of rubygem dependencies.

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

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

def extra_deps
  @extra_deps
end

#extra_dev_depsObject

Optional: An array of rubygem developer dependencies.


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

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).


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

def extra_rdoc_files
  @extra_rdoc_files
end

#group_nameObject

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


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

def group_name
  @group_name
end

#history_fileObject

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


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

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.


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

def licenses
  @licenses
end

#nameObject

MANDATORY: The name of the release.

Set via Hoe.spec.


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

def name
  @name
end

#post_install_messageObject

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


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

def post_install_message
  @post_install_message
end

#readme_fileObject

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


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

def readme_file
  @readme_file
end

#specObject

The Gem::Specification.


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

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)


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

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.


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

def summary
  @summary
end

#summary_sentencesObject

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


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

def summary_sentences
  @summary_sentences
end

#test_globsObject

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


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

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


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

def urls
  @urls
end

#versionObject

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


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

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)


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

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.


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

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


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
334
# File 'lib/hoe.rb', line 305

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.


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

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.


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

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

.pluginsObject

The list of active plugins.


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

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

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

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


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

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.


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

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.


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
500
# File 'lib/hoe.rb', line 473

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.


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

mc.send :attr_accessor, :include_dirs

#check_for_versionObject

:nodoc:


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

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.


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
566
# File 'lib/hoe.rb', line 512

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.


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

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.


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

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.


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

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)

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

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


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

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_valuesObject

Intuit values from the readme and history files.


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
# File 'lib/hoe.rb', line 660

def intuit_values
  header_re = /^((?:=+|#+) .*)$/
  readme    = File.read_utf(readme_file).split(header_re)[1..-1] rescue ""

  unless readme.empty? then
    sections = Hash[*readme.map { |s|
      s =~ /^[=#]/ ? s.strip.downcase.chomp(":").split.last : s.strip
    }]
    desc     = sections.values_at(*description_sections).join("\n\n")
    summ     = desc.split(/\.\s+/).first(summary_sentences).join(". ")
    urls     = parse_urls(readme[1])

    self.urls        ||= urls
    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.

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

def license name
  self.licenses << name
end

#load_plugin_tasksObject

Load activated plugins by calling their define tasks method.


722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
# File 'lib/hoe.rb', line 722

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.


751
752
753
754
# File 'lib/hoe.rb', line 751

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.


759
760
761
762
763
764
765
766
767
# File 'lib/hoe.rb', line 759

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)

775
776
777
# File 'lib/hoe.rb', line 775

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.


706
707
708
709
710
711
712
713
714
715
716
717
# File 'lib/hoe.rb', line 706

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.


785
786
787
788
# File 'lib/hoe.rb', line 785

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)

800
801
802
# File 'lib/hoe.rb', line 800

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

#post_initializeObject

Finalize configuration


807
808
809
810
811
812
813
814
# File 'lib/hoe.rb', line 807

def post_initialize
  activate_plugin_deps
  intuit_values
  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.


821
822
823
# File 'lib/hoe.rb', line 821

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.


835
836
837
# File 'lib/hoe.rb', line 835

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.


828
829
830
# File 'lib/hoe.rb', line 828

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.


842
843
844
# File 'lib/hoe.rb', line 842

def ruby18!
  require_ruby_version "~> 1.8"
end

#ruby19!Object

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


849
850
851
# File 'lib/hoe.rb', line 849

def ruby19!
  require_ruby_version "~> 1.9"
end

#ruby20!Object

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


856
857
858
# File 'lib/hoe.rb', line 856

def ruby20!
  require_ruby_version "~> 2.0"
end

#ruby21!Object

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


863
864
865
# File 'lib/hoe.rb', line 863

def ruby21!
  require_ruby_version "~> 2.1"
end

#ruby22!Object

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


870
871
872
# File 'lib/hoe.rb', line 870

def ruby22!
  require_ruby_version "~> 2.2"
end

#ruby23!Object

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


877
878
879
# File 'lib/hoe.rb', line 877

def ruby23!
  require_ruby_version "~> 2.3"
end

#run_spec_extrasObject

:nodoc:


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

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.


886
887
888
889
890
891
892
893
894
# File 'lib/hoe.rb', line 886

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.


899
900
901
902
903
904
# File 'lib/hoe.rb', line 899

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)

910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
# File 'lib/hoe.rb', line 910

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