pprof 0.3.9 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8426b4eb39b37e5229a8e338e4348e81aa93e671
4
- data.tar.gz: ac5988b00d9287a1b8dc491ec9ae7f60ec6119f7
2
+ SHA256:
3
+ metadata.gz: f7691660bb69c7c6f6f4fedb4722dc0e647183378e5aa79cfa0ce2a80f7e4cef
4
+ data.tar.gz: ae54346cc1d76c10a89468b605a698727ff38909f683bed7ff8a6d779c6605b0
5
5
  SHA512:
6
- metadata.gz: 9f1e6dcc8770c0198910a060dc5fd00526515a41c1be82e145df7a428b4f1463fecd1738aefc4af550d11ae8d528abc6f4d8751a71721ffbddaa2302b5bb8117
7
- data.tar.gz: 644b8df71ed9a7238cd160bc967dcaab72f9a180727ddd9eaacf858c88519cbbde8767792f940a621405c70751324ddc120196d1541a09709869b8ef86c2027f
6
+ metadata.gz: 9b2490137336562c025610bbfc7de8b0fe1a177005b9a7c7cfea21310fedb3f77164745303dc08b1816d3e8dd5a0f7a5aaa71373a71c784921982d36da4e876f
7
+ data.tar.gz: 22665cd4ba32a996577a8ed8099348f29193fb88589a32b1faaf8ca03298a971902373d23cdad568c59a1b6e23f59f81e3c0a3e543e8173c18ddd71f098379a5
data/bin/pprof CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'pprof'
4
5
  require 'optparse'
@@ -7,7 +8,7 @@ require 'optparse'
7
8
  # Or a standard match if the string is bare.
8
9
  #
9
10
  def matcher(string)
10
- m = string.match(%r[^/(.*)/(.*)$])
11
+ m = string.match(%r{^/(.*)/(.*)$})
11
12
  if m.nil?
12
13
  Regexp.new(Regexp.escape(string))
13
14
  else
@@ -19,10 +20,11 @@ end
19
20
 
20
21
  filters = {}
21
22
  options = {}
22
- list_options = { :mode => :table }
23
+ list_options = { mode: :table }
23
24
 
25
+ # rubocop:disable Metrics/BlockLength
24
26
  parser = OptionParser.new do |opts|
25
- opts.banner = <<-BANNER.gsub(/^ *\|/,'')
27
+ opts.banner = <<-BANNER.gsub(/^ *\|/, '')
26
28
  |Usage:
27
29
  | pprof [print_options] (PATH|UUID)
28
30
  | pprof [list_options] [filters]
@@ -40,125 +42,130 @@ parser = OptionParser.new do |opts|
40
42
  | - To remove all expired certificates, you can use `#{opts.program_name} -e0 | xargs -0 rm`
41
43
  BANNER
42
44
 
43
- opts.separator ""
44
- opts.separator "Print options (when file given)"
45
+ opts.separator ''
46
+ opts.separator 'Print options (when file given)'
45
47
 
46
- opts.on("-i", "--info", "Print general info (default)") do
48
+ opts.on('-i', '--info', 'Print general info (default)') do
47
49
  options[:info] = true
48
50
  end
49
- opts.on("-c", "--certs", "Print certificates") do
51
+ opts.on('-c', '--certs', 'Print certificates') do
50
52
  options[:certs] = true
51
53
  end
52
- opts.on("-d", "--devices", "Print provisioned devices") do
54
+ opts.on('-d', '--devices', 'Print provisioned devices') do
53
55
  options[:devices] = true
54
56
  end
55
57
 
56
- opts.separator ""
57
- opts.separator "List options (when no file given)"
58
+ opts.separator ''
59
+ opts.separator 'List options (when no file given)'
58
60
 
59
- opts.on("-l", "--list", "Print only the UUIDs, one per line (instead of an ASCII table)") do
61
+ opts.on('-l', '--list', 'Print only the UUIDs, one per line (instead of an ASCII table)') do
60
62
  list_options[:mode] = :list
