pprof 0.3.9 → 0.4.0

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
- SHA1:
3
- metadata.gz: 8426b4eb39b37e5229a8e338e4348e81aa93e671
4
- data.tar.gz: ac5988b00d9287a1b8dc491ec9ae7f60ec6119f7
2
+ SHA256:
3
+ metadata.gz: b8843e85a32a30167805e1aa3cef04d1626b05f7f1d1c130b1558d9e3bfaa809
4
+ data.tar.gz: 4ef87037d3779a327d32bb87fb73fc3501d94d4406bb9529fc1049775a23f93e
5
5
  SHA512:
6
- metadata.gz: 9f1e6dcc8770c0198910a060dc5fd00526515a41c1be82e145df7a428b4f1463fecd1738aefc4af550d11ae8d528abc6f4d8751a71721ffbddaa2302b5bb8117
7
- data.tar.gz: 644b8df71ed9a7238cd160bc967dcaab72f9a180727ddd9eaacf858c88519cbbde8767792f940a621405c70751324ddc120196d1541a09709869b8ef86c2027f
6
+ metadata.gz: 19fe84e13c4007da01357055deb1350eb0108fe31dd45466827208d7d59f9a858dedc8450e1f0cc2f7863db567263638371ce97536d66b5db054c021c5caa612
7
+ data.tar.gz: 065fbe7cd8cc1af06ca4e739ca1e901694cf711039c345cd2bd9086090b80af503b616ce2babeedf0120bb692c8d425472e8ad8b2d645efb4569f42771cd63bc
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,124 @@ 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('-0', '--print0', 'Separate each found entry by \\0, to be used by `xargs -0`') do
66
68
  list_options[:zero] = true
67
69
  end
68
70
 
69
- opts.separator ""
70
- opts.separator "Filters (when no file given)"
71
+ opts.separator ''
72
+ opts.separator 'Filters (when no file given)'
71
73
 
72
- opts.on("--name NAME", "Filter by name") do |name|
74
+ opts.on('--name NAME', 'Filter by name') do |name|
73
75
  filters[:name] = matcher(name)
74
76
  end
75
77
 
76
- opts.on("--appid-name APPID", "Filter by App ID Name") do |appid_name|
78
+ opts.on('--appid-name APPID', 'Filter by App ID Name') do |appid_name|
77
79
  filters[:appid_name] = matcher(appid_name)
78
80
  end
79
81
 
80
- opts.on("--appid APPID", "Filter by App ID") do |appid|
82
+ opts.on('--appid APPID', 'Filter by App ID') do |appid|
81
83
  filters[:appid] = matcher(appid)
82
84
  end
83
85
 
84
- opts.on("--uuid UUID", "Filter by UUID") do |uuid|
86
+ opts.on('--uuid UUID', 'Filter by UUID') do |uuid|
85
87
  filters[:uuid] = matcher(uuid)
86
88
  end
87
89
 
88
- opts.on("--team TEAM", "Filter by team name or ID") do |team|
90
+ opts.on('--team TEAM', 'Filter by team name or ID') do |team|
89
91
  filters[:team] = matcher(team)
90
92
  end
91
93
 
92
- opts.on("--[no-]exp", "Only profiles (not) expired") do |flag|
94
+ opts.on('--[no-]exp', 'Only profiles (not) expired') do |flag|
93
95
  filters[:exp] = flag
94
96
  end
95
97
 
96
- opts.on("--[no-]has-devices", "Filter by profiles having (no) provisioned devices") do |d|
98
+ opts.on('--[no-]has-devices', 'Filter by profiles having (no) provisioned devices') do |d|
97
99
  filters[:has_devices] = d
98
100
  end
99
101
 
100
- opts.on("--[no-]all-devices", "Filter by profiles (not) provisioning all devices") do |d|
102
+ opts.on('--[no-]all-devices', 'Filter by profiles (not) provisioning all devices') do |d|
101
103
  filters[:all_devices] = d
102
104
  end
103
105
 
