class CBin::SpecificationSource::Creator

Attributes

code_spec[R]
spec[R]

Public Class Methods

new(code_spec, platforms = 'ios') click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 12
def initialize(code_spec, platforms = 'ios')
  @code_spec = code_spec
  @platforms = Array(platforms)
  validate!
end

Public Instance Methods

clear_spec_file() click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 46
def clear_spec_file
  File.delete(filename) if File.exist?(filename)
end
create() click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 22
def create
  if CBin::Build::Utils.is_framework(@code_spec)
    spec = create_framework_from_code_spec
  else
    spec = create_from_code_spec
  end

  spec
end
filename() click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 50
def filename
  @filename ||= "#{CBin::Config::Builder.instance.binary_json_dir_name}/#{spec.name}.binary.podspec.json"
end
validate!() click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 18
def validate!
  raise Pod::Informative, '源码 podspec 不能为空 .' unless code_spec
end
write_spec_file(file = filename) click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 32
def write_spec_file(file = filename)
  create unless spec

  FileUtils.mkdir_p(CBin::Config::Builder.instance.binary_json_dir) unless File.exist?(CBin::Config::Builder.instance.binary_json_dir)
  FileUtils.rm_rf(file) if File.exist?(file)

  File.open(file, 'w+') do |f|
    # f.write("# MARK: converted automatically by plugin cocoapods-tdf-bin @slj \r\n")
    f.write(spec.to_pretty_json)
  end

  @filename = file
end

Private Instance Methods

binary_public_header_files() click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 223
def binary_public_header_files
  "bin_#{code_spec.name}_#{code_spec.version}/Headers/*.h"
end
binary_resources() click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 231
def binary_resources
  "bin_#{code_spec.name}_#{code_spec.version}/Resources/*"
end
binary_source() click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 203
def binary_source
  { http: format(CBin.config.binary_download_url, code_spec.root.name, code_spec.version), type: CBin.config.download_file_type }
end
binary_source_files() click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 215
def binary_source_files
  { http: format(CBin.config.binary_download_url, code_spec.root.name, code_spec.version), type: CBin.config.download_file_type }
end
binary_vendored_libraries() click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 227
def binary_vendored_libraries
  "bin_#{code_spec.name}_#{code_spec.version}/*.a"
end
code_spec_consumer(_platform = :ios) click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 207
def code_spec_consumer(_platform = :ios)
  code_spec.consumer(:ios)
end
create_framework_from_code_spec() click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 129
      def create_framework_from_code_spec
        @spec = code_spec.dup
        # vendored_frameworks | resources | source | source_files | public_header_files
        # license | resource_bundles | vendored_libraries

        # Project Linkin
        @spec.vendored_frameworks = "#{code_spec.root.name}.framework"

        # Resources
        extnames = []
        extnames << '*.bundle' if code_spec_consumer.resource_bundles.any?
        if code_spec_consumer.resources.any?
          extnames += code_spec_consumer.resources.map { |r| File.basename(r) }
        end

        extnames = extnames.select do | extname |
          not expand_suffix(extname)
        end

        if extnames.any?
          resources = framework_contents('Resources').flat_map { |r| extnames.map { |e| "#{r}/#{e}" } }
          resources << "#{code_spec.root.name}.framework/*.{storyboardc,nib,mom,momd,cdm}"
          @spec.resources = resources
        end

        # Source Location
        @spec.source = binary_source

        # Source Code
        @spec.source_files = framework_contents('Headers/*')
        @spec.public_header_files = framework_contents('Headers/*')

        # Unused for binary
        spec_hash = @spec.to_hash
        # spec_hash.delete('license')
        spec_hash.delete('resource_bundles')
        spec_hash.delete('exclude_files')
        spec_hash.delete('preserve_paths')
        # 这里不确定 vendored_libraries 指定的时动态/静态库
        # 如果是静态库的话,需要移除,否则就不移除
        # 最好是静态库都独立成 Pod ,cocoapods-package 打静态库去 collect 目标文件时好做过滤
        # 这里统一只对命名后缀 .a 文件做处理
        # spec_hash.delete('vendored_libraries')
        # libraries 只能假设为动态库不做处理了,如果有例外,需要开发者自行处理
        vendored_libraries = spec_hash.delete('vendored_libraries')
        vendored_libraries = Array(vendored_libraries).reject { |l| l.end_with?('.a') }
        if vendored_libraries.any?
          spec_hash['vendored_libraries'] = vendored_libraries
        end

        # Filter platforms
        platforms = spec_hash['platforms']
        selected_platforms = platforms.select { |k, _v| @platforms.include?(k) }
        spec_hash['platforms'] = selected_platforms.empty? ? platforms : selected_platforms

        @spec = Pod::Specification.from_hash(spec_hash)
        @spec.description = <<-EOF
         「   converted automatically by plugin cocoapods-tdf-bin   」
          #{@spec.description}
        EOF
        @spec
      end
