watchdocs-rails 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +21 -42
- data/lib/watchdocs/rails/{store/file_store.rb → buffer/file_buffer.rb} +2 -2
- data/lib/watchdocs/rails/{store/memory_store.rb → buffer/memory_buffer.rb} +1 -1
- data/lib/watchdocs/rails/buffer.rb +9 -0
- data/lib/watchdocs/rails/configuration.rb +3 -3
- data/lib/watchdocs/rails/middleware.rb +7 -1
- data/lib/watchdocs/rails/recordings/exporter.rb +47 -0
- data/lib/watchdocs/rails/recordings/recorder.rb +57 -0
- data/lib/watchdocs/rails/recordings.rb +25 -21
- data/lib/watchdocs/rails/version.rb +1 -1
- data/lib/watchdocs/rails.rb +1 -2
- metadata +7 -6
- data/lib/watchdocs/rails/bridge.rb +0 -45
- data/lib/watchdocs/rails/store.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3219efab0c6110f67ca59f59d3707f894e79717
|
4
|
+
data.tar.gz: eacf3d9fe251bef0d9c0f5866dad515233cfa73b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 804a2ff175b8e28e96599dd8ac877f4b1723babd9b844e0b88d39433321aa102925b5977cdd3483d2964d28a95d4a0d4f8da30484d6a52a7d11f52bcf14d2f61
|
7
|
+
data.tar.gz: 1a0b2de9e71e4807820d7e45bfbd444c26f8fe8cff63d17e0ca4e4febb8c5e406add509b0da64302440eefb381b8fe970c899ab8f4eed5f469cc5fbfd181dab8
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -9,7 +9,7 @@ It captures every JSON response, stores request and response details in temporar
|
|
9
9
|
Add to your Gemfile. It is recommended to add to `:test, :development` group.
|
10
10
|
|
11
11
|
```ruby
|
12
|
-
gem 'watchdocs-rails'
|
12
|
+
gem 'watchdocs-rails'
|
13
13
|
```
|
14
14
|
|
15
15
|
and run
|
@@ -24,56 +24,36 @@ Create `config/initializers/watchdocs.rb` and configure the gem if you need to c
|
|
24
24
|
|
25
25
|
```ruby
|
26
26
|
Watchdocs::Rails.configure do |c|
|
27
|
-
c.
|
27
|
+
c.buffer_size = 50
|
28
28
|
c.temp_directory = 'tmp'
|
29
|
-
c.
|
29
|
+
c.export_url = 'http://demo8792890.mockable.io/requests'
|
30
30
|
end
|
31
31
|
```
|
32
32
|
|
33
|
-
###
|
33
|
+
### buffer_size
|
34
34
|
|
35
|
-
|
35
|
+
**Default:** 50
|
36
36
|
|
37
|
-
|
37
|
+
Buffer is a place where the gem stores recorderd requests. Buffer size is maximum number of requests that can be stored in a buffer. When limit is reached, buffer content is being exported and cleared. *In other words: Buffer is being exported and cleared every `buffer_size` reqests.*
|
38
38
|
|
39
|
-
|
40
|
-
- `Watchdocs::Rails::Store::JsonFileStore` - stores in temporary json file
|
41
|
-
|
42
|
-
or you can implement you own store for recordings. Just create module that implements the following methods:
|
43
|
-
|
44
|
-
```ruby
|
45
|
-
# Params
|
46
|
-
# content - is a Ruby Array of Hashes
|
47
|
-
def write(content)
|
48
|
-
...
|
49
|
-
end
|
50
|
-
|
51
|
-
# Returns Ruby Array of Hashes
|
52
|
-
def read
|
53
|
-
...
|
54
|
-
end
|
55
|
-
|
56
|
-
def delete!
|
57
|
-
...
|
58
|
-
end
|
59
|
-
|
60
|
-
# Returns true if store already initialized
|
61
|
-
def exists?
|
62
|
-
...
|
63
|
-
end
|
64
|
-
```
|
39
|
+
While executing specs buffer is a memory, otherwise it's a temporary file stored in `temp_directory`.
|
65
40
|
|
66
41
|
### temp_directory
|
67
42
|
|
68
|
-
**
|
43
|
+
**Default:** tmp
|
44
|
+
|
69
45
|
Directory to store temporary file with recordings.
|
70
46
|
|
71
|
-
###
|
47
|
+
### export_url
|
48
|
+
|
49
|
+
**Default:** http://demo8792890.mockable.io/requests
|
72
50
|
|
73
|
-
URL for
|
51
|
+
URL for exporting recorgings to your Watchdocs project.
|
74
52
|
|
75
53
|
## Usage
|
76
54
|
|
55
|
+
You can enable Watchdocs to record request while executing specs or making manual tests. You can of course do both at the same time if you want.
|
56
|
+
|
77
57
|
### Tests
|
78
58
|
|
79
59
|
If you have some requests specs or features specs that call JSON API then add this line to your `config/environments/test.rb`.
|
@@ -96,7 +76,7 @@ In `specs/rails_helper.rb`:
|
|
96
76
|
|
97
77
|
config.after(:suite) do
|
98
78
|
....
|
99
|
-
Watchdocs::Rails::Recordings.
|
79
|
+
Watchdocs::Rails::Recordings.export
|
100
80
|
end
|
101
81
|
```
|
102
82
|
|
@@ -105,21 +85,21 @@ In `specs/rails_helper.rb`:
|
|
105
85
|
|
106
86
|
```
|
107
87
|
Minitest.after_run do
|
108
|
-
Watchdocs::Rails::Recordings.
|
88
|
+
Watchdocs::Rails::Recordings.export
|
109
89
|
end
|
110
90
|
```
|
111
91
|
|
112
|
-
### Development
|
92
|
+
### Development (manual tests)
|
113
93
|
|
114
|
-
If you don't have any specs yet. You can add the following line to `config/environments/development.rb`.
|
94
|
+
If you don't have any request specs yet. You can add the following line to `config/environments/development.rb`.
|
115
95
|
|
116
96
|
```ruby
|
117
97
|
config.middleware.insert(0, Watchdocs::Rails::Middleware)
|
118
98
|
```
|
119
99
|
|
120
|
-
|
100
|
+
If your app doesn't make a lot of JSON requests please set `buffer_size` to lower number (f.e. 10, it's 50 by default). Watchdocs will be recording all requests in your development environment during manual tests.
|
121
101
|
|
122
|
-
|
102
|
+
You can of course enable the middleware in any other environment like dev or staging
|
123
103
|
|
124
104
|
|
125
105
|
## Versioning
|
@@ -141,7 +121,6 @@ as even minimal functionality is not guaranteed to be implemented yet.
|
|
141
121
|
|
142
122
|
- httparty
|
143
123
|
- configurations
|
144
|
-
- mini_memory_store
|
145
124
|
|
146
125
|
## Contributing
|
147
126
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Watchdocs
|
2
2
|
module Rails
|
3
3
|
module Store
|
4
|
-
module
|
4
|
+
module FileBuffer
|
5
5
|
class StorageError < StandardError; end
|
6
6
|
|
7
7
|
class << self
|
@@ -40,7 +40,7 @@ module Watchdocs
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def temp_local_path
|
43
|
-
|
43
|
+
Rails.configuration.temp_directory
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
@@ -3,14 +3,14 @@ require 'configurations'
|
|
3
3
|
module Watchdocs
|
4
4
|
module Rails
|
5
5
|
include Configurations
|
6
|
-
configurable :
|
6
|
+
configurable :buffer_size,
|
7
7
|
:temp_directory,
|
8
8
|
:sync_url
|
9
9
|
|
10
10
|
configuration_defaults do |c|
|
11
|
-
c.
|
11
|
+
c.buffer_size = 50
|
12
12
|
c.temp_directory = 'tmp'
|
13
|
-
c.
|
13
|
+
c.export_url = 'http://demo8792890.mockable.io/requests'
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -61,7 +61,13 @@ module Watchdocs
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def record_call
|
64
|
-
|
64
|
+
Rails::Recordings.record(
|
65
|
+
report, from_specs: from_specs?
|
66
|
+
)
|
67
|
+
end
|
68
|
+
|
69
|
+
def from_specs?
|
70
|
+
::Rails.env.test?
|
65
71
|
end
|
66
72
|
|
67
73
|
def request_headers(env)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
|
3
|
+
module Watchdocs
|
4
|
+
module Rails
|
5
|
+
module Recordings
|
6
|
+
module Exporter
|
7
|
+
class WatchdocsApiError < StandardError; end
|
8
|
+
|
9
|
+
DEFAULT_ERROR = 'Unknown API Error occured.'.freeze
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def export(payload)
|
13
|
+
response = HTTParty.post(
|
14
|
+
api_url,
|
15
|
+
body: payload.to_json,
|
16
|
+
headers: { 'Content-Type' => 'application/json' }
|
17
|
+
)
|
18
|
+
check_response(response)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def check_response(response)
|
24
|
+
case response.code.to_s.chars.first
|
25
|
+
when '2'
|
26
|
+
true
|
27
|
+
when '4', '5'
|
28
|
+
raise WatchdocsApiError, get_error(response.body)
|
29
|
+
else
|
30
|
+
raise WatchdocsApiError, DEFAULT_ERROR
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_error(response_body)
|
35
|
+
JSON.parse(response_body)['errors'].join(', ')
|
36
|
+
rescue
|
37
|
+
DEFAULT_ERROR
|
38
|
+
end
|
39
|
+
|
40
|
+
def api_url
|
41
|
+
Watchdocs::Rails.configuration.export_url
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Watchdocs
|
2
|
+
module Rails
|
3
|
+
module Recordings
|
4
|
+
class Recorder
|
5
|
+
attr_reader :store, :output
|
6
|
+
|
7
|
+
def initialize(from_specs: true)
|
8
|
+
set_store(from_specs)
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(new_call)
|
12
|
+
record_new
|
13
|
+
save_recordings
|
14
|
+
send_recordings if buffer_full?
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def record_new
|
20
|
+
@output = if current_recordings
|
21
|
+
current_recordings << new_call
|
22
|
+
else
|
23
|
+
[new_call]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def current_recordings
|
28
|
+
@current ||= store.read
|
29
|
+
end
|
30
|
+
|
31
|
+
def save_recordings
|
32
|
+
store.write(output)
|
33
|
+
end
|
34
|
+
|
35
|
+
def send_recordings
|
36
|
+
Recordings.send(output)
|
37
|
+
end
|
38
|
+
|
39
|
+
def set_store(from_specs)
|
40
|
+
@store = if from_specs
|
41
|
+
Rails::Buffer::MemoryBuffer
|
42
|
+
else
|
43
|
+
Rails::Buffer::FileBuffer
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def buffer_full?
|
48
|
+
current_recordings.count > buffer_size
|
49
|
+
end
|
50
|
+
|
51
|
+
def buffer_size
|
52
|
+
Rails.configuration.buffer_size
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -1,45 +1,49 @@
|
|
1
|
+
require 'watchdocs/rails/recordings/recorder'
|
2
|
+
require 'watchdocs/rails/recordings/exporter'
|
3
|
+
|
1
4
|
module Watchdocs
|
2
5
|
module Rails
|
3
6
|
module Recordings
|
7
|
+
attr_reader :store
|
8
|
+
|
4
9
|
class << self
|
5
|
-
def
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
[new_call]
|
10
|
-
end
|
11
|
-
save_recordings(output)
|
10
|
+
def record(new_call, from_specs)
|
11
|
+
Recorder.new(
|
12
|
+
from_specs: from_specs
|
13
|
+
).call(new_call)
|
12
14
|
end
|
13
15
|
|
14
|
-
def clear!
|
16
|
+
def clear!(from_specs: true)
|
17
|
+
set_store(from_specs)
|
15
18
|
clear_recordings
|
16
19
|
end
|
17
20
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
+
def export(recordings = nil, from_specs: true)
|
22
|
+
recordings ||= current_recordings
|
23
|
+
set_store(from_specs)
|
24
|
+
send_recordings(recordings) && clear!(from_specs)
|
21
25
|
end
|
22
26
|
|
23
27
|
private
|
24
28
|
|
25
|
-
def recordings_exists?
|
26
|
-
store.exists?
|
27
|
-
end
|
28
|
-
|
29
29
|
def current_recordings
|
30
30
|
store.read
|
31
31
|
end
|
32
32
|
|
33
|
-
def save_recordings(content)
|
34
|
-
store.write(content)
|
35
|
-
end
|
36
|
-
|
37
33
|
def clear_recordings
|
38
34
|
store.delete!
|
39
35
|
end
|
40
36
|
|
41
|
-
def
|
42
|
-
|
37
|
+
def export_recorings(recordings)
|
38
|
+
Exporter.export(recordings)
|
39
|
+
end
|
40
|
+
|
41
|
+
def set_store(from_specs)
|
42
|
+
@store = if from_specs
|
43
|
+
Rails::Buffer::MemoryBuffer
|
44
|
+
else
|
45
|
+
Rails::Buffer::FileBuffer
|
46
|
+
end
|
43
47
|
end
|
44
48
|
end
|
45
49
|
end
|
data/lib/watchdocs/rails.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'watchdocs/rails/core_extensions'
|
2
|
-
require 'watchdocs/rails/
|
2
|
+
require 'watchdocs/rails/buffer'
|
3
3
|
require 'watchdocs/rails/configuration'
|
4
4
|
require 'watchdocs/rails/middleware'
|
5
|
-
require 'watchdocs/rails/bridge'
|
6
5
|
require 'watchdocs/rails/recordings'
|
7
6
|
|
8
7
|
module Watchdocs
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: watchdocs-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mazikwyry
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -109,7 +109,9 @@ files:
|
|
109
109
|
- lib/watchdocs-rails.rb
|
110
110
|
- lib/watchdocs/.DS_Store
|
111
111
|
- lib/watchdocs/rails.rb
|
112
|
-
- lib/watchdocs/rails/
|
112
|
+
- lib/watchdocs/rails/buffer.rb
|
113
|
+
- lib/watchdocs/rails/buffer/file_buffer.rb
|
114
|
+
- lib/watchdocs/rails/buffer/memory_buffer.rb
|
113
115
|
- lib/watchdocs/rails/configuration.rb
|
114
116
|
- lib/watchdocs/rails/core_extensions.rb
|
115
117
|
- lib/watchdocs/rails/core_extensions/enumerable.rb
|
@@ -117,9 +119,8 @@ files:
|
|
117
119
|
- lib/watchdocs/rails/core_extensions/object.rb
|
118
120
|
- lib/watchdocs/rails/middleware.rb
|
119
121
|
- lib/watchdocs/rails/recordings.rb
|
120
|
-
- lib/watchdocs/rails/
|
121
|
-
- lib/watchdocs/rails/
|
122
|
-
- lib/watchdocs/rails/store/memory_store.rb
|
122
|
+
- lib/watchdocs/rails/recordings/exporter.rb
|
123
|
+
- lib/watchdocs/rails/recordings/recorder.rb
|
123
124
|
- lib/watchdocs/rails/version.rb
|
124
125
|
- watchdocs-rails-0.1.0.gem
|
125
126
|
- watchdocs-rails-0.1.1.gem
|
@@ -1,45 +0,0 @@
|
|
1
|
-
require 'httparty'
|
2
|
-
|
3
|
-
module Watchdocs
|
4
|
-
module Rails
|
5
|
-
module Bridge
|
6
|
-
class WatchdocsApiError < StandardError; end
|
7
|
-
|
8
|
-
DEFAULT_ERROR = 'Unknown API Error occured.'.freeze
|
9
|
-
|
10
|
-
class << self
|
11
|
-
def send(payload)
|
12
|
-
response = HTTParty.post(
|
13
|
-
api_url,
|
14
|
-
body: payload.to_json,
|
15
|
-
headers: { 'Content-Type' => 'application/json' }
|
16
|
-
)
|
17
|
-
check_response(response)
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def check_response(response)
|
23
|
-
case response.code.to_s.chars.first
|
24
|
-
when '2'
|
25
|
-
true
|
26
|
-
when '4', '5'
|
27
|
-
raise WatchdocsApiError, get_error(response.body)
|
28
|
-
else
|
29
|
-
raise WatchdocsApiError, DEFAULT_ERROR
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def get_error(response_body)
|
34
|
-
JSON.parse(response_body)['errors'].join(', ')
|
35
|
-
rescue
|
36
|
-
DEFAULT_ERROR
|
37
|
-
end
|
38
|
-
|
39
|
-
def api_url
|
40
|
-
Watchdocs::Rails.configuration.sync_url
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Watchdocs
|
2
|
-
module Rails
|
3
|
-
module Store
|
4
|
-
# You can implement you own store for recordings
|
5
|
-
# Just create module that implements following methods
|
6
|
-
|
7
|
-
## Params
|
8
|
-
## content - is a Ruby Array of Hashes
|
9
|
-
# def write(content)
|
10
|
-
# ...
|
11
|
-
# end
|
12
|
-
|
13
|
-
## Returns Ruby Array of Hashes
|
14
|
-
# def read
|
15
|
-
# ...
|
16
|
-
# end
|
17
|
-
|
18
|
-
# def delete!
|
19
|
-
# ...
|
20
|
-
# end
|
21
|
-
|
22
|
-
## Returns true if store already initialized
|
23
|
-
# def exists?
|
24
|
-
# ...
|
25
|
-
# end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
require 'watchdocs/rails/store/file_store'
|
31
|
-
require 'watchdocs/rails/store/memory_store'
|