cocoapods-vipers 0.0.1 → 0.0.4
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
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 955f762815a084b35b851037fc3b3a82be44f13ce49cef0f496cf70f32bde70d
         | 
| 4 | 
            +
              data.tar.gz: 208b7100f16ac29a91797b282d7344c89931e60acd6202f0a17184b37818a7e2
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 64e2b36364468a508cd87c9f7c9b711c66aa661acd7f9f6b509d92aeaa9a8d0f3d08a348621f518393d077143d3927a5020a9b682af2697c8cae22f87e558d3c
         | 
| 7 | 
            +
              data.tar.gz: 904ca06ed03e28b425574535cccc87660fe05526505c8bf07996e4e75cb46adbe088ccdc2ac02b2dd152f9ea083426a81f30b1df2010ff6fc714bdf60b6b1c74
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            import UIKit
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            // MARK: VIPERs Enum
         | 
| 4 | 
            +
            public enum VIPERs: String {
         | 
| 5 | 
            +
                public typealias RawValue = String
         | 
| 6 | 
            +
            /** Injection VIPERS case **/
         | 
| 7 | 
            +
            }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            public struct VIPERBinderHelper {
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                public static func initBinder(shouldObserveForAppLaunch: Bool = true) {
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                    // initAllBinder
         | 
| 14 | 
            +
            /** Injection VIPERBinderHelper call init function **/
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                    if shouldObserveForAppLaunch {
         | 
| 17 | 
            +
                        Router.observeForAppLaunch()
         | 
| 18 | 
            +
                    }
         | 
| 19 | 
            +
                }
         | 
| 20 | 
            +
            }
         | 
| @@ -47,7 +47,7 @@ def handleClsAndMethod(viper, vipers_params_class, vipers_ext_func) | |
| 47 47 | 
             
            #{assign_lines_text}
         | 
| 48 48 | 
             
                }
         | 
| 49 49 | 
             
                required public init() {
         | 
| 50 | 
            -
                     | 
| 50 | 
            +
                    print("default init")
         | 
| 51 51 | 
             
                }
         | 
| 52 52 | 
             
              }
         | 
| 53 53 | 
             
            RUBY
         | 
| @@ -79,9 +79,56 @@ RUBY | |
| 79 79 | 
             
              vipers_ext_func.push(method_text)
         | 
| 80 80 | 
             
            end
         | 
| 81 81 |  | 
| 82 | 
            +
            def traverse_dir(file_path)
         | 
| 83 | 
            +
              if File.directory? file_path
         | 
| 84 | 
            +
                Dir.foreach(file_path) do |file|
         | 
| 85 | 
            +
                  if file != "." && file != ".."
         | 
| 86 | 
            +
                    traverse_dir(file_path + "/" + file){|x| yield x}
         | 
| 87 | 
            +
                  end
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
              else
         | 
| 90 | 
            +
                yield file_path
         | 
| 91 | 
            +
              end
         | 
| 92 | 
            +
            end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
            # 返回 { Bool, String } 是否存在重复的viper
         | 
| 95 | 
            +
            def check_duplicate_viper(paths, main_path, vipers_json_path) 
         | 
| 96 | 
            +
              arr = []
         | 
| 97 | 
            +
              paths.each do |spec|
         | 
| 98 | 
            +
                json_path = ''
         | 
| 99 | 
            +
                if spec['spec_name'] == main_path
         | 
| 100 | 
            +
                  json_path = spec['spec_name']
         | 
| 101 | 
            +
                else
         | 
| 102 | 
            +
                  spec_json_path = "#{vipers_json_path}"
         | 
| 103 | 
            +
                  spec_json_path.gsub!("SPECNAME", spec['spec_name'])
         | 
| 104 | 
            +
                  json_path = spec['spec_path'] + "/" + spec_json_path
         | 
| 105 | 
            +
                end
         | 
| 106 | 
            +
              
         | 
| 107 | 
            +
                if File.exists?(json_path)
         | 
| 108 | 
            +
                  file = File.read(json_path)
         | 
| 109 | 
            +
                  data_hash = JSON.parse(file)
         | 
| 110 | 
            +
                  vipers = data_hash["vipers"]
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                  vipers.each do |viper|
         | 
| 113 | 
            +
                    arr.push(viper["viper"])
         | 
| 114 | 
            +
                  end              
         | 
| 115 | 
            +
                
         | 
| 116 | 
            +
                end
         | 
| 117 | 
            +
              end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
              result = arr.detect {|e| arr.rindex(e) != arr.index(e) }
         | 
| 120 | 
            +
             | 