61
63
  end
62
- opts.on("-p", "--path", "Print only the paths, one per line (instead of an ASCII table)") do
64
+ opts.on('-p', '--path', 'Print only the paths, one per line (instead of an ASCII table)') do
63
65
  list_options[:mode] = :path
64
66
  end
65
- opts.on("-0", "--print0", "Separate each found entry by \\0, to be used by `xargs -0`") do
67
+ opts.on('-j', '--json', 'Print the output information as a JSON') do
68
+ list_options[:mode] = :json
69
+ end
70
+ opts.on('-0', '--print0', 'Separate each found entry by \\0, to be used by `xargs -0`') do
66
71
  list_options[:zero] = true
67
72
  end
68
73
 
69
- opts.separator ""
70
- opts.separator "Filters (when no file given)"
74
+ opts.separator ''
75
+ opts.separator 'Filters (when no file given)'
71
76
 
72
- opts.on("--name NAME", "Filter by name") do |name|
77
+ opts.on('--name NAME', 'Filter by name') do |name|
73
78
  filters[:name] = matcher(name)
74
79
  end
75
80
 
76
- opts.on("--appid-name APPID", "Filter by App ID Name") do |appid_name|
81
+ opts.on('--appid-name APPID', 'Filter by App ID Name') do |appid_name|
77
82
  filters[:appid_name] = matcher(appid_name)
78
83
  end
79
84
 
80
- opts.on("--appid APPID", "Filter by App ID") do |appid|
85
+ opts.on('--appid APPID', 'Filter by App ID') do |appid|
81
86
  filters[:appid] = matcher(appid)
82
87
  end
83
88
 
84
- opts.on("--uuid UUID", "Filter by UUID") do |uuid|
89
+ opts.on('--uuid UUID', 'Filter by UUID') do |uuid|
85
90
  filters[:uuid] = matcher(uuid)
86
91
  end
87
92
 
88
- opts.on("--team TEAM", "Filter by team name or ID") do |team|
93
+ opts.on('--team TEAM', 'Filter by team name or ID') do |team|
89
94
  filters[:team] = matcher(team)
90
95
  end
91
96
 
92
- opts.on("--[no-]exp", "Only profiles (not) expired") do |flag|
97
+ opts.on('--[no-]exp', 'Only profiles (not) expired') do |flag|
93
98
  filters[:exp] = flag
94
99
  end
95
100
 
96
- opts.on("--[no-]has-devices", "Filter by profiles having (no) provisioned devices") do |d|
101
+ opts.on('--[no-]has-devices', 'Filter by profiles having (no) provisioned devices') do |d|
97
102
  filters[:has_devices] = d
98
103
  end
99
104
 
100
- opts.on("--[no-]all-devices", "Filter by profiles (not) provisioning all devices") do |d|
105
+ opts.on('--[no-]all-devices', 'Filter by profiles (not) provisioning all devices') do |d|
101
106
  filters[:all_devices] = d
102
107
  end
103
108
 
104
- opts.on("--aps [ENV]", "Only profiles having Push entitlements (or a specific aps env)") do |env|
109
+ opts.on('--aps [ENV]', 'Only profiles having Push entitlements (or a specific aps env)') do |env|
105
110
  filters[:aps_env] = env.nil? ? true : matcher(env)
106
111
  end
107
112
 
113
+ opts.separator ''
114
+ opts.separator 'Misc'
108
115
 
109
- opts.separator ""
110
- opts.separator "Misc"
111
-
112
- opts.on_tail("-h", "--help", "Show this message") do
116
+ opts.on_tail('-h', '--help', 'Show this message') do
113
117
  puts opts
114
118
  exit
115
119
  end
116
120
 
117
- opts.on_tail("-v", "--version", "Show version") do
121
+ opts.on_tail('-v', '--version', 'Show version') do
118
122
  puts PProf::VERSION
119
123
  exit
