avocado-docs 2.0.6 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +5 -13
  2. data/app/assets/images/avocado/filter-icon.png +0 -0
  3. data/app/assets/javascripts/avocado/angular-route.min.js +14 -0
  4. data/app/assets/javascripts/avocado/angular.min.js +235 -0
  5. data/app/assets/javascripts/avocado/app.js.coffee +4 -0
  6. data/app/assets/javascripts/avocado/application.js.coffee +30 -0
  7. data/app/assets/javascripts/avocado/controllers/avocado_ctrl.js.coffee +92 -0
  8. data/app/assets/javascripts/avocado/md5.js +19 -0
  9. data/app/assets/javascripts/avocado/services/endpoint.js.coffee +23 -0
  10. data/app/assets/javascripts/avocado/services/request.js.coffee +12 -0
  11. data/app/assets/javascripts/avocado/services/resource.js.coffee +5 -0
  12. data/app/assets/javascripts/avocado/services/response.js.coffee +9 -0
  13. data/app/assets/javascripts/avocado/ui-utils.min.js +7 -0
  14. data/app/assets/stylesheets/avocado/application.css.scss +110 -119
  15. data/app/controllers/avocado/avocado_controller.rb +4 -5
  16. data/app/views/layouts/avocado/avocado.html.erb +4 -3
  17. data/app/views/template.html.erb +43 -51
  18. data/lib/avocado-docs.rb +5 -16
  19. data/lib/avocado/config.rb +7 -4
  20. data/lib/avocado/controller.rb +9 -5
  21. data/lib/avocado/middleware/defaults.rb +2 -0
  22. data/lib/avocado/middleware/document_metadata.rb +4 -4
  23. data/lib/avocado/middleware/example_serialization.rb +2 -2
  24. data/lib/avocado/middleware/ignore_xhr_requests.rb +10 -0
  25. data/lib/avocado/middleware/request_serialization.rb +7 -6
  26. data/lib/avocado/middleware/resource_serialization.rb +6 -8
  27. data/lib/avocado/middleware/response_serialization.rb +3 -2
  28. data/lib/avocado/packages/package.rb +23 -0
  29. data/lib/avocado/packages/rspec_package.rb +15 -0
  30. data/lib/avocado/request_store.rb +22 -0
  31. data/lib/avocado/rspec.rb +11 -8
  32. data/lib/avocado/uploader.rb +28 -8
  33. data/lib/avocado/version.rb +1 -1
  34. metadata +32 -19
  35. data/app/assets/javascripts/avocado/application.js +0 -21
  36. data/app/helpers/avocado/application_helper.rb +0 -4
  37. data/lib/avocado/cache.rb +0 -20
@@ -2,7 +2,7 @@ module Avocado
2
2
  class Config
3
3
  class << self
4
4
 
5
- attr_accessor :url, :headers, :document_if, :yaml_path, :ignored_params
5
+ attr_accessor :url, :headers, :document_if, :json_path, :ignored_params
6
6
 
7
7
  def configure(&block)
8
8
  yield self
@@ -16,8 +16,8 @@ module Avocado
16
16
  @document_if || -> { true }
17
17
  end
18
18
 
19
- def yaml_path
20
- @yaml_path || Rails.application.root
19
+ def json_path
20
+ @json_path || Rails.application.root
21
21
  end
22
22
 
23
23
  def ignored_params
@@ -25,7 +25,10 @@ module Avocado
25
25
  end
26
26
 
27
27
  def reset!
28
- @headers = @document_if = @yaml_path = @ignored_params = nil
28
+ @headers = nil
29
+ @document_if = nil
30
+ @json_path = nil
31
+ @ignored_params = nil
29
32
  end
30
33
 
31
34
  end
@@ -6,17 +6,21 @@ module Avocado
6
6
  extend ActiveSupport::Concern
7
7
 
8
8
  included do
9
- after_action -> do
10
- Avocado::Cache.clean
11
- Avocado::Cache.store(request, response) if documentable?
12
- end
9
+ around_action :store_request_and_response_in_avocado
13
10
  end
14
11
 
15
12
  def documentable?
16
- response.body.blank? || !!JSON.parse(response.body)
13
+ (response.status == 204 && response.body.blank?) || !!JSON.parse(response.body)
17
14
  rescue
18
15
  false
19
16
  end
20
17
 
