sniffer 0.3.2 → 0.4.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: b00b58cacb868d2d9c5f555b62134af8792ee28063664c4bfd37d460f08fe23f
4
- data.tar.gz: e976369fb1cf6cabda9f0886ad69de71cb22c1fa5e8e437eb6e1eb6273e5b4d2
3
+ metadata.gz: 50fc6c81f9d42483702b1f7c58c784bb34098d4b687bb14463cdff1a115ca9b7
4
+ data.tar.gz: e075f394c7b28b95468039faf893f5cc3cb5a548111a065f69b81fbda715bfe2
5
5
  SHA512:
6
- metadata.gz: '09588af04a27d7ee008297e1132e6e627782bc305ec7b94e7cfd805657fa0b03d2eaacfd8493946e0efe381482e7e951b3112133dffdcc647a79e3b3fedcfdcf'
7
- data.tar.gz: 8e24f753d53093ff4d49c81de1918ddb313a7c7833b4dcf35c4b20175a68f6649ec939eb3b39bddeefb94f526f5e5ff9b342719e976a681671fb4270632930e2
6
+ metadata.gz: 71103bf582fe917cda1c4ad52c7e238c851c2aeb5459c5375b7157394cf0893e0cc2d2d1d100f3006d0a176accf083c6bf55d90d21d4f9f8b8ba395d50eefd60
7
+ data.tar.gz: d765279e5adb997fd1021a131587a96ae6057f8ee808af9debe657c1f67fdaecd537c23d62d8663729e79ae24f81e5f4f7f6bf54326870bf3a29e939bc04af05
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to help us improve
4
+ title: ''
5
+ labels: ''
6
+ assignees: aderyabin
7
+
8
+ ---
9
+
10
+ ## What did you do?
11
+
12
+ ## What did you expect to happen?
13
+
14
+ ## What actually happened?
15
+
16
+ ## Additional context
17
+
18
+ ## Environment
19
+
20
+ **Ruby Version:**
21
+
22
+ **Framework Version (Rails, whatever):**
23
+
24
+ **Sniffer Version:**
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea for this project
4
+ title: ''
5
+ labels: enhancement
6
+ assignees: aderyabin
7
+
8
+ ---
9
+
10
+ ## Is your feature request related to a problem? Please describe.
11
+
12
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
13
+
14
+ ## Describe the solution you'd like
15
+
16
+ A clear and concise description of what you want to happen.
17
+
18
+ ## Describe alternatives you've considered
19
+
20
+ A clear and concise description of any alternative solutions or features you've considered.
21
+
22
+ ## Additional context
23
+
24
+ Add any other context or screenshots about the feature request here.
@@ -0,0 +1,23 @@
1
+ <!--
2
+ First of all, thanks for contributing!
3
+
4
+ If it's a typo fix or minor documentation update feel free to skip the rest of this template!
5
+ -->
6
+
7
+ ## What is the purpose of this pull request?
8
+
9
+ <!--
10
+ If it's a bug fix, then link it to the issue, for example:
11
+
12
+ Fixes #xxx
13
+ -->
14
+
15
+ ## What changes did you make? (overview)
16
+
17
+ ## Is there anything you'd like reviewers to focus on?
18
+
19
+ ## Checklist
20
+
21
+ - [ ] I've added tests for this change
22
+ - [ ] I've added a Changelog entry
23
+ - [ ] I've updated a documentation
@@ -0,0 +1,34 @@
1
+ name: Run Tests
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+
9
+ jobs:
10
+ rspec:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ ruby: ["2.5.x", "2.6.x"]
16
+ steps:
17
+ - uses: actions/checkout@v1
18
+ - name: Set up Ruby
19
+ uses: actions/setup-ruby@v1
20
+ with:
21
+ ruby-version: ${{ matrix.ruby }}
22
+ - name: Install Bundler
23
+ run: |
24
+ gem install bundler
25
+ - name: Install deps
26
+ run: |
27
+ sudo apt-get update
28
+ sudo apt-get install -y --no-install-recommends libcurl4-openssl-dev
29
+ - name: Install Ruby deps
30
+ run: |
31
+ bundle install --jobs 4 --retry 3
32
+ - name: Run RSpec
33
+ run: |
34
+ bundle exec rake spec
@@ -0,0 +1,23 @@
1
+ name: Lint Ruby
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+
9
+ jobs:
10
+ rubocop:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v1
14
+ - name: Set up Ruby 2.6
15
+ uses: actions/setup-ruby@v1
16
+ with:
17
+ ruby-version: 2.6.x
18
+ - name: Install RuboCop
19
+ run: |
20
+ gem install rubocop
21
+ - name: Run RuboCop
22
+ run: |
23
+ rubocop -c .rubocop.yml
@@ -1,17 +1,17 @@
1
1
  AllCops:
2
+ TargetRubyVersion: 2.5
2
3
  # Include gemspec and Rakefile
3
4
  Include:
4
- - 'lib/**/*.rb'
5
- - 'lib/**/*.rake'
6
- - 'spec/**/*.rb'
5
+ - "lib/**/*.rb"
6
+ - "lib/**/*.rake"
7
+ - "spec/**/*.rb"
7
8
  Exclude:
8
- - 'bin/**/*'
9
- - 'Gemfile'
10
- - 'Rakefile'
11
- - '*.gemspec'
9
+ - "bin/**/*"
10
+ - "Gemfile"
11
+ - "Rakefile"
12
+ - "*.gemspec"
12
13
  DisplayCopNames: true
13
14
  StyleGuideCopsOnly: false
14
- TargetRubyVersion: 2.2
15
15
 
16
16
  Naming/AccessorMethodName:
17
17
  Enabled: false
@@ -24,14 +24,14 @@ Style/TrivialAccessors:
24
24
 
25
25
  Style/Documentation:
26
26
  Exclude:
27
- - 'spec/**/*.rb'
27
+ - "spec/**/*.rb"
28
28
 
29
29
  Style/StringLiterals:
30
30
  Enabled: false
31
31
 
32
32
  Style/BlockDelimiters:
33
33
  Exclude:
34
- - 'spec/**/*.rb'
34
+ - "spec/**/*.rb"
35
35
 
36
36
  Style/DoubleNegation:
37
37
  Enabled: false
@@ -47,22 +47,16 @@ Lint/AmbiguousBlockAssociation:
47
47
 
48
48
  Metrics/MethodLength:
49
49
  Exclude:
50
- - 'spec/**/*.rb'
50
+ - "spec/**/*.rb"
51
51
 
52
- Metrics/LineLength:
52
+ Layout/LineLength:
53
53
  Max: 120
54
54
  Exclude:
55
- - 'spec/**/*.rb'
55
+ - "spec/**/*.rb"
56
56
 
57
57
  Metrics/BlockLength:
58
58
  Exclude:
59
- - 'spec/**/*.rb'
60
-
61
- Rails/Date:
62
- Enabled: false
63
-
64
- Rails/TimeZone:
65
- Enabled: false
59
+ - "spec/**/*.rb"
66
60
 
67
61
  Security/YAMLLoad:
68
62
  Enabled: false
@@ -1,3 +1,8 @@
1
+ ## 0.4.0 (March 19, 2020) ##
2
+
3
+ * Added middleware support
4
+
5
+
1
6
  ## 0.3.2 (January 12, 2018) ##
2
7
 
3
8
  * Fix EventMachine::HttpClient not defined in Thin
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Sniffer
2
2
 
