Class: Foobara::RemoteImports::ImportType

Inherits:
Command
  • Object
show all
Includes:
ImportBase
Defined in:
foobara-remote-imports-1.2.0/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

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, #load_manifest_headers, #root_manifest, #should_cache?, #validate, #validate_manifest

Methods inherited from Command

install!

Methods included from TruncatedInspect

#inspect, truncating

Methods included from Concern

foobara_class_methods_module_for, foobara_concern?, included

Instance Method Details

#deanonymize_models?Boolean

Returns:

  • (Boolean)


96
97
98
# File 'src/foobara/remote_imports/import_type.rb', line 96

def deanonymize_models?
  deanonymize_models
end

#find_manifests_to_importObject



8
9
10
# File '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 '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_type?(BuiltinTypes[: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