module FedoraLens::Lenses

Public Class Methods

as_dom() click to toggle source
# File lib/fedora_lens/lenses.rb, line 87
def as_dom
  Lens[
    # TODO figure out a memoizing strategy so we don't parse multiple times
    get: lambda {|xml| Nokogiri::XML(xml)},
    put: lambda {|xml, value| value.to_xml},
    create: lambda {|value| value.to_xml}
  ]
end
at_css(selector) click to toggle source
# File lib/fedora_lens/lenses.rb, line 96
def at_css(selector)
  Lens[
    get: lambda {|doc| doc.at_css(selector).content},
    put: lambda {|doc, value| 
    doc.at_css(selector).content = value; doc},
    # can't do a css create because we don't know the structure
  ]
end
compose(outer, inner) click to toggle source
# File lib/fedora_lens/lenses.rb, line 185
def compose(outer, inner)
  Lens[
    get: lambda do |source|
      inner.get(outer.get(source))
    end,
    put: lambda do |source, value|
      outer.put(source, inner.put(outer.get(source), value))
    end
  ]
end
empty_property(graph, rdf_subject, predicate, should_delete) click to toggle source
# File lib/fedora_lens/lenses.rb, line 105
def empty_property(graph, rdf_subject, predicate, should_delete)
  if should_delete
    graph.query([rdf_subject, predicate, nil]).each_statement do |statement|
      if should_delete.call(statement.object)
        graph.delete(statement)
      end
    end
  else
    graph.delete([rdf_subject, predicate, nil])
  end
end
get_predicate(predicate, opts = {}) click to toggle source

@param [RDF::URI] predicate @param [Hash] opts @option opts [Proc] :select a proc that takes the object and returns

true if it should be included in this subset
of the predicates.  Used for storing
different classes of objects under different
attribute names even though they all use the
same predicate.
# File lib/fedora_lens/lenses.rb, line 125
def get_predicate(predicate, opts = {})
  Lens[
    get: lambda do |orm|
      values = orm.value(predicate)
      if opts[:select]
        values.select { |val| opts[:select].call(val) }
      else
        values
      end
    end,
    put: lambda do |orm, values|
      empty_property(orm.graph, orm.resource.subject_uri, predicate, opts[:select])
      Array(values).each do |value|
        next if value.nil?
        orm.graph.insert([orm.resource.subject_uri, predicate, value])
      end
      orm
    end,
    create: lambda do |values|
      orm = Ldp::Orm.new(Ldp::Resource::RdfSource.new(FedoraLens.connection, '', RDF::Graph.new))
      values.each do |value|
        orm.graph.insert([orm.resource.subject_uri, predicate, value])
      end
      orm
    end
  ]
end
hash_update() click to toggle source
# File lib/fedora_lens/lenses.rb, line 64
def hash_update
  Lens[
    get: lambda {|hash| hash[key]},
    put: lambda {|hash, pair| hash.merge(pair[0] => pair[1])}
  ]
end
literal_to_string() click to toggle source
# File lib/fedora_lens/lenses.rb, line 24
def literal_to_string
  Lens[
    get: :to_s.to_proc,
    put: lambda do |source, value|
      if source.is_a?(RDF::Literal)
        RDF::Literal.new(value, language: source.language, datatype: source.datatype)
      else
        RDF::Literal.new(value)
      end
    end
  ]
end
literals_to_strings() click to toggle source
# File lib/fedora_lens/lenses.rb, line 37
def literals_to_strings
  Lens[
    get: lambda do |source|
      source.map(&:to_s)
    end,
    put: lambda do |sources, values|
      Array(values).map do |value|
        RDF::Literal.new(value)
      end
    end
  ]
end
load_model(klass) click to toggle source
# File lib/fedora_lens/lenses.rb, line 153
def load_model(klass)
  Lens[
    get: lambda do |id|
      klass.find(id)
    end,
    put: lambda do |id, model|
      model.save
      id
    end
  ]
end
load_or_build_orm() click to toggle source
# File lib/fedora_lens/lenses.rb, line 165
def load_or_build_orm
  Lens[
    get: lambda do |uri|
      if uri.present?
        Ldp::Orm.new(Ldp::Resource::RdfSource.new(FedoraLens.connection, uri.to_s))
      else
        Ldp::Orm.new(Ldp::Resource::RdfSource.new(FedoraLens.connection, nil, RDF::Graph.new))
      end
    end,
    put: lambda do |uri, orm|
      if orm.resource.subject.present?
        orm.save
      else
        orm.resource.create
      end
      orm.resource.subject_uri
    end
  ]
end
orm_to_hash(name_to_lens) click to toggle source
# File lib/fedora_lens/lenses.rb, line 71
def orm_to_hash(name_to_lens)
  Lens[
    get: lambda do |orm|
      name_to_lens.inject({}) do |hash, (key, lens)|
        hash.merge(key => lens.get(orm))
      end
    end,
    put: lambda do |orm, hash|
      name_to_lens.each do |(key, lens)|
        lens.put(orm, hash[key])
      end
      orm
    end
  ]
end
single() click to toggle source
# File lib/fedora_lens/lenses.rb, line 16
def single
  Lens[
    get: :first.to_proc,
    put: lambda {|source, value| source[0] = value; source},
    create: lambda {|value| [value]}
  ]
end
uris_to_ids(&block) click to toggle source

@param class_lambda [Proc] returns an object which implements uri_to_id and id_to_uri

# File lib/fedora_lens/lenses.rb, line 51
def uris_to_ids(&block)
  Lens[
    get: lambda do |source|
      source.map { |uri| yield.uri_to_id(URI.parse(uri).to_s) }
    end,
    put: lambda do |sources, values|
      Array(values).compact.map do |value|
        RDF::URI.new(yield.id_to_uri(value))
      end
    end
  ]
end
zip(first, second) click to toggle source
# File lib/fedora_lens/lenses.rb, line 196
def zip(first, second)
end