Module: HMap::Utils

Defined in:
lib/cocoapods-hmap-prebuilt/hmap_utils.rb

Overview

A collection of utility functions used throughout cocoapods-hmap-prebuilt.

Constant Summary collapse

HEADER_EXTENSIONS =
Pod::Sandbox::FileAccessor::HEADER_EXTENSIONS

Class Method Summary collapse

Class Method Details

.change_xcconfig_header_search_path(xcconfig, hmap_h, use_headermap: true, save_origin: true) ⇒ Object



92
93
94
95
96
97
98
99
100
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 92

def self.change_xcconfig_header_search_path(xcconfig, hmap_h, use_headermap: true, save_origin: true)
  hmap_header_serach_paths = hmap_h.inject('') do |sum, hmap_n|
    hmap_pod_root_path = "${PODS_ROOT}/Headers/#{HMAP_DIR_NAME}/#{hmap_n}"
    sum + "\"#{hmap_pod_root_path}\" "
  end
  save_build_setting_to_xcconfig(xcconfig, hmap_header_serach_paths, HEAD_SEARCH_PATHS, save_origin: save_origin) do |xc|
    xc.attributes['USE_HEADERMAP'] = 'NO' unless use_headermap
  end
end

.clean_build_setting_to_xcconfig(path, build_setting) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 121

def self.clean_build_setting_to_xcconfig(path, build_setting)
  xc = Xcodeproj::Config.new(path)
  save_origin_build_setting = "SAVE_#{build_setting}"
  hmap_build_setting = "HMAP_PREBUILT_#{build_setting}"
  return if xc.attributes[hmap_build_setting].nil?

  xc.attributes[build_setting] = xc.attributes[save_origin_build_setting]
  xc.attributes.delete(save_origin_build_setting)
  xc.attributes.delete(hmap_build_setting)
  xc.attributes['USE_HEADERMAP'] = 'YES'
  xc.attributes.delete(build_setting) if xc.attributes[build_setting].nil?
  xc.save_as(path)
  puts "\t -xcconfig path: #{path} clean finish."
end

.clean_target_build_setting(targets, build_setting) ⇒ Object



74
75
76
77
78
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 74

def self.clean_target_build_setting(targets, build_setting)
  target_xcconfig_path(targets) do |xc|
    clean_build_setting_to_xcconfig(xc, build_setting)
  end
end

.hash_set_value(hash, *args) ⇒ Object



27
28
29
30
31
32
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 27

def self.hash_set_value(hash, *args)
  args.each do |arg|
    hash.merge(arg)
  end
  hash
end

.index_of_range(num, range) ⇒ Object



8
9
10
11
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 8

def self.index_of_range(num, range)
  num &= range - 1
  num
end

.magic?(magic) ⇒ Boolean

Returns:

  • (Boolean)


60
61
62
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 60

def self.magic?(magic)
  magic.eql?(HEADER_CONST[:HMAP_SWAPPED_MAGIC]) || magic.eql?(HEADER_CONST[:HMAP_HEADER_MAGIC_NUMBER])
end

.next_power_of_two(num) ⇒ Object



17
18
19
20
21
22
23
24
25
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 17

def self.next_power_of_two(num)
  num |= (num >> 1)
  num |= (num >> 2)
  num |= (num >> 4)
  num |= (num >> 8)
  num |= (num >> 16)
  num |= (num >> 32)
  num + 1
end

.power_of_two?(num) ⇒ Boolean

Returns:

  • (Boolean)


13
14
15
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 13

def self.power_of_two?(num)
  num != 0 && (num & (num - 1)).zero?
end

.safe_encode(string, target_encoding) ⇒ Object



64
65
66
67
68
69
70
71
72
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 64

def self.safe_encode(string, target_encoding)
  string.encode(target_encoding)
rescue Encoding::InvalidByteSequenceError
  string.force_encoding(target_encoding)
rescue Encoding::UndefinedConversionError
  string.encode(target_encoding, fallback: lambda { |c|
    c.force_encoding(target_encoding)
  })
end

.save_build_setting_to_xcconfig(path, value, build_setting, save_origin: true) {|xc| ... } ⇒ Object

Yields:

  • (xc)


102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 102

def self.save_build_setting_to_xcconfig(path, value, build_setting, save_origin: true)
  xc = Xcodeproj::Config.new(path)
  save_origin_build_setting = "SAVE_#{build_setting}"
  hmap_build_setting = "HMAP_PREBUILT_#{build_setting}"
  origin_build_setting = xc.attributes[build_setting]

  if !origin_build_setting.nil? && !origin_build_setting.include?(hmap_build_setting)
    xc.attributes[save_origin_build_setting] =
      origin_build_setting
  end

  save_origin_build_setting_value = xc.attributes[save_origin_build_setting]
  value = "#{value} ${#{save_origin_build_setting}}" if save_origin && !save_origin_build_setting_value.nil?
  xc.attributes[hmap_build_setting] = value
  xc.attributes[build_setting] = "${#{hmap_build_setting}}"
  yield(xc) if block_given?
  xc.save_as(path)
end

.specialize_format(format, swapped) ⇒ Object



34
35
36
37
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 34

def self.specialize_format(format, swapped)
  modifier = swapped ? '<' : '>'
  format.tr('=', modifier)
end

.string_downcase_hash(str) ⇒ Object



39
40
41
42
43
44
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 39

def self.string_downcase_hash(str)
  str.downcase.bytes.inject(0) do |sum, value|
    sum += value * 13
    sum
  end
end

.swapped_magic?(magic, version) ⇒ Boolean

Returns:

  • (Boolean)


56
57
58
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 56

def self.swapped_magic?(magic, version)
  magic.eql?(HEADER_CONST[:HMAP_SWAPPED_MAGIC]) && version.eql?(HEADER_CONST[:HMAP_SWAPPED_VERSION])
end

.target_xcconfig_path(targets) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 80

def self.target_xcconfig_path(targets)
  targets.each do |target|
    raise ClassIncludedError.new(target.class, Pod::Target) unless target.is_a?(Pod::Target)

    config_h = Pod::Target.instance_method(:build_settings).bind(target).call
    config_h.each_key do |configuration_name|
      xcconfig = target.xcconfig_path(configuration_name)
      yield(xcconfig) if block_given?
    end
  end
end

.update_changed_file(path, contents) ⇒ Object



46
47
48
49
50
51
52
53
54
# File 'lib/cocoapods-hmap-prebuilt/hmap_utils.rb', line 46

def self.update_changed_file(path, contents)
  if path.exist?
    content_stream = StringIO.new(contents)
    identical = File.open(path, 'rb') { |f| FileUtils.compare_stream(f, content_stream) }
    return if identical
  end
  path.dirname.mkpath
  File.open(path, 'w') { |f| f.write(contents) }
end