Class: Capsium::Package::MergedView

Inherits:
Object
  • Object
show all
Defined in:
lib/capsium/package/merged_view.rb,
sig/capsium/package/merged_view.rbs

Overview

The merged (overlay) view of a package's content, per ARCHITECTURE.md section 5a. Shared by Package (validation) and Reactor (serving).

Defined Under Namespace

Classes: Layer

Constant Summary collapse

TOMBSTONE_FILE =

Returns:

  • (String)
".capsium-tombstones"
CONTENT_PREFIX =

Returns:

  • (String)
"#{Package::CONTENT_DIR}/".freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(package_path, storage:, manifest:, dependency_views: [], exported_only: false) ⇒ MergedView

Returns a new instance of MergedView.



47
48
49
50
51
52
53
54
55
# File 'lib/capsium/package/merged_view.rb', line 47

def initialize(package_path, storage:, manifest:, dependency_views: [],
               exported_only: false)
  @package_path = package_path
  @storage = storage
  @manifest = manifest
  @exported_only = exported_only
  @dependency_views = dependency_views
  @layers = build_layers
end

Instance Attribute Details

#dependency_viewsArray[[String, MergedView]] (readonly)

Returns the value of attribute dependency_views.

Returns:



45
46
47
# File 'lib/capsium/package/merged_view.rb', line 45

def dependency_views
  @dependency_views
end

#layersArray[Layer] (readonly)

Returns the value of attribute layers.

Returns:



45
46
47
# File 'lib/capsium/package/merged_view.rb', line 45

def layers
  @layers
end

#package_pathString (readonly)

Returns the value of attribute package_path.

Returns:

  • (String)


45
46
47
# File 'lib/capsium/package/merged_view.rb', line 45

def package_path
  @package_path
end

Instance Method Details

#dependency_pair_for(reference) ⇒ [String, MergedView]?

The [GUID, view] pair whose GUID prefixes the reference (longest GUID first, so nested GUIDs address the innermost dependency).

Parameters:

  • reference (String)

Returns:



85
86
87
88
89
# File 'lib/capsium/package/merged_view.rb', line 85

def dependency_pair_for(reference)
  @dependency_views
    .sort_by { |guid, _view| -guid.length }
    .find { |guid, _view| reference.start_with?("#{guid}/") }
end

#resolve(reference) ⇒ String?

The absolute filesystem path serving a resource reference: a package-relative content path ("content/app.js"), or a dependency reference ("/content/app.js"). nil when no layer provides the path or it is tombstoned. Non-content paths never resolve through the view.

Parameters:

  • reference (String, nil)

Returns:

  • (String, nil)


62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/capsium/package/merged_view.rb', line 62

def resolve(reference)
  return unless reference.is_a?(String)

  if reference.include?("://")
    pair = dependency_pair_for(reference)
    return unless pair

    return pair[1].resolve(reference.delete_prefix("#{pair[0]}/"))
  end

  content_relative = content_relative(reference)
  return unless content_relative
  return if content_relative == TOMBSTONE_FILE

  result = resolve_own(content_relative)
  return if result == :tombstoned
  return result if result

  resolve_dependencies(reference)
end