class Pakyow::Presenter::VersionedView

Wraps one or more versioned view objects. Provides an interface for manipulating multiple view versions as if they were a single object, picking one to use for presentation.

Constants

DEFAULT_VERSION

Attributes

names[R]

Public Class Methods

new(view) click to toggle source
# File lib/pakyow/presenter/versioned_view.rb, line 15
def initialize(view)
  __setobj__(view)
  @names = view.object.nodes.map { |node| node.label(:version) }
  @used = false
end

Public Instance Methods

initialize_dup(_) click to toggle source
Calls superclass method
# File lib/pakyow/presenter/versioned_view.rb, line 21
def initialize_dup(_)
  super

  @names = @names.map(&:dup)
end
pp(*args) click to toggle source

Fixes an issue using pp inside a delegator.

# File lib/pakyow/presenter/versioned_view.rb, line 81
def pp(*args)
  Kernel.pp(*args)
end
soft_copy() click to toggle source

@api private

# File lib/pakyow/presenter/versioned_view.rb, line 28
def soft_copy
  instance = self.class.allocate
  instance.__setobj__(__getobj__.soft_copy)
  instance.instance_variable_set(:@names, @names)
  instance.instance_variable_set(:@used, @used)
  instance
end
use(version) click to toggle source

Uses the view matching version, removing all other versions.

# File lib/pakyow/presenter/versioned_view.rb, line 54
def use(version)
  version = version.to_sym

  if node = version_named(version)
    node.set_label(:versioned, true)
    cleanup
  else
    cleanup(all: true)
  end

  self
end
used?() click to toggle source
# File lib/pakyow/presenter/versioned_view.rb, line 67
def used?
  __getobj__.object.internal_nodes.any? { |node|
    node.labeled?(:versioned)
  }
end
version?(version) click to toggle source

Returns true if version exists.

# File lib/pakyow/presenter/versioned_view.rb, line 38
def version?(version)
  !!version_named(version.to_sym)
end
versioned(version) click to toggle source

Returns the view matching version.

# File lib/pakyow/presenter/versioned_view.rb, line 44
def versioned(version)
  if node = version_named(version.to_sym)
    View.from_object(node)
  else
    nil
  end
end
versions() click to toggle source
# File lib/pakyow/presenter/versioned_view.rb, line 73
def versions
  __getobj__.object.nodes.map { |node|
    View.from_object(node)
  }
end

Private Instance Methods

cleanup(all: false) click to toggle source
# File lib/pakyow/presenter/versioned_view.rb, line 87
def cleanup(all: false)
  if all
    remove
  else
    nodes_to_remove = []

    __getobj__.object.internal_nodes.each do |node|
      unless node.is_a?(StringDoc::MetaNode) || node.labeled?(:versioned)
        nodes_to_remove << node
      end
    end

    nodes_to_remove.each(&:remove)
  end
end
version_named(version) click to toggle source
# File lib/pakyow/presenter/versioned_view.rb, line 103
def version_named(version)
  __getobj__.object.internal_nodes.find { |node|
    version == (node.label(:version) || DEFAULT_VERSION).to_sym
  }
end