120
124
  end
121
125
  end
126
+ # rubocop:enable Metrics/BlockLength
122
127
 
123
128
  # Parse the options, catching parse errors nicely
124
129
  begin
125
130
  parser.parse!
126
- rescue OptionParser::InvalidOption => err
127
- puts err
128
- puts parser.help()
131
+ rescue OptionParser::InvalidOption => e
132
+ puts e
133
+ puts parser.help
129
134
  exit 1
130
135
  end
131
136
 
132
137
  # Don't mix filters and options together, that doesn't make sense
133
138
 
134
139
  unless filters.empty? || ARGV.empty?
135
- puts "You should use either filter flags to filter the whole list, or an specific path, not both."
140
+ puts 'You should use either filter flags to filter the whole list, or an specific path, not both.'
136
141
  puts parser # Usage
137
142
  exit
138
143
  end
139
144
 
140
145
  unless options.empty? || !ARGV.empty?
141
- puts "You should use option flags only when providing an specific path."
146
+ puts 'You should use option flags only when providing an specific path.'
142
147
  puts parser # Usage
143
148
  exit
144
149
  end
145
150
 
146
151
  # Call the appropriate action
147
152
 
153
+ o = PProf::OutputFormatter.new
148
154
  if ARGV.empty?
149
155
  # Print list of matching profiles
150
- o = PProf::OutputFormatter.new
151
156
  list_options[:mode] = :path if list_options[:zero] && list_options[:mode] == :table
152
157
  o.print_filtered_list(PProf::ProvisioningProfile::DEFAULT_DIR, filters, list_options)
153
158
  else
154
- # Print info about given profile path/UUID
155
- o = PProf::OutputFormatter.new
156
159
  begin
160
+ # Print info about given profile path/UUID
157
161
  p = PProf::ProvisioningProfile.new(ARGV[0])
158
-
159
- options = { :info => true } if options.empty?
160
- o.print_info(p, options)
161
- rescue Exception => e
162
+ options = { info: true } if options.empty?
163
+ if list_options[:mode] == :json
164
+ o.print_json(p, options)
165
+ else
166
+ o.print_info(p, options)
167
+ end
168
+ rescue StandardError => e
162
169
  o.print_error(e, ARGV[0])
163
170
  end
164
171
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Module for the pprof tool to manipulate Provisioning Profiles
2
4
  module PProf
3
5
  # Represents the list of entitlements in a Provisioning Profile
@@ -23,7 +25,7 @@ module PProf
23
25
  # True if we can attach a debugger to the executable, false if not.
24
26
  #
25
27
  # @return [Bool]
26
- def get_task_allow
28
+ def get_task_allow # rubocop:disable Naming/AccessorMethodName
27
29
  @dict['get-task-allow']
28
30
  end
29
31
 
@@ -98,9 +100,10 @@ module PProf
98
100
  # @param [#to_s] key
99
101
  # The key to check
100
102
  #
101
- def has_key?(key)
102
- @dict.has_key?(key.to_s)
103
+ def key?(key)
104
+ @dict.key?(key.to_s)
103
105
  end
106
+ alias has_key? key?
104
107
 
105
108
  # The list of all entitlement keys, as String
106
109
  #
@@ -1,7 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
1
5
  # Module for the pprof tool to manipulate Provisioning Profiles
2
6
  module PProf
3
7
  # A helper tool to pretty-print Provisioning Profile informations
4
8
  class OutputFormatter
9
+ # List of properties of a `PProf::ProvisioningProfile` to print when using the `-i` flag
10
+ MAIN_PROFILE_KEYS = %i[name uuid app_id_name app_id_prefix creation_date expiration_date ttl team_ids team_name]
11
+
5
12
  # Initialize a new OutputFormatter
6
13
  #
7
14
  # @param [IO] output
@@ -27,14 +34,16 @@ module PProf
27
34
  # @param [String...] cols
28
35
  # The content of each column of the row to add