3
- [![Build Status](https://travis-ci.org/aderyabin/sniffer.svg?branch=master)](https://travis-ci.org/aderyabin/sniffer) [![Gem Version](https://badge.fury.io/rb/sniffer.svg)](https://rubygems.org/gems/sniffer) [![Join the chat at https://gitter.im/aderyabin/sniffer](https://badges.gitter.im/aderyabin/sniffer.svg)](https://gitter.im/aderyabin/sniffer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
3
+ [![Build](https://github.com/aderyabin/sniffer/workflows/Run%20Tests/badge.svg)](https://github.com/aderyabin/sniffer/actions) [![Gem Version](https://badge.fury.io/rb/sniffer.svg)](https://rubygems.org/gems/sniffer) [![Join the chat at https://gitter.im/aderyabin/sniffer](https://badges.gitter.im/aderyabin/sniffer.svg)](https://gitter.im/aderyabin/sniffer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4
4
 
5
5
  Sniffer aims to help:
6
6
 
@@ -19,10 +19,6 @@ Sniffer supports most common HTTP accessing libraries:
19
19
  * [EM-HTTP-Request](https://github.com/igrigorik/em-http-request)
20
20
  * [Excon](https://github.com/excon/excon)
21
21
 
22
-
23
- <a href="https://evilmartians.com/">
24
- <img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54"></a>
25
-
26
22
  ## Demo
27
23
 
28
24
  ![demo](https://github.com/aderyabin/sniffer/blob/master/assets/demo.gif?raw=true)
@@ -125,8 +121,8 @@ Sniffer default options:
125
121
 
126
122
  ```ruby
127
123
  Sniffer.config do |c|
128
- c.logger = Logger.new($stdout),
129
- c.severity = Logger::Severity::DEBUG,
124
+ c.logger = Logger.new($stdout)
125
+ c.severity = Logger::Severity::DEBUG
130
126
  # HTTP options to log
131
127
  c.log = {
132
128
  request_url: true,
@@ -137,8 +133,8 @@ Sniffer.config do |c|
137
133
  response_headers: true,
138
134
  response_body: true,
139
135
  timing: true
140
- },
141
- c.store = true, # save requests/responses to Sniffer.data
136
+ }
137
+ c.store = true # save requests/responses to Sniffer.data
142
138
  c.enabled = false # Sniffer disabled by default
143
139
  c.url_whitelist = nil
144
140
  c.url_blacklist = nil
@@ -177,6 +173,30 @@ Sniffer.data[0].to_h
177
173
  # => {{:request=>{:host=>"example.com", ...}}
178
174
  ```
179
175
 
176
+ ### Middleware
177
+
178
+ You can add the middleware to run custom code before/after the sniffed data was logged.
179
+
180
+ ```ruby
181
+ Sniffer.middleware do |chain|
182
+ chain.add MyHook
183
+ end
184
+
185
+ class MyHook
186
+ def request(data_item)
187
+ puts "Before work"
188
+ yield
189
+ puts "After work"
190
+ end
191
+
192
+ def response(data_item)
193
+ puts "Before work"
194
+ yield
195
+ puts "After work"
196
+ end
197
+ end
198
+ ```
199
+
180
200
  ## Development
181
201
 
182
202
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -48,11 +48,20 @@ module Sniffer
48
48
  end
49
49
 
50
50
  def store(data_item)
51
- data.store(data_item) if config.store
51
+ return unless config.store
52
+ return unless data_item.allowed_to_sniff?
53
+
54
+ config.middleware.invoke_request(data_item) do
55
+ data.store(data_item)
56
+ end
52
57
  end
53
58
 
54
- def logger
55
- config.logger
59
+ def notify_response(data_item)
60
+ return unless config.store
61
+ return unless data_item.allowed_to_sniff?
62
+
63
+ config.middleware.invoke_response(data_item) do
64
+ end
56
65
  end
57
66
  end
58
67
  end
@@ -76,10 +76,10 @@ module Sniffer
76
76
  body: body_str,
77
77
  timing: timing)
78
78
 
79
- data_item.log
79
+ Sniffer.notify_response(data_item)
80
80
  end
81
81
  end
82
82
  end
83
83
  end
84
84
 
85
- Curl::Easy.send(:include, Sniffer::Adapters::CurlAdapter) if defined?(::Curl::Easy)
85
+ Curl::Easy.include Sniffer::Adapters::CurlAdapter if defined?(::Curl::Easy)
@@ -66,7 +66,7 @@ module Sniffer
66
66
  headers: hash_headers,
67
67
  body: @response_body,
68
68
  timing: bm)
69
- @data_item.log
69
+ Sniffer.notify_response(@data_item)
70
70
 
71
71
  end
72
72
 
@@ -82,6 +82,6 @@ module Sniffer
82
82
  end
83
83
 
84
84
  if defined?(::Ethon::Easy)
85
- Ethon::Easy::Http.send(:include, Sniffer::Adapters::EthonAdapter::Http)
86
- Ethon::Easy::Operations.send(:include, Sniffer::Adapters::EthonAdapter::Operations)
85
+ Ethon::Easy::Http.include Sniffer::Adapters::EthonAdapter::Http
86
+ Ethon::Easy::Operations.include Sniffer::Adapters::EthonAdapter::Operations
87
87
  end
@@ -50,7 +50,7 @@ module Sniffer
50
50
  def on_body_data_with_sniffer(data)
51
51
  if Sniffer.enabled?
52
52
  @data_item.response.body = data
53
- @data_item.log
53
+ Sniffer.notify_response(@data_item)
54
54
  end
55
55
 
56
56
  on_body_data_without_sniffer(data)
@@ -36,7 +36,7 @@ module Sniffer
36
36
  body: @response.body,
37
37
  timing: bm)
38
38
 
39
- data_item.log
39
+ Sniffer.notify_response(data_item)
40
40
  end
41
41
 
42
42
  @response
@@ -46,4 +46,4 @@ module Sniffer
46
46
  end
47
47
  end
48
48
 
49
- ::Excon::Connection.send(:include, Sniffer::Adapters::ExconAdapter) if defined?(::Excon::Connection)
49
+ ::Excon::Connection.include Sniffer::Adapters::ExconAdapter if defined?(::Excon::Connection)
@@ -55,7 +55,7 @@ module Sniffer
55
55
  body: @res.body,
56
56
  timing: bm)
57
57
 
58
- data_item.log
58
+ Sniffer.notify_response(data_item)
59
59
  end
60
60
 
61
61
  return @res unless opts.follow
@@ -69,4 +69,4 @@ module Sniffer
69
69
  end
70
70
  end
71
71
 
72
- HTTP::Client.send(:include, Sniffer::Adapters::HTTPAdapter) if defined?(::HTTP::Client)
72
+ HTTP::Client.include Sniffer::Adapters::HTTPAdapter if defined?(::HTTP::Client)
@@ -30,11 +30,9 @@ module Sniffer
30
30
  retryable_response = nil
31
31
 
32
32
  bm = Benchmark.realtime do
33
- begin
34
- do_get_block_without_sniffer(req, proxy, conn, &block)
35
- rescue HTTPClient::RetryableResponse => e
36
- retryable_response = e
37
- end
33
+ do_get_block_without_sniffer(req, proxy, conn, &block)
34
+ rescue HTTPClient::RetryableResponse => e
35
+ retryable_response = e
38
36
  end
39
37
 
40
38
  if Sniffer.enabled?
@@ -46,7 +44,7 @@ module Sniffer
46
44
 
47
45
  conn.push(res)
48
46
 
49
- data_item.log
47
+ Sniffer.notify_response(data_item)
50
48
  end
51
49
 
52
50
  raise retryable_response unless retryable_response.nil?
@@ -56,4 +54,4 @@ module Sniffer
56
54
  end
57
55
  end
58
56
 
59
- HTTPClient.send(:include, Sniffer::Adapters::HTTPClientAdapter) if defined?(::HTTPClient)
57
+ HTTPClient.include Sniffer::Adapters::HTTPClientAdapter if defined?(::HTTPClient)
@@ -38,7 +38,7 @@ module Sniffer
38
38
  body: @response.body.to_s,
39
39
  timing: bm)
40
40
 
41
- data_item.log
41
+ Sniffer.notify_response(data_item)
42
42
  end
43
43
 
44
44
  @response
@@ -47,4 +47,4 @@ module Sniffer
47
47
  end
48
48
  end
49
49
  end
50
- Net::HTTP.send(:include, Sniffer::Adapters::NetHttpAdapter)
50
+ Net::HTTP.include Sniffer::Adapters::NetHttpAdapter
@@ -36,7 +36,7 @@ module Sniffer
36
36
  body: @res.body.to_s,
37
37
  timing: bm)
38
38
 
39
- data_item.log
39
+ Sniffer.notify_response(data_item)
40
40
  end
41
41
 
42
42
  @res
@@ -46,4 +46,4 @@ module Sniffer
46
46
  end
47
47
  end
48
48
 
49
- ::Patron::Session.send(:include, Sniffer::Adapters::PatronAdapter) if defined?(::Patron::Session)
49
+ ::Patron::Session.include Sniffer::Adapters::PatronAdapter if defined?(::Patron::Session)
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "anyway_config"
4
+ require_relative "middleware/chain"
5
+ require_relative "middleware/logger"
4
6
 
5
7
  module Sniffer
6
8
  # Sniffer configuration
@@ -24,6 +26,17 @@ module Sniffer
24
26
  url_whitelist: nil,
25
27
  url_blacklist: nil
26
28
 
29
+ def middleware
30
+ @middleware ||= begin
31
+ Middleware::Chain.new.tap do |chain|
32
+ chain.add(Sniffer::Middleware::Logger, logger, severity)
33
+ end
34
+ end
35
+
36
+ yield @middleware if block_given?
37
+ @middleware
38
+ end
39
+
27
40
  def capacity?
28
41
  store.is_a?(Hash) && store.key?(:capacity)
29
42
  end
@@ -34,6 +47,7 @@ module Sniffer
34
47
 
35
48
  def rotate?
36
49
  return false unless capacity?
50
+
37
51
  store.fetch(:rotate, true)
38
52
  end
39
53
  end
@@ -4,8 +4,6 @@ module Sniffer
4
4
  # Data class stores the data and controls capacity
5
5
  class Data < Array
6
6
  def store(data_item)
7
- return unless data_item.allowed_to_sniff?
8
-
9
7
  if config.rotate?
10
8
  rotate(data_item)
11
9
  else
@@ -12,27 +12,38 @@ module Sniffer
12
12
 
13
13
  def to_h
14
14
  {
15
- request: request && request.to_h,
16
- response: response && response.to_h
15
+ request: # frozen_string_literal: true
16
+ # Sniffer data item stores a request info
17
+ # Basic object for request and response objects
18
+ # Stores http request data
19
+ # rubocop:enable
20
+ # Stores http response data
21
+
22
+ request&.to_h,
23
+ response: # frozen_string_literal: true
24
+ # Sniffer data item stores a request info
25
+ # Basic object for request and response objects
26
+ # Stores http request data
27
+ # rubocop:enable
28
+ # Stores http response data
29
+
30
+ response&.to_h
17
31
  }
18
32
  end
19
33
 
20
- def log
21
- return unless Sniffer.logger && allowed_to_sniff?
22
- Sniffer.logger.log(Sniffer.config.severity, to_json)
23
- end
24
-
25
34
  def to_log
26
35
  return {} unless Sniffer.config.logger
36
+
27
37
  request.to_log.merge(response.to_log)
28
38
  end
29
39
 
30
- def to_json
40
+ def to_json(*_args)
31
41
  to_log.to_json
32
42
  end
33
43
 
34
44
  def allowed_to_sniff?
35
45
  return true unless request
46
+
36
47
  RequestPolicy.call(request)
37
48
  end
38
49
 
@@ -59,7 +70,14 @@ module Sniffer
59
70
  query: query,
60
71
  port: port,
61
72
  headers: headers,
62
- body: body && body.to_s,
73
+ body: # frozen_string_literal: true
74
+ # Sniffer data item stores a request info
75
+ # Basic object for request and response objects
76
+ # Stores http request data
77
+ # rubocop:enable
78
+ # Stores http response data
79
+
80
+ body&.to_s,
63
81
  method: method
64
82
  }
