utilrb 3.0.1 → 3.1.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
2
  SHA1:
3
- metadata.gz: 30f3b27613076cc9f327bccee358f2bc55bcd826
4
- data.tar.gz: ef980585fef480c37de10056afec1bd714df4683
3
+ metadata.gz: dfc6c628c67691e4051455e910ea27774e48d1f8
4
+ data.tar.gz: 3985cf51ce618e65f82a503ec1d3708a76986c0d
5
5
  SHA512:
6
- metadata.gz: df1fab4bfabbe73e7d657a7564022042d3f16c84293474ed441c1c9b1452481c2393aa76d38b820a398731fc605aa5d0a8ea6e30c089b7ef3b2ca2279145bbd2
7
- data.tar.gz: 1efd86909aff5ea2802c1ff9a04db0e5eb052cbed3412858d1d051245b47baf82d329a200102318e8067396f1175f319247062942bd4bab4d22a72818ac06408
6
+ metadata.gz: 7c0826bbdc14832b30ee1f08585b04f8ae203bcaca23eebf9b2a8441e2c63599a12e8d9a774c673b01652530f0aff811162dc21840cc3aed36d5950878a70243
7
+ data.tar.gz: 7a2e844418cc195a2515bb2575f684ed4d264c481a2ed19713e688c7ada8802d06c85feca9b30009e1579b012f87920d444a366487dc1ccb0d0915e19636d95b
@@ -1,9 +1,11 @@
1
1
  sudo: false
2
+ dist: trusty
2
3
  language: ruby
3
4
  rvm:
4
5
  - 2.0.0
5
- - 2.1.6
6
- - 2.2.2
6
+ - 2.1.9
7
+ - 2.2.5
8
+ - 2.3.1
7
9
  script:
8
10
  - bundle exec rake
9
11
  - bundle exec rake test
@@ -1,15 +1,20 @@
1
1
  module Kernel
2
2
  # Raises if +object+ can accept calls with exactly +arity+ arguments.
3
3
  # object should respond to #arity
4
- def check_arity(object, arity)
5
- if object.respond_to?(:lambda?) # For ruby 1.9 compatibility on blocks without arguments
6
- if !object.lambda? && object.arity == 0
7
- return
4
+ def check_arity(object, arity, strict: nil)
5
+ if strict.nil?
6
+ if object.respond_to?(:lambda?)
7
+ strict = object.lambda?
8
+ else strict = true
8
9
  end
9
10
  end
10
11
 
11
- unless object.arity == arity || (object.arity < 0 && object.arity > - arity - 2)
12
- raise ArgumentError, "#{object} does not accept to be called with #{arity} argument(s)", caller(2)
12
+ if strict
13
+ if object.arity >= 0 && object.arity != arity
14
+ raise ArgumentError, "#{object} requests #{object.arity} arguments, but #{arity} was requested"
15
+ elsif -object.arity-1 > arity
16
+ raise ArgumentError, "#{object} requests at least #{object.arity} arguments, but #{arity} was requested"
17
+ end
13
18
  end
14
19
  end
15
20
  end
@@ -116,13 +116,13 @@ module Kernel
116
116
  # The caller of this method should call it at the end of its definition
117
117
  # file, or the translation method may not be robust at all
118
118
  def eval_dsl_file(file, proxied_object, context, full_backtrace, *exceptions, &block)
119
+ file = File.expand_path(file)
119
120
  if !File.readable?(file)
120
121
  raise ArgumentError, "#{file} does not exist"
121
122
  end
122
123
 