| 121 | 
            +
              if result
         | 
| 122 | 
            +
                return { 'result' => true, 'viper' => result }
         | 
| 123 | 
            +
              else
         | 
| 124 | 
            +
                return { 'result' => false }
         | 
| 125 | 
            +
              end
         | 
| 126 | 
            +
             | 
| 127 | 
            +
            end
         | 
| 128 | 
            +
             | 
| 82 129 | 
             
            module CocoapodsVipers
         | 
| 83 130 | 
             
                class Vipers
         | 
| 84 | 
            -
                    def sync(paths)
         | 
| 131 | 
            +
                    def sync(paths, pods)
         | 
| 85 132 | 
             
                      Pod::UI.puts "Synchronizing Vipers yml"
         | 
| 86 133 |  | 
| 87 134 | 
             
                      if !File.exists?("vipers_config.yml")
         | 
| @@ -94,14 +141,46 @@ module CocoapodsVipers | |
| 94 141 | 
             
                      vipers_json_path = json['podspec_project_vipers_json_path']
         | 
| 95 142 | 
             
                      main_project_vipers_json_path = json['main_project_vipers_json_path']
         | 
| 96 143 | 
             
                      extension_template_path = json['extension_template_path']
         | 
| 144 | 
            +
                      prorocols_template_path = json['prorocols_template_path']
         | 
| 145 | 
            +
                      protocols_path = json['hycan_service_injects_protocols_path']
         | 
| 146 | 
            +
                      pod_frameworks_all_path = json['pod_frameworks_all_path']
         | 
| 147 | 
            +
             | 
| 148 | 
            +
                      flag = check_duplicate_viper(paths, main_project_vipers_json_path, vipers_json_path)
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                      if flag['result']
         | 
| 151 | 
            +
                        raise "viper脚本执行失败,出现重复定义的viper: #{flag['viper']}"
         | 
| 152 | 
            +
                      end
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                      check_unused_pods = false
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                      if json['check_unused_pods'] == 'true'
         | 
| 157 | 
            +
                        check_unused_pods = true
         | 
| 158 | 
            +
                      end
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                      framework_array = pods
         | 
| 161 | 
            +
             | 
| 162 | 
            +
                      if pod_frameworks_all_path 
         | 
| 163 | 
            +
                        if File.exists?(pod_frameworks_all_path)
         | 
| 164 | 
            +
                          fileData = File.read(pod_frameworks_all_path)
         | 
| 165 | 
            +
                          all_framework = JSON.parse(fileData)
         | 
| 166 | 
            +
                          framework_array = all_framework
         | 
| 167 | 
            +
                        end
         | 
| 168 | 
            +
                      end
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                      should_check = false
         | 
| 171 | 
            +
                      if json['check_json'] == 'true'
         | 
| 172 | 
            +
                        should_check = true
         | 
| 173 | 
            +
                      end
         | 
| 174 | 
            +
             | 
| 97 175 | 
             
                      # Pod::UI.puts "json: #{json}"
         | 
| 98 176 | 
             
                      # Pod::UI.puts "ext_path: #{ext_path}"
         | 
| 99 177 | 
             
                      # Pod::UI.puts "pod_paths: #{paths}"
         | 
| 100 178 |  | 
| 101 | 
            -
                       | 
| 179 | 
            +
                      vipers_case = []
         | 
| 102 180 | 
             
                      vipers_create_binder = []
         | 
| 103 181 | 
             
                      vipers_params_class = []
         | 
| 104 182 | 
             
                      vipers_ext_func = []
         | 
| 183 | 
            +
                      vipers_call_binder = []
         | 
| 105 184 |  | 
| 106 185 | 
             
                      if !paths
         | 
| 107 186 | 
             
                        Pod::UI.puts "没有找到对应的业务组件,以Hycan开头的"
         | 
| @@ -132,28 +211,111 @@ module CocoapodsVipers | |
| 132 211 | 
             
                          data_hash = JSON.parse(file)
         | 
| 133 212 | 
             
                          vipers = data_hash["vipers"]
         | 
| 134 213 |  | 
| 135 | 
            -
                           | 
| 214 | 
            +
                          vipers_case.push("// MARK: - #{data_hash["moduleName"]} #{data_hash["description"]}")
         | 
| 136 215 | 
             
                          vipers_create_binder.push("    // MARK: - #{data_hash["moduleName"]} Create Binder")
         | 
| 137 216 | 
             
                          vipers_params_class.push("  // MARK: - #{data_hash["moduleName"]} Params Class\n")
         | 