create_from_code_spec() click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 56
      def create_from_code_spec
        @spec = code_spec.dup
        # vendored_frameworks | resources | source | source_files | public_header_files
        # license | resource_bundles | vendored_libraries

        # Project Linkin
        # @spec.vendored_frameworks = "#{code_spec.root.name}.framework"

        # Resources
        extnames = []
        extnames << '*.bundle' if code_spec_consumer.resource_bundles.any?
        if code_spec_consumer.resources.any?
          extnames += code_spec_consumer.resources.map { |r| File.basename(r) }
        end
        if extnames.any?
          @spec.resources = framework_contents('Resources').flat_map { |r| extnames.map { |e| "#{r}/#{e}" } }
        end

        # Source Location
        @spec.source = binary_source

        # Source Code
        # @spec.source_files = framework_contents('Headers/*')
        # @spec.public_header_files = framework_contents('Headers/*')

        # Unused for binary
        spec_hash = @spec.to_hash
        # spec_hash.delete('license')
        spec_hash.delete('resource_bundles')
        spec_hash.delete('exclude_files')
        spec_hash.delete('preserve_paths')

        spec_hash.delete('subspecs')
        spec_hash.delete('default_subspecs')
        spec_hash.delete('default_subspec')
        spec_hash.delete('vendored_frameworks')
        spec_hash.delete('vendored_framework')

        # 这里不确定 vendored_libraries 指定的时动态/静态库
        # 如果是静态库的话,需要移除,否则就不移除
        # 最好是静态库都独立成 Pod ,cocoapods-package 打静态库去 collect 目标文件时好做过滤
        # 这里统一只对命名后缀 .a 文件做处理
        # spec_hash.delete('vendored_libraries')
        # libraries 只能假设为动态库不做处理了,如果有例外,需要开发者自行处理
        spec_hash.delete('vendored_libraries')

        # vendored_libraries = Array(vendored_libraries).reject { |l| l.end_with?('.a') }
        # if vendored_libraries.any?
        #   spec_hash['vendored_libraries'] = vendored_libraries
        # end

        # Filter platforms
        platforms = spec_hash['platforms']
        selected_platforms = platforms.select { |k, _v| @platforms.include?(k) }
        spec_hash['platforms'] = selected_platforms.empty? ? platforms : selected_platforms

        @spec = Pod::Specification.from_hash(spec_hash)

        #把命令 prepare_command 移除掉,如ReactiveCocoa会执行修改重命令的脚步
        @spec.prepare_command = "" if @spec.prepare_command
        @spec.version = code_spec.version
        @spec.source = binary_source
        @spec.source_files = binary_source_files
        @spec.public_header_files = binary_public_header_files
        @spec.vendored_libraries = binary_vendored_libraries
        @spec.resources = binary_resources if @spec.attributes_hash.keys.include?("resources")
        @spec.description = <<-EOF
         「   converted automatically by plugin cocoapods-tdf-bin   」
          #{@spec.description}
        EOF
        @spec
      end
expand_suffix(suffix) click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 192
def expand_suffix(suffix)
  if suffix.end_with?('.storyboard') ||
    suffix.end_with?('.xib') ||
    suffix.end_with?('.xcdatamodel') ||
    suffix.end_with?('.xcdatamodeld') ||
    suffix.end_with?('.xcmappingmodel')
    return true
  end
  false
end
framework_contents(name) click to toggle source
# File lib/cocoapods-tdf-bin/helpers/spec_source_creator.rb, line 211
def framework_contents(name)
  ["#{code_spec.root.name}.framework"].map { |path| "#{path}/#{name}" }
end