29
36
  def row(*cols)
30
- '| ' + cols.zip(@widths).map do |c,w|
37
+ justified_cols = cols.zip(@widths).map do |c, w|
31
38
  (c || '<nil>').to_s.ljust(w)[0...w]
32
- end.join(' | ') + ' |'
39
+ end
40
+ "| #{justified_cols.join(' | ')} |"
33
41
  end
34
42
 
35
43
  # Add a separator line to the ASCII table
36
44
  def separator
37
- '+' + @widths.map { |w| '-' * (w+2) }.join('+') + '+'
45
+ columns_dashes = @widths.map { |w| '-' * (w + 2) }
46
+ "+#{columns_dashes.join('+')}+"
38
47
  end
39
48
  end
40
49
 
@@ -57,25 +66,78 @@ module PProf
57
66
  # Decide what to print. Valid keys are :info, :certs and :devices
58
67
  #
59
68
  def print_info(profile, options = nil)
60
- options ||= { :info => true }
69
+ options ||= { info: true }
61
70
  if options[:info]
62
- keys = [:name, :uuid, :app_id_name, :app_id_prefix, :creation_date, :expiration_date, :ttl, :team_ids, :team_name]
71
+ keys = MAIN_PROFILE_KEYS
63
72
  keys.each do |key|
64
- @output.puts "- #{key.to_s}: #{profile.send(key.to_sym)}"
73
+ @output.puts "- #{key}: #{profile.send(key.to_sym)}"
65
74
  end
66
- @output.puts "- Entitlements:"
67
- @output.puts profile.entitlements.to_s.split("\n").map { |line| " #{line}" }
75
+ @output.puts '- Entitlements:'
76
+ @output.puts(profile.entitlements.to_s.split("\n").map { |line| " #{line}" })
68
77
  end
69
78
 
70
- if options[:info] || options[:certs]
79
+ # rubocop:disable Style/GuardClause
80
+ if options[:info] || options[:certs]
71
81
  @output.puts "- #{profile.developer_certificates.count} Developer Certificates"
72
- profile.developer_certificates.each { |cert| @output.puts " - #{cert.subject}" } if options[:certs]
82
+ if options[:certs]
83
+ profile.developer_certificates.each do |cert|
84
+ @output.puts " - #{cert.subject}"
85
+ @output.puts " issuer: #{cert.issuer}"
86
+ @output.puts " serial: #{cert.serial}"
87
+ @output.puts " expires: #{cert.not_after}"
88
+ end
89
+ end
73
90
  end
91
+
74
92
  if options[:info] || options[:devices]
75
93
  @output.puts "- #{(profile.provisioned_devices || []).count} Provisioned Devices"
76
94
  profile.provisioned_devices.each { |udid| @output.puts " - #{udid}" } if options[:devices]
77
95
  @output.puts "- Provision all devices: #{profile.provisions_all_devices.inspect}"
78
96
  end
97
+ # rubocop:enable Style/GuardClause
98
+ end
99
+
100
+ # Returns a Provisioning Profile hash ready to be printed as a JSON output
101
+ #
102
+ # @param [Array<PProf::ProvisioningProfile>] profile
103
+ # List of provisioning profiles to include in the JSON output
104
+ # @param [Hash] options
105
+ # Options to indicate what to include in the generated JSON.
106
+ # `:certs`: if set to `true`, output will also include the info about `DeveloperCertificates` in each profile
107
+ # `:devices`: if set to `true`, output will also include the list of `ProvisionedDevices` for each profile
108
+ #
109
+ # @return [Hash] The hash ready to be `JSON.pretty_generate`'d
110
+ #
111
+ def as_json(profile, options = {})
112
+ hash = profile.to_hash.dup
113
+ hash.delete 'DER-Encoded-Profile'
114
+ hash.delete 'ProvisionedDevices' unless options[:devices]
115
+ if options[:certs]
116
+ hash['DeveloperCertificates'] = developer_certificates.map do |cert|
117
+ {
118
+ subject: cert.subject,
119
+ issuer: cert.issuer,
120
+ serial: cert.serial,
121
+ expires: cert.not_after
122
+ }
123
+ end
124
+ else
125
+ hash.delete 'DeveloperCertificates'
126
+ end
127
+ hash
128
+ end
129
+
130
+ # Prints a Provisioning Profile as JSON
131
+ #
132
+ # @param [Array<PProf::ProvisioningProfile>] profile
133
+ # List of provisioning profiles to include in the JSON output
134
+ # @param [Hash] options
135
+ # Options to indicate what to include in the generated JSON.
136
+ # `:certs`: if set to `true`, output will also include the info about `DeveloperCertificates` in each profile
137
+ # `:devices`: if set to `true`, output will also include the list of `ProvisionedDevices` for each profile
138
+ #
139
+ def print_json(profile, options = {})
140
+ @output.puts JSON.pretty_generate(as_json(profile, options))
79
141
  end
