Class: Mxrb::OfficialMarketplace::Installer

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

Overview

Safely extracts GitHub or local MPK archives into the target project.

Constant Summary collapse

ATLAS_VARIABLES_IMPORT =

rubocop:disable Metrics/ClassLength

'@import "../../themesource/atlas_core/web/variables";'
IMPORTABLE_CONTENT_TYPES =
%w[Module Service].freeze
DOWNLOADABLE_CONTENT_TYPES =
(IMPORTABLE_CONTENT_TYPES + %w[Widget]).freeze

Instance Method Summary collapse

Constructor Details

#initialize(target:, client: HttpClient.new, mpr: nil) ⇒ Installer

Returns a new instance of Installer.



365
366
367
368
369
# File 'lib/mxrb/official_marketplace.rb', line 365

def initialize(target:, client: HttpClient.new, mpr: nil)
  @target = File.expand_path(target)
  @client = client
  @mpr = mpr && File.expand_path(mpr)
end

Instance Method Details

#dependencies(identifier, apply: false, apply_resolved: false, api: ContentApi.new) ⇒ Object



417
418
419
420
421
422
423
424
425
426
# File 'lib/mxrb/official_marketplace.rb', line 417

def dependencies(identifier, apply: false, apply_resolved: false, api: ContentApi.new)
  lifecycle = Lifecycle.new(target: @target, mpr: @mpr, installer: self)
  _name, entry = lifecycle.installed(identifier)
  mpr = lifecycle.mpr_path(entry)
  resolver = DependencyResolver.new(
    target: @target, mpr:, installer: self, api:,
    mendix_version: detect_mendix_version(mpr)
  )
  resolver.resolve(identifier, apply:, apply_resolved:)
end

#download_official(package, mpr, api) ⇒ Object



428
429
430
431
432
433
434
435
# File 'lib/mxrb/official_marketplace.rb', line 428

def download_official(package, mpr, api)
  Dir.mktmpdir('mxrb-marketplace-') do |dir|
    archive = api.download(
      package.version_id, File.join(dir, 'package.mpk'), download_url: package.download_url
    )
    install_official_archive(archive, package, mpr)
  end
end

#import(path, name: nil, mpr: @mpr) ⇒ Object

Raises:



444
445
446
447
448
449
450
451
# File 'lib/mxrb/official_marketplace.rb', line 444

def import(path, name: nil, mpr: @mpr)
  source = File.expand_path(path)
  raise MarketplaceError, "package not found: #{source}" unless File.file?(source)

  package_name = valid_name(name || File.basename(source, File.extname(source)))
  package = Package.new(package_name, 'local', :mpk, source, nil)
  mpr ? import_module(source, package, mpr) : install_archive(source, package)
end

#pull(identifier, version: nil, mpr: @mpr) ⇒ Object



371
372
373
374
375
376
377
# File 'lib/mxrb/official_marketplace.rb', line 371

def pull(identifier, version: nil, mpr: @mpr)
  package = GitHubResolver.new(client: @client).resolve(identifier, version:)
  Dir.mktmpdir('mxrb-marketplace-') do |dir|
    archive = @client.download(package.download_url, File.join(dir, 'package.zip'))
    mpr ? import_module(archive, package, mpr) : install_archive(archive, package)
  end
end

#pull_official(identifier, version: nil, mendix_version: nil, allow_vulnerable: false, api: ContentApi.new) ⇒ Object

Raises:



379
380
381
382
383
384
385
386
387
388
# File 'lib/mxrb/official_marketplace.rb', line 379

def pull_official(identifier, version: nil, mendix_version: nil,
                  allow_vulnerable: false, api: ContentApi.new)
  mpr = @mpr
  raise MarketplaceError, 'official Marketplace module pull requires --mpr FILE.mpr' unless mpr

  mendix_version ||= detect_mendix_version(mpr)
  package = api.resolve(identifier, version:, mendix_version:, allow_vulnerable:)
  validate_official_package!(package)
  download_official(package, mpr, api)
end

#remove(identifier, apply: false) ⇒ Object

rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/ParameterLists



411
412
413
414
415
# File 'lib/mxrb/official_marketplace.rb', line 411

def remove(identifier, apply: false)
  plan = Lifecycle.new(target: @target, mpr: @mpr, installer: self).plan_remove(identifier)
  plan.apply! if apply
  plan
end

#update_official(identifier, version: nil, mendix_version: nil, allow_vulnerable: false, apply: false, api: ContentApi.new) ⇒ Object

rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/ParameterLists



391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
# File 'lib/mxrb/official_marketplace.rb', line 391

def update_official(identifier, version: nil, mendix_version: nil,
                    allow_vulnerable: false, apply: false, api: ContentApi.new)
  lifecycle = Lifecycle.new(target: @target, mpr: @mpr, installer: self)
  _name, installed = lifecycle.installed(identifier)
  content_id = installed['content_id'] || identifier
  mpr = lifecycle.mpr_path(installed)
  mendix_version ||= detect_mendix_version(mpr)
  package = api.resolve(content_id, version:, mendix_version:, allow_vulnerable:)
  validate_official_package!(package)
  Dir.mktmpdir('mxrb-marketplace-update-') do |dir|
    archive = api.download(
      package.version_id, File.join(dir, 'package.mpk'), download_url: package.download_url
    )
    plan = lifecycle.plan_update(identifier, archive, package)
    plan.apply! if apply
    plan
  end
end

#validate_official_package!(package) ⇒ Object

Raises:



437
438
439
440
441
442
# File 'lib/mxrb/official_marketplace.rb', line 437

def validate_official_package!(package)
  return if DOWNLOADABLE_CONTENT_TYPES.include?(package.content_type)

  raise MarketplaceError,
        "Marketplace content #{package.name.inspect} is #{package.content_type}, not a Module, Service, or Widget"
end