watchdocs-rails 0.2.0 → 0.3.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/.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'
|