65
83
  end
@@ -94,7 +112,14 @@ module Sniffer
94
112
  {
95
113
  status: status,
96
114
  headers: headers,
97
- body: body && body.to_s,
115
+ body: # frozen_string_literal: true
116
+ # Sniffer data item stores a request info
117
+ # Basic object for request and response objects
118
+ # Stores http request data
119
+ # rubocop:enable
120
+ # Stores http response data
121
+
122
+ body&.to_s,
98
123
  timing: timing
99
124
  }
100
125
  end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "entry"
4
+
5
+ module Sniffer
6
+ # Middleware is code configured to run before/after
7
+ # storing sniffed request/response
8
+ # To add middleware
9
+ #
10
+ # Sniffer.middleware do |chain|
11
+ # chain.add MyHook
12
+ # end
13
+ #
14
+ # class MyHook
15
+ # def request(data_item)
16
+ # puts "Before request work"
17
+ # yield
18
+ # puts "After request work"
19
+ # end
20
+ #
21
+ # def response(data_item)
22
+ # puts "Before response work"
23
+ # yield
24
+ # puts "After response work"
25
+ # end
26
+ # end
27
+ module Middleware
28
+ # Stores all the middleware configs
29
+ class Chain
30
+ include Enumerable
31
+
32
+ def entries
33
+ @entries ||= []
34
+ end
35
+
36
+ def each(&block)
37
+ entries.each(&block)
38
+ end
39
+
40
+ def add(klass, *args)
41
+ entries.push(Entry.new(klass, *args))
42
+ end
43
+
44
+ def remove(klass)
45
+ entries.delete_if { |entry| entry.klass == klass }
46
+ end
47
+
48
+ def invoke_request(*args)
49
+ chain = map(&:make_new).dup
50
+ traverse_chain = lambda do
51
+ if chain.empty?
52
+ yield
53
+ else
54
+ chain.shift.request(*args, &traverse_chain)
55
+ end
56
+ end
57
+ traverse_chain.call
58
+ end
59
+
60
+ def invoke_response(*args)
61
+ chain = map(&:make_new).dup
62
+ traverse_chain = lambda do
63
+ if chain.empty?
64
+ yield
65
+ else
66
+ chain.shift.response(*args, &traverse_chain)
67
+ end
68
+ end
69
+ traverse_chain.call
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sniffer
4
+ module Middleware
5
+ # Middleware entry, represented with klass and arguments for initializer
6
+ class Entry
7
+ attr_reader :klass
8
+
9
+ def initialize(klass, *args)
10
+ @klass = klass
11
+ @args = args
12
+ end
13
+
14
+ def make_new
15
+ @klass.new(*@args)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sniffer
4
+ module Middleware
5
+ # Response logging build-in middleware
6
+ class Logger
7
+ attr_reader :logger, :severity
8
+
9
+ def initialize(logger, severity)
10
+ @logger = logger
11
+ @severity = severity
12
+ end
13
+
14
+ def request(_data_item)
15
+ yield
16
+ end
17
+
18
+ def response(data_item)
19
+ yield
20
+
21
+ return unless logger
22
+
23
+ logger.log(severity, data_item.to_json)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sniffer
4
- VERSION = "0.3.2".freeze
4
+ VERSION = "0.4.0"
5
5
  end
