tcr 0.1.4 → 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/.travis.yml +5 -4
- data/README.md +21 -1
- data/lib/tcr/cassette.rb +4 -0
- data/lib/tcr/net/ldap.rb +19 -0
- data/lib/tcr/recordable_tcp_socket.rb +15 -6
- data/lib/tcr/version.rb +1 -1
- data/spec/fixtures/ldap.marshal +0 -0
- data/spec/tcr_spec.rb +41 -0
- data/tcr.gemspec +1 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d304ca968d1155919b181710a474dd9a98a4f269
|
4
|
+
data.tar.gz: 67e7387321ce706d2b7dc1651bcbdc825ae682d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 051e136095dcd34c387d7638124bd453b6ba7134ea06bf784e1501fb04fe2c7d1f1ed11bd64a3edae17dd9bcea54f241be985901bf958cf1652aa129df9bffae
|
7
|
+
data.tar.gz: e9ffe3fc3379731f11a78ed2fb017480a8372d1ff2563019df12f704e9780e61c8ef5392ebe0057cb91b05940c7b5d7d820f492a161fd351d12ad541b1f652ae
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
TCR is a *very* lightweight version of [VCR](https://github.com/vcr/vcr) for TCP sockets.
|
8
8
|
|
9
|
-
Currently used for recording 'net/smtp' interactions so only a few of the TCPSocket methods are recorded out.
|
9
|
+
Currently used for recording 'net/smtp', 'net/imap' and 'net/ldap' interactions so only a few of the TCPSocket methods are recorded out.
|
10
10
|
|
11
11
|
## Installation
|
12
12
|
|
@@ -87,6 +87,26 @@ TCR.configure do |c|
|
|
87
87
|
c.hit_all = true
|
88
88
|
end
|
89
89
|
```
|
90
|
+
|
91
|
+
The following storage formats are supported:
|
92
|
+
|
93
|
+
- JSON (default)
|
94
|
+
- YAML
|
95
|
+
- Marshal (recommended for binary data transfer like LDAP)
|
96
|
+
|
97
|
+
You can configure them via:
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
TCR.configure do |c|
|
101
|
+
c.format = 'json'
|
102
|
+
# or
|
103
|
+
c.format = 'yaml'
|
104
|
+
# or
|
105
|
+
c.format = 'marshal'
|
106
|
+
end
|
107
|
+
```
|
108
|
+
|
109
|
+
|
90
110
|
## Contributing
|
91
111
|
|
92
112
|
1. Fork it
|
data/lib/tcr/cassette.rb
CHANGED
@@ -49,6 +49,8 @@ module TCR
|
|
49
49
|
JSON.parse(content)
|
50
50
|
when "yaml"
|
51
51
|
YAML.load(content)
|
52
|
+
when "marshal"
|
53
|
+
Marshal.load(content)
|
52
54
|
else
|
53
55
|
raise RuntimeError.new "unrecognized format #{TCR.configuration.format}, please use `json` or `yaml`"
|
54
56
|
end
|
@@ -60,6 +62,8 @@ module TCR
|
|
60
62
|
JSON.pretty_generate(content)
|
61
63
|
when "yaml"
|
62
64
|
YAML.dump(content)
|
65
|
+
when "marshal"
|
66
|
+
Marshal.dump(content)
|
63
67
|
else
|
64
68
|
raise RuntimeError.new "unrecognized format #{TCR.configuration.format}, please use `json` or `yaml`"
|
65
69
|
end
|
data/lib/tcr/net/ldap.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# support LDAP(S) connections
|
2
|
+
if defined? ::Net::LDAP
|
3
|
+
|
4
|
+
module Net::LDAP::Connection::FixSSLSocketSyncClose
|
5
|
+
def close
|
6
|
+
super
|
7
|
+
# see: https://github.com/ruby-ldap/ruby-net-ldap/pull/314
|
8
|
+
return if io.closed?
|
9
|
+
io.close
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module TCR
|
14
|
+
class RecordableTCPSocket
|
15
|
+
include Net::LDAP::Connection::GetbyteForSSLSocket
|
16
|
+
include Net::BER::BERParser
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -17,7 +17,8 @@ module TCR
|
|
17
17
|
@live = true
|
18
18
|
@socket = TCPSocket.real_open(address, port)
|
19
19
|
else
|
20
|
-
@live
|
20
|
+
@live = false
|
21
|
+
@closed = false
|
21
22
|
end
|
22
23
|
@recording = cassette.next_session
|
23
24
|
end
|
@@ -26,6 +27,10 @@ module TCR
|
|
26
27
|
_read(:read, bytes)
|
27
28
|
end
|
28
29
|
|
30
|
+
def getc(*args)
|
31
|
+
_read(:getc, *args)
|
32
|
+
end
|
33
|
+
|
29
34
|
def gets(*args)
|
30
35
|
_read(:gets, *args)
|
31
36
|
end
|
@@ -53,13 +58,15 @@ module TCR
|
|
53
58
|
if live
|
54
59
|
@socket.closed?
|
55
60
|
else
|
56
|
-
|
61
|
+
@closed
|
57
62
|
end
|
58
63
|
end
|
59
64
|
|
60
65
|
def close
|
61
66
|
if live
|
62
67
|
@socket.close
|
68
|
+
else
|
69
|
+
@closed = true
|
63
70
|
end
|
64
71
|
end
|
65
72
|
|
@@ -86,8 +93,9 @@ module TCR
|
|
86
93
|
|
87
94
|
def _write(method, data)
|
88
95
|
if live
|
89
|
-
|
90
|
-
|
96
|
+
payload = data.dup if !data.is_a?(Symbol)
|
97
|
+
@socket.__send__(method, payload)
|
98
|
+
recording << ["write", data.dup]
|
91
99
|
else
|
92
100
|
direction, data = recording.shift
|
93
101
|
_ensure_direction("write", direction)
|
@@ -102,8 +110,9 @@ module TCR
|
|
102
110
|
end
|
103
111
|
|
104
112
|
if live
|
105
|
-
data
|
106
|
-
|
113
|
+
data = @socket.__send__(method, *args)
|
114
|
+
payload = data.dup if !data.is_a?(Symbol)
|
115
|
+
recording << ["read", payload]
|
107
116
|
else
|
108
117
|
_block_for_read_data if blocking && TCR.configuration.block_for_reads
|
109
118
|
raise EOFError if recording.empty?
|
data/lib/tcr/version.rb
CHANGED
Binary file
|
data/spec/tcr_spec.rb
CHANGED
@@ -4,6 +4,8 @@ require "net/protocol"
|
|
4
4
|
require "net/http"
|
5
5
|
require "net/imap"
|
6
6
|
require "net/smtp"
|
7
|
+
require "net/ldap"
|
8
|
+
require "tcr/net/ldap"
|
7
9
|
require 'thread'
|
8
10
|
require "mail"
|
9
11
|
|
@@ -16,9 +18,11 @@ describe TCR do
|
|
16
18
|
around(:each) do |example|
|
17
19
|
File.unlink("test.json") if File.exists?("test.json")
|
18
20
|
File.unlink("test.yaml") if File.exists?("test.yaml")
|
21
|
+
File.unlink("test.marshal") if File.exists?("test.marshal")
|
19
22
|
example.run
|
20
23
|
File.unlink("test.json") if File.exists?("test.json")
|
21
24
|
File.unlink("test.yaml") if File.exists?("test.yaml")
|
25
|
+
File.unlink("test.marshal") if File.exists?("test.marshal")
|
22
26
|
end
|
23
27
|
|
24
28
|
describe ".configuration" do
|
@@ -179,6 +183,16 @@ describe TCR do
|
|
179
183
|
}.to change{ File.exists?("./test.yaml") }.from(false).to(true)
|
180
184
|
end
|
181
185
|
|
186
|
+
it "creates a cassette file on use with marshal" do
|
187
|
+
TCR.configure { |c| c.format = "marshal" }
|
188
|
+
|
189
|
+
expect {
|
190
|
+
TCR.use_cassette("test") do
|
191
|
+
tcp_socket = TCPSocket.open("smtp.mandrillapp.com", 2525)
|
192
|
+
end
|
193
|
+
}.to change{ File.exists?("./test.marshal") }.from(false).to(true)
|
194
|
+
end
|
195
|
+
|
182
196
|
it "records the tcp session data into the file" do
|
183
197
|
TCR.use_cassette("test") do
|
184
198
|
tcp_socket = TCPSocket.open("smtp.mandrillapp.com", 2525)
|
@@ -376,4 +390,31 @@ describe TCR do
|
|
376
390
|
sock.print("hello\n".freeze)
|
377
391
|
end
|
378
392
|
end
|
393
|
+
|
394
|
+
it "supports Net::LDAP connections" do
|
395
|
+
TCR.configure { |c|
|
396
|
+
c.hook_tcp_ports = [389]
|
397
|
+
c.format = 'marshal'
|
398
|
+
c.cassette_library_dir = "."
|
399
|
+
}
|
400
|
+
expect {
|
401
|
+
TCR.use_cassette("spec/fixtures/ldap") do
|
402
|
+
ldap = Net::LDAP.new(
|
403
|
+
host: 'ldap.forumsys.com',
|
404
|
+
port: 389,
|
405
|
+
)
|
406
|
+
|
407
|
+
ldap.auth 'cn=read-only-admin,dc=example,dc=com', 'password'
|
408
|
+
|
409
|
+
ldap.search(
|
410
|
+
base: 'DC=example,DC=com',
|
411
|
+
filter: '(ou=mathematicians,dc=example,dc=com)',
|
412
|
+
scope: Net::LDAP::SearchScope_WholeSubtree,
|
413
|
+
return_result: false
|
414
|
+
) do |_entry|
|
415
|
+
break
|
416
|
+
end
|
417
|
+
end
|
418
|
+
}.not_to raise_error
|
419
|
+
end
|
379
420
|
end
|
data/tcr.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |gem|
|
|
19
19
|
|
20
20
|
gem.add_development_dependency "rspec"
|
21
21
|
gem.add_development_dependency "mail"
|
22
|
+
gem.add_development_dependency "net-ldap"
|
22
23
|
gem.add_development_dependency "mime-types", "~>2.0"
|
23
24
|
gem.add_development_dependency "geminabox"
|
24
25
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tcr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Forman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-08-
|
11
|
+
date: 2018-08-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: net-ldap
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: mime-types
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,12 +98,14 @@ files:
|
|
84
98
|
- lib/tcr/cassette.rb
|
85
99
|
- lib/tcr/configuration.rb
|
86
100
|
- lib/tcr/errors.rb
|
101
|
+
- lib/tcr/net/ldap.rb
|
87
102
|
- lib/tcr/recordable_tcp_socket.rb
|
88
103
|
- lib/tcr/version.rb
|
89
104
|
- spec/fixtures/block_for_reads.json
|
90
105
|
- spec/fixtures/email_with_image.eml
|
91
106
|
- spec/fixtures/google_https.json
|
92
107
|
- spec/fixtures/google_imap.json
|
108
|
+
- spec/fixtures/ldap.marshal
|
93
109
|
- spec/fixtures/mandrill_smtp.json
|
94
110
|
- spec/fixtures/multitest-extra-smtp.json
|
95
111
|
- spec/fixtures/multitest-smtp.json
|
@@ -127,6 +143,7 @@ test_files:
|
|
127
143
|
- spec/fixtures/email_with_image.eml
|
128
144
|
- spec/fixtures/google_https.json
|
129
145
|
- spec/fixtures/google_imap.json
|
146
|
+
- spec/fixtures/ldap.marshal
|
130
147
|
- spec/fixtures/mandrill_smtp.json
|
131
148
|
- spec/fixtures/multitest-extra-smtp.json
|
132
149
|
- spec/fixtures/multitest-smtp.json
|