| 138 217 | 
             
                          vipers_ext_func.push("  // MARK: - #{data_hash["moduleName"]} Extension Func\n")
         | 
| 139 | 
            -
             | 
| 218 | 
            +
                          vipers_call_binder.push("        init#{data_hash["moduleName"]}Binder()")
         | 
| 219 | 
            +
                          vipers_create_binder.push("   public static func init#{data_hash["moduleName"]}Binder() {")
         | 
| 220 | 
            +
                          cls_array = []
         | 
| 140 221 | 
             
                          vipers.each do |viper|
         | 
| 141 | 
            -
                             | 
| 222 | 
            +
                            if viper["description"] == ""
         | 
| 223 | 
            +
                              vipers_case.push("    case #{viper["viper"]}")
         | 
| 224 | 
            +
                            else
         | 
| 225 | 
            +
                              vipers_case.push("    //#{viper["description"]}\n    case #{viper["viper"]}")
         | 
| 226 | 
            +
                            end
         | 
| 142 227 | 
             
                            handleClsAndMethod(viper, vipers_params_class, vipers_ext_func)
         | 
| 143 228 | 
             
                            if spec['spec_name'] == main_project_vipers_json_path
         | 
| 144 229 | 
             
                              vipers_create_binder.push("      //#{viper["description"]}\n      VIPERBinder.addUnity(className: \"#{viper["class"]}\", identifier: VIPERs.#{viper["viper"]}.identifier)")
         | 
| 145 230 | 
             
                            else
         | 
| 146 231 | 
             
                              vipers_create_binder.push("      //#{viper["description"]}\n      VIPERBinder.addUnity(projectClassName: \"#{data_hash["moduleName"]}.#{viper["class"]}\", identifier: VIPERs.#{viper["viper"]}.identifier)")
         | 
| 147 | 
            -
                            end | 
| 232 | 
            +
                            end
         | 
| 233 | 
            +
                            cls_array.push(viper["class"])
         | 
| 148 234 | 
             
                          end
         | 
| 149 | 
            -
                           | 
| 235 | 
            +
                          vipers_case.push("\n")
         | 
| 236 | 
            +
                          vipers_create_binder.push("   }\n")
         | 
| 237 | 
            +
             | 
| 238 | 
            +
                          # 检测模块内未使用的Pods-framework
         | 
| 239 | 
            +
                          if check_unused_pods
         | 
| 240 | 
            +
                            # Pod::UI.puts "检测模块内未使用的Pods-framework"
         | 
| 241 | 
            +
                            dir_path = spec_path + '/' + data_hash["moduleName"]
         | 
| 242 | 
            +
                            if spec['spec_name'] == main_project_vipers_json_path
         | 
| 243 | 
            +
                              dir_path = '.' + '/HycanCommunity/Swift'
         | 
| 244 | 
            +
                            end
         | 
| 245 | 
            +
             | 
| 246 | 
            +
                            traverse_dir(dir_path) { |f|
         | 
| 247 | 
            +
                              if f.to_s() =~ /\.swift$/ || f.to_s() =~ /\.h$/ || f.to_s() =~ /\.m$/
         | 
| 248 | 
            +
                                lineNumber = 0
         | 
| 249 | 
            +
                                IO.readlines(f).each { |line| 
         | 
| 250 | 
            +
                                  framework_array.each do |framew|
         | 
| 251 | 
            +
                                    if line =~ /^[\/\/]/
         | 
| 252 | 
            +
                                    else
         | 
| 253 | 
            +
                                      if line.index("#import <#{framew}")
         | 
| 254 | 
            +
                                        # Pod::UI.puts "in file: #{f} - line in #{data_hash["moduleName"]}"
         | 
| 255 | 
            +
                                        # Pod::UI.puts line
         | 
| 256 | 
            +
                                        framework_array.delete(framew)
         | 
| 257 | 
            +
                                        break
         | 
| 258 | 
            +
                                      end
         | 
| 259 | 
            +
              
         | 
| 260 | 
            +
                                      if line.index("import #{framew}")
         | 
| 261 | 
            +
                                        # Pod::UI.puts "in file: #{f} - line in #{data_hash["moduleName"]}"
         | 
| 262 | 
            +
                                        # Pod::UI.puts line
         | 
| 263 | 
            +
                                        framework_array.delete(framew)
         | 
| 264 | 
            +
                                        break
         | 
| 265 | 
            +
                                      end
         | 
| 266 | 
            +
                                    end
         | 
| 267 | 
            +
                                  end
         | 
| 268 | 
            +
                                  if lineNumber > 200
         | 
| 269 | 
            +
                                    break
         | 
| 270 | 
            +
                                  end
         | 
| 271 | 
            +
                                  lineNumber += 1
         | 
| 272 | 
            +
                                }
         | 
| 273 | 
            +
                              end                  
         | 
| 274 | 
            +
                            }
         | 
