twiglet 2.3.4 → 2.3.9

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
  SHA256:
3
- metadata.gz: 566cfbc6b21d6429cbdc6554befd8e4b721af7bde6f44de190e883bdbc2f2c17
4
- data.tar.gz: 5202227657bcc217a0d2bac7b523f09887cc8b5f3449a6d94d1670a54bb5d549
3
+ metadata.gz: bd37b7e4eb03587c77c448d986a57dea2db5c119208c9588d400614785c9ab00
4
+ data.tar.gz: 2087e6acf11a7944083c81a493f8dc1608f8789ea5e5fb09cdbe8fbad7391456
5
5
  SHA512:
6
- metadata.gz: e21fdf10a73403d168464f0186f88072549b9770d6b0456848e75dc5a445aecbfd9758f98e3cb1ba83ba2216ce74a8e37ce68a523aa888f35cadc90d53981f34
7
- data.tar.gz: 38ed9e4fa093acd5f2e974b3a61bfa1543831320f5b2687b3e35a235048c068dadf06d2d5b7e7078eeb3803f111037d8a5358e19a5b3cf0485b3d5a547c50bc2
6
+ metadata.gz: 15599c765672e0bcbdbd03f717dde89ccb99ac2142bbb9aad56337466f31c0e9355aa18cd07b4f6cbe9cf53768d9e8efc59042c98aa66aacf82a3ce4e1296993
7
+ data.tar.gz: 67c1dae018c5fa57e4bffc0144b58ae5e9316faf4a1190d919d5828a44240955d246a12e6dde07b34b459694eb4808ac81d02fe2b08bc0187dce3562c8d94e6f
@@ -4,6 +4,9 @@ on:
4
4
  push:
5
5
  branches:
6
6
 
7
+ env:
8
+ CI: true
9
+
7
10
  jobs:
8
11
  build:
9
12
  runs-on: ubuntu-latest
@@ -13,7 +16,7 @@ jobs:
13
16
 
14
17
  strategy:
15
18
  matrix:
16
- ruby-version: [2.6, 2.7]
19
+ ruby-version: [2.5, 2.6, 2.7]
17
20
 
18
21
  steps:
19
22
  - uses: actions/checkout@v2
@@ -23,11 +26,22 @@ jobs:
23
26
  ruby-version: ${{ matrix.ruby-version }}
24
27
  - name: Install dependencies
25
28
  run: bundle install
29
+ - name: install cc-test-reporter
30
+ env:
31
+ CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
32
+ run: |
33
+ curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-0.6.3-linux-amd64 > ./cc-test-reporter
34
+ chmod +x ./cc-test-reporter
35
+ ./cc-test-reporter before-build
26
36
  - name: Rubocop Check
27
37
  run: bundle exec rubocop
28
38
  - name: Run all tests
29
39
  run: bundle exec rake test
30
40
  shell: bash
41
+ - name: upload test coverage to CodeClimate
42
+ env:
43
+ CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
44
+ run: ./cc-test-reporter after-build
31
45
  - name: Run example_app
32
46
  run: bundle exec ruby example_app.rb
33
47
  shell: bash
@@ -0,0 +1,16 @@
1
+ name: Check version
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - master
7
+ types: [opened, synchronize]
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-18.04
11
+
12
+ steps:
13
+ - uses: simplybusiness/version-forget-me-not@v1
14
+ env:
15
+ ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
16
+ VERSION_FILE_PATH: "lib/twiglet/version.rb"
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ *~
1
2
  *.gem
2
3
  Gemfile.lock
3
4
  *.rbc
@@ -2,7 +2,7 @@ inherit_gem:
2
2
  simplycop: .simplycop.yml
3
3
 
4
4
  AllCops:
5
- TargetRubyVersion: 2.6
5
+ TargetRubyVersion: 2.5
6
6
  Rails:
7
7
  Enabled: false
8
8
  Documentation:
@@ -0,0 +1,7 @@
1
+ FROM ruby:2.6.5
2
+
3
+ WORKDIR /var/app
4
+ COPY Gemfile .
5
+ RUN bundle install
6
+
7
+ CMD ["bash"]
data/Gemfile CHANGED
@@ -5,4 +5,5 @@ gem 'simplycop', git: 'https://github.com/simplybusiness/simplycop.git'
5
5
  group :development, :test do
6
6
  gem 'minitest'
7
7
  gem 'rake'
8
+ gem 'simplecov', '0.17.1'
8
9
  end
@@ -0,0 +1,9 @@
1
+ .PHONY: all build test
2
+
3
+ all: build test
4
+
5
+ build:
6
+ docker build -t simplybusiness/ruby-dev:2.6.5 .
7
+
8
+ test:
9
+ docker run -it -v `pwd`:/var/app simplybusiness/ruby-dev:2.6.5 bundle exec rake test
data/README.md CHANGED
@@ -117,7 +117,7 @@ which will print:
117
117
  {"service":{"name":"service name"},"@timestamp":"2020-05-14T10:58:30.780+01:00","log":{"level":"error"},"event":{"action":"HTTP request"},"trace":{"id":"126bb6fa-28a2-470f-b013-eefbf9182b2d"},"message":"Error 500 in /pets/buy","http":{"request":{"method":"post","url.path":"/pet/buy"},"response":{"status_code":500}}}
