Class: Foobara::RemoteImports::ImportType

Inherits:
Command
  • Object
show all
Includes:
ImportBase
Defined in:
foobara-remote-imports-0.0.11/src/foobara/remote_imports/import_type.rb

Constant Summary

Constants included from TruncatedInspect

TruncatedInspect::MAX_LENGTH

Instance Attribute Summary

Attributes included from ImportBase

#manifest_data, #manifest_to_import, #manifests_to_import

Attributes included from CommandPatternImplementation::Concerns::Subcommands

#is_subcommand

Attributes included from CommandPatternImplementation::Concerns::Runtime

#exception, #outcome

Attributes included from CommandPatternImplementation::Concerns::Errors

#error_collection

Attributes included from CommandPatternImplementation::Concerns::Inputs

#inputs, #raw_inputs

Instance Method Summary collapse

Methods included from ImportBase

#already_exists?, #already_imported, #cache_file_path, #cache_key, #cache_manifest, #cached?, #determine_manifests_to_import, #execute, #filter_manifests_to_import, #import_objects_from_manifests, #imported_objects, included, #load_cached_manifest, #load_manifest, #load_manifest_from_url, #root_manifest, #should_cache?, #validate, #validate_manifest

Methods inherited from Command

install!, reset_all

Methods included from Concern

foobara_class_methods_module_for, foobara_concern?, included

Methods included from CommandPatternImplementation::Concerns::Reflection

#initialize

Methods included from CommandPatternImplementation::Concerns::DomainMappers

#domain_map, #domain_map!, #run_mapped_subcommand!

Methods included from CommandPatternImplementation::Concerns::Subcommands

#run_subcommand!, #subcommand?

Methods included from CommandPatternImplementation::Concerns::Entities

#load_entities, #load_records

Methods included from CommandPatternImplementation::Concerns::Transactions

#auto_detect_current_transactions, #commit_transaction, #open_transaction, #opened_transactions, #relevant_entity_classes, #rollback_transaction, #transactions

Methods included from CommandPatternImplementation::Concerns::StateMachine

#state_machine

Methods included from CommandPatternImplementation::Concerns::Runtime

#execute, #halt!, #run, #run!, #run_execute, #succeed, #success?, #validate, #validate_records

Methods included from CommandPatternImplementation::Concerns::Errors

#initialize

Methods included from CommandPatternImplementation::Concerns::Inputs

#cast_and_validate_inputs, #initialize, #method_missing, #respond_to_missing?, #respond_to_missing_for_inputs?

Methods included from TruncatedInspect

#inspect, truncating

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Foobara::CommandPatternImplementation::Concerns::Inputs

Instance Method Details

#deanonymize_models?Boolean

Returns:

  • (Boolean)


96
97
98
# File 'foobara-remote-imports-0.0.11/src/foobara/remote_imports/import_type.rb', line 96

def deanonymize_models?
  deanonymize_models
end

#find_manifests_to_importObject



8
9
10
# File 'foobara-remote-imports-0.0.11/src/foobara/remote_imports/import_type.rb', line 8

def find_manifests_to_import
  root_manifest.types
end

#import_object_from_manifestObject

TODO: break this method up?



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'foobara-remote-imports-0.0.11/src/foobara/remote_imports/import_type.rb', line 13

def import_object_from_manifest
  existing_type = Foobara.foobara_root_namespace.foobara_lookup_type(
    manifest_to_import.reference,
    mode: Namespace::LookupMode::ABSOLUTE
  )

  # TODO: might this be a sign of a name collision? Maybe better to give a meaningful error if the type isn't in
  # #already_imported ??
  return if existing_type

  domain_manifest = manifest_to_import.domain

  run_subcommand!(
    ImportDomain,
    raw_manifest: manifest_data,
    to_import: domain_manifest.reference,
    already_imported:
  )

  domain_manifest = manifest_to_import.domain

  domain = if domain_manifest.global?
             GlobalDomain
           else
             Foobara.foobara_root_namespace.foobara_lookup_domain!(
               domain_manifest.reference,
               mode: Namespace::LookupMode::ABSOLUTE
             )
           end

  manifest_to_import.types_depended_on.each do |depended_on_type|
    run_subcommand!(
      ImportType,
      raw_manifest: manifest_data,
      to_import: depended_on_type.reference,
      already_imported:
    )
  end

  containing_module_name = manifest_to_import.scoped_full_path[0..-2].join("::")
  unless containing_module_name.empty?
    Util.make_module_p(containing_module_name, tag: true)
  end

  # Warning: cannot desugarize this because unfortunately desugarizing an entity declaration will actually
  # create the entity class, which should be considered a bug.
  declaration_data = manifest_to_import.declaration_data

  # TODO: how do we solve this for :active_record type??
  if declaration_data["type"] == "entity"
    declaration_data = Util.deep_dup(declaration_data)

    declaration_data["type"] = "detached_entity"
    declaration_data["mutable"] = false

    primary_key_attribute = declaration_data["primary_key"]
    required = declaration_data["attributes_declaration"]["required"]

    required << primary_key_attribute unless required.include?(primary_key_attribute)

    model_base_class = declaration_data["model_base_class"]
    unless model_base_class == "Foobara::Entity"
      # :nocov:
      raise "Expected model base class to be Foobara::Entity, but was #{model_base_class}"
      # :nocov:
    end

    declaration_data["model_base_class"] = "Foobara::DetachedEntity"
  end

  type = domain.foobara_type_from_strict_stringified_declaration(declaration_data)

  if deanonymize_models? && type.extends?(:model)
    Foobara::Model.deanonymize_class(type.target_class)
  end

  unless domain.foobara_registered?(type)
    domain.foobara_register_type(manifest_to_import.scoped_path, type)
  end

  type
end