rollday 0.1.0 → 0.3.0

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
  SHA256:
3
- metadata.gz: ad34763ae84ecaefbd8febab644f790d10a0cd18fe0cd425004e8c8b6464c10b
4
- data.tar.gz: 64474e52fb56a31a4cff7e4b11736d75163783b543bea30a6ca64b8054a5b366
3
+ metadata.gz: d2c78b5cc1611bf2a6d2766ffbd66df911882fc62e2fbcf3575450113c71e4b2
4
+ data.tar.gz: 2bc833d5d56efe20e819c66ec503074fe058444dc65f7640b393fab268782c04
5
5
  SHA512:
6
- metadata.gz: fbb72f7c5446af3d674925b453bc92c978fc9db212a5ee36e905bc8775da81df6d91a477128f0cc0c0b0033f0a150ed58e017e5dd49b2af099502381d80bc57c
7
- data.tar.gz: 53b16030723f41849ec4271d55d5073b7dea6cb36b3e178b28dd24e8247abb5feb64f71385dce67b4b0d099d3fb7a3097f9d8cdbbc77722bd186509d1d2d65cd
6
+ metadata.gz: 8f6a73ebb75e6854044f29da60c3cb98c68efd6f7dae56b66efbbe66c55847fbfdf08016c6dfacd520e261cec4162c263c7c227802c64303085e8260211cc2bc
7
+ data.tar.gz: f80905eebdc8af2e5dcff399dc3ad5ff42de2c3c75fbaf7b20b5139d8cec527237bb0a14acc6b32d90b337ef57b4254c5a7ee8fedf011db0ee9fde709af55373
data/CHANGELOG.md CHANGED
@@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ## [0.1.0] - YYYY-MM-DD
10
+ ## [0.2.0] - 2022-06-18
11
11
 
12
12
  ### Added
13
13
  - New feature 1
data/README.md CHANGED
@@ -1,11 +1,9 @@
1
1
  # Rollday
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be
4
- able to package up your Ruby library into a gem. Put your Ruby code in the file
5
- `lib/rollday`. To experiment with that code, run
6
- `bin/console` for an interactive prompt.
3
+ Rollday is a a gem to integrate with Faraday requests. It adds a default middleware for your projecrts Faraday client to send a rollbar for configurable response status codes.
4
+
5
+ It can be configured once for th eentire project, or customized per Faraday request
7
6
 
8
- TODO: Delete this and the text above, and describe your gem
9
7
 
10
8
  ## Installation
11
9
 
@@ -15,17 +13,36 @@ Add this line to your application's Gemfile:
15
13
  gem 'rollday'
16
14
  ```
17
15
 
18
- And then execute:
16
+ ## Usage
17
+
18
+ ### Initialization
19
19
 
20
- $ bundle install
20
+ Intialization should happen in `app/initializers/rollday.rb`. All options below are the current defaults unless stated
21
+ ```ruby
22
+ Rollday.configure do |config|
23
+ config.use_default_middleware! # [Not default option] set middleware for all Faraday requests (Faraday.get(...))
21
24
 
22
- Or install it yourself as:
25
+ config.use_default_client_middleware! # [Not default option] set middleware for all Faraday clients.
23
26
 
24
- $ gem install rollday
27
+ config.status_code_regex = /[45]\d\d$/ # If status code matches, will attempt to send a rollbar
25
28
 
26
- ## Usage
29
+ config.use_person_scope = true # Assign a person scope to the rollbar scope
30
+
31
+ config.use_params_scope = true # Assign a params scope to the rollbar scope. Configured from Faraday params for request
27
32
 
