ree 1.0.28 → 1.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/Gemfile.lock +1 -1
 - data/lib/ree/dsl/import_dsl.rb +89 -18
 - data/lib/ree/dsl/link_import_builder.rb +19 -5
 - data/lib/ree/version.rb +1 -1
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: c26bd9f765b493214449328b06c723150c4d64a1a6198836ccdd3e92d6c38ed2
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: bec255f8119ff87b049000bb758e157d18507568d636fa4e19e6bbe363b9e4f0
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 312e40978d8bec156f2a8bce86a84083045a8034f5436ef7f53c506806ef0044b4c29ca2a09b0233614d20f5198ac6c0babdf2484852816f0d8a3787b4e54461
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: b8c81dc9707038944f00ddc38ab4a3f269597630b1a05923df292244f4e12d5d9a8e2ceb3651f3f09003a9ed2a1bfd1eb31d47507a6cb6d05bb5a43ad717d2c1
         
     | 
    
        data/Gemfile.lock
    CHANGED
    
    
    
        data/lib/ree/dsl/import_dsl.rb
    CHANGED
    
    | 
         @@ -1,21 +1,24 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal  = true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            class Ree::ImportDsl
         
     | 
| 
      
 4 
     | 
    
         
            +
              def initialize
         
     | 
| 
      
 5 
     | 
    
         
            +
                setup_removed_constants
         
     | 
| 
      
 6 
     | 
    
         
            +
              end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
       4 
8 
     | 
    
         
             
              def execute(klass, proc)
         
     | 
| 
       5 
     | 
    
         
            -
                self.class.instance_exec(&proc)
         
     | 
| 
       6 
     | 
    
         
            -
              rescue Ree::ImportDsl::UnlinkConstError => e
         
     | 
| 
       7 
     | 
    
         
            -
                const_removed = remove_const(klass, e.const)
         
     | 
| 
      
 9 
     | 
    
         
            +
                class_constant = self.class.instance_exec(&proc)
         
     | 
| 
       8 
10 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
                 
     | 
| 
      
 11 
     | 
    
         
            +
                [
         
     | 
| 
      
 12 
     | 
    
         
            +
                  extract_constants(class_constant),
         
     | 
| 
      
 13 
     | 
    
         
            +
                  get_removed_constants
         
     | 
| 
      
 14 
     | 
    
         
            +
                ]
         
     | 
| 
      
 15 
     | 
    
         
            +
              rescue Ree::ImportDsl::UnlinkConstError => e
         
     | 
| 
      
 16 
     | 
    
         
            +
                retry_after = remove_or_assign_const(klass, e.const)
         
     | 
| 
      
 17 
     | 
    
         
            +
                retry if retry_after
         
     | 
| 
       10 
18 
     | 
    
         
             
              rescue NoMethodError => e
         
     | 
| 
       11 
     | 
    
         
            -
                if e.name == :&
         
     | 
| 
       12 
     | 
    
         
            -
                   
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                  if const_removed
         
     | 
| 
       15 
     | 
    
         
            -
                    retry
         
     | 
| 
       16 
     | 
    
         
            -
                  else
         
     | 
| 
       17 
     | 
    
         
            -
                    raise Ree::Error.new("'#{e.receiver}' already linked or defined in '#{klass}'", :invalid_dsl_usage)
         
     | 
| 
       18 
     | 
    
         
            -
                  end
         
     | 
| 
      
 19 
     | 
    
         
            +
                if e.name == :& || e.name == :as
         
     | 
| 
      
 20 
     | 
    
         
            +
                  retry_after = remove_or_assign_const(klass, e.receiver)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  retry if retry_after
         
     | 
| 
       19 
22 
     | 
    
         
             
                else
         
     | 
| 
       20 
23 
     | 
    
         
             
                  raise e
         
     | 
| 
       21 
24 
     | 
    
         
             
                end
         
     | 
| 
         @@ -27,9 +30,30 @@ class Ree::ImportDsl 
     | 
|
| 
       27 
30 
     | 
    
         
             
                retry
         
     | 
| 
       28 
31 
     | 
    
         
             
              end
         
     | 
| 
       29 
32 
     | 
    
         | 
| 
      
 33 
     | 
    
         
            +
              private def extract_constants(class_constant)
         
     | 
| 
      
 34 
     | 
    
         
            +
                [class_constant] + class_constant.constants
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
              private def setup_removed_constants
         
     | 
| 
      
 38 
     | 
    
         
            +
                self.class.instance_variable_set(:@removed_constants, [])
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
              private def get_removed_constants
         
     | 
