doc_yo_self 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1dca5880b129ed713c81bfecb1ea14cc0b9626d7
4
+ data.tar.gz: f4f71b07c337878360beaae7bd95704646e39356
5
+ SHA512:
6
+ metadata.gz: 0a0163819d7f45e25692402dab3a108487ad1978eae2c8e4b9b8184b9b46e9c2d403af65c07d2394d6baa57d65a93f5f00f43ec885efa1fbf33c540534e3c68d
7
+ data.tar.gz: d8abe36cc4aec720b51bf12a1136ab9785dab713780c00b45324c7196d79851a09ceee84548b53263b2a8dd2766d996476bcb3f02d9bf84515abb3168ba76f1a
@@ -0,0 +1 @@
1
+ /coverage/
@@ -0,0 +1,66 @@
1
+ # Doc Yo Self
2
+
3
+ An auto documentation for Rails. Pop it into your test suite and watch it amaze.
4
+
5
+ Time for this project was provided by my employer, [SmashingBoxes](http://smashingboxes.com/). What a great place to work.
6
+
7
+ # Limitations
8
+
9
+ * **Current focus is MiniTest**. Probably will work with Rspec too, but that's not our focus right now.
10
+ * **Probably not thread safe**. Thread safety isn't a focus for this project right now. Pull requests welcome :-).
11
+
12
+
13
+ ## Setup
14
+
15
+ ```ruby
16
+ DocYoSelf.config do |c|
17
+ c.template_file = 'test/template.md.erb'
18
+ c.output = 'api_docs.md'
19
+ end
20
+ ```
21
+
22
+ To run doc generation after every controller spec, put this into your `teardown` method. Or whatever method your test framework of choice will run after *every test*.
23
+
24
+ ```ruby
25
+ def teardown
26
+ DocYoSelf.run!
27
+ end
28
+ ```
29
+
30
+ Then put this at the bottom of your `test_helper.rb`:
31
+
32
+ ```ruby
33
+ DocYoSelf.finish!
34
+ ```
35
+
36
+ Or put it individually into only certain tests...
37
+
38
+ ```ruby
39
+ def test_some_api
40
+ get :index, :users
41
+ assert response.status == 200
42
+ DocYoSelf.run!
43
+ end
44
+ ```
45
+
46
+ ## Usage
47
+
48
+ It will log all requests and responses by default, but you can add some **optional** parameters as well.
49
+
50
+ ### Skipping documentation
51
+
52
+ ```ruby
53
+ def test_stuff
54
+ DocYoSelf.skip
55
+ # Blahhh
56
+ end
57
+ ```
58
+
59
+ ## Adding notes
60
+
61
+ ```ruby
62
+ def test_stuff
63
+ DocYoSelf.note "안녕하세요. This is a note."
64
+ # Blahhh
65
+ end
66
+ ```
@@ -0,0 +1,8 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ end
6
+
7
+ desc "Run tests"
8
+ task :default => :test
File without changes
@@ -0,0 +1,15 @@
1
+ $:.push File.expand_path('../lib', __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.authors = ['Rick Carlino']
5
+ s.description = "An automatic API documentation generator."
6
+ s.email = 'rick.carlino@gmail.com'
7
+ s.files = `git ls-files`.split("\n")
8
+ s.homepage = 'https://github.com/rickcarlino/doc_yo_self'
9
+ s.license = 'MIT'
10
+ s.name = 'doc_yo_self'
11
+ s.require_paths = ['lib']
12
+ s.summary = "Uses your test cases to write example documentation for your API."
13
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ s.version = '0.0.1'
15
+ end
@@ -0,0 +1,80 @@
1
+ You can use ERB to format each test case.
2
+ GET
3
+ api/aaa
4
+ {:id=>12}
5
+ {"id": 12, "name": "rick"}
6
+ You can use ERB to format each test case.
7
+ GET
8
+ api/users
9
+ {:id=>12}
10
+ {"id": 12, "name": "rick"}
11
+ You can use ERB to format each test case.
12
+ GET
13
+ api/users
14
+ {:id=>12}
15
+ {"id": 12, "name": "rick"}
16
+ You can use ERB to format each test case.
17
+ GET
18
+ api/zzz
19
+ {:id=>12}
20
+ {"id": 12, "name": "rick"}
21
+ You can use ERB to format each test case.
22
+ GET
23
+ api/aaa
24
+ {:id=>12}
25
+ {"id": 12, "name": "rick"}
26
+ You can use ERB to format each test case.
27
+ GET
28
+ api/users
29
+ {:id=>12}
30
+ {"id": 12, "name": "rick"}
31
+ You can use ERB to format each test case.
32
+ GET
33
+ api/users
34
+ {:id=>12}
35
+ {"id": 12, "name": "rick"}
36
+ You can use ERB to format each test case.
37
+ GET
38
+ api/zzz
39
+ {:id=>12}
40
+ {"id": 12, "name": "rick"}
41
+ You can use ERB to format each test case.
42
+ GET
43
+ api/aaa
44
+ {:id=>12}
45
+ {"id": 12, "name": "rick"}
46
+ You can use ERB to format each test case.
47
+ GET
48
+ api/zzz
49
+ {:id=>12}
50
+ {"id": 12, "name": "rick"}
51
+ You can use ERB to format each test case.
52
+ GET
53
+ api/users
54
+ {:id=>12}
55
+ {"id": 12, "name": "rick"}
56
+ You can use ERB to format each test case.
57
+ GET
58
+ api/users
59
+ {:id=>12}
60
+ {"id": 12, "name": "rick"}
61
+ You can use ERB to format each test case.
62
+ GET
63
+ api/aaa
64
+ {:id=>12}
65
+ {"id": 12, "name": "rick"}
66
+ You can use ERB to format each test case.
67
+ GET
68
+ api/zzz
69
+ {:id=>12}
70
+ {"id": 12, "name": "rick"}
71
+ You can use ERB to format each test case.
72
+ GET
73
+ api/aaa
74
+ {:id=>12}
75
+ {"id": 12, "name": "rick"}
76
+ You can use ERB to format each test case.
77
+ GET
78
+ api/zzz
79
+ {:id=>12}
80
+ {"id": 12, "name": "rick"}
@@ -0,0 +1,83 @@
1
+ class DocYoSelf
2
+ attr_accessor :tests
3
+ def initialize
4
+ @tests = []
5
+ @skip = 0 # <= Hate this.
6
+ end
7
+
8
+ def sort_by_url!
9
+ @tests.sort! do |x, y|
10
+ x.request.path <=> y.request.path
11
+ end
12
+ end
13
+
14
+ def clean_up!
15
+ @tests = []
16
+ end
17
+
18
+ def note(msg)
19
+ @note = msg || ''
20
+ end
21
+
22
+ def run!(request, response)
23
+ @skip += 1
24
+ return if @skip == 2 # Gross.
25
+ add_test_case(request, response, @note)
26
+ @note = ''
27
+ @skip = 0
28
+ self
29
+ end
30
+
31
+ def add_test_case(request, response, note)
32
+ test = self.class::TestCase.new(request, response, note)
33
+ test.template = self.class::Conf.template
34
+ self.tests << test
35
+ end
36
+
37
+ def skip
38
+ @skip += 1
39
+ end
40
+
41
+ def output_testcases_to_file
42
+ docs = self.class::Conf.output_file
43
+ raise 'No output file specific for DocYoSelf' unless docs
44
+ File.delete docs if File.exists? docs
45
+ write_to_file
46
+ end
47
+
48
+ def write_to_file
49
+ File.open(self.class::Conf.output_file, 'a') do |file|
50
+ @tests.each do |test|
51
+ file.write(test.compile_template)
52
+ end
53
+ end
54
+ end
55
+
56
+ # = = = =
57
+
58
+ def self.finish!
59
+ current.sort_by_url!
60
+ current.output_testcases_to_file
61
+ current.clean_up!
62
+ end
63
+
64
+ def self.run!(request, response)
65
+ current.run!(request, response)
66
+ end
67
+
68
+ def self.skip
69
+ current.skip
70
+ end
71
+
72
+ def self.note(msg)
73
+ current.note(msg)
74
+ end
75
+
76
+ def self.current
77
+ Thread.current[:dys_instance] ||= self.new
78
+ end
79
+
80
+ def self.config(&block)
81
+ yield(self::Conf)
82
+ end
83
+ end
@@ -0,0 +1,12 @@
1
+ class DocYoSelf::Conf
2
+ class << self
3
+ attr_accessor :template_file, :output_file
4
+
5
+ @output_file = 'documentation.md'
6
+
7
+ def template
8
+ raise 'You must set a template file.' unless template_file
9
+ @template ||= File.read(template_file)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,4 @@
1
+ require 'base'
2
+ require 'conf'
3
+ require 'test_case'
4
+
@@ -0,0 +1,15 @@
1
+ require 'erb'
2
+
3
+ class DocYoSelf::TestCase
4
+ attr_reader :request, :response, :created_at, :note
5
+ attr_accessor :template
6
+
7
+ def initialize(request, response, note = '')
8
+ @request, @response, @note = request, response, note
9
+ @created_at = Time.now
10
+ end
11
+
12
+ def compile_template
13
+ ERB.new(template).result binding
14
+ end
15
+ end
File without changes
@@ -0,0 +1,7 @@
1
+ You can use ERB to format each test case.
2
+ <%= request.method %>
3
+ <%= request.path %>
4
+ <%= request.params %>
5
+ <%= response.body %>
6
+ <%= note %>
7
+
@@ -0,0 +1,69 @@
1
+ require_relative "test_helper"
2
+
3
+ class TestBase < DysTest
4
+
5
+ def test_run!
6
+ tests = DocYoSelf.current.tests
7
+ assert_equal 0, tests.length,
8
+ "Expected current tests to be an empty array"
9
+ DocYoSelf.run!(request, response)
10
+ assert_equal 1, tests.length,
11
+ "Expected run!() to increase number of tests"
12
+ assert tests.first.is_a?(DocYoSelf::TestCase)
13
+ DocYoSelf.run!(request, response)
14
+ assert_equal 2, tests.length,
15
+ "Expected run!() to increase number of tests"
16
+ assert_includes tests.first.compile_template,
17
+ "You can use ERB to format each test case",
18
+ "Did not load correct template file"
19
+ end
20
+
21
+ def test_sort!
22
+ first = Request.new("GET", {id: 12}, 'api/aaa')
23
+ last = Request.new("GET", {id: 12}, 'api/zzz')
24
+ DocYoSelf.run!(first, response)
25
+ DocYoSelf.run!(last, response)
26
+ results = DocYoSelf.current.sort_by_url!.map{|tc| tc.request.path}
27
+ assert_equal ["api/aaa", "api/zzz"], results,
28
+ "Did not sort test cases by request URL"
29
+ end
30
+
31
+ def test_finish!
32
+ file = DocYoSelf::Conf.output_file
33
+ first = Request.new("GET", {id: 12}, 'api/aaa')
34
+ last = Request.new("GET", {id: 12}, 'api/zzz')
35
+ DocYoSelf.run!(first, response)
36
+ DocYoSelf.run!(last, response)
37
+ DocYoSelf.finish!
38
+ assert File.exists?(file),
39
+ "Did not create an output file after finish!()ing"
40
+ assert_includes File.read(file), "You can use ERB",
41
+ "Did not utilize template to output docs."
42
+ end
43
+
44
+ def test_skip
45
+ file = DocYoSelf::Conf.output_file
46
+ tests= DocYoSelf.current.tests
47
+ first = Request.new("GET", {id: 12}, 'api/skip')
48
+ last = Request.new("GET", {id: 12}, 'api/noskip')
49
+ DocYoSelf.skip
50
+ DocYoSelf.run!(first, response)
51
+ DocYoSelf.run!(last, response)
52
+ assert_equal 1, tests.length,
53
+ "DYS Did not skip tests."
54
+ assert_equal 'api/noskip', tests.first.request.path,
55
+ "DYS Did not skip tests."
56
+ end
57
+
58
+ def test_note
59
+ file = DocYoSelf::Conf.output_file
60
+ tests= DocYoSelf.current.tests
61
+ first = Request.new("GET", {id: 12}, 'api/skip')
62
+ last = Request.new("GET", {id: 12}, 'api/noskip')
63
+ DocYoSelf.note "안녕하세요"
64
+ DocYoSelf.run!(first, response)
65
+ DocYoSelf.run!(last, response)
66
+ assert_includes tests.first.compile_template, "안녕하세요",
67
+ "Could not find note in documentation."
68
+ end
69
+ end
@@ -0,0 +1,15 @@
1
+ require_relative "test_helper"
2
+
3
+ class TestConfig < DysTest
4
+
5
+ def test_set_configs
6
+ DocYoSelf.config do |c|
7
+ c.template_file = 'test/template.md.erb'
8
+ c.output_file = 'api_docs.md'
9
+ end
10
+ assert_equal 'api_docs.md', DocYoSelf::Conf.output_file,
11
+ "Unable to set output file"
12
+ assert_equal 'test/template.md.erb', DocYoSelf::Conf.template_file,
13
+ "Unable to set template file"
14
+ end
15
+ end
@@ -0,0 +1,30 @@
1
+ require "simplecov"
2
+ SimpleCov.start
3
+ require_relative '../lib/doc_yo_self'
4
+ require 'minitest/autorun'
5
+ require 'pry'
6
+
7
+ class DysTest < Minitest::Unit::TestCase
8
+ def setup
9
+ DocYoSelf.config do |c|
10
+ c.template_file = 'test/fake_template.md'
11
+ c.output_file = 'test/fake_output.md'
12
+ end
13
+ end
14
+
15
+ def teardown
16
+ DocYoSelf.finish!
17
+ end
18
+
19
+ # Include some fake structs that act like response/request objects.
20
+ Request = Struct.new :method, :params, :path
21
+ Response = Struct.new :body, :success?
22
+
23
+ def request
24
+ Request.new("GET", {id: 12}, 'api/users')
25
+ end
26
+
27
+ def response
28
+ Response.new('{"id": 12, "name": "rick"}', true)
29
+ end
30
+ end
@@ -0,0 +1,28 @@
1
+ require_relative "test_helper"
2
+
3
+ class TestTestCase < DysTest
4
+
5
+ def dys
6
+ @dys ||= DocYoSelf::TestCase.new(request, response)
7
+ end
8
+
9
+ def test_compile_template
10
+ template = "<%= 2 + 2 %>"
11
+ dys.template = template
12
+ assert_equal dys.template, template,
13
+ "Could not set a template."
14
+ assert_equal "4", dys.compile_template,
15
+ "Could not compile template"
16
+ end
17
+
18
+ def test_compile_with_file
19
+ DocYoSelf.config { |c| c.template_file = 'test/fake_template.md' }
20
+ test = DocYoSelf::TestCase.new(request, response)
21
+ test.template = DocYoSelf::Conf.template
22
+ assert_includes test.compile_template, "use ERB"
23
+ end
24
+
25
+ def test_created_at
26
+ assert dys.created_at.is_a?(Time)
27
+ end
28
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: doc_yo_self
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Rick Carlino
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-29 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: An automatic API documentation generator.
14
+ email: rick.carlino@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - .gitignore
20
+ - README.md
21
+ - Rakefile
22
+ - api_docs.md
23
+ - doc_yo_self.gemspec
24
+ - documentation.md
25
+ - lib/base.rb
26
+ - lib/conf.rb
27
+ - lib/doc_yo_self.rb
28
+ - lib/test_case.rb
29
+ - test/fake_output.md
30
+ - test/fake_template.md
31
+ - test/test_base.rb
32
+ - test/test_config.rb
33
+ - test/test_helper.rb
34
+ - test/test_test_case.rb
35
+ homepage: https://github.com/rickcarlino/doc_yo_self
36
+ licenses:
37
+ - MIT
38
+ metadata: {}
39
+ post_install_message:
40
+ rdoc_options: []
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubyforge_project:
55
+ rubygems_version: 2.2.2
56
+ signing_key:
57
+ specification_version: 4
58
+ summary: Uses your test cases to write example documentation for your API.
59
+ test_files:
60
+ - test/fake_output.md
61
+ - test/fake_template.md
62
+ - test/test_base.rb
63
+ - test/test_config.rb
64
+ - test/test_helper.rb
65
+ - test/test_test_case.rb