dumb-logger 1.0.0 → 1.0.1

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: 2a310511e9401162dbea1264cfc0688d9bd1b4fb
4
- data.tar.gz: 811167e870e502ece41b9ec4a0172036c506ec84
3
+ metadata.gz: 97dcaa8c2a86896da031d59fce6d9e76629ae0ad
4
+ data.tar.gz: cc24b7b01e23defa63650a640f71d264dfa0d122
5
5
  SHA512:
6
- metadata.gz: 3c6dc6168a885f2c18284fdc58cafa7cb14dee853795216007462e702717ca4530f1dc4268c25b90d6e2b755d5a5dd119d2613495a4a8a94f31fcf8b90e8fdfc
7
- data.tar.gz: 1004d15fe2bf9e469e47fa90621821ef47ff877c41289c67b115a73357ab4fb62ddbd7cb1aca9453ee29bbec08545b064fcc9b39c4d2cf72bcb2495199e01e6b
6
+ metadata.gz: 1502f4709b0138d8618fdae48cde9e614c9371795734f6a8f8491f0ffbc923f626ff41d68301d6a52bc8d4312b5beeb32124cc0a2e71c10da37e5ed5d5145667
7
+ data.tar.gz: a01939fc773088661a1865147f6be643017227cd620a7d854b00784852c7174665c79e4fd54fef36b886a7561e7f29eae610b4ba970bd9c3c45f9d6d38452ace
@@ -41,8 +41,20 @@ Feature: Test the output generated
41
41
  And stderr should contain exactly "a message"
42
42
  And stdout should contain exactly ""
43
43
 
44
- Scenario: Single-line message with no newline (alternate)
45
- When I invoke the logger with ("a message", :newline=>false)
44
+ Scenario: Single-line message with no newline (alternate 1)
45
+ When I invoke the logger with ("a message", {:newline=>false})
46
+ Then the return value should be 0
47
+ And stderr should contain exactly "a message"
48
+ And stdout should contain exactly ""
49
+
50
+ Scenario: Single-line message with no newline (alternate 2)
51
+ When I invoke the logger with ("a message", {:return=>false})
52
+ Then the return value should be 0
53
+ And stderr should contain exactly "a message"
54
+ And stdout should contain exactly ""
55
+
56
+ Scenario: Single-line message with :newline overriding :return
57
+ When I invoke the logger with ("a message", {:newline=>false,:return=>true})
46
58
  Then the return value should be 0
47
59
  And stderr should contain exactly "a message"
48
60
  And stdout should contain exactly ""
@@ -53,12 +65,24 @@ Feature: Test the output generated
53
65
  And stderr should contain exactly "line 1\nline 2"
54
66
  And stdout should contain exactly ""
55
67
 
56
- Scenario: Multi-line message with no newline (alternate)
68
+ Scenario: Multi-line message with no newline (alternate 1)
57
69
  When I invoke the logger with ("line 1",{:newline=>false},"line 2")
58
70
  Then the return value should be 0
59
71
  And stderr should contain exactly "line 1\nline 2"
60
72
  And stdout should contain exactly ""
61
73
 
74
+ Scenario: Multi-line message with no newline (alternate 2)
75
+ When I invoke the logger with ("line 1",{:return=>false},"line 2")
76
+ Then the return value should be 0
77
+ And stderr should contain exactly "line 1\nline 2"
78
+ And stdout should contain exactly ""
79
+
80
+ Scenario: Multi-line message with :newline overriding :return
81
+ When I invoke the logger with ("line 1",{:return=>true,:newline=>false},"line 2")
82
+ Then the return value should be 0
83
+ And stderr should contain exactly "line 1\nline 2"
84
+ And stdout should contain exactly ""
85
+
62
86
  Scenario: Single-line message with instance prefix
63
87
  When I set the prefix to '[instance-prefix] '
64
88
  And I invoke the logger with ("a message")
data/lib/dumb-logger.rb CHANGED
@@ -368,6 +368,13 @@ class DumbLogger
368
368
  @sink_io = File.open(@options[:sink], (self.append? ? 'a' : 'w'))
369
369
  @options[:needs_close] = true
370
370
  end
371
+ #
372
+ # Note that you cannot seek-position the $stdout or $stderr
373
+ # streams. However, there doesn't seem to be a clear way to
374
+ # determine that, so we'll wrap the actual seek (in {#message}) in
375
+ # a rescue block.
376
+ #
377
+ @options[:needs_seek] = true
371
378
  @sink_io.sync = true if (@sink_io.respond_to?(:sync=))