18
+ def store_request_and_response_in_avocado
19
+ yield
20
+ ensure
21
+ Avocado::RequestStore.instance.reset!
22
+ Avocado::RequestStore.instance.store(request, response) if documentable?
23
+ end
24
+
21
25
  end
22
26
  end
@@ -4,6 +4,7 @@ require 'avocado/middleware/request_serialization'
4
4
  require 'avocado/middleware/response_serialization'
5
5
  require 'avocado/middleware/resource_serialization'
6
6
  require 'avocado/middleware/example_serialization'
7
+ require 'avocado/middleware/ignore_xhr_requests'
7
8
 
8
9
  Avocado::Middleware.configure do |chain|
9
10
  chain << Avocado::Middleware::DocumentMetadata
@@ -12,4 +13,5 @@ Avocado::Middleware.configure do |chain|
12
13
  chain << Avocado::Middleware::ResponseSerialization
13
14
  chain << Avocado::Middleware::ResourceSerialization
14
15
  chain << Avocado::Middleware::ExampleSerialization
16
+ chain << Avocado::Middleware::IgnoreXhrRequests
15
17
  end
@@ -2,11 +2,11 @@ module Avocado
2
2
  class Middleware::DocumentMetadata
3
3
 
4
4
  # return false if the :document metadata is given and is explicitly false
5
- def call(example, *)
6
- if example.metadata[:document] == false
7
- yield false
8
- else
5
+ def call(package)
6
+ if package.document?
9
7
  yield
8
+ else
9
+ yield false
10
10
  end
11
11
  end
12
12
 
@@ -1,8 +1,8 @@
1
1
  module Avocado
2
2
  class Middleware::ExampleSerialization
3
3
 
4
- def call(example, *)
5
- Avocado::Cache.json[:description] = example.description
4
+ def call(package)
5
+ Avocado::RequestStore.instance.json[:description] = package.description
6
6
  yield
7
7
  end
8
8
 
@@ -0,0 +1,10 @@
1
+ module Avocado
2
+ class Middleware::IgnoreXhrRequests
3
+
4
+ # return false and bail if the request is AJAX
5
+ def call(package)
6
+ yield !package.request.xhr?
7
+ end
8
+
9
+ end
10
+ end
@@ -1,9 +1,9 @@
1
1
  module Avocado
2
2
  class Middleware::RequestSerialization
3
3
 
4
- def call(example, request, response)
5
- @request = request
6
- Avocado::Cache.json.merge! request: serialize(@request)
4
+ def call(package)
5
+ @request = package.request
6
+ Avocado::RequestStore.instance.json.merge! request: serialize(@request)
7
7
  yield
8
8
  end
9
9
 
@@ -34,10 +34,11 @@ module Avocado
34
34
 
35
35
  def deep_replace_file_uploads_with_text(hash)
36
36
  hash.each do |k, v|
37
- if Hash === v
37
+ case v
38
+ when Hash
38
39
  deep_replace_file_uploads_with_text(v)
39
- else
40
- hash[k] = '<Multipart File Upload>' if v.respond_to? :path
40
+ when Rack::Test::UploadedFile
41
+ hash[k] = '<Multipart File Upload>'
41
42
  end
42
43
  end
43
44
  end
@@ -1,21 +1,19 @@
1
1
  module Avocado
2
2
  class Middleware::ResourceSerialization
3
3
 
4
- def call(example, request, response)
5
- name = infer_name_from_route(request.path, request.method) || ""
6
- Avocado::Cache.json.merge! resource: { name: name }
4
+ def call(package)
5
+ request = package.request
6
+ name = infer_resource_name_from_request(request)
7
+ Avocado::RequestStore.instance.json.merge! resource: { name: name }
7
8
  yield
8
9
  end
9
10
 
10
11
  private
11
12
 
12
- def infer_name_from_route(path, method)
13
- controller = Rails.application.routes.recognize_path(path, method: method)[:controller]
13
+ def infer_resource_name_from_request(request)
14
+ controller = request.params[:controller]
14
15
  name = controller.partition('/').reject(&:blank?).last
15
16
  name.titleize.split('/').last
16
- rescue ActionController::RoutingError
17
- puts "Path #{path} not found in controller routes; Defaulting name to path."
18
- path
19
17
  end
20
18
 
21
19
  end
@@ -1,8 +1,9 @@
1
1
  module Avocado
2
2
  class Middleware::ResponseSerialization
3
3
 
