sniffer 0.3.1 → 0.5.0

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: 1df847d342d16a8c26cf1e9711fab6baf465444524ea9eb1e404b2b762a228c8
4
- data.tar.gz: 28cbd39a08076ef975e9370d6d49d926a169b6cc1368fd35ee33de96611e1d58
3
+ metadata.gz: 25c004fd4e29948699cec6a077433d3b0d98f3571c361be81c4f15626f2143a3
4
+ data.tar.gz: f08cbb6c16a3d572a3536c2a08eff0978f87e4f4d35b489d4cbfdf3ea60c6af9
5
5
  SHA512:
6
- metadata.gz: ddb474fcfce55fb0875bd27df8a89a35be9ff1516fba2dc3778e2423823a85200cf27970f88efce3508bfcc8c57edc29d3b422755ce7c7d4eb9b22935d8eb3df
7
- data.tar.gz: b71fb9b1be1d0715a2b4b2fd856d119ca5e7372cc52c759328e17f4ab714ab68fefbe7b7da1a0183763496ed9ed9f9cfb30a1ad3d35547596bb94b5a305f3aab
6
+ metadata.gz: 9548307ea9f504e05ce9fa1f789a1e0d697906841f34a317f5c67c3e1c0ae669f69afab0537fe5e331550e10b531016227ff68321c1f4eadb4bc3f3d6d7a896b
7
+ data.tar.gz: 1cacd254ba99b6167c4d2221061ebbba0cb2565c281fe100df31190ac0e37035c14e008544d5f2f02b980a08609187841886d700354c6e76a95cd31afb84781e
@@ -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,37 @@
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-version: ['3.1', '3.0', '2.7', '2.6', '2.5']
16
+ steps:
17
+ - uses: actions/checkout@v2
18
+ - name: Set up Ruby ${{ matrix.ruby-version }}
19
+ uses: ruby/setup-ruby@v1
20
+ with:
21
+ ruby-version: ${{ matrix.ruby-version }}
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 rspec
35
+ - name: Run RSpec (prepended)
36
+ run: |
37
+ bundle exec rspec -r all_prepend
@@ -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
data/.rubocop.yml CHANGED
@@ -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.4
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
data/CHANGELOG.md CHANGED
@@ -1,9 +1,23 @@
1
- ## 0.3.0 (January 12, 2018) ##
1
+ ## 0.5.0 (May 6, 2022) ##
2
+
3
+ * Added prepend of all adapters by [@nate-at-gusto](https://github.com/nate-at-gusto)
4
+ * Replaced `active_attr` to `dry-initializer`
5
+ * Added rubies `2.7`, `3.0`, `3.1` support
6
+
7
+
8
+ ## 0.4.0 (March 19, 2020) ##
9
+
10
+ * Added middleware support by [@dsalahutdinov](https://github.com/dsalahutdinov)
11
+
12
+
13
+ ## 0.3.2 (January 12, 2018) ##
14
+
15
+ * Fix EventMachine::HttpClient not defined in Thin
2
16
 
3
17
  ## 0.2.0 (January 8, 2018) ##
4
18
 
5
19
  * Added Excon adapter
6
- * Added EventMachine adapter
20
+ * Added EventMachine adapter
7
21
  * Added `rotate` option
8
22
  * Added storage capacity feature
9
23
  * Added ruby 2.2 support
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)
@@ -35,6 +31,20 @@ Add this line to your application's Gemfile:
35
31
  gem 'sniffer'
36
32
  ```
37
33
 
34
+ If you wish Sniffer to use `Module#prepend` instead of `alias_method`, you can cause individual adapters to use `prepend` instead with:
35
+
36
+ ```ruby
37
+ gem 'sniffer', require: ['http_prepend', 'httpclient_prepend', 'sniffer']
38
+ ```
39
+
40
+ It's important that `'sniffer'` is the last item in the list. See the `lib` directory for a list of prependable adapters.
41
+
42
+ If you want all adapters to use `prepend`:
43
+
44
+ ```ruby
45
+ gem 'sniffer', require: ['all_prepend', 'sniffer']
46
+ ```
47
+
38
48
  And then execute:
39
49
 
40
50
  $ bundle
@@ -125,8 +135,8 @@ Sniffer default options:
125
135
 
126
136
  ```ruby
127
137
  Sniffer.config do |c|
128
- c.logger = Logger.new($stdout),
129
- c.severity = Logger::Severity::DEBUG,
138
+ c.logger = Logger.new($stdout)
139
+ c.severity = Logger::Severity::DEBUG
130
140
  # HTTP options to log
131
141
  c.log = {
132
142
  request_url: true,
@@ -137,8 +147,8 @@ Sniffer.config do |c|
137
147
  response_headers: true,
138
148
  response_body: true,
139
149
  timing: true
140
- },
141
- c.store = true, # save requests/responses to Sniffer.data
150
+ }
151
+ c.store = true # save requests/responses to Sniffer.data
142
152
  c.enabled = false # Sniffer disabled by default
143
153
  c.url_whitelist = nil
144
154
  c.url_blacklist = nil
@@ -177,12 +187,45 @@ Sniffer.data[0].to_h
177
187
  # => {{:request=>{:host=>"example.com", ...}}
178
188
  ```
179
189
 
190
+ ### Middleware
191
+
192
+ You can add the middleware to run custom code before/after the sniffed data was logged.
193
+
194
+ ```ruby
195
+ Sniffer.middleware do |chain|
196
+ chain.add MyHook
197
+ end
198
+
199
+ class MyHook
200
+ def request(data_item)
201
+ puts "Before work"
202
+ yield
203
+ puts "After work"
204
+ end
205
+
206
+ def response(data_item)
207
+ puts "Before work"
208
+ yield
209
+ puts "After work"
210
+ end
211
+ end
212
+ ```
213
+
180
214
  ## Development
181
215
 
182
216
  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.
183
217
 
184
218
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
185
219
 
220
+
221
+ ## Development (with Docker)
222
+
223
+ Get local development environment working and tests running is very easy with docker-compose:
224
+ ```sh
225
+ docker-compose run app bundle
226
+ docker-compose run app bundle exec rspec
227
+ ```
228
+
186
229
  ## Contributing
187
230
 
188
231
  Bug reports and pull requests are welcome on GitHub at https://github.com/aderyabin/sniffer. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
@@ -195,6 +238,7 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/aderya
195
238
  * [Stanislav Chereshkevich](https://github.com/dissident)
196
239
  * [Anatoliy Kurichev](https://github.com/russo-matrosso)
197
240
  * [Dmitriy Ivliev](https://github.com/moofkit)
241
+ * [Nate Berkopec](https://github.com/nate-at-gusto)
198
242
 
199
243
  ## License
200
244
 
@@ -0,0 +1,18 @@
1
+ version: '3.4'
2
+
3
+ services:
4
+ app:
5
+ image: ruby:latest
6
+ environment:
7
+ - BUNDLE_PATH=/bundle
8
+ - BUNDLE_CONFIG=/app/.bundle/config
9
+ command: bash
10
+ working_dir: /app
11
+ volumes:
12
+ - .:/app:cached
13
+ - bundler_data:/bundle
14
+ tmpfs:
15
+ - /tmp
16
+
17
+ volumes:
18
+ bundler_data:
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'curb_prepend'
4
+ require 'ethon_prepend'
5
+ require 'eventmachine_prepend'
6
+ require 'excon_prepend'
7
+ require 'http_prepend'
8
+ require 'httpclient_prepend'
9
+ require 'net_http_prepend'
10
+ require 'patron_prepend'
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sniffer
4
+ module Adapters
5
+ module CurlAdapter
6
+ PREPEND = true
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sniffer
4
+ module Adapters
5
+ module EthonAdapter
6
+ PREPEND = true
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sniffer
4
+ module Adapters
5
+ module EventMachineAdapter
6
+ PREPEND = true
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sniffer
4
+ module Adapters
5
+ module ExconAdapter
6
+ PREPEND = true
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sniffer
4
+ module Adapters
5
+ module HTTPAdapter
6
+ PREPEND = true
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sniffer
4
+ module Adapters
5
+ module HTTPClientAdapter
6
+ PREPEND = true
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sniffer
4
+ module Adapters
5
+ module NetHttpAdapter
6
+ PREPEND = true
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sniffer
4
+ module Adapters
5
+ module PatronAdapter
6
+ PREPEND = true
7
+ end
8
+ end
9
+ end
@@ -4,16 +4,6 @@ module Sniffer
4
4
  module Adapters
5
5
  # Curl adapter
6
6
  module CurlAdapter
7
- def self.included(base)
8
- base.class_eval do
9
- alias_method :http_without_sniffer, :http
10
- alias_method :http, :http_with_sniffer
11
-
12
- alias_method :http_post_without_sniffer, :http_post
13
- alias_method :http_post, :http_post_with_sniffer
14
- end
15
- end
16
-
17
7
  def http_with_sniffer(verb)
18
8
  sniffer_request(verb)
19
9
 
@@ -40,6 +30,37 @@ module Sniffer
40
30
  @res
41
31
  end
42
32
 
33
+ # Only used when prepending, see all_prepend.rb
34
+ module Prepend
35
+ include CurlAdapter
36
+
37
+ def http(verb)
38
+ sniffer_request(verb)
39
+
40
+ super(verb)
41
+
42
+ bm = Benchmark.realtime do
43
+ @res = super(verb)
44
+ end
45
+
46
+ sniffer_response(bm)
47
+
48
+ @res
49
+ end
50
+
51
+ def http_post(*args)
52
+ sniffer_request(:POST, *args)
53
+
54
+ bm = Benchmark.realtime do
55
+ @res = super(*args)
56
+ end
57
+
58
+ sniffer_response(bm)
59
+
60
+ @res
61
+ end
62
+ end
63
+
43
64
  private
44
65
 
45
66
  def data_item
@@ -76,10 +97,23 @@ module Sniffer
76
97
  body: body_str,
77
98
  timing: timing)
78
99
 
79
- data_item.log
100
+ Sniffer.notify_response(data_item)
80
101
  end
81
102
  end
82
103
  end
83
104
  end
84
105
 
85
- Curl::Easy.send(:include, Sniffer::Adapters::CurlAdapter) if defined?(::Curl::Easy)
106
+ if defined?(::Curl::Easy)
107
+ if defined?(Sniffer::Adapters::CurlAdapter::PREPEND)
108
+ Curl::Easy.prepend Sniffer::Adapters::CurlAdapter::Prepend
109
+ else
110
+ Curl::Easy.class_eval do
111
+ include Sniffer::Adapters::CurlAdapter
112
+ alias_method :http_without_sniffer, :http
113
+ alias_method :http, :http_with_sniffer
114
+
115
+ alias_method :http_post_without_sniffer, :http_post
116
+ alias_method :http_post, :http_post_with_sniffer
117
+ end
118
+ end
119
+ end