| 275 | 
            +
                          end
         | 
| 276 | 
            +
             | 
| 277 | 
            +
                          # 检测模块内是否有未定义的 class
         | 
| 278 | 
            +
                          if should_check
         | 
| 279 | 
            +
                            # Pod::UI.puts "检测模块内是否有未定义的 class"                 
         | 
| 280 | 
            +
                            dir_path = spec_path + '/' + data_hash["moduleName"]
         | 
| 281 | 
            +
                            if spec['spec_name'] == main_project_vipers_json_path
         | 
| 282 | 
            +
                              dir_path = '.' + '/HycanCommunity/Swift'
         | 
| 283 | 
            +
                            end
         | 
| 284 | 
            +
                            traverse_dir(dir_path) { |f|
         | 
| 285 | 
            +
                              if f.to_s() =~ /\.swift$/
         | 
| 286 | 
            +
                                lineNumber = 0
         | 
| 287 | 
            +
                                IO.readlines(f).each { |line| 
         | 
| 288 | 
            +
                                  cls_array.each do |cls|
         | 
| 289 | 
            +
                                    if line.index("class #{cls}")
         | 
| 290 | 
            +
                                      cls_array.delete(cls)
         | 
| 291 | 
            +
                                      break
         | 
| 292 | 
            +
                                    end
         | 
| 293 | 
            +
                                  end
         | 
| 294 | 
            +
                                  if lineNumber > 100
         | 
| 295 | 
            +
                                    break
         | 
| 296 | 
            +
                                  end
         | 
| 297 | 
            +
                                  lineNumber += 1
         | 
| 298 | 
            +
                                }
         | 
| 299 | 
            +
                              end                  
         | 
| 300 | 
            +
                            }
         | 
| 301 | 
            +
             | 
| 302 | 
            +
                            Pod::UI.puts "以下 Class 在 #{data_hash["moduleName"]} 没找到定义"
         | 
| 303 | 
            +
                            Pod::UI.puts cls_array.to_s()
         | 
| 304 | 
            +
                          end
         | 
| 305 | 
            +
                      
         | 
| 150 306 | 
             
                        end
         | 
| 151 307 | 
             
                      end
         | 
| 152 308 |  | 
| 153 | 
            -
                       | 
| 309 | 
            +
                      if check_unused_pods
         | 
| 310 | 
            +
                        Pod::UI.puts "以下 Pod 的 Framework 在主工程+Pod工程都没找到定义"
         | 
| 311 | 
            +
                        Pod::UI.puts framework_array.to_s()
         | 
| 312 | 
            +
                      end
         | 
| 313 | 
            +
             | 
| 314 | 
            +
                      injection_vipers_case = vipers_case.join("\n")
         | 
| 154 315 | 
             
                      injection_vipers_params_class = vipers_params_class.join("\n")
         | 
| 155 316 | 
             
                      injection_vipers_ext_func = vipers_ext_func.join("\n")
         | 
| 156 317 | 
             
                      injection_vipers_create_binder = vipers_create_binder.join("\n")
         | 
| 318 | 
            +
                      injection_vipers_call_binder = vipers_call_binder.join("\n")
         | 
| 157 319 |  | 
| 158 320 | 
             
                      template_file = ''
         | 
| 159 321 |  | 
| @@ -164,14 +326,25 @@ module CocoapodsVipers | |
| 164 326 | 
             
                      end
         | 
| 165 327 |  | 
| 166 328 | 
             
                      template = File.read(template_file)
         | 
| 167 | 
            -
             | 
| 168 | 
            -
                      # 替换 /** Injection VIPERS case **/ (暂不执行)
         | 
| 169 | 
            -
                      template.gsub!("/** Injection VIPERBinderHelper autoCreateBinder **/", injection_vipers_create_binder)
         | 
| 329 | 
            +
                      template.gsub!("/** Injection VIPERBinderHelper autoCreateBinder init **/", injection_vipers_create_binder)
         | 
| 170 330 | 
             
                      template.gsub!("/** Injection VIPERs extension **/", injection_vipers_ext_func)
         | 
| 171 331 | 
             
                      template.gsub!("/** Injection VIPERParams class **/", injection_vipers_params_class)              
         | 
| 172 332 |  | 
| 173 333 | 
             
                      File.open(ext_path, "w") { |file| file.puts template }
         | 