4
- def call(example, request, response)
5
- Avocado::Cache.json.merge! response: serialize(response)
4
+ def call(package)
5
+ response = package.response
6
+ Avocado::RequestStore.instance.json.merge! response: serialize(response)
6
7
  yield
7
8
  end
8
9
 
@@ -0,0 +1,23 @@
1
+ module Avocado
2
+ module Packages
3
+ class Package
4
+
5
+ attr_accessor :example, :request, :response
6
+
7
+ def initialize(example, request, response)
8
+ @example = example
9
+ @request = request
10
+ @response = response
11
+ end
12
+
13
+ def description
14
+ raise 'Implement #description'
15
+ end
16
+
17
+ def document?
18
+ raise 'Implement #document?'
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ module Avocado
2
+ module Packages
3
+ class RSpecPackage < Package
4
+
5
+ def description
6
+ example.description
7
+ end
8
+
9
+ def document?
10
+ example.metadata[:document] != false
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ # Temporarily store a JSON request/response. Ultimately RSpec will determine
2
+ # if this request/response gets documented or not in an after(:each) block
3
+ module Avocado
4
+ class RequestStore
5
+ include Singleton
6
+
7
+ attr_accessor :request, :response, :json
8
+
9
+ def store(request, response)
10
+ @json = {}
11
+ @request = request
12
+ @response = response
13
+ end
14
+
15
+ def reset!
16
+ @json = nil
17
+ @request = nil
18
+ @response = nil
19
+ end
20
+
21
+ end
22
+ end
@@ -8,20 +8,23 @@ RSpec.configure do |config|
8
8
  # Invoke all middleware with the request/response stored from the after_action in the controller
9
9
  # The final action is to store the request JSON in the Avocado module until after(:suite) executes
10
10
  config.after(:each) do |ex|
11
- _example = defined?(example) ? example : ex
12
- request = Avocado::Cache.request
13
- response = Avocado::Cache.response
11
+ _ex = defined?(example) ? example : ex
12
+ request = Avocado::RequestStore.instance.request
13
+ response = Avocado::RequestStore.instance.response
14
14
 
15
15
  if request && response
16
- Avocado::Middleware.invoke(_example, request, response) do
17
- Avocado.payload << Avocado::Cache.json
16
+ package = Avocado::Packages::RSpecPackage.new(_ex, request, response)
17
+ Avocado::Middleware.invoke(package) do
18
+ Avocado::Uploader.instance.payload << Avocado::RequestStore.instance.json
18
19
  end
19
20
  end
20
21
 
21
- Avocado::Cache.clean
22
+ Avocado::RequestStore.instance.reset!
22
23
  end
23
24
 
24
- # Upload avocado.yml to the configured URL if one is given
25
- config.after(:suite) { Avocado.upload! }
25
+ # Upload avocado.json to the configured URL if one is given
26
+ config.after(:suite) do
27
+ Avocado::Uploader.instance.upload!
28
+ end
26
29
 
27
30
  end
@@ -1,22 +1,42 @@
1
1
  module Avocado
2
2
  class Uploader
3
+ include Singleton
3
4
 
4
- def upload(filename)
5
+ attr_accessor :payload
6
+
7
+ def initialize
8
+ @payload = []
9
+ end
10
+
11
+ def upload!
12
+ p payload
13
+ return unless should_upload?
5
14
  WebMock.allow_net_connect!
6
- uri = URI.parse Avocado::Config.url
7
- file = File.open(filename)
8
- req = Net::HTTP::Post::Multipart.new uri.path, 'file' => UploadIO.new(file, 'text/yaml', 'avocado.yml')
9
- Net::HTTP.start(uri.host, uri.port) { |http| http.request(req) }
15
+ write_payload_to_json_file do |file|
16
+ request = Net::HTTP::Post::Multipart.new uri.path, 'file' => UploadIO.new(file, 'text/json', 'avocado.json')
17
+ Net::HTTP.start(uri.host, uri.port) { |http| http.request(request) }
18
+ end
10
19
  ensure
11
20
  WebMock.disable_net_connect!
12
- file.close
13
- File.delete file.path
14
21
  end
15
22
 
16
23
  private
17
24
 
25
+ def write_payload_to_json_file(&block)
26
+ File.write 'avocado.json', JSON[payload]
27
+ file = File.open 'avocado.json'
28
+ yield(file)
29
+ ensure
30
+ file.close
31
+ # File.delete file.path
32
+ end
33
+
34
+ def should_upload?
35
+ payload.present? && Avocado::Config.url.presence
36
+ end
37
+
18
38
  def uri
