api_tommy 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,39 @@
1
+ require "grit"
2
+ require "tmpdir"
3
+
4
+ module ApiTommy
5
+ class Github
6
+ def update_wiki(file, content)
7
+ Dir.mktmpdir("api_tommy") do |dir|
8
+ clone_wiki(dir)
9
+ update_file(dir, file, content)
10
+ push(dir, file)
11
+ end
12
+ rescue => e
13
+ raise Error, "Can't update wiki (#{e.message})"
14
+ end
15
+
16
+ def wiki_url
17
+ return @wiki_url if defined?(@wiki_url)
18
+ origin = Grit::Repo.new(Dir.pwd).config["remote.origin.url"]
19
+ @wiki_url = origin.gsub(".git", ".wiki.git") if origin
20
+ @wiki_url
21
+ end
22
+
23
+ def clone_wiki(dir)
24
+ git = Grit::Git.new("/tmp/filling-in")
25
+ git.clone({}, wiki_url, dir)
26
+ end
27
+
28
+ def update_file(dir, file, content)
29
+ File.open(File.join(dir, file), "w") { |f| f.write(content) }
30
+ end
31
+
32
+ def push(dir, file)
33
+ repo = Grit::Repo.new(dir)
34
+ Dir.chdir(dir) { repo.add(file) }
35
+ repo.commit_index("Update #{file}")
36
+ repo.git.push({}, "origin", "master")
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,41 @@
1
+ module ApiTommy
2
+ class Markdown
3
+ 1.upto(6).each do |level|
4
+ self.class.send(:define_method, "h#{level}") { |text| title(text, level) }
5
+ end
6
+
7
+ def self.title(text, level)
8
+ "\n#{"#" * level} #{text}\n"
9
+ end
10
+
11
+ def self.p(text)
12
+ "\n#{text.gsub(/[\n]+/, " ")}\n"
13
+ end
14
+
15
+ def self.code(text, language = nil)
16
+ result = "\n```"
17
+ result << language unless language.nil?
18
+ result << "\n#{text}\n```\n"
19
+ end
20
+
21
+ def self.ul(text)
22
+ "* #{text}\n"
23
+ end
24
+
25
+ def self.th(*headers)
26
+ "\n".tap do |result|
27
+ headers.each { |header| result << "| #{header} " }
28
+ result << "\n"
29
+ headers.size.times.each { result << "| --- " }
30
+ result << "\n"
31
+ end
32
+ end
33
+
34
+ def self.tr(*values)
35
+ "".tap do |result|
36
+ values.each { |value| result << "| #{value} " }
37
+ result << "\n"
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,3 @@
1
+ module ApiTommy
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,3 @@
1
+ # file needed for rdoc generator auto discovering
2
+ require "rdoc/rdoc"
3
+ require "api_tommy"
@@ -0,0 +1,25 @@
1
+ module RDoc
2
+ module Generator
3
+ class ApiTommy < ApiTommy::Generator
4
+ RDoc.add_generator(self)
5
+
6
+ def initialize(store, options)
7
+ @store = store
8
+ @options = options
9
+ @content = ""
10
+ @h = ::ApiTommy::Markdown
11
+ end
12
+
13
+ def generate
14
+ log("Parsing and Generating doc...")
15
+ @store.all_classes.each do |clazz|
16
+ generate_class_doc(clazz)
17
+ end
18
+ log("Done.")
19
+
20
+ finalize_content
21
+ update_wiki
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1 @@
1
+ # This is the footer
@@ -0,0 +1 @@
1
+ # This is the header
@@ -0,0 +1,47 @@
1
+ # This API deals with user operations.
2
+ #
3
+ # id - the id
4
+ # username - the username
5
+ # api_key - the api key
6
+ # email - the email
7
+ # first_name - the first name
8
+ # last_name - the last name
9
+ # role - the role
10
+ # role_promotion - the role from a promotion point of view
11
+ # activated - true or false indicating if the user is enabled
12
+ # shop_ids - an array of all shop ids
13
+ #
14
+ # Examples
15
+ #
16
+ # {
17
+ # "id": "67bc91bf-d28d-5a24-ac73-296dfdbcdc6a",
18
+ # "username": "sysadmin",
19
+ # "api_key": null,
20
+ # "email": "sys@admin.net",
21
+ # "first_name": "sys",
22
+ # "last_name": "admin",
23
+ # "role": "sysadmin",
24
+ # "role_promotion": "admin",
25
+ # "activated": true,
26
+ # "shop_ids": [
27
+ # "7bf37141-20ed-537c-8aed-d1b1f1a23adc"
28
+ # ]
29
+ # }
30
+ #
31
+ class SamplesController < ApplicationController
32
+ # Get all users. Must be an authenticated sysadmin.
33
+ # Only returns JSON responses. Pagination options are available.
34
+ #
35
+ # api_key - The api key
36
+ #
37
+ # Examples
38
+ # GET /api/v2/users
39
+ #
40
+ # Returns an array of all users (field '''users''' in the JSON repsonse).
41
+ # Raises 401 if the current user is not authenticated.
42
+ # Raises 403 if the current user is not sysadmin.
43
+ # Raises 500 if an error occurs.
44
+ def index
45
+ puts "foobar"
46
+ end
47
+ end
@@ -0,0 +1,49 @@
1
+ require "test_helper"
2
+ require "tmpdir"
3
+
4
+ module ApiTommy
5
+ class GithubTest < ActiveSupport::TestCase
6
+ def setup
7
+ @g = Github.new
8
+ end
9
+
10
+ test "can extract wiki url" do
11
+ Grit::Repo.any_instance.expects(:config).returns(
12
+ "remote.origin.url" => "foobar.git"
13
+ )
14
+ assert_equal "foobar.wiki.git", @g.wiki_url
15
+ end
16
+
17
+ test "can clone a github wiki" do
18
+ Grit::Repo.any_instance.stubs(:config).returns(
19
+ "remote.origin.url" => "https://github.com/rails-api/rails-api.git"
20
+ )
21
+ Dir.mktmpdir("api_tommy") do |dir|
22
+ Grit::Git.any_instance.expects(:clone).with(
23
+ {},
24
+ "https://github.com/rails-api/rails-api.wiki.git",
25
+ dir
26
+ )
27
+ @g.clone_wiki(dir)
28
+ end
29
+ end
30
+
31
+ test "can update a file" do
32
+ filename = "foobar.txt"
33
+ Dir.mktmpdir("api_tommy") do |dir|
34
+ Dir.chdir(dir) { File.open(filename, "w") { |f| f.write("foo") } }
35
+ @g.update_file(dir, filename, "bar")
36
+ Dir.chdir(dir) { assert_equal "bar", File.read(filename) }
37
+ end
38
+ end
39
+
40
+ test "can push file" do
41
+ filename = "foobar.txt"
42
+ Dir.mktmpdir(["api_tommy", ".git"]) do |dir|
43
+ @g.update_file(dir, filename, "foo")
44
+ Grit::Git.any_instance.stubs(:push).with({}, "origin", "master")
45
+ @g.push(dir, filename)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,32 @@
1
+ require 'test_helper'
2
+
3
+ module ApiTommy
4
+ class MarkdownTest < ActiveSupport::TestCase
5
+ def setup
6
+ @h = ApiTommy::Markdown
7
+ end
8
+
9
+ 1.upto(6).each do |level|
10
+ test "can generate an h#{level} title" do
11
+ assert_equal "\n#{"#" * level} foobar\n", @h.send("h#{level}", "foobar")
12
+ end
13
+ end
14
+
15
+ test "can generate a paragraph" do
16
+ assert_equal "\nfoobar!\n", @h.p("foobar!")
17
+ end
18
+
19
+ test "can generate an unordered list item" do
20
+ assert_equal "* foobar\n", @h.ul("foobar")
21
+ end
22
+
23
+ test "can generate table headers" do
24
+ expected = "\n| foo | bar | foobar \n| --- | --- | --- \n"
25
+ assert_equal expected, @h.th("foo", "bar", "foobar")
26
+ end
27
+
28
+ test "can generate table values" do
29
+ assert_equal "| foo | bar | foobar \n", @h.tr("foo", "bar", "foobar")
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,95 @@
1
+ require "test_helper"
2
+ require "ostruct"
3
+ require "optparse"
4
+
5
+ module RDoc
6
+ module Generator
7
+ class ApiTommyTest < ActiveSupport::TestCase
8
+ test "rdoc should have registered the generator" do
9
+ assert_equal ApiTommy, RDoc::GENERATORS["apitommy"]
10
+ end
11
+
12
+ test "should set corret setup options" do
13
+ options = OpenStruct.new(
14
+ :dry_run => false,
15
+ :option_parser => OptionParser.new
16
+ )
17
+ ApiTommy.setup_options options
18
+ assert options.dry_run
19
+ end
20
+
21
+ test "accepts a filename option" do
22
+ options = Options.new
23
+ options.option_parser = OptionParser.new
24
+ ApiTommy.setup_options options
25
+ options.option_parser.parse(%w(--filename foobar.md))
26
+ assert_equal "foobar.md", options.filename
27
+ end
28
+
29
+ test "accepts a filename option with space" do
30
+ options = Options.new
31
+ options.option_parser = OptionParser.new
32
+ ApiTommy.setup_options options
33
+ options.option_parser.parse(["--filename", "foo bar.md"])
34
+ assert_equal "foo-bar.md", options.filename
35
+ end
36
+
37
+ test "accepts a filename option without md extension" do
38
+ options = Options.new
39
+ options.option_parser = OptionParser.new
40
+ ApiTommy.setup_options options
41
+ options.option_parser.parse(["--filename", "foobar"])
42
+ assert_equal "foobar.md", options.filename
43
+ end
44
+
45
+ test "accepts a header option" do
46
+ options = Options.new
47
+ options.option_parser = OptionParser.new
48
+ ApiTommy.setup_options options
49
+ options.option_parser.parse(["--header", "foobar.md"])
50
+ assert_equal "foobar.md", options.header
51
+ end
52
+
53
+ test "accepts a footer option" do
54
+ options = Options.new
55
+ options.option_parser = OptionParser.new
56
+ ApiTommy.setup_options options
57
+ options.option_parser.parse(["--footer", "foobar.md"])
58
+ assert_equal "foobar.md", options.footer
59
+ end
60
+
61
+ test "should correctly generate" do
62
+ rdoc = RDoc.new
63
+ options = rdoc.load_options
64
+ options.parse(%w(--format apitommy test/fixtures/samples_controller.rb))
65
+ ApiTommy.setup_options(options)
66
+ options.verbosity = 0
67
+ ::ApiTommy::Github.any_instance.stubs(:update_wiki)
68
+ rdoc.document(options)
69
+ assert rdoc.generator.content.include?("This API deals with user operations.")
70
+ assert rdoc.generator.content.include?("Get all users.")
71
+ end
72
+
73
+ test "should correctly generate with header and footer" do
74
+ rdoc = RDoc.new
75
+ options = rdoc.load_options
76
+ options.parse(%w(
77
+ --format apitommy
78
+ --header test/fixtures/header.md
79
+ --footer test/fixtures/footer.md
80
+ test/fixtures/samples_controller.rb
81
+ ))
82
+ ApiTommy.setup_options(options)
83
+ options.verbosity = 0
84
+ ::ApiTommy::Github.any_instance.stubs(:update_wiki)
85
+ rdoc.document(options)
86
+ assert rdoc.generator.content.include?("This is the header")
87
+ assert rdoc.generator.content.include?("This is the footer")
88
+ end
89
+ end
90
+
91
+ class ApiTommy
92
+ attr_accessor :options, :content
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,16 @@
1
+ require "simplecov"
2
+ SimpleCov.start
3
+
4
+ require "active_support"
5
+ require "minitest/autorun"
6
+ require "mocha/setup"
7
+ require "pry"
8
+
9
+ require "minitest/reporters"
10
+ Minitest::Reporters.use!(Minitest::Reporters::DefaultReporter.new)
11
+
12
+ ActiveSupport::TestCase.test_order = :random
13
+
14
+ require "api_tommy"
15
+
16
+ system('mkdir', '-p', 'doc')
metadata ADDED
@@ -0,0 +1,203 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: api_tommy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - David Fernandez
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rdoc
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: tomparse
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: grit
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.5'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '4.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '4.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: mocha
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.14'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.14'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.10'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.10'
97
+ - !ruby/object:Gem::Dependency
98
+ name: minitest-reporters
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.8'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.8'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '10.4'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '10.4'
139
+ description: This generator takes one or several classes with comments formatted in
140
+ TomDoc and spits out a single Markdown file
141
+ email:
142
+ - david.fernandez@gatemedia.ch
143
+ executables: []
144
+ extensions: []
145
+ extra_rdoc_files: []
146
+ files:
147
+ - ".gitignore"
148
+ - ".rubocop.yml"
149
+ - ".ruby-version"
150
+ - ".travis.yml"
151
+ - Gemfile
152
+ - Gemfile.lock
153
+ - LICENSE.txt
154
+ - README.md
155
+ - Rakefile
156
+ - api_tommy.gemspec
157
+ - lib/api_tommy.rb
158
+ - lib/api_tommy/error.rb
159
+ - lib/api_tommy/generator.rb
160
+ - lib/api_tommy/github.rb
161
+ - lib/api_tommy/markdown.rb
162
+ - lib/api_tommy/version.rb
163
+ - lib/rdoc/discover.rb
164
+ - lib/rdoc/generator/api_tommy.rb
165
+ - test/fixtures/footer.md
166
+ - test/fixtures/header.md
167
+ - test/fixtures/samples_controller.rb
168
+ - test/lib/api_tommy/github_test.rb
169
+ - test/lib/api_tommy/markdown_test.rb
170
+ - test/lib/rdoc/generator/api_tommy_test.rb
171
+ - test/test_helper.rb
172
+ homepage: https://github.com/gatemedia/api-tommy
173
+ licenses:
174
+ - MIT
175
+ metadata: {}
176
+ post_install_message:
177
+ rdoc_options: []
178
+ require_paths:
179
+ - lib
180
+ required_ruby_version: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
185
+ required_rubygems_version: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ requirements: []
191
+ rubyforge_project:
192
+ rubygems_version: 2.4.5
193
+ signing_key:
194
+ specification_version: 4
195
+ summary: An API documentation generator based on RDoc and TomDoc
196
+ test_files:
197
+ - test/fixtures/footer.md
198
+ - test/fixtures/header.md
199
+ - test/fixtures/samples_controller.rb
200
+ - test/lib/api_tommy/github_test.rb
201
+ - test/lib/api_tommy/markdown_test.rb
202
+ - test/lib/rdoc/generator/api_tommy_test.rb
203
+ - test/test_helper.rb