| 174 334 |  | 
| 335 | 
            +
                      prorocols_template_file = ''
         | 
| 336 | 
            +
                      
         | 
| 337 | 
            +
                      if prorocols_template_path
         | 
| 338 | 
            +
                        prorocols_template_file = prorocols_template_path
         | 
| 339 | 
            +
                      else
         | 
| 340 | 
            +
                        prorocols_template_file = File.dirname(__FILE__) + '/template/Protocols.swift' # 脚本所在目录 寻找模板文件
         | 
| 341 | 
            +
                      end
         | 
| 342 | 
            +
                      
         | 
| 343 | 
            +
                      prorocols_template = File.read(prorocols_template_file)
         | 
| 344 | 
            +
                      prorocols_template.gsub!("/** Injection VIPERS case **/", injection_vipers_case)
         | 
| 345 | 
            +
                      prorocols_template.gsub!("/** Injection VIPERBinderHelper call init function **/", injection_vipers_call_binder)
         | 
| 346 | 
            +
                      File.open(protocols_path, "w") { |file| file.puts prorocols_template }
         | 
| 347 | 
            +
             | 
| 175 348 | 
             
                      # 1 校验没有重复的 枚举值 enum
         | 
| 176 349 | 
             
                      # 2 读取模板的swift文件
         | 
| 177 350 | 
             
                      # 3 遍历读取模块里的json ps: 主工程 + 业务工程
         | 
    
        data/lib/cocoapods_plugin.rb
    CHANGED
    
    | @@ -5,6 +5,7 @@ module CocoapodsVipers | |
| 5 5 |  | 
| 6 6 | 
             
              Pod::HooksManager.register('cocoapods-vipers', :pre_install) do |_context, _|
         | 
| 7 7 | 
             
                paths = []
         | 
| 8 | 
            +
                pods = []
         | 
| 8 9 | 
             
                puts 'vipers hook pre_install'
         | 
| 9 10 | 
             
                dependencies = _context.podfile.dependencies
         | 
| 10 11 | 
             
                  dependencies.each do |d|
         | 
| @@ -17,8 +18,9 @@ module CocoapodsVipers | |
| 17 18 | 
             
                      # puts d.external_source[:path]
         | 
| 18 19 | 
             
                      paths.push({ 'spec_path' => d.external_source[:path], 'spec_name' => d.name })
         | 
| 19 20 | 
             
                    end
         | 
| 21 | 
            +
                    pods.push(d.name)
         | 
| 20 22 | 
             
                  end
         | 
| 21 | 
            -
                  CocoapodsVipers::Vipers.new.sync(paths)
         | 
| 23 | 
            +
                  CocoapodsVipers::Vipers.new.sync(paths, pods)
         | 
| 22 24 | 
             
              end
         | 
| 23 25 |  | 
| 24 26 | 
             
              Pod::HooksManager.register('cocoapods-vipers', :post_install) do |context|
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: cocoapods-vipers
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - fengjx
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2022-11-08 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -49,10 +49,11 @@ files: | |
| 49 49 | 
             
            - lib/cocoapods-vipers/command.rb
         | 
| 50 50 | 
             
            - lib/cocoapods-vipers/command/vipers.rb
         | 
| 51 51 | 
             
            - lib/cocoapods-vipers/gem_version.rb
         | 
| 52 | 
            +
            - lib/cocoapods-vipers/template/Protocols.swift
         | 
| 52 53 | 
             
            - lib/cocoapods-vipers/template/Vipers+Extension.swift
         | 
| 53 54 | 
             
            - lib/cocoapods-vipers/vipers-sync.rb
         | 
| 54 55 | 
             
            - lib/cocoapods_plugin.rb
         | 
| 55 | 
            -
            homepage: https://github.com/ | 
| 56 | 
            +
            homepage: https://github.com/Cellphoness/cocoapods-vipers/
         | 
| 56 57 | 
             
            licenses:
         | 
| 57 58 | 
             
            - MIT
         | 
| 58 59 | 
             
            metadata: {}
         | 
| @@ -71,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 71 72 | 
             
                - !ruby/object:Gem::Version
         | 
| 72 73 | 
             
                  version: '0'
         | 
| 73 74 | 
             
            requirements: []
         | 
| 74 | 
            -
            rubygems_version: 3. | 
| 75 | 
            +
            rubygems_version: 3.3.11
         | 
| 75 76 | 
             
            signing_key:
         | 
| 76 77 | 
             
            specification_version: 4
         | 
| 77 78 | 
             
            summary: cocoapods-vipers generate VIPER enum and medthod for Router which is in HycanServices
         |