104
- opts.on("--aps [ENV]", "Only profiles having Push entitlements (or a specific aps env)") do |env|
106
+ opts.on('--aps [ENV]', 'Only profiles having Push entitlements (or a specific aps env)') do |env|
105
107
  filters[:aps_env] = env.nil? ? true : matcher(env)
106
108
  end
107
109
 
110
+ opts.separator ''
111
+ opts.separator 'Misc'
108
112
 
109
- opts.separator ""
110
- opts.separator "Misc"
111
-
112
- opts.on_tail("-h", "--help", "Show this message") do
113
+ opts.on_tail('-h', '--help', 'Show this message') do
113
114
  puts opts
114
115
  exit
115
116
  end
116
117
 
117
- opts.on_tail("-v", "--version", "Show version") do
118
+ opts.on_tail('-v', '--version', 'Show version') do
118
119
  puts PProf::VERSION
119
120
  exit
120
121
  end
121
122
  end
123
+ # rubocop:enable Metrics/BlockLength
122
124
 
123
125
  # Parse the options, catching parse errors nicely
124
126
  begin
125
127
  parser.parse!
126
- rescue OptionParser::InvalidOption => err
127
- puts err
128
- puts parser.help()
128
+ rescue OptionParser::InvalidOption => e
129
+ puts e
130
+ puts parser.help
129
131
  exit 1
130
132
  end
131
133
 
132
134
  # Don't mix filters and options together, that doesn't make sense
133
135
 
134
136
  unless filters.empty? || ARGV.empty?
135
- puts "You should use either filter flags to filter the whole list, or an specific path, not both."
137
+ puts 'You should use either filter flags to filter the whole list, or an specific path, not both.'
136
138
  puts parser # Usage
137
139
  exit
138
140
  end
139
141
 
140
142
  unless options.empty? || !ARGV.empty?
141
- puts "You should use option flags only when providing an specific path."
143
+ puts 'You should use option flags only when providing an specific path.'
142
144
  puts parser # Usage
143
145
  exit
144
146
  end
145
147
 
146
148
  # Call the appropriate action
147
149
 
150
+ o = PProf::OutputFormatter.new
148
151
  if ARGV.empty?
149
152
  # Print list of matching profiles
150
- o = PProf::OutputFormatter.new
151
153
  list_options[:mode] = :path if list_options[:zero] && list_options[:mode] == :table
152
154
  o.print_filtered_list(PProf::ProvisioningProfile::DEFAULT_DIR, filters, list_options)
153
155
  else
154
- # Print info about given profile path/UUID
155
- o = PProf::OutputFormatter.new
156
156
  begin
157
+ # Print info about given profile path/UUID
157
158
  p = PProf::ProvisioningProfile.new(ARGV[0])
158
-
159
- options = { :info => true } if options.empty?
159
+
160
+ options = { info: true } if options.empty?
160
161
  o.print_info(p, options)
161
- rescue Exception => e
162
+ rescue StandardError => e
162
163
  o.print_error(e, ARGV[0])
163
164
  end
164
165
  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,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
  # A helper tool to pretty-print Provisioning Profile informations
@@ -27,14 +29,16 @@ module PProf
27
29
  # @param [String...] cols
28
30
  # The content of each column of the row to add
29
31
  def row(*cols)
30
- '| ' + cols.zip(@widths).map do |c,w|
32
+ justified_cols = cols.zip(@widths).map do |c, w|
31
33
  (c || '<nil>').to_s.ljust(w)[0...w]
32
- end.join(' | ') + ' |'
34
+ end
35
+ "| #{justified_cols.join(' | ')} |"
33
36
  end
34
37
 
35
38
  # Add a separator line to the ASCII table
36
39
  def separator
37
- '+' + @widths.map { |w| '-' * (w+2) }.join('+') + '+'
40
+ columns_dashes = @widths.map { |w| '-' * (w + 2) }
41
+ "+#{columns_dashes.join('+')}+"
38
42
  end
39
43
  end
40
44
 
@@ -57,25 +61,36 @@ module PProf
57
61
  # Decide what to print. Valid keys are :info, :certs and :devices
