sea_shanty 0.1.1 → 0.2.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 +4 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +17 -17
- data/README.md +3 -0
- data/lib/sea_shanty/configuration.rb +9 -0
- data/lib/sea_shanty/request_store.rb +26 -23
- data/lib/sea_shanty/util/logger.rb +25 -0
- data/lib/sea_shanty/version.rb +1 -1
- data/lib/sea_shanty.rb +6 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 513c49610891e98faecb14e58daf7a675f865facece11474daa7142bf359beaf
|
4
|
+
data.tar.gz: b2e9f9018c06a2c33aaa72bf8be87487118f1782d01406c28ce60ff6b087ddce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83d95071d3a20a5c574dcc2a6d0df123fd90bedd7216099e9c71451b3c984ba2b660c539092ab3912213d75c2a9f27db273a50c39e303863245736f18b09fc7c
|
7
|
+
data.tar.gz: e091a14764d18ada33fb273139db862a7cf715ad081c2233be05991af6b991207f48e1f8d76de441714da0601f19f157c4e670bb2b50cc1272881ed4a4cafbc9
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,48 +1,48 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
sea_shanty (0.
|
4
|
+
sea_shanty (0.2.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
9
|
ast (2.4.2)
|
10
|
-
faraday (2.7.
|
10
|
+
faraday (2.7.4)
|
11
11
|
faraday-net_http (>= 2.0, < 3.1)
|
12
12
|
ruby2_keywords (>= 0.0.4)
|
13
13
|
faraday-net_http (3.0.2)
|
14
14
|
json (2.6.3)
|
15
|
-
language_server-protocol (3.17.0.
|
16
|
-
minitest (5.
|
15
|
+
language_server-protocol (3.17.0.3)
|
16
|
+
minitest (5.18.0)
|
17
17
|
parallel (1.22.1)
|
18
|
-
parser (3.1.
|
18
|
+
parser (3.2.1.0)
|
19
19
|
ast (~> 2.4.1)
|
20
20
|
rainbow (3.1.1)
|
21
21
|
rake (13.0.6)
|
22
|
-
regexp_parser (2.
|
22
|
+
regexp_parser (2.7.0)
|
23
23
|
rexml (3.2.5)
|
24
|
-
rubocop (1.
|
24
|
+
rubocop (1.44.1)
|
25
25
|
json (~> 2.3)
|
26
26
|
parallel (~> 1.10)
|
27
|
-
parser (>= 3.
|
27
|
+
parser (>= 3.2.0.0)
|
28
28
|
rainbow (>= 2.2.2, < 4.0)
|
29
29
|
regexp_parser (>= 1.8, < 3.0)
|
30
30
|
rexml (>= 3.2.5, < 4.0)
|
31
|
-
rubocop-ast (>= 1.
|
31
|
+
rubocop-ast (>= 1.24.1, < 2.0)
|
32
32
|
ruby-progressbar (~> 1.7)
|
33
|
-
unicode-display_width (>=
|
34
|
-
rubocop-ast (1.
|
35
|
-
parser (>= 3.
|
36
|
-
rubocop-performance (1.15.
|
33
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
34
|
+
rubocop-ast (1.26.0)
|
35
|
+
parser (>= 3.2.1.0)
|
36
|
+
rubocop-performance (1.15.2)
|
37
37
|
rubocop (>= 1.7.0, < 2.0)
|
38
38
|
rubocop-ast (>= 0.4.0)
|
39
39
|
ruby-progressbar (1.11.0)
|
40
40
|
ruby2_keywords (0.0.5)
|
41
|
-
standard (1.
|
41
|
+
standard (1.24.3)
|
42
42
|
language_server-protocol (~> 3.17.0.2)
|
43
|
-
rubocop (= 1.
|
44
|
-
rubocop-performance (= 1.15.
|
45
|
-
unicode-display_width (2.
|
43
|
+
rubocop (= 1.44.1)
|
44
|
+
rubocop-performance (= 1.15.2)
|
45
|
+
unicode-display_width (2.4.2)
|
46
46
|
|
47
47
|
PLATFORMS
|
48
48
|
x86_64-darwin-21
|
data/README.md
CHANGED
@@ -87,6 +87,9 @@ Any HTTP requests made before the call to `SeaShanty.intercept` will not be hand
|
|
87
87
|
* A callable object with an arity of 2
|
88
88
|
* Is called once with each header name and value
|
89
89
|
* Must return the filtered value
|
90
|
+
* `log`
|
91
|
+
* Is the destination, where SeaShanty should log to
|
92
|
+
* Must be either an object that responds to `write` or a path to a file to write log entries to
|
90
93
|
|
91
94
|
### Creating your own interceptor
|
92
95
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "sea_shanty/errors"
|
4
|
+
require "sea_shanty/util/logger"
|
4
5
|
|
5
6
|
module SeaShanty
|
6
7
|
class Configuration
|
@@ -8,6 +9,14 @@ module SeaShanty
|
|
8
9
|
alias_method :bypass?, :bypass
|
9
10
|
alias_method :readonly?, :readonly
|
10
11
|
|
12
|
+
def log=(destination)
|
13
|
+
@logger = Logger.new(destination)
|
14
|
+
end
|
15
|
+
|
16
|
+
def logger
|
17
|
+
@logger ||= Logger::NullLogger.new
|
18
|
+
end
|
19
|
+
|
11
20
|
def generic_responses=(responses)
|
12
21
|
unless Hash === responses
|
13
22
|
raise(
|
@@ -18,50 +18,49 @@ module SeaShanty
|
|
18
18
|
if configuration.bypass?
|
19
19
|
raise ConfigurationError, "Bypass and readonly are both true - please set only one of them." if configuration.readonly?
|
20
20
|
yield
|
21
|
-
elsif configuration.readonly?
|
22
|
-
load_response(request)
|
23
|
-
elsif has_response_for?(request)
|
24
|
-
load_response(request)
|
25
21
|
else
|
26
|
-
|
27
|
-
|
28
|
-
|
22
|
+
path = request_file_path(request)
|
23
|
+
if configuration.readonly? || path.exist?
|
24
|
+
load_response(path, request)
|
25
|
+
else
|
26
|
+
response = yield
|
27
|
+
store(path, request, response) unless configuration.bypass?
|
28
|
+
response
|
29
|
+
end
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
32
|
-
def
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
def load_response(request)
|
37
|
-
raise UnknownRequest, "SeaShanty: Unknown request #{request.method.to_s.upcase} to #{request.url}" unless has_response_for?(request)
|
38
|
-
contents = YAML.safe_load(request_file_path(request).read, permitted_classes: [Symbol, Time, DateTime])
|
33
|
+
def load_response(path, request)
|
34
|
+
raise UnknownRequest, "SeaShanty: Unknown request #{request.method.to_s.upcase} to #{request.url}" unless path.exist?
|
35
|
+
log("Loading response for #{request.url} from #{path}")
|
36
|
+
contents = YAML.safe_load(Pathname(path).read, permitted_classes: [Symbol, Time, DateTime])
|
39
37
|
Response.from_h(contents.fetch(:response))
|
40
38
|
end
|
41
39
|
|
42
|
-
def store(request, response)
|
43
|
-
|
44
|
-
|
45
|
-
|
40
|
+
def store(path, request, response)
|
41
|
+
log("Storing response for #{request.url} in #{path}")
|
42
|
+
path.dirname.mkpath
|
43
|
+
path.open("w+") do |file|
|
46
44
|
file.write(YAML.dump(serialize(request, response)))
|
47
45
|
end
|
48
46
|
end
|
49
47
|
|
50
|
-
private
|
51
|
-
|
52
|
-
attr_reader :configuration, :generic_responses, :storage_dir, :request_serializer
|
53
|
-
|
54
48
|
def request_file_path(request)
|
55
49
|
_, generic_file_path = generic_responses.find { |matcher, path| matcher.match?(request.url.to_s) }
|
56
50
|
file_path = if generic_file_path.nil?
|
57
|
-
request_serializer.file_path(request)
|
51
|
+
request_serializer.file_path(request).tap { |path| log("Generated #{path} for request to #{request.url}") }
|
58
52
|
else
|
53
|
+
log("Found a generic response in #{generic_file_path} for request to #{request.url}")
|
59
54
|
Pathname.new(generic_file_path.to_s)
|
60
55
|
end
|
61
56
|
|
62
57
|
storage_dir.join(file_path)
|
63
58
|
end
|
64
59
|
|
60
|
+
private
|
61
|
+
|
62
|
+
attr_reader :configuration, :generic_responses, :storage_dir, :request_serializer
|
63
|
+
|
65
64
|
def serialize(request, response)
|
66
65
|
{
|
67
66
|
request: request_serializer.serialize(request),
|
@@ -69,5 +68,9 @@ module SeaShanty
|
|
69
68
|
stored_at: DateTime.now.to_s
|
70
69
|
}
|
71
70
|
end
|
71
|
+
|
72
|
+
def log(message)
|
73
|
+
configuration.logger.log(message)
|
74
|
+
end
|
72
75
|
end
|
73
76
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SeaShanty
|
4
|
+
class Logger
|
5
|
+
attr_reader :destination
|
6
|
+
|
7
|
+
def initialize(destination)
|
8
|
+
@destination = if destination.respond_to? :printf
|
9
|
+
destination
|
10
|
+
else
|
11
|
+
File.open(destination.to_s, "a+")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def log(message)
|
16
|
+
destination.write(message)
|
17
|
+
destination.write("\n") unless message.end_with?("\n")
|
18
|
+
end
|
19
|
+
|
20
|
+
class NullLogger
|
21
|
+
def log(*)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/sea_shanty/version.rb
CHANGED
data/lib/sea_shanty.rb
CHANGED
@@ -56,7 +56,12 @@ module SeaShanty
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def request_store
|
59
|
-
|
59
|
+
RequestStore.new(configuration)
|
60
|
+
end
|
61
|
+
|
62
|
+
def reset!
|
63
|
+
@configuration = Configuration.new
|
64
|
+
configure {}
|
60
65
|
end
|
61
66
|
|
62
67
|
def configuration_overwrite(env_var, value)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sea_shanty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rasmus Bang Grouleff
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: SeaShanty is a minimalistic library for recording HTTP requests and responses
|
14
14
|
and replaying responses for already seen requests in an unobtrusive and test framework
|
@@ -40,6 +40,7 @@ files:
|
|
40
40
|
- lib/sea_shanty/request_serializer.rb
|
41
41
|
- lib/sea_shanty/request_store.rb
|
42
42
|
- lib/sea_shanty/response.rb
|
43
|
+
- lib/sea_shanty/util/logger.rb
|
43
44
|
- lib/sea_shanty/version.rb
|
44
45
|
- sea_shanty.gemspec
|
45
46
|
- sig/sea_shanty.rbs
|