| 
      
 42 
     | 
    
         
            +
                self.class.instance_variable_get(:@removed_constants)
         
     | 
| 
      
 43 
     | 
    
         
            +
              end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
              class RemovedConstant
         
     | 
| 
      
 46 
     | 
    
         
            +
                attr_reader :name, :const
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                def initialize(name, const)
         
     | 
| 
      
 49 
     | 
    
         
            +
                  @name = name
         
     | 
| 
      
 50 
     | 
    
         
            +
                  @const = const
         
     | 
| 
      
 51 
     | 
    
         
            +
                end
         
     | 
| 
      
 52 
     | 
    
         
            +
              end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
       30 
54 
     | 
    
         
             
              class UnlinkConstError < StandardError
         
     | 
| 
       31 
55 
     | 
    
         
             
                attr_reader :const
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
       33 
57 
     | 
    
         
             
                def initialize(const)
         
     | 
| 
       34 
58 
     | 
    
         
             
                  @const = const
         
     | 
| 
       35 
59 
     | 
    
         
             
                end
         
     | 
| 
         @@ -82,25 +106,72 @@ class Ree::ImportDsl 
     | 
|
| 
       82 
106 
     | 
    
         | 
| 
       83 
107 
     | 
    
         
             
              private
         
     | 
| 
       84 
108 
     | 
    
         | 
| 
       85 
     | 
    
         
            -
              def  
     | 
| 
       86 
     | 
    
         
            -
                 
     | 
| 
      
 109 
     | 
    
         
            +
              def remove_or_assign_const(klass, constant)
         
     | 
| 
      
 110 
     | 
    
         
            +
                retry_after = false
         
     | 
| 
       87 
111 
     | 
    
         | 
| 
       88 
112 
     | 
    
         
             
                klass.constants.each do |const_sym|
         
     | 
| 
       89 
113 
     | 
    
         
             
                  const = klass.const_get(const_sym)
         
     | 
| 
      
 114 
     | 
    
         
            +
                  next if const.is_a?(ClassConstant)
         
     | 
| 
       90 
115 
     | 
    
         | 
| 
       91 
116 
     | 
    
         
             
                  if constant.is_a?(Class) || constant.is_a?(Module)
         
     | 
| 
       92 
117 
     | 
    
         
             
                    if (const.is_a?(Class) || const.is_a?(Module)) && const.name == constant.name
         
     | 
| 
       93 
118 
     | 
    
         
             
                      klass.send(:remove_const, const_sym)
         
     | 
| 
       94 
     | 
    
         
            -
                       
     | 
| 
      
 119 
     | 
    
         
            +
                      store_removed_constant(const_sym, constant)
         
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
      
 121 
     | 
    
         
            +
                      retry_after = true
         
     | 
| 
       95 
122 
     | 
    
         
             
                      break
         
     | 
| 
       96 
123 
     | 
    
         
             
                    end
         
     | 
| 
       97 
124 
     | 
    
         
             
                  elsif const == constant
         
     | 
| 
       98 
125 
     | 
    
         
             
                    klass.send(:remove_const, const_sym)
         
     | 
| 
       99 
     | 
    
         
            -
                     
     | 
| 
      
 126 
     | 
    
         
            +
                    store_removed_constant(const_sym, constant)
         
     | 
| 
      
 127 
     | 
    
         
            +
             
     | 
| 
      
 128 
     | 
    
         
            +
                    retry_after = true
         
     | 
| 
       100 
129 
     | 
    
         
             
                    break
         
     | 
| 
       101 
130 
     | 
    
         
             
                  end
         
     | 
| 
       102 
131 
     | 
    
         
             
                end
         
     | 
| 
       103 
132 
     | 
    
         | 
| 
       104 
     | 
    
         
            -
                 
     | 
| 
      
 133 
     | 
    
         
            +
                return true if retry_after
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
                const_name = if constant.is_a?(String)
         
     | 
| 
      
 136 
     | 
    
         
            +
                  constant.to_sym
         
     | 
| 
      
 137 
     | 
    
         
            +
                elsif constant.is_a?(Class) || constant.is_a?(Module)
         
     | 
| 
      
 138 
     | 
    
         
            +
                  constant.name
         
     | 
| 
      
 139 
     | 
    
         
            +
                else
         
     | 
| 
      
 140 
     | 
    
         
            +
                  raise ArgumentError.new("unknown constant: #{constant.inspect}")
         
     | 
