lines 0.1.19 → 0.1.20
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 +8 -8
- data/.gitignore +1 -0
- data/lib/lines.rb +39 -28
- data/lib/lines/version.rb +1 -1
- data/spec/lines_spec.rb +69 -38
- metadata +2 -2
- data/Gemfile.lock +0 -35
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NGU4YzQzOTg2NjJlNWFjNjA2ZDliYzEzYTRkMDE3OWJjZGRjZmI0NQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NzIzODU1MzljMTg5N2I1MzVhMjdlN2EwOTE4YmVlY2ZlMjE4NDM4Yg==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YmQ0MGI3ODU4ZWJhNDM1NzA5ZDlmMWI2NjNiMmFjMDQ2YjZjZDExZjExMjk4
|
10
|
+
MDFlZWQyMmRmY2IxZjY4NDc1ODljZmI3NmYwZTkzZjBiYjUwZWY0OWI4MjU4
|
11
|
+
ZDE3NThhMDhhMWY5NTlkYWZhY2M3YjcwMjZhY2Q2MzlhZDNlNjE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
OTg1YjllMzkyNjMzNmIwZjdmYTU2MDQzZmIzNmNmY2IyOTE5ZTJiNDkwYWRi
|
14
|
+
M2U1YWE5OWEzNjk5YjkzMmU2OWFlZDRjMWI1NzZmNjVjOWQwY2NkNmY3NmYx
|
15
|
+
MjIzNWFjMjNmNjllMGZlZDBlNTljNzMwZmE4OWUzYjMzZWIzYTQ=
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Gemfile.lock
|
data/lib/lines.rb
CHANGED
@@ -56,8 +56,7 @@ module Lines
|
|
56
56
|
# obj - a ruby hash
|
57
57
|
# args -
|
58
58
|
def log(obj, args={})
|
59
|
-
obj =
|
60
|
-
obj = global.merge(obj)
|
59
|
+
obj = prepare_obj(obj, args)
|
61
60
|
outputters.each{|out| out.output(dumper, obj) }
|
62
61
|
obj
|
63
62
|
end
|
@@ -65,25 +64,15 @@ module Lines
|
|
65
64
|
# Add data to the logs
|
66
65
|
#
|
67
66
|
# data - a ruby hash
|
67
|
+
#
|
68
|
+
# return a Context instance
|
68
69
|
def context(data={})
|
69
|
-
new_context = Context.new
|
70
|
+
new_context = Context.new ensure_hash!(data)
|
70
71
|
yield new_context if block_given?
|
71
72
|
new_context
|
72
73
|
end
|
73
74
|
|
74
|
-
|
75
|
-
attr_reader :data
|
76
|
-
|
77
|
-
def initialize(data)
|
78
|
-
@data = data
|
79
|
-
end
|
80
|
-
|
81
|
-
def log(obj, args={})
|
82
|
-
Lines.log(obj, args.merge(data))
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# A backward-compatibile logger
|
75
|
+
# Returns a backward-compatibile logger
|
87
76
|
def logger
|
88
77
|
@logger ||= (
|
89
78
|
require "lines/logger"
|
@@ -91,23 +80,34 @@ module Lines
|
|
91
80
|
)
|
92
81
|
end
|
93
82
|
|
83
|
+
def ensure_hash!(obj) # :nodoc:
|
84
|
+
return {} unless obj
|
85
|
+
return obj if obj.kind_of?(Hash)
|
86
|
+
return obj.to_h if obj.respond_to?(:to_h)
|
87
|
+
obj = {msg: obj}
|
88
|
+
end
|
89
|
+
|
94
90
|
protected
|
95
91
|
|
96
|
-
def
|
92
|
+
def prepare_obj(obj, args={})
|
97
93
|
if obj.kind_of?(Exception)
|
98
94
|
ex = obj
|
99
95
|
obj = {ex: ex.class, msg: ex.to_s}
|
100
96
|
if ex.respond_to?(:backtrace) && ex.backtrace
|
101
97
|
obj[:backtrace] = ex.backtrace
|
102
98
|
end
|
103
|
-
|
104
|
-
|
105
|
-
obj = obj.to_h
|
106
|
-
else
|
107
|
-
obj = {msg: obj}
|
108
|
-
end
|
99
|
+
else
|
100
|
+
obj = ensure_hash!(obj)
|
109
101
|
end
|
110
|
-
|
102
|
+
|
103
|
+
args = ensure_hash!(args)
|
104
|
+
|
105
|
+
g = global.inject({}) do |h, (k,v)|
|
106
|
+
h[k] = v.respond_to?(:call) ? v.call : v
|
107
|
+
h
|
108
|
+
end
|
109
|
+
|
110
|
+
g.merge(obj.merge(args))
|
111
111
|
end
|
112
112
|
|
113
113
|
def to_outputter(out)
|
@@ -125,6 +125,19 @@ module Lines
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
+
# Wrapper object that holds a given context. Emitted by Lines.with
|
129
|
+
class Context
|
130
|
+
attr_reader :data
|
131
|
+
|
132
|
+
def initialize(data)
|
133
|
+
@data = data
|
134
|
+
end
|
135
|
+
|
136
|
+
def log(obj, args={})
|
137
|
+
Lines.log obj, Lines.ensure_hash!(args).merge(data)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
128
141
|
class StreamOutputter
|
129
142
|
# stream must accept a #write(str) message
|
130
143
|
def initialize(stream = $stderr)
|
@@ -157,9 +170,8 @@ module Lines
|
|
157
170
|
}
|
158
171
|
|
159
172
|
def initialize(syslog = Syslog, app_name=nil)
|
160
|
-
@app_name = app_name
|
161
173
|
@syslog = syslog
|
162
|
-
prepare_syslog
|
174
|
+
prepare_syslog(app_name)
|
163
175
|
end
|
164
176
|
|
165
177
|
def output(dumper, obj)
|
@@ -176,10 +188,9 @@ module Lines
|
|
176
188
|
|
177
189
|
protected
|
178
190
|
|
179
|
-
attr_reader :app_name
|
180
191
|
attr_reader :syslog
|
181
192
|
|
182
|
-
def prepare_syslog
|
193
|
+
def prepare_syslog(app_name)
|
183
194
|
unless syslog.opened?
|
184
195
|
# Did you know ? app_name is detected by syslog if nil
|
185
196
|
syslog.open(app_name,
|
data/lib/lines/version.rb
CHANGED
data/spec/lines_spec.rb
CHANGED
@@ -6,59 +6,90 @@ describe Lines do
|
|
6
6
|
let(:outputter) { StringIO.new }
|
7
7
|
let(:output) { outputter.string }
|
8
8
|
before do
|
9
|
+
Lines.global.replace({})
|
9
10
|
Lines.use(outputter)
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
context ".log" do
|
14
|
+
it "logs stuff" do
|
15
|
+
Lines.log(foo: 'bar')
|
16
|
+
expect(output).to eq('foo=bar' + Lines::NL)
|
17
|
+
end
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
it "supports a first msg argument" do
|
20
|
+
Lines.log("this user is annoying", user: 'bob')
|
21
|
+
expect(output).to eq("msg='this user is annoying' user=bob" + Lines::NL)
|
22
|
+
end
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
it "logs exceptions" do
|
25
|
+
Lines.log(StandardError.new("error time!"), user: 'bob')
|
26
|
+
expect(output).to eq("ex=StandardError msg='error time!' user=bob" + Lines::NL)
|
27
|
+
end
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
it "logs exception backtraces when available" do
|
30
|
+
ex = (raise "foo" rescue $!)
|
31
|
+
#expect(ex).not_to eq(nil)
|
32
|
+
Lines.log(ex)
|
33
|
+
expect(output).to match(/ex=RuntimeError msg=foo backtrace=\[[^\]]+\]/)
|
34
|
+
end
|
33
35
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
36
|
+
it "works with anything" do
|
37
|
+
Lines.log("anything1", "anything2")
|
38
|
+
expect(output).to eq('msg=anything2' + Lines::NL)
|
39
|
+
end
|
38
40
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
expect(output).to eq('app=self' + Lines::NL)
|
41
|
+
it "doesn't convert nil args to msg" do
|
42
|
+
Lines.log("anything", nil)
|
43
|
+
expect(output).to eq('msg=anything' + Lines::NL)
|
44
|
+
end
|
44
45
|
end
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
|
47
|
+
context ".context" do
|
48
|
+
it "has contextes" do
|
49
|
+
Lines.context(foo: "bar").log(a: 'b')
|
50
|
+
expect(output).to eq('a=b foo=bar' + Lines::NL)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "has contextes with blocks" do
|
54
|
+
Lines.context(foo: "bar") do |ctx|
|
55
|
+
ctx.log(a: 'b')
|
56
|
+
end
|
57
|
+
expect(output).to eq('a=b foo=bar' + Lines::NL)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "mixes everything" do
|
61
|
+
Lines.global[:app] = :self
|
62
|
+
ctx = Lines.context(foo: "bar")
|
63
|
+
ctx.log('msg', ahoi: true)
|
64
|
+
expect(output).to eq('app=self msg=msg ahoi=#t foo=bar' + Lines::NL)
|
65
|
+
end
|
49
66
|
end
|
50
67
|
|
51
|
-
|
52
|
-
|
53
|
-
|
68
|
+
context ".logger" do
|
69
|
+
it "is provided for backward-compatibility" do
|
70
|
+
l = Lines.logger
|
71
|
+
l.info("hi")
|
72
|
+
expect(output).to eq('pri=info msg=hi' + Lines::NL)
|
54
73
|
end
|
55
|
-
expect(output).to eq('a=b foo=bar' + Lines::NL)
|
56
74
|
end
|
57
75
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
76
|
+
context ".global" do
|
77
|
+
it "prepends data to the line" do
|
78
|
+
Lines.global["app"] = :self
|
79
|
+
Lines.log 'hey'
|
80
|
+
expect(output).to eq('app=self msg=hey' + Lines::NL)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "resolves procs dynamically" do
|
84
|
+
count = 0
|
85
|
+
Lines.global[:count] = proc{ count += 1 }
|
86
|
+
Lines.log 'test1'
|
87
|
+
Lines.log 'test2'
|
88
|
+
expect(output).to eq(
|
89
|
+
'count=1 msg=test1' + Lines::NL +
|
90
|
+
'count=2 msg=test2' + Lines::NL
|
91
|
+
)
|
92
|
+
end
|
62
93
|
end
|
63
94
|
end
|
64
95
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lines
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.20
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonas Pfenniger
|
@@ -45,10 +45,10 @@ executables: []
|
|
45
45
|
extensions: []
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
|
+
- .gitignore
|
48
49
|
- .rspec
|
49
50
|
- .travis.yml
|
50
51
|
- Gemfile
|
51
|
-
- Gemfile.lock
|
52
52
|
- LICENSE.txt
|
53
53
|
- README.md
|
54
54
|
- Rakefile
|
data/Gemfile.lock
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
lines (0.1.18)
|
5
|
-
|
6
|
-
GEM
|
7
|
-
remote: http://rubygems.org/
|
8
|
-
specs:
|
9
|
-
blankslate (2.1.2.4)
|
10
|
-
diff-lcs (1.2.1)
|
11
|
-
json (1.7.7)
|
12
|
-
parslet (1.5.0)
|
13
|
-
blankslate (~> 2.0)
|
14
|
-
rake (0.9.2.2)
|
15
|
-
rdoc (4.0.0)
|
16
|
-
json (~> 1.4)
|
17
|
-
rspec (2.13.0)
|
18
|
-
rspec-core (~> 2.13.0)
|
19
|
-
rspec-expectations (~> 2.13.0)
|
20
|
-
rspec-mocks (~> 2.13.0)
|
21
|
-
rspec-core (2.13.0)
|
22
|
-
rspec-expectations (2.13.0)
|
23
|
-
diff-lcs (>= 1.1.3, < 2.0)
|
24
|
-
rspec-mocks (2.13.0)
|
25
|
-
|
26
|
-
PLATFORMS
|
27
|
-
ruby
|
28
|
-
|
29
|
-
DEPENDENCIES
|
30
|
-
bundler (~> 1.3)
|
31
|
-
lines!
|
32
|
-
parslet
|
33
|
-
rake
|
34
|
-
rdoc
|
35
|
-
rspec
|