Class: ProtonBot::Log

Inherits:
Object
  • Object
show all
Defined in:
lib/protonbot/log.rb

Overview

Log - for colored logging.

Instance Attribute Summary collapse

Logging collapse

Instance Method Summary collapse

Constructor Details

#initializeLog

Returns a new instance of Log.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/protonbot/log.rb', line 9

def initialize
  @pastel = Pastel.new

  @queue = Queue.new

  @fmt  = '[:date|:time] :name ▷ :lvl ▶ :text'
  @dfmt = '%d.%m.%Y'
  @tfmt = '%H:%M:%S'
  @levels = DEFAULT_SCHEME

  @logging = true

  @stop = false

  lloop
end

Instance Attribute Details

#levelsHash<String>

Returns Colorscheme.

Returns:

  • (Hash<String>)

    Colorscheme



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/protonbot/log.rb', line 6

class ProtonBot::Log
  attr_accessor :levels, :logging

  def initialize
    @pastel = Pastel.new

    @queue = Queue.new

    @fmt  = '[:date|:time] :name ▷ :lvl ▶ :text'
    @dfmt = '%d.%m.%Y'
    @tfmt = '%H:%M:%S'
    @levels = DEFAULT_SCHEME

    @logging = true

    @stop = false

    lloop
  end

  # Use it to get rid of appending name on each log-method-call
  # @param name [String]
  # @return [LogWrapper] wrapper
  # @see ProtonBot::LogWrapper
  def wrap(name)
    ProtonBot::LogWrapper.new(self, name)
  end

  # @!group Logging
  # @param msg [String]
  # @param nam [String] Name
  def info(msg, nam = 'log')
    dat = gsub(msg.to_s, :info, nam)
    @queue << dat
    @pastel.strip(dat)
  end

  # @param msg [String]
  # @param nam [String] Name
  def debug(msg, nam = 'log')
    dat = gsub(msg.to_s, :debug, nam)
    @queue << dat
    @pastel.strip(dat)
  end

  # @param msg [String]
  # @param nam [String] Name
  def warn(msg, nam = 'log')
    dat = gsub(msg.to_s, :warning, nam)
    @queue << dat
    @pastel.strip(dat)
  end

  # @param msg [String]
  # @param nam [String] Name
  def error(msg, nam = 'log')
    dat = gsub(msg.to_s, :error, nam)
    @queue << dat
    @pastel.strip(dat)
  end

  # @param msg [String]
  # @param code [Integer]
  # @param nam [String] Name
  def crash(msg, code = 1, nam = 'log')
    dat = gsub(msg.to_s, :crash, nam)
    @queue << dat
    @pastel.strip(dat)
    exit code
  end
  # @!endgroup

  # @return [String] Output
  def inspect
    %(<#ProtonBot::Log:#{object_id.to_s(16)} @logging=#{@logging}>)
  end

  # Stops log thread
  def stop
    @stop = true
    @thr.join
  end

  private

  # Formats message
  # @param msg [String]
  # @param sname [Symbol] Color-Scheme name
  # @param nam [String] Log-Name
  def gsub(msg, sname, nam)
    dt = DateTime.now

    date = dt.strftime(@dfmt)
    time = dt.strftime(@tfmt)

    dates = @pastel.decorate(date, *@levels[sname][:fmt][:datetime])
    times = @pastel.decorate(time, *@levels[sname][:fmt][:datetime])

    name = @pastel.decorate(nam, *@levels[sname][:fmt][:name])

    lvl = @pastel.decorate(*@levels[sname][:chars],
                           *@levels[sname][:fmt][:lvl])

    @fmt
      .gsub(':date', dates)
      .gsub(':time', times)
      .gsub(':name', name)
      .gsub(':lvl',  lvl)
      .gsub(':text', msg)
      .gsub('▷', @pastel.decorate('▷', *@levels[sname][:fmt][:arrows]))
      .gsub('▶', @pastel.decorate('▶', *@levels[sname][:fmt][:arrows]))
  end

  # Log-loop - reads messages from queue and writes them to STDOUT
  def lloop
    @thr = Thread.new do
      loop do
        break if @stop
        d = begin
              @queue.pop
            rescue
              nil
            end
        print("#{d}\n") if @logging && d
      end
    end
  end

  # Default colorcheme
  DEFAULT_SCHEME = {
    info: {
      chars: 'I',
      fmt: {
        datetime: [:bright_cyan],
        name:     [:cyan],
        lvl:      [:cyan],
        arrows:   [:bright_cyan]
      }
    },
    debug: {
      chars: 'D',
      fmt: {
        datetime: [:bright_green],
        name:     [:green],
        lvl:      [:green],
        arrows:   [:bright_green]
      }
    },
    warning: {
      chars: 'W',
      fmt: {
        datetime: [:bright_yellow],
        name:     [:yellow],
        lvl:      [:yellow],
        arrows:   [:bright_yellow]
      }
    },
    error: {
      chars: 'E',
      fmt: {
        datetime: [:bright_red],
        name:     [:red],
        lvl:      [:red],
        arrows:   [:bright_red]
      }
    },
    crash: {
      chars: 'C',
      fmt: {
        datetime: [:bright_magenta],
        name:     [:magenta],
        lvl:      [:magenta],
        arrows:   [:bright_magenta]
      }
    }
  }.freeze
end

#loggingBool

Returns If false, does not write messages.

Returns:

  • (Bool)

    If false, does not write messages.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/protonbot/log.rb', line 6

class ProtonBot::Log
  attr_accessor :levels, :logging

  def initialize
    @pastel = Pastel.new

    @queue = Queue.new

    @fmt  = '[:date|:time] :name ▷ :lvl ▶ :text'
    @dfmt = '%d.%m.%Y'
    @tfmt = '%H:%M:%S'
    @levels = DEFAULT_SCHEME

    @logging = true

    @stop = false

    lloop
  end

  # Use it to get rid of appending name on each log-method-call
  # @param name [String]
  # @return [LogWrapper] wrapper
  # @see ProtonBot::LogWrapper
  def wrap(name)
    ProtonBot::LogWrapper.new(self, name)
  end

  # @!group Logging
  # @param msg [String]
  # @param nam [String] Name
  def info(msg, nam = 'log')
    dat = gsub(msg.to_s, :info, nam)
    @queue << dat
    @pastel.strip(dat)
  end

  # @param msg [String]
  # @param nam [String] Name
  def debug(msg, nam = 'log')
    dat = gsub(msg.to_s, :debug, nam)
    @queue << dat
    @pastel.strip(dat)
  end

  # @param msg [String]
  # @param nam [String] Name
  def warn(msg, nam = 'log')
    dat = gsub(msg.to_s, :warning, nam)
    @queue << dat
    @pastel.strip(dat)
  end

  # @param msg [String]
  # @param nam [String] Name
  def error(msg, nam = 'log')
    dat = gsub(msg.to_s, :error, nam)
    @queue << dat
    @pastel.strip(dat)
  end

  # @param msg [String]
  # @param code [Integer]
  # @param nam [String] Name
  def crash(msg, code = 1, nam = 'log')
    dat = gsub(msg.to_s, :crash, nam)
    @queue << dat
    @pastel.strip(dat)
    exit code
  end
  # @!endgroup

  # @return [String] Output
  def inspect
    %(<#ProtonBot::Log:#{object_id.to_s(16)} @logging=#{@logging}>)
  end

  # Stops log thread
  def stop
    @stop = true
    @thr.join
  end

  private

  # Formats message
  # @param msg [String]
  # @param sname [Symbol] Color-Scheme name
  # @param nam [String] Log-Name
  def gsub(msg, sname, nam)
    dt = DateTime.now

    date = dt.strftime(@dfmt)
    time = dt.strftime(@tfmt)

    dates = @pastel.decorate(date, *@levels[sname][:fmt][:datetime])
    times = @pastel.decorate(time, *@levels[sname][:fmt][:datetime])

    name = @pastel.decorate(nam, *@levels[sname][:fmt][:name])

    lvl = @pastel.decorate(*@levels[sname][:chars],
                           *@levels[sname][:fmt][:lvl])

    @fmt
      .gsub(':date', dates)
      .gsub(':time', times)
      .gsub(':name', name)
      .gsub(':lvl',  lvl)
      .gsub(':text', msg)
      .gsub('▷', @pastel.decorate('▷', *@levels[sname][:fmt][:arrows]))
      .gsub('▶', @pastel.decorate('▶', *@levels[sname][:fmt][:arrows]))
  end

  # Log-loop - reads messages from queue and writes them to STDOUT
  def lloop
    @thr = Thread.new do
      loop do
        break if @stop
        d = begin
              @queue.pop
            rescue
              nil
            end
        print("#{d}\n") if @logging && d
      end
    end
  end

  # Default colorcheme
  DEFAULT_SCHEME = {
    info: {
      chars: 'I',
      fmt: {
        datetime: [:bright_cyan],
        name:     [:cyan],
        lvl:      [:cyan],
        arrows:   [:bright_cyan]
      }
    },
    debug: {
      chars: 'D',
      fmt: {
        datetime: [:bright_green],
        name:     [:green],
        lvl:      [:green],
        arrows:   [:bright_green]
      }
    },
    warning: {
      chars: 'W',
      fmt: {
        datetime: [:bright_yellow],
        name:     [:yellow],
        lvl:      [:yellow],
        arrows:   [:bright_yellow]
      }
    },
    error: {
      chars: 'E',
      fmt: {
        datetime: [:bright_red],
        name:     [:red],
        lvl:      [:red],
        arrows:   [:bright_red]
      }
    },
    crash: {
      chars: 'C',
      fmt: {
        datetime: [:bright_magenta],
        name:     [:magenta],
        lvl:      [:magenta],
        arrows:   [:bright_magenta]
      }
    }
  }.freeze
end

Instance Method Details

#crash(msg, code = 1, nam = 'log') ⇒ Object

Parameters:

  • msg (String)
  • code (Integer) (defaults to: 1)
  • nam (String) (defaults to: 'log')

    Name



70
71
72
73
74
75
# File 'lib/protonbot/log.rb', line 70

def crash(msg, code = 1, nam = 'log')
  dat = gsub(msg.to_s, :crash, nam)
  @queue << dat
  @pastel.strip(dat)
  exit code
end

#debug(msg, nam = 'log') ⇒ Object

Parameters:

  • msg (String)
  • nam (String) (defaults to: 'log')

    Name



45
46
47
48
49
# File 'lib/protonbot/log.rb', line 45

def debug(msg, nam = 'log')
  dat = gsub(msg.to_s, :debug, nam)
  @queue << dat
  @pastel.strip(dat)
end

#error(msg, nam = 'log') ⇒ Object

Parameters:

  • msg (String)
  • nam (String) (defaults to: 'log')

    Name



61
62
63
64
65
# File 'lib/protonbot/log.rb', line 61

def error(msg, nam = 'log')
  dat = gsub(msg.to_s, :error, nam)
  @queue << dat
  @pastel.strip(dat)
end

#info(msg, nam = 'log') ⇒ Object

Parameters:

  • msg (String)
  • nam (String) (defaults to: 'log')

    Name



37
38
39
40
41
# File 'lib/protonbot/log.rb', line 37

def info(msg, nam = 'log')
  dat = gsub(msg.to_s, :info, nam)
  @queue << dat
  @pastel.strip(dat)
end

#inspectString

Returns Output.

Returns:

  • (String)

    Output



79
80
81
# File 'lib/protonbot/log.rb', line 79

def inspect
  %(<#ProtonBot::Log:#{object_id.to_s(16)} @logging=#{@logging}>)
end

#stopObject

Stops log thread



84
85
86
87
# File 'lib/protonbot/log.rb', line 84

def stop
  @stop = true
  @thr.join
end

#warn(msg, nam = 'log') ⇒ Object

Parameters:

  • msg (String)
  • nam (String) (defaults to: 'log')

    Name



53
54
55
56
57
# File 'lib/protonbot/log.rb', line 53

def warn(msg, nam = 'log')
  dat = gsub(msg.to_s, :warning, nam)
  @queue << dat
  @pastel.strip(dat)
end

#wrap(name) ⇒ LogWrapper

Use it to get rid of appending name on each log-method-call

Parameters:

  • name (String)

Returns:

See Also:



30
31
32
# File 'lib/protonbot/log.rb', line 30

def wrap(name)
  ProtonBot::LogWrapper.new(self, name)
end