| 
      
 141 
     | 
    
         
            +
                end
         
     | 
| 
      
 142 
     | 
    
         
            +
             
     | 
| 
      
 143 
     | 
    
         
            +
                if parent_constant?(klass, const_name)
         
     | 
| 
      
 144 
     | 
    
         
            +
                  klass.const_set(const_name, ClassConstant.new(const_name.to_s))
         
     | 
| 
      
 145 
     | 
    
         
            +
                  retry_after = true
         
     | 
| 
      
 146 
     | 
    
         
            +
                end
         
     | 
| 
      
 147 
     | 
    
         
            +
             
     | 
| 
      
 148 
     | 
    
         
            +
                retry_after
         
     | 
| 
      
 149 
     | 
    
         
            +
              end
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
      
 151 
     | 
    
         
            +
              private
         
     | 
| 
      
 152 
     | 
    
         
            +
             
     | 
| 
      
 153 
     | 
    
         
            +
              def store_removed_constant(name, constant)
         
     | 
| 
      
 154 
     | 
    
         
            +
                return if constant.is_a?(ClassConstant)
         
     | 
| 
      
 155 
     | 
    
         
            +
                get_removed_constants << RemovedConstant.new(name, constant.dup)
         
     | 
| 
      
 156 
     | 
    
         
            +
              end
         
     | 
| 
      
 157 
     | 
    
         
            +
             
     | 
| 
      
 158 
     | 
    
         
            +
              def parent_constant?(klass, const_name)
         
     | 
| 
      
 159 
     | 
    
         
            +
                modules = klass.to_s.split("::")[0..-2]
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
      
 161 
     | 
    
         
            +
                result = modules.each_with_index.any? do |mod, index|
         
     | 
| 
      
 162 
     | 
    
         
            +
                  mod = Object.const_get(modules[0..index].join("::"))
         
     | 
| 
      
 163 
     | 
    
         
            +
                  mod.constants.include?(const_name)
         
     | 
| 
      
 164 
     | 
    
         
            +
                end
         
     | 
| 
      
 165 
     | 
    
         
            +
             
     | 
| 
      
 166 
     | 
    
         
            +
                result || acnchestor_constant?(klass, const_name)
         
     | 
| 
      
 167 
     | 
    
         
            +
              end
         
     | 
| 
      
 168 
     | 
    
         
            +
             
     | 
| 
      
 169 
     | 
    
         
            +
              def acnchestor_constant?(klass, const_name)
         
     | 
| 
      
 170 
     | 
    
         
            +
                return false if klass.ancestors.include?(klass) && klass.ancestors.size == 1
         
     | 
| 
      
 171 
     | 
    
         
            +
             
     | 
| 
      
 172 
     | 
    
         
            +
                klass.ancestors.any? do |anchestor|
         
     | 
| 
      
 173 
     | 
    
         
            +
                  next if anchestor == klass
         
     | 
| 
      
 174 
     | 
    
         
            +
                  anchestor.constants.include?(const_name) || acnchestor_constant?(anchestor, const_name)
         
     | 
| 
      
 175 
     | 
    
         
            +
                end
         
     | 
| 
       105 
176 
     | 
    
         
             
              end
         
     | 
| 
       106 
177 
     | 
    
         
             
            end
         
     | 
| 
         @@ -11,14 +11,13 @@ class Ree::LinkImportBuilder 
     | 
|
| 
       11 
11 
     | 
    
         
             
              # @param [Proc] proc
         
     | 
| 
       12 
12 
     | 
    
         
             
              # @return [ArrayOf[String]] List of names of imported constants
         
     | 
| 
       13 
13 
     | 
    
         
             
              def build(klass, package_name, object_name, proc)
         
     | 
| 
       14 
     | 
    
         
            -
                 
     | 
| 
      
 14 
     | 
    
         
            +
                const_list, removed_constants = Ree::ImportDsl.new.execute(klass, proc)
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
                @packages_facade.load_package_object(package_name, object_name)
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
18 
     | 
    
         
             
                package = @packages_facade.get_package(package_name)
         
     | 
| 
       19 
19 
     | 
    
         
             
                object = package.get_object(object_name)
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
       22 
21 
     | 
    
         
             
                const_list.each do |const_obj|
         
     | 
| 
       23 
22 
     | 
    
         
             
                  if object.klass.const_defined?(const_obj.name)
         
     | 
| 
       24 
23 
     | 
    
         
             
                    set_const(klass, object.klass.const_get(const_obj.name), const_obj)
         
     | 