58
62
  #
59
63
  def print_info(profile, options = nil)
60
- options ||= { :info => true }
64
+ options ||= { info: true }
61
65
  if options[:info]
62
- keys = [:name, :uuid, :app_id_name, :app_id_prefix, :creation_date, :expiration_date, :ttl, :team_ids, :team_name]
66
+ keys = %i[name uuid app_id_name app_id_prefix creation_date expiration_date ttl team_ids
67
+ team_name]
63
68
  keys.each do |key|
64
- @output.puts "- #{key.to_s}: #{profile.send(key.to_sym)}"
69
+ @output.puts "- #{key}: #{profile.send(key.to_sym)}"
65
70
  end
66
- @output.puts "- Entitlements:"
67
- @output.puts profile.entitlements.to_s.split("\n").map { |line| " #{line}" }
71
+ @output.puts '- Entitlements:'
72
+ @output.puts(profile.entitlements.to_s.split("\n").map { |line| " #{line}" })
68
73
  end
69
74
 
70
- if options[:info] || options[:certs]
75
+ # rubocop:disable Style/GuardClause
76
+ if options[:info] || options[:certs]
71
77
  @output.puts "- #{profile.developer_certificates.count} Developer Certificates"
72
- profile.developer_certificates.each { |cert| @output.puts " - #{cert.subject}" } if options[:certs]
78
+ if options[:certs]
79
+ profile.developer_certificates.each do |cert|
80
+ @output.puts " - #{cert.subject}"
81
+ @output.puts " issuer: #{cert.issuer}"
82
+ @output.puts " serial: #{cert.serial}"
83
+ @output.puts " expires: #{cert.not_after}"
84
+ end
85
+ end
73
86
  end
87
+
74
88
  if options[:info] || options[:devices]
75
89
  @output.puts "- #{(profile.provisioned_devices || []).count} Provisioned Devices"
76
90
  profile.provisioned_devices.each { |udid| @output.puts " - #{udid}" } if options[:devices]
77
91
  @output.puts "- Provision all devices: #{profile.provisions_all_devices.inspect}"
78
92
  end
93
+ # rubocop:enable Style/GuardClause
79
94
  end
80
95
 
81
96
  # Prints the filtered list of Provisioning Profiles
@@ -97,18 +112,18 @@ module PProf
97
112
  # * Valid values for key `:zero` are `true` or `false` to decide if we print `\0` at the end of each output.
98
113
  # Only used by `:list` and `:path` modes
99
114
  #
100
- def print_filtered_list(dir = PProf::ProvisioningProfile::DEFAULT_DIR, filters = {}, list_options = { :mode => :table })
115
+ def print_filtered_list(dir = PProf::ProvisioningProfile::DEFAULT_DIR, filters = {}, list_options = { mode: :table })
101
116
  filter_func = lambda do |p|
102
117
  (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
118
+ (filters[:appid_name].nil? || p.app_id_name =~ filters[:appid_name]) &&
119
+ (filters[:appid].nil? || p.entitlements.app_id =~ filters[:appid]) &&
120
+ (filters[:uuid].nil? || p.uuid =~ filters[:uuid]) &&
121
+ (filters[:team].nil? || p.team_name =~ filters[:team] || p.team_ids.any? { |id| id =~ filters[:team] }) &&
122
+ (filters[:exp].nil? || (p.expiration_date < DateTime.now) == filters[:exp]) &&
123
+ (filters[:has_devices].nil? || !(p.provisioned_devices || []).empty? == filters[:has_devices]) &&
124
+ (filters[:all_devices].nil? || p.provisions_all_devices == filters[:all_devices]) &&
125
+ (filters[:aps_env].nil? || match_aps_env(p.entitlements.aps_environment, filters[:aps_env])) &&
126
+ true
112
127
  end
113
128
 
114
129
  case list_options[:mode]
@@ -138,16 +153,17 @@ module PProf
138
153
  @output.puts table.row('UUID', 'Name', 'AppID', 'Expiration Date', ' ', 'Team Name')
139
154
  @output.puts table.separator
140
155
 
141
- Dir[dir + '/*.mobileprovision'].each do |file|
156
+ Dir['*.mobileprovision', base: dir].each do |file_name|
157
+ file = File.join(dir, file_name)
142
158
  begin
143
159
  p = PProf::ProvisioningProfile.new(file)
144
-
160
+
145
161
  next if block_given? && !yield(p)
146
162
 
147
163
  state = DateTime.now < p.expiration_date ? "\u{2705}" : "\u{274c}" # 2705=checkmark, 274C=red X
148
164
  @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 }