28
- TODO: Write usage instructions here
33
+ config.params_scope_sanitizer = [] # Array of Procs to sanitize params. Can remove params or call Rollbar::Scrubbers.scrub_value(*) to assign value
34
+
35
+ config.use_query_scope = true # Assign the url queries to the scope
36
+
37
+ config.params_query_sanitizer = [] # Array of Procs to sanitize query params. Can remove params or call Rollbar::Scrubbers.scrub_value(*) to assign value
38
+
39
+ config.message = ->(status, phrase, body, path, domain) { "[#{status}]: #{domain} - #{path}" } # Message to set for the Rollbar item. Value can be a proc or a static message
40
+
41
+ config.use_message_exception = true # When set to true, Exception will be used to establish a backtrace
42
+
43
+ config.rollbar_level = ->(_status) { :warning } # Rollbar level can be configurable based on the status code
44
+ end
45
+ ```
29
46
 
30
47
  ## Development
31
48
 
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rollday
4
+ module FaradayConnectionOptions
5
+ def new_builder(block)
6
+ super.tap do |builder|
7
+ builder.use(Rollday::FARADAY_NAME)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rollday/use_middleware"
4
+ require "rollbar"
5
+
6
+ module Rollday
7
+ class Configuration
8
+ ROLLBAR_LEVELS = [
9
+ DEBUG = :debug,
10
+ INFO = :info,
11
+ WARNING = :warning,
12
+ ERROR = :error,
13
+ CRITICAL = :critical
14
+ ]
15
+
16
+ DEFAULT_STATUS_CODE_REGEX = /[45]\d\d$/
17
+ DEFAULT_MESSAGE_PROC = ->(status, phrase, domain) { "[#{status}]: #{domain}" }
18
+ DEFAULT_LEVEL_PROC = ->(_status) { WARNING }
19
+
20
+ attr_accessor :use_person_scope, :use_params_scope, :params_scope_sanitizer, :use_query_scope, :params_query_sanitizer, :use_message_exception
21
+
22
+ def initialize(options = {})
23
+ @status_code_regex = DEFAULT_STATUS_CODE_REGEX
24
+ @use_person_scope = true
25
+
26
+ @use_params_scope = true
27
+ @params_scope_sanitizer = []
28
+
29
+ @use_query_scope = true
30
+ @params_query_sanitizer = []
31
+
32
+ @message = DEFAULT_MESSAGE_PROC
33
+ @use_message_exception = true
34
+
35
+ @rollbar_level = DEFAULT_LEVEL_PROC
36
+ end
37
+
38
+ def rollbar_level=(level)
39
+ raise ConfigError, "level= must be passed a Proc or #{ROLLBAR_LEVELS}. But was passed a #{level} instead"
40
+
41
+ @rollbar_level = level
42
+ end
43
+
44
+ def rollbar_level
45
+ @rollbar_level
46
+ end
47
+
48
+ def message=(message)
49
+ raise ConfigError, "message= must be passed a Proc but was passed a #{message.class} instead"
50
+
51
+ @message = message
52
+ end
53
+
54
+ def message
55
+ @message
56
+ end
57
+
58
+ def status_code_regex
59
+ @status_code_regex
60
+ end
61
+
62
+ def status_code_regex=(regex)
63
+ raise ConfigError, "status_code_regex= must be passed a regex but was passed a #{regex.class} instead"
64
+
65
+ @status_code_regex = regex
66
+ end
67
+
68
+ def person_scope=(person_scope)
69
+ raise ConfigError, "person_scope= must be passed a Proc but was passed a #{person_scope.class} instead"
70
+
71
+ @person_scope = person_scope
72
+ end
73
+
74
+ def person_scope
75
+ return -> {} unless @use_person_scope
76
+
77
+ @person_scope || Rollbar.scope.scope_object.raw[:person] || -> {}
78
+ end
79
+
80
+ def use_default_middleware!
81
+ Rollday.use_default_middleware!
82
+ end
83
+
84
+ def use_default_client_middleware!
85
+ Rollday.use_default_client_middleware!
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "faraday"
4
+ require "rollday/rollbar_helper"
5
+
6
+ module Rollday
7
+ class Middleware < Faraday::Middleware
8
+ include RollbarHelper
9
+
10
+ def initialize(app, **)
11
+ super(app)
12
+
13
+ @app = app
14
+ end
15
+
16
+ def call(env)
17
+ result = @app.(env)
18
+ if ship_to_rollbar?(result.status)
19
+ send_rollbar(result)
20
+ end
21
+
22
+ result
23
+ end
24
+
25
+ private
26
+
27
+ def ship_to_rollbar?(status)
28
+ status.to_s =~ Rollday.config.status_code_regex
29
+ end
30
+
31
+ def send_rollbar(result)
32
+ scope = rollbar_scope(result)
33
+ message = rollbar_message(result)
34
+ level = rollbar_level(result)
35
+ ::Rollbar.log(level, message, **scope)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rollbar'
4
+
5
+ module Rollday
6
+ module RollbarHelper
7
+
8
+ def rollbar_level(result)
9
+ level = Rollday.config.rollbar_level
10
+ level.is_a?(Proc) ? level.(result.status) : level
11
+ end
12
+
13
+ def rollbar_message(result)
14
+ message = Rollday.config.message.(result.status, result.reason_phrase, result.body, URI(result.env.url).path, URI(result.env.url).host)
15
+ return message unless Rollday.config.use_message_exception
16
+
17
+ Rollday::Faraday.new(message)
18
+ end
19
+
20
+ def rollbar_scope(result)
21
+ {
22
+ framework: "Faraday: #{::Faraday::VERSION}; Rollday: #{Rollday::VERSION}",
23
+ host: URI(result.env.url).host,
24
+ method: result.env.method,
25
+ params: params_scope(result),
26
+ path: URI(result.env.url).path,
27
+ body: result.body,
28
+ person: person_scope,
29
+ query: query_scope(result),
30
+ status: result.status,
31
+ status_phrase: result.reason_phrase,
32
+ }
33
+ end
34
+
35
+ private
36
+
37
+ def query_scope(result)
38
+ return {} unless Rollday.config.use_query_scope
39
+
40
+ query_scope = CGI::parse(URI(result.env.url).query)
41
+ Rollday.config.params_scope_sanitizer.each do |sanitizer|
42
+ query_scope = sanitizer.(query_params)
43
+ end
44
+
45
+ query_scope
46
+ end
47
+
48
+ def params_scope(result)
49
+
50
+ end
51
+
52
+ def person_scope
53
+ Rollday.config.person_scope.()
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rollday
4
+ module UseMiddleware
5
+ # https://github.com/lostisland/faraday/blob/816d824bc18453e86027c9c5fcf8427020566e50/lib/faraday/rack_builder.rb#L83-L86
6
+ # https://github.com/lostisland/faraday/blob/816d824bc18453e86027c9c5fcf8427020566e50/lib/faraday/rack_builder.rb#L156-L169
7
+ # Once the default middleware is crated and the Faraday Rack app has been built,
8
+ # it can not be removed from the middleware Faraday stack
9
+ # If removal is needed, then use the middleware per request instead of defaulted
10
+ # or use the `with_scope` to modify the parameters of the rollday gem
11
+ def self.use_default_middleware!
12
+ register_middleware!
13
+
14
+ return false if @add_default_middleware
15
+
16
+ idx = ::Faraday.default_connection.builder.handlers.size - 1
17
+ ::Faraday.default_connection.builder.insert(idx, Middleware)
18
+ @add_default_middleware = true
19
+ end
20
+
21
+ # https://github.com/lostisland/faraday/issues/946#issuecomment-500607890
22
+ # Monkey patch to force this middleware into every single Faraday.new client
23
+ def self.use_default_client_middleware!
24
+ return false if @use_default_client_middleware
25
+
26
+ require "rollday/client_middleware"
27
+ ::Faraday::ConnectionOptions.prepend(Rollday::FaradayConnectionOptions)
28
+
29
+ @use_default_client_middleware = true
30
+ end
31
+
32
+ def self.register_middleware!
33
+ return false if @register_middleware
34
+
35
+ ::Faraday::Middleware.register_middleware(Rollday::FARADAY_NAME => Middleware)
36
+ @register_middleware = true
37
+ end
38
+ end
39
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rollday
4
- VERSION = "0.1.0"
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/rollday.rb CHANGED
@@ -1,8 +1,47 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rollday/version"
4
+ require "faraday"
5
+ require "rollday/configuration"
6
+ require "rollday/middleware"
4
7
 
5
8
  module Rollday
6
9
  class Error < StandardError; end
7
- # Your code goes here...
10
+ class Faraday < Error; end # used to create backtrace for rollbar
11
+ class ConfigError < Error; end
12
+
13
+ FARADAY_NAME = :rollday.freeze
14
+
15
+ def self.configure
16
+ yield configuration if block_given?
17
+ end
18
+
19
+ def self.configuration
20
+ @configuration ||= Rollday::Configuration.new
21
+ end
22
+
23
+ class << self
24
+ alias_method :config, :configuration
25
+ end
26
+
27
+ def self.configuration=(object)
28
+ raise ConfigError, "Expected configuration to be a Rollday::Configuration" unless object.is_a?(Rollday::Configuration)
29
+
30
+ @configuration = object
31
+ end
32
+
33
+ def self.use_middleware!
34
+
35
+ end
36
+
37
+ def self.use_default_middleware!
38
+ Rollday::UseMiddleware.use_default_middleware!
39
+ end
40
+
41
+ def self.use_default_client_middleware!
42
+ Rollday::UseMiddleware.use_default_client_middleware!
43
+ end
44
+
45
+ def self.with_scope()
46
+ end
8
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rollday
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Taylor
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-18 00:00:00.000000000 Z
11
+ date: 2022-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -117,6 +117,11 @@ files:
117
117
  - bin/setup
118
118
  - docker-compose.yml
119
119
  - lib/rollday.rb
120
+ - lib/rollday/client_middleware.rb
121
+ - lib/rollday/configuration.rb
122
+ - lib/rollday/middleware.rb
123
+ - lib/rollday/rollbar_helper.rb
124
+ - lib/rollday/use_middleware.rb
120
125
  - lib/rollday/version.rb
121
126
  - rollday.gemspec
122
127
  homepage: https://github.com/matt-taylor/rollday