80
142
 
81
143
  # Prints the filtered list of Provisioning Profiles
@@ -97,23 +159,25 @@ module PProf
97
159
  # * Valid values for key `:zero` are `true` or `false` to decide if we print `\0` at the end of each output.
98
160
  # Only used by `:list` and `:path` modes
99
161
  #
100
- def print_filtered_list(dir = PProf::ProvisioningProfile::DEFAULT_DIR, filters = {}, list_options = { :mode => :table })
162
+ def print_filtered_list(dir = PProf::ProvisioningProfile::DEFAULT_DIR, filters = {}, list_options = { mode: :table })
101
163
  filter_func = lambda do |p|
102
164
  (filters[:name].nil? || p.name =~ filters[:name]) &&
103
- (filters[:appid_name].nil? || p.app_id_name =~ filters[:appid_name]) &&
104
- (filters[:appid].nil? || p.entitlements.app_id =~ filters[:appid]) &&
105
- (filters[:uuid].nil? || p.uuid =~ filters[:uuid]) &&
106
- (filters[:team].nil? || p.team_name =~ filters[:team] || p.team_ids.any? { |id| id =~ filters[:team] }) &&
107
- (filters[:exp].nil? || (p.expiration_date < DateTime.now) == filters[:exp]) &&
108
- (filters[:has_devices].nil? || !(p.provisioned_devices || []).empty? == filters[:has_devices]) &&
109
- (filters[:all_devices].nil? || p.provisions_all_devices == filters[:all_devices]) &&
110
- (filters[:aps_env].nil? || match_aps_env(p.entitlements.aps_environment, filters[:aps_env])) &&
111
- true
165
+ (filters[:appid_name].nil? || p.app_id_name =~ filters[:appid_name]) &&
166
+ (filters[:appid].nil? || p.entitlements.app_id =~ filters[:appid]) &&
167
+ (filters[:uuid].nil? || p.uuid =~ filters[:uuid]) &&
168
+ (filters[:team].nil? || p.team_name =~ filters[:team] || p.team_ids.any? { |id| id =~ filters[:team] }) &&
169
+ (filters[:exp].nil? || (p.expiration_date < DateTime.now) == filters[:exp]) &&
170
+ (filters[:has_devices].nil? || !(p.provisioned_devices || []).empty? == filters[:has_devices]) &&
171
+ (filters[:all_devices].nil? || p.provisions_all_devices == filters[:all_devices]) &&
172
+ (filters[:aps_env].nil? || match_aps_env(p.entitlements.aps_environment, filters[:aps_env])) &&
173
+ true
112
174
  end
113
175
 
114
176
  case list_options[:mode]
115
177
  when :table
116
178
  print_table(dir, &filter_func)
179
+ when :json
180
+ print_json_list(dir, list_options, &filter_func)
117
181
  else
118
182
  print_list(dir, list_options, &filter_func)
119
183
  end
