qdocs 0.2.2 → 0.3.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +32 -16
- data/lib/qdocs.rb +49 -8
- data/lib/qdocs/active_record.rb +13 -3
- data/lib/qdocs/server.rb +49 -5
- data/lib/qdocs/version.rb +1 -1
- data/lib/views/common.html.erb +65 -0
- data/lib/views/constant/show.html.erb +80 -0
- data/lib/views/method/active_record_show.html.erb +18 -0
- data/lib/views/method/show.html.erb +53 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c361421b501da1e4ae6c3cea59c9b28c3a5f8b50b2e3b4bf519d8b5ab97cafb
|
4
|
+
data.tar.gz: df3a642f6604fc8ae7c6a086a19e8178a7b3f48b119c5b6b4b9470e6a054edac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 035d39b7f119206e715a9134c97949eb598144b2eb06cd35ca816f179948cd89b2e38336c2574dbe4e7975c319dda6ce8d74199f77429060cefd45fbe646131c
|
7
|
+
data.tar.gz: 7091c36e72815b43cb3c0b218fa3e1cbb8175a79db535bd1ebd11a59bed08141563c220db0ae5d1b4787971b4c4d5a7886679d6288c23a1c9dd470a1861e754f
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -27,13 +27,20 @@ Or install it yourself as:
|
|
27
27
|
|
28
28
|
## Usage
|
29
29
|
|
30
|
-
This gem offers CLI usage, or
|
30
|
+
This gem offers CLI usage, text editor integration, or viewing in a browser:
|
31
31
|
|
32
|
-
####
|
32
|
+
#### Starting a server manually:
|
33
33
|
`$ qdocs --server`
|
34
34
|
|
35
35
|
|
36
|
-
`$ curl 'http://localhost:
|
36
|
+
`$ curl 'http://localhost:7593/?input=User%2Efind' # view JSON response`
|
37
|
+
|
38
|
+
or view it in your browser, to be able to navigate through a GUI:
|
39
|
+
|
40
|
+
`$ open 'http://localhost:7593/?input=User%2Efind'`
|
41
|
+
|
42
|
+
<img width="1346" alt="Screenshot 2021-05-24 at 11 30 29" src="https://user-images.githubusercontent.com/43235608/119334821-771c1980-bc83-11eb-8027-af9c31338885.png">
|
43
|
+
|
37
44
|
|
38
45
|
#### CLI usage
|
39
46
|
|
@@ -62,33 +69,42 @@ $ qdocs 'Set#length'
|
|
62
69
|
**also provides support for constants which are recognised to be ActiveRecord models:**
|
63
70
|
|
64
71
|
```
|
65
|
-
$ curl 'http://localhost:7593/?input=User%
|
72
|
+
$ curl 'http://localhost:7593/?input=User%2Eemail'
|
66
73
|
{
|
74
|
+
"original_input": "User#id",
|
67
75
|
"constant": {
|
68
76
|
"name": "User",
|
69
77
|
"type": "Class"
|
70
78
|
},
|
71
|
-
"query_type": "
|
79
|
+
"query_type": "instance_method",
|
72
80
|
"attributes": {
|
73
|
-
"
|
74
|
-
"
|
75
|
-
|
76
|
-
|
77
|
-
"
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
"send_verification_email"
|
82
|
-
]
|
81
|
+
"defined_at": "~/.rvm/gems/ruby-2.7.1/gems/activerecord-6.0.3.6/lib/active_record/attribute_methods/primary_key.rb:18",
|
82
|
+
"source": "def id\n _read_attribute(@primary_key)\nend\n",
|
83
|
+
"arity": 0,
|
84
|
+
"parameters": {},
|
85
|
+
"comment": "# Returns the primary key column's value.",
|
86
|
+
"name": "id",
|
87
|
+
"belongs_to": "ActiveRecord::AttributeMethods::PrimaryKey",
|
88
|
+
"super_method": null
|
83
89
|
}
|
84
90
|
}
|
85
91
|
|
86
92
|
```
|
87
93
|
|
94
|
+
#### Editor integration
|
95
|
+
|
96
|
+
See below
|
97
|
+
|
88
98
|
#### Further usage examples:
|
89
99
|
|
90
100
|
`$ qdocs --help`
|
91
101
|
|
102
|
+
## Editor integration
|
103
|
+
|
104
|
+
Feel free to add others!
|
105
|
+
|
106
|
+
- [Vim](https://github.com/johansenja/qdocs-vim)
|
107
|
+
|
92
108
|
## Development
|
93
109
|
|
94
110
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -97,7 +113,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
97
113
|
|
98
114
|
## Contributing
|
99
115
|
|
100
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
116
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/johansenja/qdocs.
|
101
117
|
|
102
118
|
## License
|
103
119
|
|
data/lib/qdocs.rb
CHANGED
@@ -13,6 +13,8 @@ module Qdocs
|
|
13
13
|
|
14
14
|
class UnknownPatternError < StandardError; end
|
15
15
|
|
16
|
+
class InvalidArgumentError < StandardError; end
|
17
|
+
|
16
18
|
module Helpers
|
17
19
|
def source_location_to_str(source_location)
|
18
20
|
if source_location && source_location.length == 2
|
@@ -44,10 +46,17 @@ module Qdocs
|
|
44
46
|
end
|
45
47
|
|
46
48
|
def render_response(const, type, attrs)
|
49
|
+
const_name = if const.is_a?(Class) || const.is_a?(Module)
|
50
|
+
const.name
|
51
|
+
elsif instance_of?(Class) || const.instance_of?(Module)
|
52
|
+
const.inspect
|
53
|
+
else
|
54
|
+
const.to_s
|
55
|
+
end
|
47
56
|
{
|
48
57
|
original_input: @original_input,
|
49
58
|
constant: {
|
50
|
-
name:
|
59
|
+
name: const_name,
|
51
60
|
type: const.class.name,
|
52
61
|
},
|
53
62
|
query_type: type,
|
@@ -71,11 +80,43 @@ module Qdocs
|
|
71
80
|
|
72
81
|
const_sl = Object.const_source_location const
|
73
82
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
83
|
+
if constant.instance_of?(Class) ||
|
84
|
+
constant.instance_of?(Module)
|
85
|
+
render_response(constant, :constant, {
|
86
|
+
source_location: source_location_to_str(const_sl),
|
87
|
+
instance_methods: own_methods(constant.instance_methods).sort,
|
88
|
+
singleton_methods: own_methods(constant.methods).sort,
|
89
|
+
included_modules: constant.included_modules,
|
90
|
+
constants: constant.constants,
|
91
|
+
constant_type: constant.class.name,
|
92
|
+
inheritance_chain: build_inheritance_chain(constant).map(&:name),
|
93
|
+
})
|
94
|
+
else
|
95
|
+
render_response(constant, :constant, {
|
96
|
+
source_location: source_location_to_str(const_sl),
|
97
|
+
instance_methods: nil,
|
98
|
+
singleton_methods: nil,
|
99
|
+
included_modules: nil,
|
100
|
+
constants: nil,
|
101
|
+
value: constant,
|
102
|
+
constant_type: constant.class.name,
|
103
|
+
inheritance_chain: nil,
|
104
|
+
})
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def build_inheritance_chain(initial)
|
111
|
+
chain = [initial]
|
112
|
+
klass = initial
|
113
|
+
while klass.respond_to?(:superclass)
|
114
|
+
break unless (sc = klass.superclass)
|
115
|
+
|
116
|
+
chain << sc
|
117
|
+
klass = sc
|
118
|
+
end
|
119
|
+
chain
|
79
120
|
end
|
80
121
|
end
|
81
122
|
|
@@ -119,7 +160,7 @@ module Qdocs
|
|
119
160
|
rescue NameError
|
120
161
|
raise UnknownMethodError, "No method #{meth.inspect} for #{constant}. Did you mean #{constant}/#{meth}/ ?"
|
121
162
|
end
|
122
|
-
when ::Method
|
163
|
+
when ::Method, UnboundMethod
|
123
164
|
meth
|
124
165
|
else
|
125
166
|
raise InvalidArgumentError, "#{meth.inspect} must be of type Symbol, String, or Method"
|
@@ -143,7 +184,7 @@ module Qdocs
|
|
143
184
|
comment: (method.comment.strip rescue nil),
|
144
185
|
name: method.name,
|
145
186
|
belongs_to: method.owner,
|
146
|
-
super_method: sup ? Handler::Method.new.show(sup.owner, sup, type) : nil,
|
187
|
+
super_method: sup ? Handler::Method.new(@original_input).show(sup.owner, sup, type) : nil,
|
147
188
|
})
|
148
189
|
end
|
149
190
|
end
|
data/lib/qdocs/active_record.rb
CHANGED
@@ -12,11 +12,15 @@ module Qdocs
|
|
12
12
|
default: col.default,
|
13
13
|
null: col.null,
|
14
14
|
default_function: col.default_function,
|
15
|
+
name: col.name,
|
15
16
|
}
|
16
17
|
end
|
17
18
|
|
18
19
|
def if_active_record(constant)
|
19
|
-
if Object.const_defined?("::ActiveRecord::Base") &&
|
20
|
+
if Object.const_defined?("::ActiveRecord::Base") &&
|
21
|
+
constant.respond_to?(:<) &&
|
22
|
+
constant < ::ActiveRecord::Base &&
|
23
|
+
!constant.abstract_class
|
20
24
|
yield constant
|
21
25
|
end
|
22
26
|
end
|
@@ -32,7 +36,7 @@ module Qdocs
|
|
32
36
|
if_active_record(con) do |klass|
|
33
37
|
constant = klass
|
34
38
|
klass.columns.each do |col|
|
35
|
-
active_record_attributes_for col
|
39
|
+
database_attributes[col.name.to_sym] = active_record_attributes_for col
|
36
40
|
end
|
37
41
|
end
|
38
42
|
end
|
@@ -70,7 +74,13 @@ module Qdocs
|
|
70
74
|
if database_attributes.empty?
|
71
75
|
attrs
|
72
76
|
else
|
73
|
-
{
|
77
|
+
{
|
78
|
+
**attrs,
|
79
|
+
attributes: {
|
80
|
+
**attrs[:attributes],
|
81
|
+
database_attributes: database_attributes,
|
82
|
+
},
|
83
|
+
}
|
74
84
|
end
|
75
85
|
end
|
76
86
|
|
data/lib/qdocs/server.rb
CHANGED
@@ -7,18 +7,62 @@ module Qdocs
|
|
7
7
|
params = req.params
|
8
8
|
case env["REQUEST_PATH"]
|
9
9
|
when "/"
|
10
|
-
|
11
|
-
|
10
|
+
resp = Qdocs.lookup(params["input"])
|
11
|
+
# this is a bit ugly but ok 🤷
|
12
|
+
format = req.env.fetch("HTTP_ACCEPT", "")
|
13
|
+
body, content_type = case format
|
14
|
+
when %r{text/html}
|
15
|
+
require "erb"
|
16
|
+
template = case resp[:query_type]
|
17
|
+
when :methods
|
18
|
+
"constant/show"
|
19
|
+
when :instance_method, :singleton_method, :class_method, :method
|
20
|
+
"method/show"
|
21
|
+
when :active_record_attribute
|
22
|
+
"method/active_record_show"
|
23
|
+
when :constant, :active_record_class
|
24
|
+
"constant/show"
|
25
|
+
end
|
26
|
+
[render_html(resp, template), "text/html"]
|
27
|
+
else
|
28
|
+
[JSON.pretty_generate(resp), "application/json"]
|
29
|
+
end
|
30
|
+
[200, { "Content-Type" => "#{content_type}" }, [body]]
|
12
31
|
else
|
13
|
-
[404, { "Content-Type" => "text/
|
32
|
+
[404, { "Content-Type" => "text/plain; charset=utf-8" }, ["Not Found"]]
|
14
33
|
end
|
15
34
|
rescue Qdocs::UnknownClassError,
|
16
35
|
Qdocs::UnknownMethodTypeError,
|
17
36
|
Qdocs::UnknownMethodError,
|
18
37
|
Qdocs::UnknownPatternError => e
|
19
|
-
[404, { "Content-Type" => "text/
|
38
|
+
[404, { "Content-Type" => "text/plain; charset=utf-8" }, ["Not found: #{e.message}"]]
|
20
39
|
rescue => e
|
21
|
-
|
40
|
+
pp e.backtrace
|
41
|
+
[500, { "Content-Type" => "text/plain; charset=utf-8" }, ["Error: #{e.message}"]]
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def render_html(resp, template)
|
47
|
+
layout_contents = File.read(
|
48
|
+
File.join(
|
49
|
+
__dir__,
|
50
|
+
"..",
|
51
|
+
"views",
|
52
|
+
"common.html.erb"
|
53
|
+
)
|
54
|
+
)
|
55
|
+
specific_contents = File.read(
|
56
|
+
File.join(
|
57
|
+
__dir__,
|
58
|
+
"..",
|
59
|
+
"views",
|
60
|
+
"#{template}.html.erb"
|
61
|
+
)
|
62
|
+
)
|
63
|
+
@resp, @const_name = resp, resp.dig(:constant, :name)
|
64
|
+
@specific_contents = ERB.new(specific_contents).result(binding)
|
65
|
+
ERB.new(layout_contents).result(binding)
|
22
66
|
end
|
23
67
|
end
|
24
68
|
end
|
data/lib/qdocs/version.rb
CHANGED
@@ -0,0 +1,65 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>Qdocs - <%= @resp[:original_input] %></title>
|
4
|
+
<style>
|
5
|
+
html, body {
|
6
|
+
font-family: monospace;
|
7
|
+
color: black;
|
8
|
+
background-color: white;
|
9
|
+
}
|
10
|
+
|
11
|
+
code {
|
12
|
+
background-color: #eee;
|
13
|
+
color: rebeccapurple;
|
14
|
+
padding: 0.5em;
|
15
|
+
line-height: 2em
|
16
|
+
}
|
17
|
+
|
18
|
+
section {
|
19
|
+
padding: 8px;
|
20
|
+
border: 1px solid #333;
|
21
|
+
border-radius: 3px;
|
22
|
+
margin: 16px 0;
|
23
|
+
}
|
24
|
+
|
25
|
+
th {
|
26
|
+
border-bottom: 1px solid #333;
|
27
|
+
}
|
28
|
+
|
29
|
+
th, td {
|
30
|
+
padding: 10px 24px;
|
31
|
+
}
|
32
|
+
|
33
|
+
@media(prefers-color-scheme: dark) {
|
34
|
+
html, body {
|
35
|
+
background-color: #333;
|
36
|
+
color: #fefefe
|
37
|
+
}
|
38
|
+
|
39
|
+
a {
|
40
|
+
color: cyan;
|
41
|
+
}
|
42
|
+
|
43
|
+
a:visited {
|
44
|
+
color: magenta
|
45
|
+
}
|
46
|
+
|
47
|
+
code {
|
48
|
+
background-color: #604e49;
|
49
|
+
color: #c7ff83;
|
50
|
+
}
|
51
|
+
|
52
|
+
section {
|
53
|
+
border-color: #fefefe;
|
54
|
+
}
|
55
|
+
|
56
|
+
th {
|
57
|
+
border-bottom-color: #fefefe;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
</style>
|
61
|
+
</head>
|
62
|
+
<body>
|
63
|
+
<%= @specific_contents %>
|
64
|
+
</body>
|
65
|
+
</html>
|
@@ -0,0 +1,80 @@
|
|
1
|
+
<% attributes = @resp[:attributes] %>
|
2
|
+
<section>
|
3
|
+
<h1><%= CGI.escapeHTML(@const_name) %>: <%= attributes[:constant_type] %></h1>
|
4
|
+
</section>
|
5
|
+
<% if attributes[:source_location] %>
|
6
|
+
<section>
|
7
|
+
<% file, line_num = attributes[:source_location].split(":") %>
|
8
|
+
<h2>Defined at</h2>
|
9
|
+
<p><a href="file://<%= file %>" target="_blank"><%= file %></a>, line number <%= line_num %></p>
|
10
|
+
</section>
|
11
|
+
<% end %>
|
12
|
+
<% if attributes[:value] %>
|
13
|
+
<section>
|
14
|
+
<h2>Constant value</h2>
|
15
|
+
<p><%= CGI.escapeHTML(attributes[:value].to_s) %></p>
|
16
|
+
</section>
|
17
|
+
<% end %>
|
18
|
+
<% if attributes[:singleton_methods] && !attributes[:singleton_methods].empty? %>
|
19
|
+
<section>
|
20
|
+
<h2>Singleton Methods</h2>
|
21
|
+
<ul>
|
22
|
+
<% attributes[:singleton_methods].each do |m| %>
|
23
|
+
<li><a href="/?input=<%= @const_name %><%= CGI.escape(".")%><%= m.to_s %>"><%= m.inspect %></a></li>
|
24
|
+
<% end %>
|
25
|
+
</ul>
|
26
|
+
</section>
|
27
|
+
<% end %>
|
28
|
+
<% if attributes[:instance_methods] && !attributes[:instance_methods].empty? %>
|
29
|
+
<section>
|
30
|
+
<h2>Instance Methods</h2>
|
31
|
+
<ul>
|
32
|
+
<% attributes[:instance_methods].each do |m| %>
|
33
|
+
<li><a href="/?input=<%= @const_name %><%= CGI.escape("#")%><%= m.to_s %>"><%= m.inspect %></a></li>
|
34
|
+
<% end %>
|
35
|
+
</ul>
|
36
|
+
</section>
|
37
|
+
<% end %>
|
38
|
+
<% if attributes[:database_attributes] && !attributes[:database_attributes].empty? %>
|
39
|
+
<section>
|
40
|
+
<h2>Active Record columns</h2>
|
41
|
+
<ul>
|
42
|
+
<% attributes[:database_attributes].each_key do |name| %>
|
43
|
+
<li><a href="/?input=<%= @const_name %><%= CGI.escape("#") %><%= name.to_s %>"><%= name.inspect %></a></li>
|
44
|
+
<% end %>
|
45
|
+
</ul>
|
46
|
+
</section>
|
47
|
+
<% end %>
|
48
|
+
<% ic = attributes[:inheritance_chain] %>
|
49
|
+
<% if ic && !ic.empty? %>
|
50
|
+
<section>
|
51
|
+
<h2>Inheritance chain</h2>
|
52
|
+
<ul>
|
53
|
+
<% ic.each do |a| %>
|
54
|
+
<li><a href="/?input=<%= a.to_s %>"><%= a %></a></li>
|
55
|
+
<% end %>
|
56
|
+
</ul>
|
57
|
+
</section>
|
58
|
+
<% end %>
|
59
|
+
<% included_modules = attributes[:included_modules] %>
|
60
|
+
<% if included_modules && !included_modules.empty? %>
|
61
|
+
<section>
|
62
|
+
<h2>Included Modules</h2>
|
63
|
+
<ul>
|
64
|
+
<% included_modules.each do |m| %>
|
65
|
+
<li><a href="/?input=<%= m.to_s %>"><%= CGI.escapeHTML(m.to_s) %></a></li>
|
66
|
+
<% end %>
|
67
|
+
</ul>
|
68
|
+
</section>
|
69
|
+
<% end %>
|
70
|
+
<% constants = attributes[:constants] %>
|
71
|
+
<% if constants && !constants.empty? %>
|
72
|
+
<section>
|
73
|
+
<h2>Constants</h2>
|
74
|
+
<ul>
|
75
|
+
<% constants.each do |c| %>
|
76
|
+
<li><a href="/?input=<%= @const_name %><%= CGI.escape("::") %><%= c %>"><%= CGI.escapeHTML(@const_name) %>::<%= CGI.escapeHTML(c.to_s) %></a></li>
|
77
|
+
<% end %>
|
78
|
+
</ul>
|
79
|
+
</section>
|
80
|
+
<% end %>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% attributes = @resp[:attributes] %>
|
2
|
+
<section>
|
3
|
+
<h1><a href="/?input=<%= @const_name %>"><%= @const_name %></a>#<%= attributes[:name] %></h1>
|
4
|
+
</section>
|
5
|
+
<section>
|
6
|
+
<dl>
|
7
|
+
<dt>Name</dt>
|
8
|
+
<dd><%= attributes[:name] %></dd>
|
9
|
+
<dt>Type</dt>
|
10
|
+
<dd><%= attributes[:type] %></dd>
|
11
|
+
<dt>Can be null?</dt>
|
12
|
+
<dd><%= attributes[:null] ? "yes" : "no" %></dd>
|
13
|
+
<dt>Default</dt>
|
14
|
+
<dd><%= attributes[:default_function] || attributes[:default] || "null" %></dd>
|
15
|
+
<dt>Comment</dt>
|
16
|
+
<dd><%= attributes[:comment] || "-" %></dd>
|
17
|
+
</dl>
|
18
|
+
</section>
|
@@ -0,0 +1,53 @@
|
|
1
|
+
<% attributes = @resp[:attributes] %>
|
2
|
+
<% method_type = @resp[:query_type] == :instance_method ? "#" : "." %>
|
3
|
+
<section>
|
4
|
+
<h1><a href="/?input=<%= @const_name %>"><%= CGI.escapeHTML(@const_name.to_s) %></a><%= method_type %><%= CGI.escapeHTML(@resp.dig(:attributes, :name).to_s) %></h1>
|
5
|
+
</section>
|
6
|
+
<section>
|
7
|
+
<h2>Arity: <%= attributes[:arity] %></h2>
|
8
|
+
<p>See <a target="_blank" href="https://ruby-doc.org/core-3.0.1/Method.html#method-i-arity">the official docs</a> for reference</p>
|
9
|
+
</section>
|
10
|
+
<% if attributes[:parameters].length.positive? %>
|
11
|
+
<section>
|
12
|
+
<h2>Parameters</h2>
|
13
|
+
<p>See <a href="https://ruby-doc.org/core-3.0.1/Method.html#method-i-parameters">the official docs</a> for reference</p>
|
14
|
+
<table>
|
15
|
+
<thead>
|
16
|
+
<tr><th>Name</th><th>Kind</th></tr>
|
17
|
+
</thead>
|
18
|
+
<tbody>
|
19
|
+
<% attributes[:parameters].each do |name, type| %>
|
20
|
+
<tr><td><%= name %></td><td><%= type %></td></tr>
|
21
|
+
<% end %>
|
22
|
+
</tbody>
|
23
|
+
</table>
|
24
|
+
</section>
|
25
|
+
<% end %>
|
26
|
+
<% if attributes[:defined_at] || attributes[:comment] || attributes[:source] %>
|
27
|
+
<section>
|
28
|
+
<% if attributes[:defined_at] %>
|
29
|
+
<% file, line_num = attributes[:defined_at].split(":") %>
|
30
|
+
<h2>Defined at</h2>
|
31
|
+
<p><a href="file://<%= file %>" target="_blank"><%= file %></a>, line number <%= line_num %></p>
|
32
|
+
<% end %>
|
33
|
+
<% if attributes[:comment] %>
|
34
|
+
<h2>Comment</h2>
|
35
|
+
<pre><code><%= attributes[:comment] %></code></pre>
|
36
|
+
<% end %>
|
37
|
+
<% if attributes[:source] %>
|
38
|
+
<h2>Source</h2>
|
39
|
+
<pre><code><%= attributes[:source] %></code></pre>
|
40
|
+
<% end %>
|
41
|
+
</section>
|
42
|
+
<% end %>
|
43
|
+
<% super_method = attributes.dig :super_method, :attributes %>
|
44
|
+
<% if super_method %>
|
45
|
+
<section>
|
46
|
+
<h2>Super method</h2>
|
47
|
+
<p>
|
48
|
+
<a href="/?input=<%= CGI.escape(super_method[:belongs_to].name.to_s) %><%= CGI.escape(method_type) %><%= super_method[:name] %>">
|
49
|
+
<%= CGI.escapeHTML(super_method[:belongs_to].name.to_s) %> - <%= super_method[:name] %>
|
50
|
+
</a>
|
51
|
+
</p>
|
52
|
+
</section>
|
53
|
+
<% end %>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qdocs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joseph Johansen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-05-
|
11
|
+
date: 2021-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: method_source
|
@@ -60,6 +60,10 @@ files:
|
|
60
60
|
- lib/qdocs/active_record.rb
|
61
61
|
- lib/qdocs/server.rb
|
62
62
|
- lib/qdocs/version.rb
|
63
|
+
- lib/views/common.html.erb
|
64
|
+
- lib/views/constant/show.html.erb
|
65
|
+
- lib/views/method/active_record_show.html.erb
|
66
|
+
- lib/views/method/show.html.erb
|
63
67
|
- qdocs.gemspec
|
64
68
|
homepage:
|
65
69
|
licenses:
|