Sha256: 899d99cbc4d29cad1ffbef7e1c6cd6f8fdfb00d1cf2db1c014b27cb75cad0904

Contents?: true

Size: 1.91 KB

Versions: 9

Compression:

Stored size: 1.91 KB

Contents

module IMW

  # A collection of classes for describing the metadata associated
  # with a dataset's fields.
  class Metadata < Hash
    
    autoload :Field,       'imw/metadata/field'
    autoload :Schema,      'imw/metadata/schema'
    autoload :Schematized, 'imw/metadata/schematized'
    autoload :DSL,         'imw/metadata/dsl'
    autoload :ContainsMetadata, 'imw/metadata/contains_metadata'

    # The resource this Schema is anchored to.
    #
    # This attribute is useful for letting relative paths in a
    # schema file refer to a common base URL.
    #
    # @return [IMW::Resource]
    attr_reader :base
    
    # Set the resource this Schema is anchored to.
    #
    # @param [IMW::Resource, String, Addressable::URI] new_base
    def base= new_base
      base_resource = IMW.open(new_base)
      base_resource.should_exist!("Metdata base directory must exist")
      raise IMW::PathError.new("Metadata base must be a directory") unless base_resource.is_directory?
      @base = base_resource
    end

    def initialize obj=nil, options={}
      super()
      self.base = options[:base] if options[:base]
      obj.each_pair { |resource, schema| self[resource] = Schema.new(schema) } if obj
    end

    def self.load metadata_resource, options
      resource = IMW.open(metadata_resource)
      new(resource.load, {:base => resource.dirname}.merge(options))
    end

    def []= resource_spec, schema_spec
      schema = schema_spec.is_a?(Schema) ? schema_spec : Schema.new(schema_spec)
      super(absolute_uri(resource_spec), schema_spec)
    end

    def [] resource_spec
      super(absolute_uri(resource_spec))
    end

    def describe? resource_spec
      has_key?(absolute_uri(resource_spec))
    end

    protected

    def absolute_uri resource_spec
      if base && resource_spec.to_s !~ %r{(^/|://)} # relative path
        base.join(resource_spec).to_s
      else
        resource_spec.to_s
      end
    end
    
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
imw-0.2.16 lib/imw/metadata.rb
imw-0.2.15 lib/imw/metadata.rb
imw-0.2.14 lib/imw/metadata.rb
imw-0.2.13 lib/imw/metadata.rb
imw-0.2.12 lib/imw/metadata.rb
imw-0.2.11 lib/imw/metadata.rb
imw-0.2.10 lib/imw/metadata.rb
imw-0.2.9 lib/imw/metadata.rb
imw-0.2.8 lib/imw/metadata.rb