@@ -19,13 +19,13 @@ Gem::Specification.new do |spec|
19
19
  end
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_dependency "anyway_config", "~> 1.0"
22
+ spec.add_dependency "anyway_config", ">= 1.0"
23
23
  spec.add_dependency "active_attr", ">= 0.10.2"
24
24
 
25
- spec.add_development_dependency "bundler", "~> 1.15"
26
- spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "bundler", "~> 2"
26
+ spec.add_development_dependency "rake", ">= 12.3.3"
27
27
  spec.add_development_dependency "rspec", "~> 3.0"
28
- spec.add_development_dependency "rubocop", "~> 0.50"
28
+ spec.add_development_dependency "rubocop"
29
29
  spec.add_development_dependency "pry-byebug"
30
30
  spec.add_development_dependency "sinatra", "~> 2.0"
31
31
  spec.add_development_dependency "puma", ">= 3.10.0"
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sniffer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Deryabin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-03 00:00:00.000000000 Z
11
+ date: 2020-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: anyway_config
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
@@ -44,28 +44,28 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.15'
47
+ version: '2'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.15'
54
+ version: '2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '10.0'
61
+ version: 12.3.3
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '10.0'
68
+ version: 12.3.3
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -84,16 +84,16 @@ dependencies:
84
84
  name: rubocop
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '0.50'
89
+ version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: '0.50'
96
+ version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: pry-byebug
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -255,10 +255,14 @@ executables: []
255
255
  extensions: []
