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, Signing, Test

Constant Summary

VERSION =

duh

"3.10.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
DEFAULT_CONFIG =

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

{
  "exclude" => /tmp$|CVS|\.svn|TAGS|extconf.h|\.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.



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 623

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

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

  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.



132
133
134
# File 'lib/hoe.rb', line 132

def author
  @author
end

#changesObject

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



138
139
140
# File 'lib/hoe.rb', line 138

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.



146
147
148
# File 'lib/hoe.rb', line 146

def description
  @description
end

#description_sectionsObject

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



152
153
154
# File 'lib/hoe.rb', line 152

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.



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

def email
  @email
end

#extra_depsObject

Optional: An array of rubygem dependencies.

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


166
167
168
# File 'lib/hoe.rb', line 166

def extra_deps
  @extra_deps
end

#extra_dev_depsObject

Optional: An array of rubygem developer dependencies.



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

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



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

def extra_rdoc_files
  @extra_rdoc_files
end

#group_nameObject

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



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

def group_name
  @group_name
end

#history_fileObject

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



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

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.



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

def licenses
  @licenses
end

#nameObject

MANDATORY: The name of the release.

Set via Hoe.spec.



197
198
199
# File 'lib/hoe.rb', line 197

def name
  @name
end

#post_install_messageObject

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



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

def post_install_message
  @post_install_message
end

#readme_fileObject

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



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

def readme_file
  @readme_file
end

#specObject

The Gem::Specification.



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

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)



226
227
228
# File 'lib/hoe.rb', line 226

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.



234
235
236
# File 'lib/hoe.rb', line 234

def summary
  @summary
end

#summary_sentencesObject

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



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

def summary_sentences
  @summary_sentences
end

#test_globsObject

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



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

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



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

def urls
  @urls
end

#versionObject

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



276
277
278
# File 'lib/hoe.rb', line 276

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)



281
282
283
284
285
286
# File 'lib/hoe.rb', line 281

def self.add_include_dirs(*dirs)
  dirs = dirs.flatten
  $:.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.



291
292
293
# File 'lib/hoe.rb', line 291

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



300
301
302
303
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
# File 'lib/hoe.rb', line 300

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

  @files.reverse.each do |path|
    @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.



345
346
347
348
349
350
351
352
353
# File 'lib/hoe.rb', line 345

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.



363
364
365
366
# File 'lib/hoe.rb', line 363

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

.pluginsObject

The list of active plugins.



371
372
373
# File 'lib/hoe.rb', line 371

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


384
385
386
387
388
389
390
391
392
# File 'lib/hoe.rb', line 384

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



433
434
435
436
437
438
439
# File 'lib/hoe.rb', line 433

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.



397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
# File 'lib/hoe.rb', line 397

def activate_plugins
  with_config do |config, _|
    config_plugins = config['plugins']
    break unless config_plugins
    Hoe.plugins.concat config_plugins.map { |plugin| plugin.intern }
  end

  Hoe.load_plugins Hoe.plugins

  names = Hoe.constants.map { |s| s.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
  activate_plugin_deps
end

#add_dependenciesObject

Add standard and user defined dependencies to the spec.



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

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", "< 11.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

#check_for_versionObject

:nodoc:



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

def check_for_version # :nodoc:
  unless self.version then
    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
end

#define_specObject

Define the Gem::Specification.



508
509
510
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
566
567
# File 'lib/hoe.rb', line 508

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             = case urls
                             when Hash then
                               urls["home"] || urls.values.first
                             when Array then
                               urls.first
                             else
                               raise "unknown urls format: #{urls.inspect}"
                             end
    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.test_files           = Dir[*self.test_globs].uniq

    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.



453
454
455
456
457
458
459
460
461
462
463
464
# File 'lib/hoe.rb', line 453

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.



501
502
503
# File 'lib/hoe.rb', line 501

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.



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

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

#have_gem?(name) ⇒ Boolean

Returns true if the gem name is installed.



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

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



422
423
424
425
426
427
428
# File 'lib/hoe.rb', line 422

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.



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

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.


445
446
447
# File 'lib/hoe.rb', line 445

def license name
  self.licenses << name
end

#load_plugin_tasksObject

Load activated plugins by calling their define tasks method.



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

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.



748
749
750
751
# File 'lib/hoe.rb', line 748

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.



756
757
758
759
760
761
762
763
764
# File 'lib/hoe.rb', line 756

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)


772
773
774
# File 'lib/hoe.rb', line 772

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.



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

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



782
783
784
785
# File 'lib/hoe.rb', line 782

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


797
798
799
# File 'lib/hoe.rb', line 797

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

#post_initializeObject

Finalize configuration



804
805
806
807
808
809
810
# File 'lib/hoe.rb', line 804

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



817
818
819
# File 'lib/hoe.rb', line 817

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.



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

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.



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

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

#run_spec_extrasObject

:nodoc:



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

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.



840
841
842
843
844
845
846
847
848
# File 'lib/hoe.rb', line 840

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

#urlObject

Deprecated: Optional: The url(s) of the project. (can be array). Auto-populates to a list of urls read from the beginning of README.txt.



252
253
254
255
256
# File 'lib/hoe.rb', line 252

def url
  warn "NOTE: Hoe#url is deprecated, use urls. It will be removed on or after 2012-06-01."
  warn "Used from #{caller.first}"
  @url
end

#url=(o) ⇒ Object

:nodoc:



258
259
260
261
262
# File 'lib/hoe.rb', line 258

def url=o # :nodoc:
  warn "NOTE: Hoe#url= is deprecated, use urls=. It will be removed on or after 2012-06-01."
  warn "Used from #{caller.first}"
  @url=o
end

#validate_fieldsObject

Verify that mandatory fields are set.



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

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)


864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
# File 'lib/hoe.rb', line 864

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