118
118
  ```
119
119
 
120
- ## Use of dotted keys
120
+ ## Use of dotted keys (DEPRECATED)
121
121
 
122
122
  Writing nested json objects could be confusing. This library has a built-in feature to convert dotted keys into nested objects, so if you log like this:
123
123
 
data/Rakefile CHANGED
@@ -2,6 +2,6 @@ require 'rake/testtask'
2
2
 
3
3
  Rake::TestTask.new do |t|
4
4
  t.libs << "test"
5
- t.test_files = FileList['test/*_test.rb']
5
+ t.test_files = FileList['test/test_coverage.rb', 'test/*_test.rb', 'examples/rack/request_logger_test.rb']
6
6
  t.verbose = true
7
7
  end
@@ -0,0 +1,17 @@
1
+ require 'twiglet/logger'
2
+ require 'request_logger'
3
+
4
+ # basic rack application
5
+ class Application
6
+ def call(_env)
7
+ status = 200
8
+ headers = { "Content-Type" => "text/json" }
9
+ body = ["Example rack app"]
10
+
11
+ [status, headers, body]
12
+ end
13
+ end
14
+
15
+ use RequestLogger, Twiglet::Logger.new('example_app')
16
+
17
+ run Application.new
@@ -0,0 +1,49 @@
1
+ # Middleware for logging request logs
2
+ class RequestLogger
3
+ def initialize(app, logger)
4
+ @app = app
5
+ @logger = logger
6
+ end
7
+
8
+ def call(env)
9
+ status, headers, body = @app.call(env)
10
+ log(env, status)
11
+ [status, headers, body]
12
+ rescue StandardError => e
13
+ log_error(env, 500, e)
14
+ [500, {}, body]
15
+ end
16
+
17
+ private
18
+
19
+ def log(env, status)
20
+ fields = get_fields(env, status)
21
+ @logger.info(fields)
22
+ end
23
+
24
+ def log_error(env, status, error)
25
+ fields = get_fields(env, status)
26
+ @logger.error(fields, error)
27
+ end
28
+
29
+ def get_fields(env, status)
30
+ message = "#{env['REQUEST_METHOD']}: #{env['PATH_INFO']}"
31
+
32
+ {
33
+ http: {
34
+ request: {
35
+ method: env['REQUEST_METHOD'],
36
+ server: env['SERVER_NAME'],
37
+ https_enabled: env['HTTPS'],
38
+ path: env['PATH_INFO'],
39
+ query: env['QUERY_STRING'] # Don't log PII query params
40
+ },
41
+ response: {
42
+ status: status,
43
+ body: { bytes: env['CONTENT_LENGTH'] }
44
+ }
45
+ },
46
+ message: message
47
+ }
48
+ end
49
+ end
@@ -0,0 +1,66 @@
1
+ require 'minitest/autorun'
2
+ require_relative './request_logger'
3
+ require 'rack'
4
+
5
+ describe RequestLogger do
6
+ let(:output) { StringIO.new }
7
+
8
+ before { output.rewind }
9
+
10
+ it 'log should not be empty' do
11
+ request.get("/some/path")
12
+ log = output.string
13
+ refute_empty log
14
+ end
15
+
16
+ it 'logs the request data' do
17
+ request.get("/some/path?some_var=1")
18
+ log = JSON.parse(output.string)
19
+ http_body = {
20
+ "request" => {
21
+ "https_enabled" => "off",
22
+ "method" => "GET",
23
+ "path" => "/some/path",
24
+ "query" => "some_var=1",
25
+ "server" => "example.org"
26
+ },
27
+ "response" => {
28
+ "status" => 200,
29
+ "body" => { "bytes" => "0" }
30
+ }
31
+ }
32
+ assert_equal http_body, log["http"]
33
+ assert_equal "GET: /some/path", log["message"]
34
+ end
35
+
36
+ it 'does not log PII' do
37
+ request.post("/user/info", input_data: {credit_card_no: '1234'})
38
+ log = output.string
39
+ assert_includes log, "POST: /user/info"
40
+ refute_includes log, 'credit_card_no'
41
+ refute_includes log, '1234'
42
+ end
43
+
44
+ it 'logs an error message when a request is bad' do
45
+ bad_request.get("/some/path")
46
+ log = JSON.parse(output.string)
47
+ assert_equal 'error', log['log']['level']
48
+ assert_equal 'some exception', log['error']['message']
49
+ end
50
+ end
51
+
52
+ def request
53
+ app = ->(env) { [200, env, "app"] }
54
+ base_request(app)
55
+ end
56
+
57
+ def bad_request
58
+ app = Rack::Lint.new ->(_env) { raise StandardError, 'some exception' }
59
+ base_request(app)
60
+ end
61
+
62
+ def base_request(app)
63
+ logger = Twiglet::Logger.new('example', output: output)
64
+ req_logger = RequestLogger.new(app, logger)
65
+ Rack::MockRequest.new(req_logger)
66
+ end
@@ -50,6 +50,9 @@ module Twiglet
50
50
 
51
51
  def log_message(level, message:)
52
52
  base_message = {
53
+ ecs: {
54
+ version: '1.5.0'
55
+ },
53
56
  "@timestamp": @now.call.iso8601(3),
54
57
  service: {
55
58
  name: @service_name
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Twiglet
4
- VERSION = '2.3.4'
4
+ VERSION = '2.3.9'
5
5
  end
@@ -17,6 +17,9 @@ describe Twiglet::Formatter do
17
17
  it 'returns a formatted log from a string message' do
18
18
  msg = @formatter.call('warn', nil, nil, 'shop is running low on dog food')
19
19
  expected_log = {
20
+ "ecs" => {
21
+ "version" => '1.5.0'
22
+ },
20
23
  "@timestamp" => '2020-05-11T15:01:01.000Z',
21
24
  "service" => {
22
25
  "name" => 'petshop'
@@ -49,6 +49,9 @@ describe Twiglet::Logger do
49
49
 
50
50
  expected_log = {
51
51
  message: 'Out of pets exception',
52
+ ecs: {
53
+ version: '1.5.0'
54
+ },
52
55
  "@timestamp": '2020-05-11T15:01:01.000Z',
53
56
  service: {
54
57
  name: 'petshop'
@@ -136,10 +139,10 @@ describe Twiglet::Logger do
136
139
  @logger.info({message: 'there'})
137
140
 
138
141
  expected_output =
139
- '{"@timestamp":"2020-05-11T15:01:01.000Z",'\
142
+ '{"ecs":{"version":"1.5.0"},"@timestamp":"2020-05-11T15:01:01.000Z",'\
140
143
  '"service":{"name":"petshop"},"log":{"level":"debug"},"message":"hi"}'\
141
144
  "\n"\
142
- '{"@timestamp":"2020-05-11T15:01:01.000Z",'\
145
+ '{"ecs":{"version":"1.5.0"},"@timestamp":"2020-05-11T15:01:01.000Z",'\
143
146
  '"service":{"name":"petshop"},"log":{"level":"info"},"message":"there"}'\
144
147
  "\n"\
145
148
 
@@ -251,6 +254,9 @@ describe Twiglet::Logger do
251
254
 
252
255
  expected_log = {
253
256
  message: 'Out of pets exception',
257
+ ecs: {
258
+ version: '1.5.0'
259
+ },
254
260
  "@timestamp": '2020-05-11T15:01:01.000Z',
255
261
  service: {
256
262
  name: 'petshop'
@@ -0,0 +1,13 @@
1
+ require 'simplecov'
2
+
3
+ SimpleCov.start do
4
+ add_filter "/test/"
5
+ add_filter "examples/rack/request_logger_test.rb"
6
+
7
+ if ENV['CI']
8
+ formatter SimpleCov::Formatter::SimpleFormatter
9
+ else
10
+ formatter SimpleCov::Formatter::MultiFormatter.new([SimpleCov::Formatter::SimpleFormatter,
11
+ SimpleCov::Formatter::HTMLFormatter])
12
+ end
13
+ end
@@ -18,7 +18,7 @@ Gem::Specification.new do |gem|
18
18
  gem.test_files = `git ls-files -- {test}/*`.split("\n")
19
19
 
20
20
  gem.require_paths = ['lib']
21
- gem.required_ruby_version = '>= 2.6'
21
+ gem.required_ruby_version = '>= 2.5'
22
22
 
23
23
  gem.license = 'Copyright SimplyBusiness'
24
24
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twiglet
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.4
4
+ version: 2.3.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simply Business
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-06 00:00:00.000000000 Z
11
+ date: 2020-08-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Like a log, only smaller.
14
14
  email:
@@ -20,16 +20,22 @@ files:
20
20
  - ".github/CODEOWNERS"
21
21
  - ".github/workflows/gem-publish.yml"
22
22
  - ".github/workflows/ruby.yml"
23
+ - ".github/workflows/version-forget-me-not.yml"
23
24
  - ".gitignore"
24
25
  - ".rubocop.yml"
25
26
  - ".ruby-version"
26
27
  - CODE_OF_CONDUCT.md
28
+ - Dockerfile
27
29
  - Gemfile
28
30
  - LICENSE
31
+ - Makefile
29
32
  - RATIONALE.md
30
33
  - README.md
31
34
  - Rakefile
32
35
  - example_app.rb
36
+ - examples/rack/example_rack_app.rb
37
+ - examples/rack/request_logger.rb
38
+ - examples/rack/request_logger_test.rb
33
39
  - lib/hash_extensions.rb
34
40
  - lib/twiglet/formatter.rb
35
41
  - lib/twiglet/logger.rb
@@ -37,6 +43,7 @@ files:
37
43
  - test/formatter_test.rb
38
44
  - test/hash_extensions_test.rb
39
45
  - test/logger_test.rb
46
+ - test/test_coverage.rb
40
47
  - twiglet.gemspec
41
48
  homepage: https://github.com/simplybusiness/twiglet-ruby
42
49
  licenses:
@@ -50,7 +57,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
50
57
  requirements:
51
58
  - - ">="
52
59
  - !ruby/object:Gem::Version
53
- version: '2.6'
60
+ version: '2.5'
54
61
  required_rubygems_version: !ruby/object:Gem::Requirement
55
62
  requirements:
56
63
  - - ">="