123
- loaded_file = file.gsub(/^#{Regexp.quote(Dir.pwd)}\//, '')
124
124
  file_content = File.read(file)
125
- eval_dsl_file_content(loaded_file, file_content, proxied_object, context, full_backtrace, *exceptions, &block)
125
+ eval_dsl_file_content(file, file_content, proxied_object, context, full_backtrace, *exceptions, &block)
126
126
  end
127
127
 
128
128
  # Same than eval_dsl_file, but will not load the same file twice
@@ -15,6 +15,16 @@ class Logger
15
15
  EOF
16
16
  end
17
17
 
18
+ # The logger level
19
+ def log_level
20
+ logger.level
21
+ end
22
+
23
+ # Sets the logger's level
24
+ def log_level=(level)
25
+ logger.level = level
26
+ end
27
+
18
28
  # Forwarded to {Logger#silent}
19
29
  def log_silent(&block)
20
30
  logger.silent(&block)
@@ -2,6 +2,7 @@ require 'facets/module/spacename'
2
2
  require 'facets/kernel/constant'
3
3
  require 'utilrb/object/attribute'
4
4
  require 'utilrb/logger/forward'
5
+ require 'weakref'
5
6
 
6
7
  class Logger
7
8
  module HierarchyElement
@@ -23,13 +24,30 @@ class Logger
23
24
  self.logger = new_logger
24
25
  end
25
26
 
27
+ def register_log_child(child)
28
+ log_children << WeakRef.new(child)
29
+ end
30
+
31
+ def each_log_child
32
+ return enum_for(__method__) if !block_given?
33
+
34
+ log_children.delete_if do |ref|
35
+ begin
36
+ yield(ref.__getobj__)
37
+ false
38
+ rescue WeakRef::RefError
39
+ true
40
+ end
41
+ end
42
+ end
43
+
26
44
  # Allows to change the logger object at this level of the hierarchy
27
45
  #
28
46
  # This is usually not used directly: a new logger can be created with
29
47
  # Hierarchy#make_own_logger and removed with Hierarchy#reset_own_logger
30
48
  def logger=(new_logger)
31
49
  @logger = new_logger
32
- log_children.each do |child|
50
+ each_log_child do |child|
33
51
  child.reset_default_logger
34
52
  end
35
53
  end
@@ -38,14 +56,14 @@ class Logger
38
56
  # logging methods will now access the parent's module logger.
39
57
  def reset_own_logger
40
58
  @logger = nil
41
- log_children.each do |child|
59
+ each_log_child do |child|
42
60
  child.reset_default_logger
43
61
  end
44
62
  end
45
63
 
46
64
  def reset_default_logger
47
65
  @__utilrb_hierarchy__default_logger = nil
48
- log_children.each do |child|
66
+ each_log_child do |child|
49
67
  child.reset_default_logger
50
68
  end
51
69
  end
@@ -130,8 +148,13 @@ class Logger
130
148
  break
131
149
  end
132
150
  end
151
+
133
152
  if m.respond_to?(:superclass)
134
153
  m = m.superclass
154
+ if m.respond_to?(:logger)
155
+ parent_module = m
156
+ break
157
+ end
135
158
  else
136
159
  m = nil; break
137
160
  end
@@ -140,8 +163,8 @@ class Logger
140
163
  if !m
141
164
  raise NoParentLogger, "cannot find a logger for #{self}"
142
165
  end
143
- if parent_module.respond_to? :log_children
144
- parent_module.log_children << self
166
+ if parent_module.respond_to? :register_log_child
167
+ parent_module.register_log_child(self)
145
168
  end
146
169
  parent_module.logger
147
170
  else
@@ -1,19 +1,19 @@
1
1
  require 'utilrb/logger/hierarchy'
2
+
2
3
  class Logger
3
- HAS_COLOR =
4
+ LEVEL_TO_COLOR =
4
5
  begin
5
- require 'highline'
6
- @console = HighLine.new
6
+ require 'pastel'
7
+ colorizer = Pastel.new
8
+ { 'DEBUG' => ->(t) { t },
9
+ 'INFO' => ->(t) { t },
10
+ 'WARN' => colorizer.magenta.detach,
11
+ 'ERROR' => colorizer.red.detach,
12
+ 'FATAL' => colorizer.red.bold.detach }
7
13
  rescue LoadError
14
+ Hash.new
8
15
  end
9
16
 
10
- LEVEL_TO_COLOR =
11
- { 'DEBUG' => [],
12
- 'INFO' => [],
13
- 'WARN' => [:magenta],
14
- 'ERROR' => [:red],
15
- 'FATAL' => [:red, :bold] }
16
-
17
17
  # Defines a logger on a module, allowing to use that module as a root in a
18
18
  # hierarchy (i.e. having submodules use the Logger::Hierarchy support)
19
19
  #
@@ -56,9 +56,9 @@ class Logger
56
56
  console = @console
57
57
  formatter =
58
58
  if block then lambda(&block)
59
- elsif HAS_COLOR
59
+ elsif !LEVEL_TO_COLOR.empty?
60
60
  lambda do |severity, time, name, msg|
61
- console.color("#{name}[#{severity}]: #{msg}\n", *LEVEL_TO_COLOR[severity])
61
+ LEVEL_TO_COLOR[severity].call("#{name}[#{severity}]: #{msg}\n")
62
62
  end
63
63
  else lambda { |severity, time, name, msg| "#{name}[#{severity}]: #{msg}\n" }
64
64
  end
@@ -0,0 +1,3 @@
1
+ require 'utilrb/kernel/require'
2
+ require_dir(__FILE__)
3
+
@@ -1,26 +1,32 @@
1
1
  module Marshal
2
- if defined? BasicObject
3
- class BlackHole < BasicObject
4
- end
5
- end
6
-
7
2
  class BlackHole
8
3
  class << self
9
- :name
4
+ attr_reader :name
10
5
  end
11
6
 
12
7
  def initialize(*args)
13
8
  end
14
9
 
10
+ def hash
11
+ __id__
12
+ end
13
+
14
+ def eql?(obj)
15
+ equal?(obj)
16
+ end
17
+
15
18
  attr_reader :__content__
16
19
  def method_missing(*args)
20
+ ::Kernel.puts args.inspect
21
+ ::Kernel.puts ::Kernel.caller
17
22
  end
18
23
  def self._load(*args)
19
24
  hole = BlackHole.new
20
25
  hole.instance_variable_set(:@__content__, args)
21
26
  end
22
27
 
23
- def self.method_missing(*args)
28
+ def self.method_missing(*args, **options)
29
+ BlackHole.new
24
30
  end
25
31
  end
26
32
 
@@ -32,20 +38,11 @@ module Marshal
32
38
  self.load(str_or_io)
33
39
  rescue Exception => e
34
40
  case e.message
35
- when /undefined class\/module ((?:\w+::)+)$/
36
- names = $1.split('::')
37
- missing = names.pop
38
- base = names.inject(Object) { |m, n| m.const_get(n) }
39
- base.const_set(missing, Module.new)
40
-
41
- if original_pos
42
- str_or_io.seek(original_pos)
43
- end
44
- retry
45
- when /undefined class\/module ((?:\w+::)+)(\w+)$/
46
- mod, klass = $1, $2
47
- full_name = "#{mod}#{klass}"
48
- mod = mod.split('::').inject(Object) { |m, n| m.const_get(n) }
41
+ when /undefined class\/module ((?:\w+)(?:::\w+)*)(?:::)?$/
42
+ full_name = $1
43
+ path = $1.split('::')
44
+ *path, klass = *path
45
+ mod = path.inject(Object) { |m, n| m.const_get(n) }
49
46
 
50
47
  blackhole = Class.new(BlackHole) do
51
48
  @name = full_name
@@ -41,15 +41,6 @@ module Utilrb
41
41
  VAR_NAME_RX = /\w+/
42
42
  FIELD_NAME_RX = /[\w\.\-]+/
43
43
 
44
- class << self
45
- attr_reader :loaded_packages
46
-
47
- def clear_cache
48
- loaded_packages.clear
49
- end
50
- end
51
- @loaded_packages = Hash.new
52
-
53
44
  def self.load(path, preset_variables)
54
45
  pkg_name = File.basename(path, ".pc")
55
46
  pkg = Class.instance_method(:new).bind(PkgConfig).call(pkg_name)
@@ -57,28 +48,41 @@ module Utilrb
57
48
  pkg
58
49
  end
59
50
 
51
+ def self.load_minimal(path, preset_variables)
52
+ pkg_name = File.basename(path, ".pc")
53
+ pkg = Class.instance_method(:new).bind(PkgConfig).call(pkg_name)
54
+ pkg.load_minimal(path, preset_variables)
55
+ pkg
56
+ end
57
+
58
+ # @deprecated {PkgConfig} does not cache the packages anymore, so no
59
+ # need to call this method
60
+ def self.clear_cache
61
+ end
62
+
60
63
  # Returns the pkg-config object that matches the given name, and
61
64
  # optionally a version string
62
- def self.get(name, version_spec = nil, preset_variables = Hash.new)
63
- if !(candidates = loaded_packages[name])
64
- paths = find_all_package_files(name)
65
- if paths.empty?
66
- raise NotFound.new(name), "cannot find the pkg-config specification for #{name}"
67
- end
65
+ def self.get(name, version_spec = nil, preset_variables = Hash.new, minimal: false, pkg_config_path: self.pkg_config_path)
66
+ paths = find_all_package_files(name, pkg_config_path: pkg_config_path)
67
+ if paths.empty?
68
+ raise NotFound.new(name), "cannot find the pkg-config specification for #{name}"
69
+ end
68
70
 
69
- candidates = Array.new
70
- paths.each do |p|
71
- candidates << PkgConfig.load(p, preset_variables)
72
- end
73
- loaded_packages[name] = candidates
71
+ candidates = paths.map do |p|
72
+ PkgConfig.load_minimal(p, preset_variables)
74
73
  end
75
74
 
76
75
  # Now try to find a matching spec
77
- if version_match = find_matching_version(candidates, version_spec)
78
- version_match
76
+ if match = find_matching_version(candidates, version_spec)
77
+ match
79
78
  else
80
79
  raise NotFound, "found #{candidates.size} packages for #{name}, but none match the version specification #{version_spec}"
81
80
  end
81
+
82
+ if !minimal
83
+ match.load_fields
84
+ end
85
+ match
82
86
  end
83
87
 
84
88
  # Finds the provided package and optional version and returns its
@@ -140,7 +144,6 @@ module Utilrb
140
144
  end
141
145
 
142
146
 
143
- attr_reader :file
144
147
  attr_reader :path
145
148
 
146
149
  # The module name
@@ -151,10 +154,17 @@ module Utilrb
151
154
  # The module version, as an array of integers
152
155
  attr_reader :version
153
156
 
157
+ attr_reader :raw_fields
158
+
154
159
  # Information extracted from the file
155
160
  attr_reader :variables
156
161
  attr_reader :fields
157
162
 
163
+ # The list of packages that are Require:'d by this package
164
+ #
165
+ # @return [Array<PkgConfig>]
166
+ attr_reader :requires
167
+
158
168
  # Create a PkgConfig object for the package +name+
159
169
  # Raises PkgConfig::NotFound if the module does not exist
160
170
  def initialize(name)
@@ -169,7 +179,7 @@ module Utilrb
169
179
  # +current+ is a string that describes what we are expanding. It is used
170
180
  # to detect recursion in expansion of variables, and to give meaningful
171
181
  # errors to the user
172
- def expand_variables(value, variables, current)
182
+ def perform_substitution(value, variables, current)
173
183
  value = value.gsub(/\$\{(\w+)\}/) do |rx|
174
184
  expand_name = $1
175
185
  if expand_name == current
@@ -211,16 +221,23 @@ module Utilrb
211
221
 
212
222
  SHELL_VARS = %w{Cflags Libs Libs.private}
213
223
 
214
- # Loads the information contained in +path+
215
- def load(path, preset_variables = Hash.new)
216
- @path = path
217
- @file = File.readlines(path).map(&:strip)
218
-
219
- raw_variables = preset_variables.dup
220
- raw_fields = Hash.new
224
+ # @api private
225
+ #
226
+ # Normalize a field name to be lowercase with only the first letter
227
+ # capitalized
228
+ def normalize_field_name(name)
229
+ name = name.downcase
230
+ name[0, 1] = name[0, 1].upcase
231
+ name
232
+ end
221
233
 
234
+ # Parse a pkg-config field and extracts the raw definition of variables
235
+ # and fields
236
+ #
237
+ # @return [(Hash,Hash)] the set of variables and the set of fields
238
+ def parse(path)
222
239
  running_line = nil
223
- @file = file.map do |line|
240
+ file = File.readlines(path).map do |line|
224
241
  line = line.gsub(/\s*#.*$/, '')
225
242
  line = line.strip
226
243
  next if line.empty?
@@ -240,54 +257,90 @@ module Utilrb
240
257
  end.compact
241
258
 
242
259
 
260
+ raw_variables, raw_fields = Hash.new, Hash.new
243
261
  file.each do |line|
244
262
  case line
245
263
  when /^(#{VAR_NAME_RX})\s*=(.*)/
246
264
  raw_variables[$1] = $2.strip
247
265
  when /^(#{FIELD_NAME_RX}):\s*(.*)/
248
- raw_fields[$1] = $2.strip
266
+ field_name = normalize_field_name($1)
267
+ raw_fields[field_name] = $2.strip
249
268
  else
250
269
  raise NotImplementedError, "#{path}: cannot parse pkg-config line #{line.inspect}"
251
270
  end
252
271
  end
272
+ return raw_variables, raw_fields
273
+ end
274
+
275
+ def expand_variables(raw_variables)
276
+ raw_variables = raw_variables.dup
253
277
 
278
+ variables = Hash.new
254
279
  # Resolve the variables
255
280
  while variables.size != raw_variables.size
256
281
  raw_variables.each do |name, value|
257
- value = expand_variables(value, raw_variables, name)
282
+ value = perform_substitution(value, raw_variables, name)
258
283
  raw_variables[name] = value
259
284
  if value !~ /\$\{#{VAR_NAME_RX}\}/
260
285
  variables[name] = value
261
286
  end
262
287
  end
263
288
  end
264
-
265
- # Shell-split the fields, and expand the variables in them
266
- raw_fields.each do |name, value|
267
- if SHELL_VARS.include?(name)
268
- value = Shellwords.shellsplit(value)
269
- resolved = Array.new
270
- while !value.empty?
271
- value = value.flat_map do |v|
272
- expanded = expand_variables(v, variables, name)
273
- if expanded == v
274
- resolved << v
275
- nil
276
- else
277
- Shellwords.shellsplit(expanded)
278
- end
279
- end.compact
280
- end
281
- fields[name] = resolved
282
- else
283
- fields[name] = expand_variables(value, variables, name)
289
+ variables
290
+ end
291
+
292
+ def expand_field(name, field)
293
+ if SHELL_VARS.include?(name)
294
+ value = Shellwords.shellsplit(field)
295
+ resolved = Array.new
296
+ while !value.empty?
297
+ value = value.flat_map do |v|
298
+ expanded = perform_substitution(v, variables, name)
299
+ if expanded == v
300
+ resolved << v
301
+ nil
302
+ else
303
+ Shellwords.shellsplit(expanded)
304
+ end
305
+ end.compact
284
306
  end
307
+ resolved
308
+ else
309
+ perform_substitution(field, variables, name)
310
+ end
311
+ end
312
+
313
+ def load_variables(path, preset_variables = Hash.new)
314
+ raw_variables, raw_fields = parse(path)
315
+ raw_variables = preset_variables.merge(raw_variables)
316
+ expand_variables(raw_variables)
317
+ end
318
+
319
+ def load_minimal(path, preset_variables = Hash.new)
320
+ raw_variables, raw_fields = parse(path)
321
+ raw_variables = preset_variables.merge(raw_variables)
322
+
323
+ @variables = expand_variables(raw_variables)
324
+ if raw_fields['Version']
325
+ @raw_version = expand_field('Version', raw_fields['Version'])
326
+ else
327
+ @raw_version = ''
328
+ end
329
+ @version = raw_version.split('.').map { |v| Integer(v) if v =~ /^\d+$/ }.compact
330
+
331
+ # To be used in the call to #load
332
+ @raw_fields = raw_fields
333
+ @path = path
334
+ end
285
335
 
336
+ def load_fields
337
+ fields = Hash.new
338
+ @raw_fields.each do |name, value|
339
+ fields[name] = expand_field(name, value)
286
340
  end
341
+ @fields = fields
287
342
 
288
343
  # Initialize the main flags
289
- @raw_version = (fields['Version'] || '')
290
- @version = raw_version.split('.').map { |v| Integer(v) if v =~ /^\d+$/ }.compact
291
344
  @description = (fields['Description'] || '')
292
345
 
293
346
  # Get the requires/conflicts
@@ -326,6 +379,14 @@ module Utilrb
326
379
  end
327
380
  end
328
381
 
382
+ # Loads the information contained in +path+
383
+ def load(path, preset_variables = Hash.new)
384
+ if !@raw_fields
385
+ load_minimal(path, preset_variables)
386
+ end
387
+ load_fields
388
+ end
389
+
329
390
  def self.define_pkgconfig_action(action) # :nodoc:
330
391
  class_eval <<-EOD, __FILE__, __LINE__+1
331
392
  def pkgconfig_#{action.gsub(/-/, '_')}(static = false)
@@ -346,7 +407,7 @@ module Utilrb
346
407
  # Returns the list of include directories listed in the Cflags: section
347
408
  # of the pkgconfig file
348
409
  def include_dirs
349
- result = Shellwords.shellsplit(cflags_only_I).map { |v| v[2..-1] }
410
+ result = raw_cflags_only_I.map { |v| v[2..-1] }
350
411
  if result.any?(&:empty?)
351
412
  raise Invalid.new(name), "empty include directory (-I without argument) found in pkg-config package #{name}"
352
413
  end
@@ -356,7 +417,7 @@ module Utilrb
356
417
  # Returns the list of library directories listed in the Libs: section
357
418
  # of the pkgconfig file
358
419
  def library_dirs
359
- result = Shellwords.shellsplit(libs_only_L).map { |v| v[2..-1] }
420
+ result = raw_libs_only_L.map { |v| v[2..-1] }
360
421
  if result.any?(&:empty?)
361
422
  raise Invalid.new(name), "empty link directory (-L without argument) found in pkg-config package #{name}"
362
423
  end
@@ -371,18 +432,27 @@ module Utilrb
371
432
  @cflags
372
433
  end
373
434
 
435
+ def raw_cflags_only_I
436
+ @cflags.grep(/^-I/)
437
+ end
438
+
439
+ def raw_cflags_only_other
440
+ @cflags.find_all { |s| s !~ /^-I/ }
441
+ end
442
+
374
443
  def cflags
375
- @cflags.join(" ")
444
+ raw_cflags.join(" ")
376
445
  end
377
446
 
378
447
  def cflags_only_I
379
- @cflags.grep(/^-I/).join(" ")
448
+ raw_cflags_only_I.join(" ")
380
449
  end
381
450
 
382
451
  def cflags_only_other
383
- @cflags.find_all { |s| s !~ /^-I/ }.join(" ")
452
+ raw_cflags_only_other.join(" ")
384
453
  end
385
454
 
455
+
386
456
  def raw_ldflags
387
457
  @ldflags
388
458
  end
@@ -391,20 +461,38 @@ module Utilrb
391
461
  @ldflags_with_requires
392
462
  end
393
463
 
464
+
465
+ def raw_libs(static = false)
466
+ @ldflags_with_requires[static]
467
+ end
468
+
469
+ def raw_libs_only_L(static = false)
470
+ @ldflags_with_requires[static].grep(/^-L/)
471
+ end
472
+
473
+ def raw_libs_only_l(static = false)
474
+ @ldflags_with_requires[static].grep(/^-l/)
475
+ end
476
+
477
+ def raw_libs_only_other(static = false)
478
+ @ldflags_with_requires[static].find_all { |s| s !~ /^-[lL]/ }
479
+ end
480
+
481
+
394
482
  def libs(static = false)
395
- @ldflags_with_requires[static].join(" ")
483
+ raw_libs(static).join(" ")
396
484
  end
397
485
 
398
486
  def libs_only_L(static = false)
399
- @ldflags_with_requires[static].grep(/^-L/).join(" ")
487
+ raw_libs_only_L(static).join(" ")
400
488
  end
401
489
 
402
490
  def libs_only_l(static = false)
403
- @ldflags_with_requires[static].grep(/^-l/).join(" ")
491
+ raw_libs_only_l(static).join(" ")
404
492
  end
405
493
 
406
494
  def libs_only_other(static = false)
407
- @ldflags_with_requires[static].find_all { |s| s !~ /^-[lL]/ }.join(" ")
495
+ raw_libs_only_other(static).join(" ")
408
496
  end
409
497
 
410
498
  def method_missing(varname, *args, &proc) # :nodoc:
@@ -415,17 +503,22 @@ module Utilrb
415
503
  end
416
504
  end
417
505
 
418
- def self.each_pkgconfig_directory(&block)
419
- if path = ENV['PKG_CONFIG_PATH']
420
- path.split(':').each(&block)
506
+ def self.pkg_config_path
507
+ ENV['PKG_CONFIG_PATH']
508
+ end
509
+
510
+ def self.each_pkgconfig_directory(pkg_config_path: self.pkg_config_path, &block)
511
+ return enum_for(__method__) if !block_given?
512
+ if pkg_config_path
513
+ pkg_config_path.split(':').each(&block)
421
514
  end
422
515
  default_search_path.each(&block)
423
516
  end
424
517
 
425
518
  # Returns true if there is a package with this name
426
- def self.find_all_package_files(name)
519
+ def self.find_all_package_files(name, pkg_config_path: self.pkg_config_path)
427
520
  result = []
428
- each_pkgconfig_directory do |dir|
521
+ each_pkgconfig_directory(pkg_config_path: pkg_config_path) do |dir|
429
522
  path = File.join(dir, "#{name}.pc")
430
523
  if File.exist?(path)
431
524
  result << path
@@ -434,9 +527,9 @@ module Utilrb
434
527
  result
435
528
  end
436
529
 
437
- def self.available_package_names
530
+ def self.available_package_names(pkg_config_path: self.pkg_config_path)
438
531
  result = []
439
- each_pkgconfig_directory do |dir|
532
+ each_pkgconfig_directory(pkg_config_path: pkg_config_path) do |dir|
440
533
  Dir.glob(File.join(dir, "*.pc")) do |path|
441
534
  result << File.basename(path, ".pc")
442
535
  end
@@ -445,15 +538,17 @@ module Utilrb
445
538
  end
446
539
 
447
540
  # Returns true if there is a package with this name
448
- def self.has_package?(name)
449
- !find_all_package_files(name).empty?
541
+ def self.has_package?(name, pkg_config_path: self.pkg_config_path)
542
+ !find_all_package_files(name, pkg_config_path: pkg_config_path).empty?
450
543
  end
451
544
 
452
545
  # Yields the package names of available packages. If +regex+ is given,
453
546
  # lists only the names that match the regular expression.
454
- def self.each_package(regex = nil)
547
+ def self.each_package(regex = nil, pkg_config_path: self.pkg_config_path)
548
+ return enum_for(__method__) if !block_given?
549
+
455
550
  seen = Set.new
456
- each_pkgconfig_directory do |dir|
551
+ each_pkgconfig_directory(pkg_config_path: pkg_config_path) do |dir|
457
552
  Dir.glob(File.join(dir, '*.pc')) do |file|
458
553
  pkg_name = File.basename(file, ".pc")
459
554
  next if seen.include?(pkg_name)
@@ -4,10 +4,10 @@ if ENV['TEST_ENABLE_COVERAGE'] != '0'
4
4
  begin
5
5
  require 'simplecov'
6
6
  require 'coveralls'
7
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
8
- SimpleCov::Formatter::HTMLFormatter,
9
- Coveralls::SimpleCov::Formatter
10
- ]
7
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(
8
+ [SimpleCov::Formatter::HTMLFormatter,
9
+ Coveralls::SimpleCov::Formatter]
10
+ )
11
11
  SimpleCov.start do
12
12
  add_filter "/test/"
13
13
  end
@@ -15,8 +15,15 @@ module Utilrb
15
15
  end
16
16
 
17
17
  def format_timepoints
18
+ start_points = Hash.new
18
19
  result = []
19
20
  @timepoints.inject(@timepoints.first.first) do |last_t, (t, name)|
21
+ if name.last == 'start'
22
+ start_points[name[0..-2]] = t
23
+ elsif name.last == 'done'
24
+ total = t - start_points.delete(name[0..-2])
25
+ name = name + ["total=%.3f" % total]
26
+ end
20
27
  result << name + [t - last_t]
21
28
  t
22
29
  end
@@ -1,4 +1,4 @@
1
1
  module Utilrb
2
- VERSION = "3.0.1"
2
+ VERSION = "3.1.0"
3
3
  end
4
4
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: utilrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Joyeux
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-09 00:00:00.000000000 Z
11
+ date: 2018-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: facets
@@ -152,6 +152,7 @@ files:
152
152
  - lib/utilrb/logger/log_pp.rb
153
153
  - lib/utilrb/logger/root.rb
154
154
  - lib/utilrb/logger/silent.rb
155
+ - lib/utilrb/marshal.rb
155
156
  - lib/utilrb/marshal/load_with_missing_constants.rb
156
157
  - lib/utilrb/module.rb
157
158
  - lib/utilrb/module/ancestor_p.rb