module Nanoc::Core::ContractsSupport

Public Class Methods

enabled?() click to toggle source
# File lib/nanoc/core/contracts_support.rb, line 114
def self.enabled?
  setup_once
end
included(base) click to toggle source
# File lib/nanoc/core/contracts_support.rb, line 118
def self.included(base)
  should_enable = setup_once

  if should_enable
    unless base.include?(::Contracts::Core)
      base.include(::Contracts::Core)
      base.extend(EnabledContracts)
      base.const_set('C', ::Contracts)
    end
  else
    base.extend(DisabledContracts)
    base.const_set('C', DisabledContracts)
  end
end
setup_once() click to toggle source
# File lib/nanoc/core/contracts_support.rb, line 85
def self.setup_once
  @_contracts_support__setup ||= false
  return @_contracts_support__should_enable if @_contracts_support__setup

  @_contracts_support__setup = true

  contracts_loadable =
    begin
      require 'contracts'
      true
    rescue LoadError
      false
    end

  # FIXME: Do something better with contracts on Ruby 3.x
  @_contracts_support__should_enable = contracts_loadable && !RUBY_VERSION.start_with?('3') && !ENV.key?('DISABLE_CONTRACTS')

  if @_contracts_support__should_enable
    # FIXME: ugly
    ::Contracts.const_set('Named', EnabledContracts::Named)
    ::Contracts.const_set('IterOf', EnabledContracts::IterOf)
    ::Contracts.const_set('AbsolutePathString', EnabledContracts::AbsolutePathString)

    warn_about_performance
  end

  @_contracts_support__should_enable
end
warn_about_performance() click to toggle source
# File lib/nanoc/core/contracts_support.rb, line 133
def self.warn_about_performance
  return if ENV.key?('CI')
  return if ENV.key?('NANOC_DEV_MODE')

  puts '-' * 78
  puts 'A NOTE ABOUT PERFORMANCE:'
  puts 'The `contracts` gem is loaded, which enables extra run-time checks, but can drastically reduce Nanoc’s performance. The `contracts` gem is intended for development purposes, and is not recommended for day-to-day Nanoc usage.'
  puts

  if defined?(Bundler)
    puts 'To speed up compilation, remove `contracts` from the Gemfile and run `bundle install`.'
  else
    puts 'To speed up compilation, either uninstall the `contracts` gem, or use Bundler (https://bundler.io/) with a Gemfile that doesn’t include `contracts`.'
  end

  puts '-' * 78
end