19
- @uri ||= URI.parse Avocado::Config.url
39
+ @_uri ||= URI.parse Avocado::Config.url
20
40
  rescue URI::InvalidURIError
21
41
  raise "Avocado::Config.url is set but is not a valid URL!"
22
42
  end
@@ -1,3 +1,3 @@
1
1
  module Avocado
2
- VERSION = "2.0.6"
2
+ VERSION = "3.0.0"
3
3
  end
metadata CHANGED
@@ -1,97 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: avocado-docs
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.6
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Logan Serman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-09 00:00:00.000000000 Z
11
+ date: 2014-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 4.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 4.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: multipart-post
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: sqlite3
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.3'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.3'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec-rails
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '2.14'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '2.14'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: combustion
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ~>
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0.5'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0.5'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: webmock
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ~>
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: '1.15'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ~>
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '1.15'
97
97
  description: Avocado listens for JSON responses in the test environment and generates
@@ -104,12 +104,22 @@ extra_rdoc_files: []
104
104
  files:
105
105
  - MIT-LICENSE
106
106
  - Rakefile
107
- - app/assets/javascripts/avocado/application.js
107
+ - app/assets/images/avocado/filter-icon.png
108
+ - app/assets/javascripts/avocado/angular-route.min.js
109
+ - app/assets/javascripts/avocado/angular.min.js
110
+ - app/assets/javascripts/avocado/app.js.coffee
111
+ - app/assets/javascripts/avocado/application.js.coffee
112
+ - app/assets/javascripts/avocado/controllers/avocado_ctrl.js.coffee
113
+ - app/assets/javascripts/avocado/md5.js
114
+ - app/assets/javascripts/avocado/services/endpoint.js.coffee
115
+ - app/assets/javascripts/avocado/services/request.js.coffee
116
+ - app/assets/javascripts/avocado/services/resource.js.coffee
117
+ - app/assets/javascripts/avocado/services/response.js.coffee
118
+ - app/assets/javascripts/avocado/ui-utils.min.js
108
119
  - app/assets/stylesheets/avocado/application.css.scss
109
120
  - app/assets/stylesheets/avocado/bootstrap.css
110
121
  - app/controllers/avocado/avocado_controller.rb
111
122
  - app/controllers/avocado/specs_controller.rb
112
- - app/helpers/avocado/application_helper.rb
113
123
  - app/models/avocado/endpoint.rb
114
124
  - app/models/avocado/parser.rb
115
125
  - app/models/avocado/request.rb
@@ -118,7 +128,6 @@ files:
118
128
  - app/views/template.html.erb
119
129
  - config/routes.rb
120
130
  - lib/avocado-docs.rb
121
- - lib/avocado/cache.rb
122
131
  - lib/avocado/config.rb
123
132
  - lib/avocado/controller.rb
124
133
  - lib/avocado/engine.rb
@@ -127,9 +136,13 @@ files:
127
136
  - lib/avocado/middleware/document_if_configuration.rb
128
137
  - lib/avocado/middleware/document_metadata.rb
129
138
  - lib/avocado/middleware/example_serialization.rb
139
+ - lib/avocado/middleware/ignore_xhr_requests.rb
130
140
  - lib/avocado/middleware/request_serialization.rb
131
141
  - lib/avocado/middleware/resource_serialization.rb
132
142
  - lib/avocado/middleware/response_serialization.rb
143
+ - lib/avocado/packages/package.rb
144
+ - lib/avocado/packages/rspec_package.rb
145
+ - lib/avocado/request_store.rb
133
146
  - lib/avocado/rspec.rb
134
147
  - lib/avocado/uploader.rb
135
148
  - lib/avocado/version.rb
@@ -142,12 +155,12 @@ require_paths:
142
155
  - lib
143
156
  required_ruby_version: !ruby/object:Gem::Requirement
144
157
  requirements:
145
- - - ! '>='
158
+ - - ">="
146
159
  - !ruby/object:Gem::Version
147
160
  version: '0'
148
161
  required_rubygems_version: !ruby/object:Gem::Requirement
149
162
  requirements:
150
- - - ! '>='
163
+ - - ">="
151
164
  - !ruby/object:Gem::Version
152
165
  version: '0'
153
166
  requirements: []