method
validate
v2_4_6 -
Show latest stable
-
0 notes -
Class: Specification
- 1_8_6_287
- 1_8_7_72
- 1_8_7_330
- 1_9_1_378
- 1_9_2_180
- 1_9_3_125 (0)
- 1_9_3_392 (0)
- 2_1_10 (0)
- 2_2_9 (0)
- 2_4_6 (0)
- 2_5_5 (0)
- 2_6_3 (0)
- What's this?
Related methods
- Class methods (48)
- add_spec
- add_specs
- all
- _all
- all=
- all_names
- array_attributes
- attribute_names
- _clear_load_cache
- default_stubs
- dirs
- dirs=
- each
- each_gemspec
- each_spec
- each_stub (<= v2_2_9)
- find_active_stub_by_path
- find_all_by_full_name (>= v2_5_5)
- find_all_by_name
- find_by_name
- find_by_path
- find_inactive_by_path
- find_in_unresolved
- find_in_unresolved_tree
- from_yaml
- gemspec_stubs_in
- installed_stubs
- _latest_specs
- latest_specs
- load
- _load
- load_defaults
- map_stubs
- new
- non_nil_attributes
- normalize_yaml_input
- outdated
- outdated_and_latest_version
- remove_spec
- required_attribute?
- required_attributes
- reset
- _resort!
- sort_by!
- stubs
- stubs_for
- uniq_by
- unresolved_deps
- Instance methods (150)
- <=>
- ==
- abbreviate
- activate
- activate_dependencies
- add_bindir
- add_dependency
- add_dependency_with_type
- add_development_dependency
- add_runtime_dependency
- add_self_to_load_path
- author
- author=
- authors
- authors=
- base_dir
- bin_dir
- bin_file
- build_args
- build_extensions
- build_info_dir
- build_info_file
- bundled_gem_in_old_ruby?
- cache_dir
- cache_file
- cache_gem (<= v1_9_3_392)
- check_version_conflict
- conficts_when_loaded_with?
- conflicts
- contains_requirable_file? (<= v1_9_3_392)
- date
- date=
- default_executable
- default_value
- dependencies
- dependencies_to_gemfile (>= v2_6_3)
- dependent_gems
- dependent_specs
- description=
- development_dependencies
- doc_dir
- _dump
- encode_with
- eql?
- executable
- executable=
- executables
- executables=
- extension_dir (>= v2_6_3)
- extensions
- extensions=
- extra_rdoc_files
- extra_rdoc_files=
- file_name
- files
- files=
- find_all_satisfiers
- find_full_gem_path (<= v2_2_9)
- for_cache
- full_gem_path (>= v1_9_3_125)
- full_name
- gem_build_complete_path (<= v2_2_9)
- gem_dir
- gems_dir
- git_version (>= v2_6_3)
- groups (>= v2_6_3)
- has_conflicts?
- hash
- has_rdoc
- has_rdoc=
- has_rdoc?
- has_unit_tests?
- initialize_copy
- init_with
- inspect
- installation_path (<= v1_9_3_392)
- installed_by_version
- installed_by_version=
- internal_init
- invalidate_memoized_attributes
- keep_only_files_and_directo... (>= v2_6_3)
- lib_dirs_glob (<= v2_2_9)
- lib_files
- license
- license=
- licenses
- licenses=
- loaded_from (>= v2_6_3)
- loaded_from= (<= v2_2_9)
- load_paths (>= v2_6_3)
- mark_version
- matches_for_glob (<= v2_2_9)
- method_missing
- missing_extensions?
- name_tuple
- nondevelopment_dependencies (>= v2_6_3)
- normalize
- original_name
- original_platform
- platform
- platform=
- pretty_print
- raise_if_conflicts
- raw_require_paths
- rdoc_options
- rdoc_options=
- required_rubygems_version=
- required_ruby_version=
- requirements
- requirements=
- require_path
- require_path=
- require_paths=
- reset_nil_attributes_to_def...
- respond_to_missing?
- rg_loaded_from (>= v2_6_3)
- ri_dir
- ruby_code
- runtime_dependencies
- same_attributes?
- sanitize
- sanitize_string
- satisfies_requirement?
- sort_obj
- source
- spec_dir
- spec_file
- spec_name
- stubbed?
- summary=
- test_file
- test_file=
- test_files
- test_files=
- test_suite_file (<= v1_9_3_392)
- test_suite_file= (<= v1_9_3_392)
- to_gemfile (>= v2_6_3)
- to_ruby
- to_ruby_for_cache
- to_s
- to_spec
- to_yaml
- traverse
- validate
- validate_dependencies
- validate_metadata (>= v2_5_5)
- validate_permissions
- version=
- warning
- yaml_initialize
= private
= protected
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..
Show source
# File lib/rubygems/specification.rb, line 2649 def validate packaging = true @warnings = 0 require 'rubygems/user_interaction' extend Gem::UserInteraction normalize nil_attributes = self.class.non_nil_attributes.find_all do |attrname| instance_variable_get("@#{attrname}").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 if !name.is_a?(String) then raise Gem::InvalidSpecificationException, "invalid value for attribute name: \"#{name.inspect}\" must be a string" elsif name !~ /[a-zA-Z]/ then raise Gem::InvalidSpecificationException, "invalid value for attribute name: #{name.dump} must include at least one letter" elsif name !~ VALID_NAME_PATTERN then raise Gem::InvalidSpecificationException, "invalid value for attribute name: #{name.dump} can only include letters, numbers, dashes, and underscores" end if raw_require_paths.empty? then raise Gem::InvalidSpecificationException, 'specification must have at least one require_path' end @files.delete_if { |x| File.directory?(x) && !File.symlink?(x) } @test_files.delete_if { |x| File.directory?(x) && !File.symlink?(x) } @executables.delete_if { |x| File.directory?(File.join(@bindir, x)) } @extra_rdoc_files.delete_if { |x| File.directory?(x) && !File.symlink?(x) } @extensions.delete_if { |x| File.directory?(x) && !File.symlink?(x) } non_files = files.reject { |x| File.file?(x) || File.symlink?(x) } unless not packaging or non_files.empty? then raise Gem::InvalidSpecificationException, "[\"#{non_files.join "\", \""}\"] are not files" end if files.include? file_name then raise Gem::InvalidSpecificationException, "#{full_name} contains itself (#{file_name}), check your files list" end unless specification_version.is_a?(Integer) raise Gem::InvalidSpecificationException, 'specification_version must be an Integer (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 unless Hash === metadata raise Gem::InvalidSpecificationException, 'metadata must be a hash' end metadata.keys.each do |k| if !k.kind_of?(String) raise Gem::InvalidSpecificationException, 'metadata keys must be a String' end if k.size > 128 raise Gem::InvalidSpecificationException, "metadata key too large (#{k.size} > 128)" end end metadata.values.each do |k| if !k.kind_of?(String) raise Gem::InvalidSpecificationException, 'metadata values must be a String' end if k.size > 1024 raise Gem::InvalidSpecificationException, "metadata value too large (#{k.size} > 1024)" end end licenses.each { |license| if license.length > 64 raise Gem::InvalidSpecificationException, "each license must be 64 characters or less" end if !Gem::Licenses.match?(license) suggestions = Gem::Licenses.suggestions(license) message = license value '#{license}' is invalid. Use a license identifier fromhttp://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license. message += "Did you mean #{suggestions.map { |s| "'#{s}'"}.join(', ')}?\n" unless suggestions.nil? warning(message) end } warning licenses is empty, but is recommended. Use a license identifier fromhttp://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license. if licenses.empty? validate_permissions # 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 # Make sure a homepage is valid HTTP/HTTPS URI if homepage and not homepage.empty? begin homepage_uri = URI.parse(homepage) unless [URI::HTTP, URI::HTTPS].member? homepage_uri.class raise Gem::InvalidSpecificationException, "\"#{homepage}\" is not a valid HTTP URI" end rescue URI::InvalidURIError raise Gem::InvalidSpecificationException, "\"#{homepage}\" is not a valid HTTP URI" end end # Warnings ]author email homepage summary].each do |attribute| value = self.send attribute warning "no #{attribute} specified" if value.nil? or value.empty? end if description == summary then warning 'description and summary are identical' end # TODO: raise at some given date warning "deprecated autorequire specified" if autorequire executables.each do |executable| executable_path = File.join(bindir, executable) shebang = File.read(executable_path, 2) == '#!' warning "#{executable_path} is missing #! line" unless shebang end files.each do |file| next unless File.symlink?(file) warning "#{file} is a symlink, which is not supported on all platforms" end validate_dependencies true ensure if $! or @warnings > 0 then alert_warning "See http://guides.rubygems.org/specification-reference/ for help" end end