165
+ rescue StandardError => e
166
+ errors << { message: e, file: file }
151
167
  end
152
168
  count += 1
153
169
  end
@@ -155,9 +171,7 @@ module PProf
155
171
  @output.puts table.separator
156
172
  @output.puts "#{count} Provisioning Profiles found."
157
173
 
158
- unless errors.empty?
159
- errors.each { |e| print_error(e[:message], e[:file]) }
160
- end
174
+ errors.each { |e| print_error(e[:message], e[:file]) } unless errors.empty?
161
175
  end
162
176
 
163
177
  # Prints the filtered list of UUIDs or Paths only
@@ -165,35 +179,35 @@ module PProf
165
179
  # @param [String] dir
166
180
  # The directory containing the mobileprovision files to list.
167
181
  # Defaults to '~/Library/MobileDevice/Provisioning Profiles'
182
+ # @param [Hash] options
183
+ # The options hash typically filled while parsing the command line arguments.
184
+ # - :mode: will print the UUIDs if set to `:uuid`, the file path otherwise
185
+ # - :zero: will concatenate the entries with `\0` instead of `\n` if set
168
186
  #
169
- # @yield each provisioning provile for filtering/validation
187
+ # @yield each provisioning profile for filtering/validation
170
188
  # The block is given ProvisioningProfile object and should
171
189
  # return true to display the row, false to filter it out
172
190
  #
173
- def print_list(dir = PProf::ProvisioningProfile::DEFAULT_DIR, options)
191
+ def print_list(dir = PProf::ProvisioningProfile::DEFAULT_DIR, options) # rubocop:disable Style/OptionalArguments
174
192
  errors = []
175
- Dir[dir + '/*.mobileprovision'].each do |file|
176
- begin
177
- p = PProf::ProvisioningProfile.new(file)
178
- next if block_given? && !yield(p)
179
-
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]) }
193
+ Dir['*.mobileprovision', base: dir].each do |file_name|
194
+ file = File.join(dir, file_name)
195
+ p = PProf::ProvisioningProfile.new(file)
196
+ next if block_given? && !yield(p)
197
+
198
+ @output.print options[:mode] == :uuid ? p.uuid.chomp : file.chomp
199
+ @output.print options[:zero] ? "\0" : "\n"
200
+ rescue StandardError => e
201
+ errors << { message: e, file: file }
188
202
  end
203
+ errors.each { |e| print_error(e[:message], e[:file]) } unless errors.empty?
189
204
  end
190
205
 
191
-
192
- private
193
206
  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
207
+ return false if actual.nil? # false if no Push entitlements
208
+ return true if expected == true # true if Push present but we don't filter on specific env
209
+
210
+ actual =~ expected # true if Push present and we filter on specific env
197
211
  end
198
212
  end
199
213
  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
@@ -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.4.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.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Olivier Halligon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-23 00:00:00.000000000 Z
11
+ date: 2022-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: plist
@@ -42,7 +42,8 @@ files:
42
42
  homepage: https://github.com/AliSoftware/pprof
43
43
  licenses:
44
44
  - MIT
45
- metadata: {}
45
+ metadata:
46
+ rubygems_mfa_required: 'true'
46
47
  post_install_message:
47
48
  rdoc_options: []
48
49
  require_paths:
@@ -51,15 +52,14 @@ 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.7.0
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
62
+ rubygems_version: 3.2.19
63
63
  signing_key:
64
64
  specification_version: 4
65
65
  summary: A Provisioning Profiles library