372
379
  return self.sink
373
380
  end # def sink=
@@ -504,21 +511,42 @@ class DumbLogger
504
511
  # @param [Array<Array,String,Symbol,Integer,Hash>] args
505
512
  # * The last integer in the array will be treated as the report's
506
513
  # loglevel; default is `0`.
514
+ #
515
+ # **Overridden by `:level` or `:mask` in an options hash passed
516
+ # to the method.**
507
517
  # * Any `Array` elements in the arguments will be merged and the
508
518
  # values interpreted as level labels (see {#label_levels}). If
509
- # loglevels are bitmasks, the labeled levels are ORed together;
510
- # otherwise the lowest labeled level will be used for the message.
519
+ # loglevels are bitmasks (see {#level_style}), the labeled levels
520
+ # are `OR`ed together; otherwise the lowest labeled level will be
521
+ # used for the message.
522
+ #
523
+ # **Overridden by `:level` or `:mask` in an options hash passed
524
+ # to the method.**
511
525
  # * Any `Hash` elements in the array will be merged and will
512
526
  # temporarily override instance-wide options -- *e.g.*,
513
- # `{ :prefix => 'alt' }` .
514
- # * If the `DumbLogger::NO_NL` value (a `Symbol`) appears in the
515
- # array, or a hash element of `:return => false`, the report will
516
- # not include a terminating newline (useful for
517
- # `"progress:..done"` reports).
527
+ # `{ :prefix => 'alt' }` . Valid *per*-call options are:
528
+ # * `:prefix => String`
529
+ # * `:level => Integer`
530
+ # (takes precedence over `:mask` if {#level_style} is {USE_LEVELS}.)
531
+ # * `:mask => Integer`
532
+ # (takes precedence over `:level` if {#level_style} is {USE_BITMASK}.)
533
+ # * `:newline => Boolean`
534
+ # (takes precedence over {DumbLogger::NO_NL} in the argument list)
535
+ # * `:return => Boolean`
536
+ # (alias for `:newline`; **deprecated after 1.0.0**)
537
+ # * If the {DumbLogger::NO_NL} value (a `Symbol`) appears in the
538
+ # array, or a hash element of `:newline => false` (or `:return =>
539
+ # false`), the report will not include a terminating newline
540
+ # (useful for `"progress:..done"` reports).
518
541
  # * Any strings in the array are treated as text to be reported,
519
- # one _per_ line. Each line will begin with the value of
520
- # #prefix, and only the final line is subject to the
521
- # DumbLogger::NO_NL special-casing.
542
+ # one *per* line. Each line will begin with the value of
543
+ # logger's value of {#prefix} (or any overriding value set with
544
+ # `:prefix` in a hash of options), and only the final line is
545
+ # subject to the {DumbLogger::NO_NL} special-casing.
546
+ #
547
+ # @note
548
+ # Use of the `:return` hash option is deprecated in versions after
549
+ # 1.0.0. Use `:newline` instead.
522
550
  #
523
551
  # @return [nil,Integer]
524
552
  # Returns either `nil` if the message's loglevel is higher than the
@@ -527,7 +555,7 @@ class DumbLogger
527
555
  # If integer levels are being used, a non-`nil` return value is
528
556
  # that of the message. If bitmask levels are being used, the
529
557
  # return value is a mask of the active level bits that applied to
530
- # the message -- *i.e.*, `msg_bits & logging_mask` .
558
+ # the message -- *i.e.*, `message_mask & logging_mask` .
531
559
  #
532
560
  def message(*args)
533
561
  #
@@ -535,32 +563,110 @@ class DumbLogger
535
563
  # list. This makes the calling format very flexible.
536
564
  #
537
565
  (symopts, args) = args.partition { |elt| elt.kind_of?(Symbol) }
566
+ #
567
+ # Pull out any symbols that are actually names for levels (or
568
+ # masks). The args variable now contains no Symbol elements.
569
+ #
538
570
  symlevels = (symopts & self.labeled_levels.keys).map { |o|
539
571
  self.labeled_levels[o]
540
572
  }.compact
573
+ #
574
+ # Now any option hashes.
575
+ #
541
576
  (hashopts, args) = args.partition { |elt| elt.kind_of?(Hash) }
542
577
  hashopts = hashopts.reduce(:merge) || {}