| 
         @@ -29,6 +28,8 @@ class Ree::LinkImportBuilder 
     | 
|
| 
       29 
28 
     | 
    
         
             
                  end
         
     | 
| 
       30 
29 
     | 
    
         
             
                end
         
     | 
| 
       31 
30 
     | 
    
         | 
| 
      
 31 
     | 
    
         
            +
                assign_removed_constants(klass, removed_constants)
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
       32 
33 
     | 
    
         
             
                const_list.map(&:name)
         
     | 
| 
       33 
34 
     | 
    
         
             
              end
         
     | 
| 
       34 
35 
     | 
    
         | 
| 
         @@ -37,9 +38,8 @@ class Ree::LinkImportBuilder 
     | 
|
| 
       37 
38 
     | 
    
         
             
              # @param [Proc] proc
         
     | 
| 
       38 
39 
     | 
    
         
             
              # @return [ArrayOf[String]] List of names of imported constants
         
     | 
| 
       39 
40 
     | 
    
         
             
              def build_for_const(klass, source_const, proc)
         
     | 
| 
       40 
     | 
    
         
            -
                 
     | 
| 
      
 41 
     | 
    
         
            +
                const_list, removed_constants = Ree::ImportDsl.new.execute(klass, proc)
         
     | 
| 
       41 
42 
     | 
    
         
             
                mod_const = Object.const_get(source_const.name.split("::").first)
         
     | 
| 
       42 
     | 
    
         
            -
                const_list = [result] + result.constants
         
     | 
| 
       43 
43 
     | 
    
         | 
| 
       44 
44 
     | 
    
         
             
                const_list.each do |const_obj|
         
     | 
| 
       45 
45 
     | 
    
         
             
                  if source_const.const_defined?(const_obj.name)
         
     | 
| 
         @@ -50,14 +50,28 @@ class Ree::LinkImportBuilder 
     | 
|
| 
       50 
50 
     | 
    
         
             
                    raise Ree::Error.new("'#{const_obj.name}' is not found in '#{source_const}'")
         
     | 
| 
       51 
51 
     | 
    
         
             
                  end
         
     | 
| 
       52 
52 
     | 
    
         
             
                end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                assign_removed_constants(klass, removed_constants)
         
     | 
| 
      
 55 
     | 
    
         
            +
                nil
         
     | 
| 
       53 
56 
     | 
    
         
             
              end
         
     | 
| 
       54 
57 
     | 
    
         | 
| 
       55 
58 
     | 
    
         
             
              private
         
     | 
| 
       56 
59 
     | 
    
         | 
| 
      
 60 
     | 
    
         
            +
              def assign_removed_constants(klass, removed_constants)
         
     | 
| 
      
 61 
     | 
    
         
            +
                removed_constants.each do |removed_const|
         
     | 
| 
      
 62 
     | 
    
         
            +
                  next if klass.const_defined?(removed_const.name)
         
     | 
| 
      
 63 
     | 
    
         
            +
                  klass.const_set(removed_const.name, removed_const.const)
         
     | 
| 
      
 64 
     | 
    
         
            +
                end
         
     | 
| 
      
 65 
     | 
    
         
            +
              end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
       57 
67 
     | 
    
         
             
              def set_const(target_klass, ref_class, const_obj)
         
     | 
| 
       58 
68 
     | 
    
         
             
                if const_obj.get_as
         
     | 
| 
       59 
69 
     | 
    
         
             
                  target_klass.send(:remove_const, const_obj.get_as.name) rescue nil
         
     | 
| 
       60 
70 
     | 
    
         
             
                  target_klass.const_set(const_obj.get_as.name, ref_class)
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                  if target_klass.const_get(const_obj.name).is_a?(Ree::ImportDsl::ClassConstant)
         
     | 
| 
      
 73 
     | 
    
         
            +
                    target_klass.send(:remove_const, const_obj.name)
         
     | 
| 
      
 74 
     | 
    
         
            +
                  end
         
     | 
| 
       61 
75 
     | 
    
         
             
                else
         
     | 
| 
       62 
76 
     | 
    
         
             
                  target_klass.send(:remove_const, const_obj.name) rescue nil
         
     | 
| 
       63 
77 
     | 
    
         
             
                  target_klass.const_set(const_obj.name, ref_class)
         
     | 
    
        data/lib/ree/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: ree
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1.0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.0.30
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Ruslan Gatiyatov
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: exe
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2023- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2023-08-28 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: commander
         
     |