method
validate
v1_9_3_392 -
Show latest stable
- Class:
Gem::Specification
validate(packaging = true)public
Checks that the specification contains all required fields, and does a very basic sanity check.
Raises InvalidSpecificationException if the spec does not pass the checks..
# File lib/rubygems/specification.rb, line 1984
def validate packaging = true
require 'rubygems/user_interaction'
extend Gem::UserInteraction
normalize
nil_attributes = self.class.non_nil_attributes.find_all do |name|
instance_variable_get("@#{name}").nil?
end
unless nil_attributes.empty? then
raise Gem::InvalidSpecificationException,
"#{nil_attributes.join ', '} must not be nil"
end
if packaging and rubygems_version != Gem::VERSION then
raise Gem::InvalidSpecificationException,
"expected RubyGems version #{Gem::VERSION}, was #{rubygems_version}"
end
@@required_attributes.each do |symbol|
unless self.send symbol then
raise Gem::InvalidSpecificationException,
"missing value for attribute #{symbol}"
end
end
unless String === name then
raise Gem::InvalidSpecificationException,
"invalid value for attribute name: \"#{name.inspect}\""
end
if require_paths.empty? then
raise Gem::InvalidSpecificationException,
'specification must have at least one require_path'
end
@files.delete_if { |x| File.directory?(x) }
@test_files.delete_if { |x| File.directory?(x) }
@executables.delete_if { |x| File.directory?(File.join(@bindir, x)) }
@extra_rdoc_files.delete_if { |x| File.directory?(x) }
@extensions.delete_if { |x| File.directory?(x) }
non_files = files.reject { |x| File.file?(x) }
unless not packaging or non_files.empty? then
raise Gem::InvalidSpecificationException,
"[\"#{non_files.join "\", \""}\"] are not files"
end
unless specification_version.is_a?(Fixnum)
raise Gem::InvalidSpecificationException,
'specification_version must be a Fixnum (did you mean version?)'
end
case platform
when Gem::Platform, Gem::Platform::RUBY then # ok
else
raise Gem::InvalidSpecificationException,
"invalid platform #{platform.inspect}, see Gem::Platform"
end
self.class.array_attributes.each do |field|
val = self.send field
klass = case field
when :dependencies
Gem::Dependency
else
String
end
unless Array === val and val.all? { |x| x.kind_of?(klass) } then
raise(Gem::InvalidSpecificationException,
"#{field} must be an Array of #{klass}")
end
end
[:authors].each do |field|
val = self.send field
raise Gem::InvalidSpecificationException, "#{field} may not be empty" if
val.empty?
end
licenses.each { |license|
if license.length > 64
raise Gem::InvalidSpecificationException,
"each license must be 64 characters or less"
end
}
# reject lazy developers:
lazy = '"FIxxxXME" or "TOxxxDO"'.gsub(/xxx/, '')
unless authors.grep(/FI XME|TO DO/).empty? then
raise Gem::InvalidSpecificationException, "#{lazy} is not an author"
end
unless Array(email).grep(/FI XME|TO DO/).empty? then
raise Gem::InvalidSpecificationException, "#{lazy} is not an email"
end
if description =~ /FI XME|TO DO/ then
raise Gem::InvalidSpecificationException, "#{lazy} is not a description"
end
if summary =~ /FI XME|TO DO/ then
raise Gem::InvalidSpecificationException, "#{lazy} is not a summary"
end
if homepage and not homepage.empty? and
homepage !~ /\A[a-z][a-z\d+.-]*:/ then
raise Gem::InvalidSpecificationException,
"\"#{homepage}\" is not a URI"
end
# Warnings
]author description email homepage summary].each do |attribute|
value = self.send attribute
alert_warning "no #{attribute} specified" if value.nil? or value.empty?
end
if description == summary then
alert_warning 'description and summary are identical'
end
# TODO: raise at some given date
alert_warning "deprecated autorequire specified" if autorequire
executables.each do |executable|
executable_path = File.join(bindir, executable)
shebang = File.read(executable_path, 2) == '#!'
alert_warning "#{executable_path} is missing #! line" unless shebang
end
true
end Related methods
- Instance methods
- <=>
- ==
- _dump
- activate
- activate_dependencies
- add_bindir
- add_dependency
- add_development_dependency
- add_runtime_dependency
- add_self_to_load_path
- author
- author=
- authors
- authors=
- base_dir
- bin_dir
- bin_file
- cache_dir
- cache_file
- cache_gem
- conflicts
- contains_requirable_file?
- date
- date=
- default_executable
- default_value
- dependencies
- dependent_gems
- dependent_specs
- description=
- development_dependencies
- doc_dir
- encode_with
- eql?
- executable
- executable=
- executables
- executables=
- extensions
- extensions=
- extra_rdoc_files
- extra_rdoc_files=
- file_name
- files
- files=
- for_cache
- full_gem_path
- full_name
- gem_dir
- gems_dir
- has_rdoc
- has_rdoc=
- has_rdoc?
- has_unit_tests?
- hash
- init_with
- initialize_copy
- installation_path
- lib_dirs_glob
- lib_files
- license
- license=
- licenses
- licenses=
- loaded_from=
- mark_version
- matches_for_glob
- method_missing
- normalize
- original_name
- original_platform
- platform
- platform=
- pretty_print
- raise_if_conflicts
- rdoc_options
- rdoc_options=
- require_path
- require_path=
- required_ruby_version=
- required_rubygems_version=
- requirements
- requirements=
- ri_dir
- runtime_dependencies
- satisfies_requirement?
- sort_obj
- spec_dir
- spec_file
- spec_name
- summary=
- test_file
- test_file=
- test_files
- test_files=
- test_suite_file
- test_suite_file=
- to_ruby
- to_ruby_for_cache
- to_s
- to_yaml
- traverse
- validate
- version=
- yaml_initialize
- Class methods
- _all
- _load
- _resort!
- add_spec
- add_specs
- all
- all=
- all_names
- array_attributes
- attribute_names
- dirs
- dirs=
- each
- find_all_by_name
- find_by_name
- find_by_path
- find_in_unresolved
- find_in_unresolved_tree
- from_yaml
- latest_specs
- load
- new
- non_nil_attributes
- normalize_yaml_input
- outdated
- remove_spec
- required_attribute?
- required_attributes
- reset
- Private methods
-
add_dependency_with_type -
find_all_satisfiers -
ruby_code -
same_attributes?