543
- (level, args) = args.partition { |elt| elt.kind_of?(Integer) }
544
- level = level.last || hashopts[:level] || hashopts[:mask] || 0
545
- cur_loglevel = self.loglevel
546
- cur_style = self.level_style
578
+ #
579
+ # All hashes have been removed from the args array, and merged
580
+ # together into a single *per*-message options hash.
581
+ #
582
+
583
+ #
584
+ # Now some fun stuff. The appropriate loglevel/mask for this
585
+ # message can come from
586
+ #
587
+ # * Integers in the argument array (last one takes precedence); or
588
+ # * Values of symbolic level/mask labels (again, last one takes
589
+ # precedence, and overrides any explicit integers); or
590
+ # * Any `:level` or `:mask` value in the options hash (which one
591
+ # of those takes precedence depends on the current logging
592
+ # style).
593
+ #
594
+ (lvls, args) = args.partition { |elt| elt.kind_of?(Integer) }
595
+ if (self.log_levels?)
596
+ level = hashopts[:level] || hashopts[:mask]
597
+ else
598
+ level = hashopts[:mask] || hashopts[:level]
599
+ end
600
+ if (level.nil?)
601
+ if (self.log_levels?)
602
+ level = symlevels.empty? ? lvls.last : symlevels.min
603
+ else
604
+ level = symlevels.empty? ? lvls.last : symlevels.reduce(:|)
605
+ end
606
+ end
607
+ level ||= 0
608
+ #
609
+ # We should now have a minimum logging level, or an ORed bitmask,
610
+ # in variable 'level'. Time to see if it meets our criteria.
611
+ #
547
612
  unless (level.zero?)
548
613
  if (self.log_levels?)
549
- return nil if ([ cur_loglevel, *symlevels ].min < level)
614
+ return nil if (self.loglevel < level)
550
615
  elsif (self.log_masks?)
551
- level = [ level, *symlevels ].reduce(:|) & cur_loglevel
616
+ level &= self.logmask
552
617
  return nil if (level.zero?)
553
618
  end
554
619
  end
620
+ #
621
+ # Looks like the request loglevel/mask is within the logger's
622
+ # requirements, so let's build the output string.
623
+ #
555
624
  prefix_text = hashopts[:prefix] || self.prefix
556
625
  text = prefix_text + args.join("\n#{prefix_text}")
626
+ #
627
+ # The :return option is overridden by :newline, and renamed to it
628
+ # if :newline isn't already in the options hash.
629
+ #
630
+ if (hashopts.key?(:return) && (! hashopts.key?(:newline)))
631
+ hashopts[:newline] = hashopts[:return]
632
+ hashopts.delete(:return)
633
+ end
557
634
  unless (hashopts.key?(:newline))
558
635
  hashopts[:newline]= (! symopts.include?(NO_NL))
559
636
  end
560
637
  text << "\n" if (hashopts[:newline])
638
+ #
639
+ # Okey. If the output stream is marked 'volatile', it's one of
640
+ # our special sinks and we need to evaluate it on every write.
641
+ #
561
642
  stream = @options[:volatile] ? eval(self.sink.to_s) : @sink_io
643
+ #
644
+ # If this is our first write to this sink, make sure we position
645
+ # properly before writing!
646
+ #
647
+ if (@options[:needs_seek] && stream.respond_to?(:seek))
648
+ poz = (self.append? \
649
+ ? IO::SEEK_END \
650
+ : IO::SEEK_SET)
651
+ begin
652
+ #
653
+ # Can't seek on some things, so just catch the exception and
654
+ # ignore it.
655
+ #
656
+ stream.seek(0, poz)
657
+ rescue Errno::ESPIPE => exc
658
+ #
659
+ # Do nothing..
660
+ #
661
+ end
662
+ @options[:needs_seek] = false
663
+ end
562
664
  stream.write(text)
563
665
  stream.flush if (@options[:volatile])
666
+ #
667
+ # All done! Return the level, or mask bits, that resulted in the
668
+ # text being transmitted.
669
+ #
564
670
  return level
565
671
  end # def message
566
672
 
@@ -31,6 +31,15 @@ class DumbLogger
31
31
  @version = @version.change(:major => 1,
32
32
  :tiny => 0)
33
33
 
34
+ #
35
+ # * Corrected & deprecated `:return` {#message} option key
36
+ # * Added seek-to on first write to a sink
37
+ # * Corrected (and documented) applicable level/mask determination
38
+ # for {#message}
39
+ # * Added some tests for `:return` *versus* `:newline`
40
+ #
41
+ @version = @version.bump(:tiny)
42
+
34
43
  #
35
44
  # How to advance the version number.
36
45
  #
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dumb-logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ken Coar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-06 00:00:00.000000000 Z
11
+ date: 2015-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler