Class: Mxrb::OfficialMarketplace::DependencyResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/mxrb/official_marketplace/dependency_resolver.rb

Overview

Discovers dependencies from unresolved qualified references inside the package MPR, then verifies Content API candidates against the MPK module.

Constant Summary collapse

PLATFORM_MODULES =

rubocop:disable Metrics/ClassLength

%w[System].freeze
OFFICIAL_CONTENT_IDS =
{
  'FeedbackModule' => 205_506,
  'DataWidgets' => 116_540,
  'Administration' => 23_513
}.freeze
DATA_WIDGET_PATTERN =
/
  \Acom\.mendix\.widget\.web\.
  (?:datagrid|datagriddatefilter|datagriddropdownfilter|datagridnumberfilter|
  datagridtextfilter|dropdownsort|gallery|selectionhelper|treenode)\.
/ix
OFFICIAL_WIDGET_CONTENT_IDS =
{
  DATA_WIDGET_PATTERN => 116_540,
  /\Acom\.mendix\.widget\.web\.combobox\.Combobox\z/i => 219_304
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(target:, mpr:, installer:, api:, mendix_version:) ⇒ DependencyResolver

Returns a new instance of DependencyResolver.



75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/mxrb/official_marketplace/dependency_resolver.rb', line 75

def initialize(target:, mpr:, installer:, api:, mendix_version:)
  @target = File.expand_path(target)
  @mpr = File.expand_path(mpr)
  @installer = installer
  @api = api
  @mendix_version = mendix_version
  @resolved = {}
  @visited = {}
  @blockers = []
  @project_modules = Mxrb.open(@mpr) { _1.modules.map(&:name) }
  @required_widget_ids = widget_ids(@mpr)
end

Instance Method Details

#resolve(identifier, apply: false, apply_resolved: false) ⇒ Object

rubocop:disable Metrics/AbcSize, Metrics/MethodLength



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/mxrb/official_marketplace/dependency_resolver.rb', line 89

def resolve(identifier, apply: false, apply_resolved: false)
  lifecycle = Lifecycle.new(target: @target, mpr: @mpr, installer: @installer)
  root, entry = lifecycle.installed(identifier)
  Dir.mktmpdir('mxrb-marketplace-dependencies-') do |temporary|
    @temporary = temporary
    visit(root, safe_path(entry.fetch('archive')))
    dependencies = @resolved.values.freeze
    widget_dependencies = resolve_widget_dependencies
    plan = DependencyPlan.new(
      root:, dependencies:, widget_dependencies:, blockers: @blockers.uniq
    ) do
      apply_dependencies(dependencies, widget_dependencies)
    end
    plan.apply! if apply
    plan.apply_resolved! if apply_resolved
    plan.expire! unless apply || apply_resolved
    return plan
  end
ensure
  @temporary = nil
end