api_docs 1.0.5 → 1.0.6
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.
- data/.gitignore +10 -0
- data/Gemfile +1 -6
- data/Rakefile +6 -27
- data/api_docs.gemspec +18 -102
- data/lib/api_docs.rb +1 -0
- data/lib/api_docs/test_helper.rb +53 -47
- data/lib/api_docs/version.rb +3 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -19
- data/test/dummy/config/routes.rb +2 -1
- data/test/test_helper_test.rb +19 -5
- metadata +10 -47
data/.gitignore
ADDED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,31 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
rescue LoadError
|
4
|
-
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
-
end
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake/testtask'
|
6
3
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
gem.homepage = 'http://github.com/twg/api_docs'
|
12
|
-
gem.license = 'MIT'
|
13
|
-
gem.summary = 'Generate API documentation using integration tests in Ruby on Rails 3'
|
14
|
-
gem.description = 'Generate API documentation using integration tests in Ruby on Rails 3'
|
15
|
-
gem.email = 'jack@twg.ca'
|
16
|
-
gem.authors = ['Oleg Khabarov', 'Jack Neto', 'The Working Group Inc.']
|
17
|
-
end
|
18
|
-
Jeweler::RubygemsDotOrgTasks.new
|
19
|
-
rescue LoadError
|
20
|
-
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
4
|
+
Rake::TestTask.new(:test) do |test|
|
5
|
+
test.libs << 'lib' << 'test'
|
6
|
+
test.pattern = 'test/**/*_test.rb'
|
7
|
+
test.verbose = true
|
21
8
|
end
|
22
9
|
|
23
|
-
|
24
|
-
require 'rake/testtask'
|
25
|
-
Rake::TestTask.new(:test) do |t|
|
26
|
-
t.libs << 'lib'
|
27
|
-
t.libs << 'test'
|
28
|
-
t.pattern = 'test/**/*_test.rb'
|
29
|
-
t.verbose = false
|
30
|
-
end
|
31
10
|
task :default => :test
|
data/api_docs.gemspec
CHANGED
@@ -1,104 +1,20 @@
|
|
1
|
-
#
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
-
# -*- encoding: utf-8 -*-
|
1
|
+
# encoding: utf-8
|
5
2
|
|
6
|
-
|
7
|
-
|
8
|
-
s.version = "1.0.5"
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Oleg Khabarov", "Jack Neto", "The Working Group Inc."]
|
12
|
-
s.date = "2013-02-28"
|
13
|
-
s.description = "Generate API documentation using integration tests in Ruby on Rails 3"
|
14
|
-
s.email = "jack@twg.ca"
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"LICENSE",
|
17
|
-
"README.md"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
"Gemfile",
|
21
|
-
"LICENSE",
|
22
|
-
"README.md",
|
23
|
-
"Rakefile",
|
24
|
-
"VERSION",
|
25
|
-
"api_docs.gemspec",
|
26
|
-
"app/assets/javascripts/api_docs.js",
|
27
|
-
"app/assets/stylesheets/api_docs.css",
|
28
|
-
"app/controllers/api_docs/docs_controller.rb",
|
29
|
-
"app/views/api_docs/docs/_action.html.erb",
|
30
|
-
"app/views/api_docs/docs/_request_params.html.erb",
|
31
|
-
"app/views/api_docs/docs/index.html.erb",
|
32
|
-
"config/routes.rb",
|
33
|
-
"doc/screenshot.png",
|
34
|
-
"lib/api_docs.rb",
|
35
|
-
"lib/api_docs/configuration.rb",
|
36
|
-
"lib/api_docs/engine.rb",
|
37
|
-
"lib/api_docs/test_helper.rb",
|
38
|
-
"lib/tasks/api_docs.rake",
|
39
|
-
"script/rails",
|
40
|
-
"test/api_docs_test.rb",
|
41
|
-
"test/docs_controller_test.rb",
|
42
|
-
"test/dummy/README.rdoc",
|
43
|
-
"test/dummy/Rakefile",
|
44
|
-
"test/dummy/app/assets/images/glyphicons-halflings-white.png",
|
45
|
-
"test/dummy/app/assets/images/glyphicons-halflings.png",
|
46
|
-
"test/dummy/app/assets/javascripts/application.js",
|
47
|
-
"test/dummy/app/assets/javascripts/bootstrap.min.js",
|
48
|
-
"test/dummy/app/assets/stylesheets/application.css",
|
49
|
-
"test/dummy/app/assets/stylesheets/bootstrap.min.css",
|
50
|
-
"test/dummy/app/controllers/application_controller.rb",
|
51
|
-
"test/dummy/app/helpers/application_helper.rb",
|
52
|
-
"test/dummy/app/mailers/.gitkeep",
|
53
|
-
"test/dummy/app/models/.gitkeep",
|
54
|
-
"test/dummy/app/views/layouts/application.html.erb",
|
55
|
-
"test/dummy/config.ru",
|
56
|
-
"test/dummy/config/application.rb",
|
57
|
-
"test/dummy/config/boot.rb",
|
58
|
-
"test/dummy/config/environment.rb",
|
59
|
-
"test/dummy/config/environments/development.rb",
|
60
|
-
"test/dummy/config/environments/production.rb",
|
61
|
-
"test/dummy/config/environments/test.rb",
|
62
|
-
"test/dummy/config/initializers/backtrace_silencers.rb",
|
63
|
-
"test/dummy/config/initializers/inflections.rb",
|
64
|
-
"test/dummy/config/initializers/mime_types.rb",
|
65
|
-
"test/dummy/config/initializers/secret_token.rb",
|
66
|
-
"test/dummy/config/initializers/session_store.rb",
|
67
|
-
"test/dummy/config/initializers/wrap_parameters.rb",
|
68
|
-
"test/dummy/config/locales/en.yml",
|
69
|
-
"test/dummy/config/routes.rb",
|
70
|
-
"test/dummy/lib/assets/.gitkeep",
|
71
|
-
"test/dummy/log/.gitkeep",
|
72
|
-
"test/dummy/public/404.html",
|
73
|
-
"test/dummy/public/422.html",
|
74
|
-
"test/dummy/public/500.html",
|
75
|
-
"test/dummy/public/favicon.ico",
|
76
|
-
"test/dummy/script/rails",
|
77
|
-
"test/test_helper.rb",
|
78
|
-
"test/test_helper_test.rb"
|
79
|
-
]
|
80
|
-
s.homepage = "http://github.com/twg/api_docs"
|
81
|
-
s.licenses = ["MIT"]
|
82
|
-
s.require_paths = ["lib"]
|
83
|
-
s.rubygems_version = "1.8.23"
|
84
|
-
s.summary = "Generate API documentation using integration tests in Ruby on Rails 3"
|
85
|
-
|
86
|
-
if s.respond_to? :specification_version then
|
87
|
-
s.specification_version = 3
|
88
|
-
|
89
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
90
|
-
s.add_runtime_dependency(%q<rails>, [">= 3.1.0"])
|
91
|
-
s.add_runtime_dependency(%q<jquery-rails>, [">= 0"])
|
92
|
-
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
93
|
-
else
|
94
|
-
s.add_dependency(%q<rails>, [">= 3.1.0"])
|
95
|
-
s.add_dependency(%q<jquery-rails>, [">= 0"])
|
96
|
-
s.add_dependency(%q<jeweler>, [">= 0"])
|
97
|
-
end
|
98
|
-
else
|
99
|
-
s.add_dependency(%q<rails>, [">= 3.1.0"])
|
100
|
-
s.add_dependency(%q<jquery-rails>, [">= 0"])
|
101
|
-
s.add_dependency(%q<jeweler>, [">= 0"])
|
102
|
-
end
|
103
|
-
end
|
3
|
+
$:.unshift File.expand_path('../lib', __FILE__)
|
4
|
+
require 'api_docs/version'
|
104
5
|
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "api_docs"
|
8
|
+
s.version = ApiDocs::VERSION
|
9
|
+
s.authors = ["Oleg Khabarov"]
|
10
|
+
s.email = ["oleg@khabarov.ca"]
|
11
|
+
s.homepage = "http://github.com/twg/api_docs"
|
12
|
+
s.summary = "Generate API documentation using integration tests in Ruby on Rails"
|
13
|
+
s.description = "Generate API documentation using integration tests in Ruby on Rails"
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.platform = Gem::Platform::RUBY
|
17
|
+
s.require_paths = ['lib']
|
18
|
+
|
19
|
+
s.add_dependency 'rails', '>=3.1.0'
|
20
|
+
end
|
data/lib/api_docs.rb
CHANGED
data/lib/api_docs/test_helper.rb
CHANGED
@@ -1,68 +1,74 @@
|
|
1
1
|
module ApiDocs::TestHelper
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
3
|
+
module InstanceMethods
|
4
|
+
# Method that allows test creation and will document results in a YAML file
|
5
|
+
# Example usage:
|
6
|
+
# api_call(:get, '/users/:id', :id => 12345) do |doc|
|
7
|
+
# doc.description = 'Something for the docs'
|
8
|
+
# ... regular test code
|
9
|
+
# end
|
10
|
+
def api_call(method, path, params = { })
|
11
|
+
parsed_params = params.dup
|
12
|
+
parsed_path = path.dup
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
parsed_params.each do |k, v|
|
15
|
+
parsed_params.delete(k) if parsed_path.gsub!(":#{k}", v.to_s)
|
16
|
+
end
|
17
|
+
|
18
|
+
if credentials = parsed_params.delete('HTTP_AUTHORIZATION')
|
19
|
+
auth = {'HTTP_AUTHORIZATION' => credentials}
|
20
|
+
end
|
16
21
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
22
|
+
# Making actual test request. Based on the example above:
|
23
|
+
# get '/users/12345'
|
24
|
+
doc = OpenStruct.new
|
25
|
+
send(method, parsed_path, parsed_params, auth)
|
21
26
|
|
22
|
-
|
27
|
+
yield doc if block_given?
|
23
28
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
29
|
+
# Assertions inside test block didn't fail. Preparing file
|
30
|
+
# content to be written
|
31
|
+
c = request.filtered_parameters['controller']
|
32
|
+
a = request.filtered_parameters['action']
|
28
33
|
|
29
|
-
|
30
|
-
|
34
|
+
file_path = File.expand_path("#{c.gsub('/', ':')}.yml", ApiDocs.config.docs_path)
|
35
|
+
params = ApiDocs::TestHelper.api_deep_clean_params(params)
|
31
36
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
37
|
+
# Marking response as an unique
|
38
|
+
key = 'ID-' + Digest::MD5.hexdigest("
|
39
|
+
#{method}#{path}#{doc.description}#{params}#{response.status}}
|
40
|
+
")
|
36
41
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
+
data = if File.exists?(file_path)
|
43
|
+
YAML.load_file(file_path) rescue Hash.new
|
44
|
+
else
|
45
|
+
Hash.new
|
46
|
+
end
|
42
47
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
48
|
+
data[a] ||= { }
|
49
|
+
data[a][key] = {
|
50
|
+
'description' => doc.description,
|
51
|
+
'method' => request.method,
|
52
|
+
'path' => path,
|
53
|
+
'params' => ApiDocs::TestHelper.api_deep_clean_params(params),
|
54
|
+
'status' => response.status,
|
55
|
+
'body' => response.body
|
56
|
+
}
|
57
|
+
FileUtils.mkdir_p(File.dirname(file_path))
|
58
|
+
File.open(file_path, 'w'){|f| f.write(data.to_yaml)}
|
59
|
+
end
|
54
60
|
end
|
55
61
|
|
56
62
|
# Cleans up params. Removes things like File object handlers
|
57
63
|
# Sets up ignored values so we don't generate new keys for same data
|
58
|
-
def api_deep_clean_params(params)
|
64
|
+
def self.api_deep_clean_params(params)
|
59
65
|
case params
|
60
66
|
when Hash
|
61
67
|
params.each_with_object({}) do |(key, value), res|
|
62
|
-
res[key.to_s] = api_deep_clean_params(value)
|
68
|
+
res[key.to_s] = ApiDocs::TestHelper.api_deep_clean_params(value)
|
63
69
|
end
|
64
70
|
when Array
|
65
|
-
params.collect{|value| api_deep_clean_params(value)}
|
71
|
+
params.collect{|value| ApiDocs::TestHelper.api_deep_clean_params(value)}
|
66
72
|
else
|
67
73
|
case params
|
68
74
|
when Rack::Test::UploadedFile
|
@@ -74,4 +80,4 @@ module ApiDocs::TestHelper
|
|
74
80
|
end
|
75
81
|
end
|
76
82
|
|
77
|
-
ActionDispatch::IntegrationTest.send :include, ApiDocs::TestHelper
|
83
|
+
ActionDispatch::IntegrationTest.send :include, ApiDocs::TestHelper::InstanceMethods
|
@@ -1,24 +1,6 @@
|
|
1
1
|
class ApplicationController < ActionController::Base
|
2
|
-
protect_from_forgery
|
3
2
|
|
4
|
-
|
5
|
-
respond_to do |format|
|
6
|
-
format.json {
|
7
|
-
render :text => [{
|
8
|
-
:id => 1,
|
9
|
-
:name => 'Test User',
|
10
|
-
:created_at => 1.day.ago
|
11
|
-
}].to_json
|
12
|
-
}
|
13
|
-
format.xml {
|
14
|
-
render :text => [{
|
15
|
-
:id => 1,
|
16
|
-
:name => 'Test User',
|
17
|
-
:created_at => 1.day.ago
|
18
|
-
}].to_xml(:root => 'users')
|
19
|
-
}
|
20
|
-
end
|
21
|
-
end
|
3
|
+
http_basic_authenticate_with :name => 'user', :password => 'secret', :only => :authenticate
|
22
4
|
|
23
5
|
def show
|
24
6
|
status = :ok
|
@@ -41,4 +23,8 @@ class ApplicationController < ActionController::Base
|
|
41
23
|
end
|
42
24
|
end
|
43
25
|
end
|
26
|
+
|
27
|
+
def authenticate
|
28
|
+
render :text => {:message => 'Authenticated'}.to_json
|
29
|
+
end
|
44
30
|
end
|
data/test/dummy/config/routes.rb
CHANGED
data/test/test_helper_test.rb
CHANGED
@@ -11,21 +11,21 @@ class TestHelperTest < ActionDispatch::IntegrationTest
|
|
11
11
|
|
12
12
|
def test_api_deep_clean_params
|
13
13
|
assert_equal ({'a' => 'b'}),
|
14
|
-
api_deep_clean_params({:a => 'b'})
|
14
|
+
ApiDocs::TestHelper.api_deep_clean_params({:a => 'b'})
|
15
15
|
|
16
16
|
assert_equal ({'a' => {'b' => 'c'}}),
|
17
|
-
api_deep_clean_params({:a => {:b => 'c'}})
|
17
|
+
ApiDocs::TestHelper.api_deep_clean_params({:a => {:b => 'c'}})
|
18
18
|
|
19
19
|
assert_equal ([{'a' => 'b'}, {'c' => 'd'}]),
|
20
|
-
api_deep_clean_params([{:a => 'b'}, {:c => 'd'}])
|
20
|
+
ApiDocs::TestHelper.api_deep_clean_params([{:a => 'b'}, {:c => 'd'}])
|
21
21
|
|
22
22
|
assert_equal ({'a'=>[{'b'=>'c'}]}),
|
23
|
-
api_deep_clean_params({:a => [{:b => 'c'}]})
|
23
|
+
ApiDocs::TestHelper.api_deep_clean_params({:a => [{:b => 'c'}]})
|
24
24
|
end
|
25
25
|
|
26
26
|
def test_api_deep_clean_params_with_file_handler
|
27
27
|
assert_equal ({'a' => 'BINARY'}),
|
28
|
-
api_deep_clean_params({:a => Rack::Test::UploadedFile.new(__FILE__)})
|
28
|
+
ApiDocs::TestHelper.api_deep_clean_params({:a => Rack::Test::UploadedFile.new(__FILE__)})
|
29
29
|
end
|
30
30
|
|
31
31
|
def test_api_call
|
@@ -110,4 +110,18 @@ eoxml
|
|
110
110
|
assert_equal 1, output['show'].keys.size
|
111
111
|
end
|
112
112
|
|
113
|
+
def test_api_call_with_httpauth
|
114
|
+
auth = ActionController::HttpAuthentication::Basic.encode_credentials('user', 'secret')
|
115
|
+
api_call(:get, '/authenticate', :random => 1, :format => 'json', 'HTTP_AUTHORIZATION' => auth) do
|
116
|
+
assert_response :success
|
117
|
+
assert_equal ({'message' => 'Authenticated'}), JSON.parse(response.body)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_api_call_with_httpauth_failure
|
122
|
+
api_call(:get, '/authenticate', :random => 1, :format => 'json') do
|
123
|
+
assert_response :unauthorized
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
113
127
|
end
|
metadata
CHANGED
@@ -1,17 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: api_docs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Oleg Khabarov
|
9
|
-
- Jack Neto
|
10
|
-
- The Working Group Inc.
|
11
9
|
autorequire:
|
12
10
|
bindir: bin
|
13
11
|
cert_chain: []
|
14
|
-
date: 2013-
|
12
|
+
date: 2013-05-23 00:00:00.000000000 Z
|
15
13
|
dependencies:
|
16
14
|
- !ruby/object:Gem::Dependency
|
17
15
|
name: rails
|
@@ -29,46 +27,14 @@ dependencies:
|
|
29
27
|
- - ! '>='
|
30
28
|
- !ruby/object:Gem::Version
|
31
29
|
version: 3.1.0
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
none: false
|
36
|
-
requirements:
|
37
|
-
- - ! '>='
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: '0'
|
40
|
-
type: :runtime
|
41
|
-
prerelease: false
|
42
|
-
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
none: false
|
44
|
-
requirements:
|
45
|
-
- - ! '>='
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: jeweler
|
50
|
-
requirement: !ruby/object:Gem::Requirement
|
51
|
-
none: false
|
52
|
-
requirements:
|
53
|
-
- - ! '>='
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: '0'
|
56
|
-
type: :development
|
57
|
-
prerelease: false
|
58
|
-
version_requirements: !ruby/object:Gem::Requirement
|
59
|
-
none: false
|
60
|
-
requirements:
|
61
|
-
- - ! '>='
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
version: '0'
|
64
|
-
description: Generate API documentation using integration tests in Ruby on Rails 3
|
65
|
-
email: jack@twg.ca
|
30
|
+
description: Generate API documentation using integration tests in Ruby on Rails
|
31
|
+
email:
|
32
|
+
- oleg@khabarov.ca
|
66
33
|
executables: []
|
67
34
|
extensions: []
|
68
|
-
extra_rdoc_files:
|
69
|
-
- LICENSE
|
70
|
-
- README.md
|
35
|
+
extra_rdoc_files: []
|
71
36
|
files:
|
37
|
+
- .gitignore
|
72
38
|
- Gemfile
|
73
39
|
- LICENSE
|
74
40
|
- README.md
|
@@ -87,6 +53,7 @@ files:
|
|
87
53
|
- lib/api_docs/configuration.rb
|
88
54
|
- lib/api_docs/engine.rb
|
89
55
|
- lib/api_docs/test_helper.rb
|
56
|
+
- lib/api_docs/version.rb
|
90
57
|
- lib/tasks/api_docs.rake
|
91
58
|
- script/rails
|
92
59
|
- test/api_docs_test.rb
|
@@ -129,8 +96,7 @@ files:
|
|
129
96
|
- test/test_helper.rb
|
130
97
|
- test/test_helper_test.rb
|
131
98
|
homepage: http://github.com/twg/api_docs
|
132
|
-
licenses:
|
133
|
-
- MIT
|
99
|
+
licenses: []
|
134
100
|
post_install_message:
|
135
101
|
rdoc_options: []
|
136
102
|
require_paths:
|
@@ -141,9 +107,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
141
107
|
- - ! '>='
|
142
108
|
- !ruby/object:Gem::Version
|
143
109
|
version: '0'
|
144
|
-
segments:
|
145
|
-
- 0
|
146
|
-
hash: -620307920657419595
|
147
110
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
111
|
none: false
|
149
112
|
requirements:
|
@@ -155,5 +118,5 @@ rubyforge_project:
|
|
155
118
|
rubygems_version: 1.8.23
|
156
119
|
signing_key:
|
157
120
|
specification_version: 3
|
158
|
-
summary: Generate API documentation using integration tests in Ruby on Rails
|
121
|
+
summary: Generate API documentation using integration tests in Ruby on Rails
|
159
122
|
test_files: []
|