@@ -138,16 +202,17 @@ module PProf
138
202
  @output.puts table.row('UUID', 'Name', 'AppID', 'Expiration Date', ' ', 'Team Name')
139
203
  @output.puts table.separator
140
204
 
141
- Dir[dir + '/*.mobileprovision'].each do |file|
205
+ Dir['*.mobileprovision', base: dir].each do |file_name|
206
+ file = File.join(dir, file_name)
142
207
  begin
143
208
  p = PProf::ProvisioningProfile.new(file)
144
-
209
+
145
210
  next if block_given? && !yield(p)
146
211
 
147
212
  state = DateTime.now < p.expiration_date ? "\u{2705}" : "\u{274c}" # 2705=checkmark, 274C=red X
148
213
  @output.puts table.row(p.uuid, p.name, p.entitlements.app_id, p.expiration_date.to_time, state, p.team_name)
149
- rescue Exception => e
150
- errors << { :message => e, :file => file }
214
+ rescue StandardError => e
215
+ errors << { message: e, file: file }
151
216
  end
152
217
  count += 1
153
218
  end
@@ -155,9 +220,7 @@ module PProf
155
220
  @output.puts table.separator
156
221
  @output.puts "#{count} Provisioning Profiles found."
157
222
 
158
- unless errors.empty?
159
- errors.each { |e| print_error(e[:message], e[:file]) }
160
- end
223
+ errors.each { |e| print_error(e[:message], e[:file]) } unless errors.empty?
161
224
  end
162
225
 
163
226
  # Prints the filtered list of UUIDs or Paths only
@@ -165,35 +228,62 @@ module PProf
165
228
  # @param [String] dir
166
229
  # The directory containing the mobileprovision files to list.
167
230
  # Defaults to '~/Library/MobileDevice/Provisioning Profiles'
231
+ # @param [Hash] options
232
+ # The options hash typically filled while parsing the command line arguments.
233
+ # - :mode: will print the UUIDs if set to `:list`, the file path otherwise
234
+ # - :zero: will concatenate the entries with `\0` instead of `\n` if set
168
235
  #
169
- # @yield each provisioning provile for filtering/validation
236
+ # @yield each provisioning profile for filtering/validation
170
237
  # The block is given ProvisioningProfile object and should
171
238
  # return true to display the row, false to filter it out
172
239
  #
173
- def print_list(dir = PProf::ProvisioningProfile::DEFAULT_DIR, options)
240
+ def print_list(dir = PProf::ProvisioningProfile::DEFAULT_DIR, options) # rubocop:disable Style/OptionalArguments
174
241
  errors = []
175
- Dir[dir + '/*.mobileprovision'].each do |file|
176
- begin
177
- p = PProf::ProvisioningProfile.new(file)
178
- next if block_given? && !yield(p)
242
+ Dir['*.mobileprovision', base: dir].each do |file_name|
243
+ file = File.join(dir, file_name)
244
+ p = PProf::ProvisioningProfile.new(file)
245
+ next if block_given? && !yield(p)
179
246
 
180
- @output.print options[:mode] == :uuid ? p.uuid.chomp : file.chomp
181
- @output.print options[:zero] ? "\0" : "\n"
182
- rescue Exception => e
183
- errors << { :message => e, :file => file }
184
- end
185
- end
186
- unless errors.empty?
187
- errors.each { |e| print_error(e[:message], e[:file]) }
247
+ @output.print options[:mode] == :list ? p.uuid.chomp : file.chomp
248
+ @output.print options[:zero] ? "\0" : "\n"
249
+ rescue StandardError => e
250
+ errors << { message: e, file: file }
188
251
  end
252
+ errors.each { |e| print_error(e[:message], e[:file]) } unless errors.empty?
189
253
  end
190
254
 
