dumb-logger 1.0.0 → 1.0.1

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
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