256
256
  extra_rdoc_files: []
257
257
  files:
258
+ - ".github/ISSUE_TEMPLATE/bug_report.md"
259
+ - ".github/ISSUE_TEMPLATE/feature_request.md"
260
+ - ".github/PULL_REQUEST_TEMPLATE.md"
261
+ - ".github/workflows/rspec.yml"
262
+ - ".github/workflows/rubocop.yml"
258
263
  - ".gitignore"
259
264
  - ".rspec"
260
265
  - ".rubocop.yml"
261
- - ".travis.yml"
262
266
  - CHANGELOG.md
263
267
  - CODE_OF_CONDUCT.md
264
268
  - Gemfile
@@ -280,6 +284,9 @@ files:
280
284
  - lib/sniffer/config.rb
281
285
  - lib/sniffer/data.rb
282
286
  - lib/sniffer/data_item.rb
287
+ - lib/sniffer/middleware/chain.rb
288
+ - lib/sniffer/middleware/entry.rb
289
+ - lib/sniffer/middleware/logger.rb
283
290
  - lib/sniffer/request_policy.rb
284
291
  - lib/sniffer/version.rb
285
292
  - sniffer.gemspec
@@ -302,8 +309,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
302
309
  - !ruby/object:Gem::Version
303
310
  version: '0'
304
311
  requirements: []
305
- rubyforge_project:
306
- rubygems_version: 2.7.7
312
+ rubygems_version: 3.0.1
307
313
  signing_key:
308
314
  specification_version: 4
309
315
  summary: Analyze HTTP Requests
@@ -1,6 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.2.2
5
- - 2.4.2
6
- - 2.5.0