api_tommy 0.1.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.
@@ -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