Class: Mxrb::OfficialMarketplace::Installer
- Inherits:
-
Object
- Object
- Mxrb::OfficialMarketplace::Installer
- 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
- #dependencies(identifier, apply: false, apply_resolved: false, api: ContentApi.new) ⇒ Object
- #download_official(package, mpr, api) ⇒ Object
- #import(path, name: nil, mpr: @mpr) ⇒ Object
-
#initialize(target:, client: HttpClient.new, mpr: nil) ⇒ Installer
constructor
A new instance of Installer.
- #pull(identifier, version: nil, mpr: @mpr) ⇒ Object
- #pull_official(identifier, version: nil, mendix_version: nil, allow_vulnerable: false, api: ContentApi.new) ⇒ Object
-
#remove(identifier, apply: false) ⇒ Object
rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/ParameterLists.
-
#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.
- #validate_official_package!(package) ⇒ Object
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.(target) @client = client @mpr = mpr && File.(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
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.(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
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
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 |