Class: Ree::LinkImportBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/ree/dsl/link_import_builder.rb

Instance Method Summary collapse

Constructor Details

#initialize(packages_facade) ⇒ LinkImportBuilder

Returns a new instance of LinkImportBuilder.



4
5
6
# File 'lib/ree/dsl/link_import_builder.rb', line 4

def initialize(packages_facade)
  @packages_facade = packages_facade
end

Instance Method Details

#build(klass, package_name, object_name, proc) ⇒ ArrayOf[String]

Returns List of names of imported constants.

Parameters:

  • klass (Class)

    Object class

  • package_name (Symbol)
  • object_name (Symbol)
  • proc (Proc)

Returns:

  • (ArrayOf[String])

    List of names of imported constants



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/ree/dsl/link_import_builder.rb', line 13

def build(klass, package_name, object_name, proc)
  const_list, removed_constants = Ree::ImportDsl.new.execute(klass, proc)

  @packages_facade.load_package_object(package_name, object_name)

  package = @packages_facade.get_package(package_name)
  object = package.get_object(object_name)

  const_list.each do |const_obj|
    if object.klass.const_defined?(const_obj.name)
      set_const(klass, object.klass.const_get(const_obj.name), const_obj)
    elsif package.module.const_defined?(const_obj.name)
      set_const(klass, package.module.const_get(const_obj.name), const_obj)
    else
      raise Ree::Error.new("'#{const_obj.name}' is not found in :#{object.name}")
    end
  end

  assign_removed_constants(klass, removed_constants)

  const_list.map(&:name)
end

#build_for_const(klass, source_const, proc) ⇒ ArrayOf[String]

Returns List of names of imported constants.

Parameters:

  • klass (Class)

    Object class

  • source_const (Class)

    Source class

  • proc (Proc)

Returns:

  • (ArrayOf[String])

    List of names of imported constants



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/ree/dsl/link_import_builder.rb', line 40

def build_for_const(klass, source_const, proc)
  const_list, removed_constants = Ree::ImportDsl.new.execute(klass, proc)
  mod_const = Object.const_get(source_const.name.split("::").first)

  const_list.each do |const_obj|
    if source_const.const_defined?(const_obj.name)
      set_const(klass, source_const.const_get(const_obj.name), const_obj)
    elsif mod_const.const_defined?(const_obj.name)
      set_const(klass, mod_const.const_get(const_obj.name), const_obj)
    else
      raise Ree::Error.new("'#{const_obj.name}' is not found in '#{source_const}'")
    end
  end

  assign_removed_constants(klass, removed_constants)
  nil
end

#build_for_objects(klass, package_name, proc) ⇒ ArrayOf[String]

Returns List of names of imported constants.

Parameters:

  • klass (Class)

    Object class

  • package_name (Symbol)
  • proc (Proc)

Returns:

  • (ArrayOf[String])

    List of names of imported constants



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
95
96
# File 'lib/ree/dsl/link_import_builder.rb', line 62

def build_for_objects(klass, package_name, proc)
  const_list, removed_constants = Ree::ImportDsl.new.execute(klass, proc)
  package = @packages_facade.get_package(package_name)

  const_list.each do |const_obj|
    if const_obj.module_name
      object_name = Ree::StringUtils.underscore(const_obj.module_name).to_sym
    else
      object_name = Ree::StringUtils.underscore(const_obj.name).to_sym
    end

    object = package.get_object(object_name)
    @packages_facade.load_package_object(package_name, object_name) if object

    if object && object.klass && object.klass.const_defined?(const_obj.name)
      set_const(klass, object.klass.const_get(const_obj.name), const_obj)
      next
    end

    load_const_file(const_obj.name, package)
    long_const_name = const_obj.module_name ? "#{const_obj.module_name}::#{const_obj.name}" : const_obj.name

    if package.module.const_defined?(const_obj.name)
      set_const(klass, package.module.const_get(const_obj.name), const_obj)
    elsif package.module.const_defined?(long_const_name)
      set_const(klass, package.module.const_get(long_const_name), const_obj)
    else
      raise Ree::Error.new("'#{const_obj.name}' is not found in :#{object&.name}")
    end
  end

  assign_removed_constants(klass, removed_constants)

  const_list.map(&:name)
end