255
+ # Prints the filtered list of profiles as a JSON array
256
+ #
257
+ # @param [String] dir
258
+ # The directory containing the mobileprovision files to list.
259
+ # Defaults to '~/Library/MobileDevice/Provisioning Profiles'
260
+ # @param [Hash] options
261
+ # The options hash typically filled while parsing the command line arguments.
262
+ # - :mode: will print the UUIDs if set to `:list`, the file path otherwise
263
+ # - :zero: will concatenate the entries with `\0` instead of `\n` if set
264
+ #
265
+ # @yield each provisioning profile for filtering/validation
266
+ # The block is given ProvisioningProfile object and should
267
+ # return true to display the row, false to filter it out
268
+ #
269
+ def print_json_list(dir = PProf::ProvisioningProfile::DEFAULT_DIR, options) # rubocop:disable Style/OptionalArguments
270
+ errors = []
271
+ profiles = Dir['*.mobileprovision', base: dir].map do |file_name|
272
+ file = File.join(dir, file_name)
273
+ p = PProf::ProvisioningProfile.new(file)
274
+ as_json(p, options) unless block_given? && !yield(p)
275
+ rescue StandardError => e
276
+ errors << { message: e, file: file }
277
+ end.compact
278
+ errors.each { |e| print_error(e[:message], e[:file]) } unless errors.empty?
279
+ @output.puts JSON.pretty_generate(profiles)
280
+ end
191
281
 
192
- private
193
282
  def self.match_aps_env(actual, expected)
194
- return false if actual.nil? # false if no Push entitlements
195
- return true if expected === true # true if Push present but we don't filter on specific env
196
- return actual =~ expected # true if Push present and we filter on specific env
283
+ return false if actual.nil? # false if no Push entitlements
284
+ return true if expected == true # true if Push present but we don't filter on specific env
285
+
286
+ actual =~ expected # true if Push present and we filter on specific env
197
287
  end
198
288
  end
199
289
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'openssl'
2
4
  require 'plist'
3
5
  require 'time'
@@ -7,7 +9,7 @@ module PProf
7
9
  # Represents the content of a Provisioning Profile file
8
10
  class ProvisioningProfile
9
11
  # The default location where all the Provisioning Profiles are stored on a Mac
10
- DEFAULT_DIR="#{ENV['HOME']}/Library/MobileDevice/Provisioning Profiles"
12
+ DEFAULT_DIR = "#{ENV['HOME']}/Library/MobileDevice/Provisioning Profiles"
11
13
 
12
14
  # Create a new ProvisioningProfile object from a file path or UUID
13
15
  #
@@ -19,26 +21,26 @@ module PProf
19
21
  # File path or UUID of the ProvisioningProfile
20
22
  #
21
23
  def initialize(file)
22
- if file =~ %r/^[0-9A-F-]*$/i
23
- path = "#{PProf::ProvisioningProfile::DEFAULT_DIR}/#{file}.mobileprovision"
24
- else
25
- path = file
26
- end
24
+ path = if file =~ /^[0-9A-F-]*$/i
25
+ "#{PProf::ProvisioningProfile::DEFAULT_DIR}/#{file}.mobileprovision"
26
+ else
27
+ file
28
+ end
27
29
  xml = nil
28
30
  begin
29
31
  pkcs7 = OpenSSL::PKCS7.new(File.read(path))
30
32
  pkcs7.verify([], OpenSSL::X509::Store.new)
31
33
  xml = pkcs7.data
32
- raise "Empty PKCS7 payload" if xml.nil? || xml.empty?
33
- rescue
34
+ raise 'Empty PKCS7 payload' if xml.nil? || xml.empty?
35
+ rescue StandardError
34
36
  # Seems like sometimes OpenSSL fails to parse the PKCS7 payload
35
37
  # Besides, OpenSSL is deprecated on macOS so might not be up-to-date on all machines
36
38
  # So as a fallback, we run the `security` command line.
37
- # (We could use `security` everytime, but invoking a command line is generally less
39
+ # (We could use `security` everytime, but invoking a command line is generally less
38
40
  # efficient than calling the OpenSSL gem if available, so for now it's just used as fallback)
39
41
  xml = `security cms -D -i "#{path}" 2> /dev/null`
40
42
  end
41
- @plist = Plist::parse_xml(xml)
43
+ @plist = Plist.parse_xml(xml)
42
44
  raise "Unable to parse file #{file}." if @plist.nil?
43
45
  end
44
46
 
@@ -101,7 +103,7 @@ module PProf
101
103
  def team_ids
102
104
  @plist['TeamIdentifier']
103
105
  end
104
-
106
+
105
107
  # The name of the Team associated with this Provisioning Profile
106
108
  #
107
109
  # @return [String]
@@ -109,7 +111,7 @@ module PProf
109
111
  @plist['TeamName']
110
112
  end
111
113
 
112
- # The list of X509 Developer Certifiates associated with this profile
114
+ # The list of X509 Developer Certificates associated with this profile
113
115
  #
114
116
  # @return [Array<OpenSSL::X509::Certificate>]
115
117
  def developer_certificates
@@ -144,7 +146,7 @@ module PProf
144
146
  #
145
147
  # @return [Hash]
146
148
  def to_hash
147
- @dict
149
+ @plist
148
150
  end
149
151
 
150
152
  # The human-readable string representation of this Provisioning Profile
@@ -152,14 +154,14 @@ module PProf
152
154
  #
153
155
  # @return [String]
154
156
  def to_s
155
- lines = [:name, :uuid, :app_id_name, :app_id_prefix, :creation_date, :expiration_date, :ttl, :team_ids, :team_name].map do |key|
156
- "- #{key.to_s}: #{self.send(key.to_sym)}"
157
+ lines = %i[name uuid app_id_name app_id_prefix creation_date expiration_date ttl team_ids team_name].map do |key|
158
+ "- #{key}: #{send(key.to_sym)}"
157
159
  end +
158
- [
159
- "- #{developer_certificates.count} Developer Certificates",
160
- "- #{provisioned_devices.count} Provisioned Devices",
161
- "- Entitlements:"
162
- ] + entitlements.to_hasg.map { |key, value| " - #{key}: #{value}" }
160
+ [
161
+ "- #{developer_certificates.count} Developer Certificates",
162
+ "- #{provisioned_devices.count} Provisioned Devices",
163
+ '- Entitlements:'
164
+ ] + entitlements.to_hash.map { |key, value| " - #{key}: #{value}" }
163
165
  lines.join("\n")
164
166
  end
165
167
  end
data/lib/pprof/version.rb CHANGED
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PProf
2
4
  # Module version
3
- VERSION = '0.3.9'
5
+ VERSION = '0.5.0'
4
6
  end
data/lib/pprof.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pprof/version'
2
4
 
3
5
  require 'pprof/provisioning_profile'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pprof
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.9
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Olivier Halligon
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-23 00:00:00.000000000 Z
11
+ date: 2022-05-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: plist
@@ -42,8 +42,9 @@ files:
42
42
  homepage: https://github.com/AliSoftware/pprof
43
43
  licenses:
44
44
  - MIT
45
- metadata: {}
46
- post_install_message:
45
+ metadata:
46
+ rubygems_mfa_required: 'true'
47
+ post_install_message:
47
48
  rdoc_options: []
48
49
  require_paths:
49
50
  - lib
@@ -51,16 +52,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
51
52
  requirements:
52
53
  - - ">="
53
54
  - !ruby/object:Gem::Version
54
- version: 2.0.0
55
+ version: 2.6.4
55
56
  required_rubygems_version: !ruby/object:Gem::Requirement
56
57
  requirements:
57
58
  - - ">="
58
59
  - !ruby/object:Gem::Version
59
60
  version: '0'
60
61
  requirements: []
61
- rubyforge_project:
62
- rubygems_version: 2.5.2
63
- signing_key:
62
+ rubygems_version: 3.0.3
63
+ signing_key:
64
64
  specification_version: 4
65
65
  summary: A Provisioning Profiles library
66
66
  test_files: []