docushin 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +5 -1
- data/app/controllers/docushin/application_controller.rb +19 -0
- data/app/controllers/docushin/collections_controller.rb +42 -0
- data/app/controllers/docushin/home_controller.rb +12 -0
- data/app/controllers/docushin/routes_controller.rb +17 -30
- data/app/helpers/docushin/application_helper.rb +3 -0
- data/app/views/docushin/collections/create.html.erb +1 -0
- data/app/views/docushin/collections/index.html.erb +23 -0
- data/app/views/docushin/collections/new.html.erb +52 -0
- data/app/views/docushin/home/index.html.erb +25 -0
- data/app/views/docushin/routes/_form.html.erb +87 -21
- data/app/views/docushin/routes/index.html.erb +8 -8
- data/app/views/docushin/routes/show.html.erb +6 -5
- data/app/views/layouts/docushin.html.erb +113 -82
- data/config/routes.rb +3 -1
- data/docushin.gemspec +3 -1
- data/lib/docushin.rb +9 -0
- data/lib/docushin/route.rb +52 -11
- data/lib/docushin/route_set.rb +18 -8
- data/lib/docushin/version.rb +1 -1
- data/spec/docushin/route_set_spec.rb +2 -2
- data/spec/docushin/route_spec.rb +22 -9
- data/spec/dummy/config/routes.rb +1 -1
- data/spec/dummy/doc/docushin/collections.yml +7 -0
- data/spec/dummy/doc/docushin/fff1454d69c4340014bef52217525fed.md +5 -0
- data/spec/requests/collections_spec.rb +11 -0
- data/spec/requests/home_spec.rb +8 -0
- data/spec/requests/requests_helper.rb +1 -0
- data/spec/requests/routes_spec.rb +7 -0
- data/spec/spec_helper.rb +3 -1
- metadata +61 -34
- data/spec/dummy/log/development.log +0 -0
- data/spec/dummy/log/test.log +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ff44f887590f3c84d28dc2956398a3a647b861ce
|
4
|
+
data.tar.gz: 1f3bb7880b63f6989f74d89bbfc46c07ce8edbcb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cdc378fb7c22a1e920e793f51ac1e861a5414aef39446b688378b97f7cb1567fe8c9620633315d1c4ceb8cf3c3a887bf22b60271951acc9c77e9bf6201816a10
|
7
|
+
data.tar.gz: abe028ef7c8e8412e0733c04de4600476611205bf0311448f0390a84a2841262706f84eaa984d3007191ee34dc65577336faf41865676876488192a8bd7891ea
|
data/.gitignore
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
*.gem
|
2
2
|
*.rbc
|
3
|
+
*.log
|
4
|
+
.\#*
|
5
|
+
\#*\#
|
3
6
|
.bundle
|
4
7
|
.config
|
5
8
|
.yardoc
|
@@ -8,10 +11,11 @@ Gemfile.lock
|
|
8
11
|
InstalledFiles
|
9
12
|
_yardoc
|
10
13
|
coverage
|
11
|
-
doc/
|
12
14
|
lib/bundler/man
|
13
15
|
pkg
|
14
16
|
rdoc
|
17
|
+
spec/dummy/log/test.log
|
18
|
+
spec/dummy/log/development.log
|
15
19
|
spec/reports
|
16
20
|
test/tmp
|
17
21
|
test/version_tmp
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Docushin
|
2
|
+
class ApplicationController < ActionController::Base
|
3
|
+
layout "docushin"
|
4
|
+
|
5
|
+
private
|
6
|
+
def authorize!
|
7
|
+
render :text => "Unauthorized" unless Rails.env.development?
|
8
|
+
return false
|
9
|
+
end
|
10
|
+
|
11
|
+
def load_route_set
|
12
|
+
@route_set = Docushin::RouteSet.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def set_default_base_path
|
16
|
+
File.join(Rails.root, 'doc', 'docushin')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Docushin
|
2
|
+
class CollectionsController < Docushin::ApplicationController
|
3
|
+
before_filter :authorize!, :only => [:edit, :update, :destroy]
|
4
|
+
before_filter :set_default_base_path, :load_route_set
|
5
|
+
|
6
|
+
def index
|
7
|
+
@content = YAML.load_documents(File.open(File.join(Rails.root, "doc", "docushin", "collections.yml"))) rescue nil
|
8
|
+
@collections = @content.nil? ? [] : @content
|
9
|
+
end
|
10
|
+
|
11
|
+
def show
|
12
|
+
end
|
13
|
+
|
14
|
+
def new
|
15
|
+
end
|
16
|
+
|
17
|
+
def edit
|
18
|
+
end
|
19
|
+
|
20
|
+
def destroy
|
21
|
+
@content = YAML.load_documents(File.open(File.join(Rails.root, "doc", "docushin", "collections.yml"))) rescue nil
|
22
|
+
@content.reject! {|obj| obj[:id] == params[:id]}
|
23
|
+
File.open(File.join(set_default_base_path,"collections.yml"), "w") do |file|
|
24
|
+
@content.each do|item|
|
25
|
+
file.write item.to_yaml
|
26
|
+
end
|
27
|
+
file.close
|
28
|
+
end
|
29
|
+
redirect_to collections_path
|
30
|
+
end
|
31
|
+
|
32
|
+
def create
|
33
|
+
params[:title] = params[:title].blank? ? "Default Title" : params[:title]
|
34
|
+
@data = {:id => Digest::MD5.hexdigest(DateTime.now.to_s), :title => params[:title], :route_set_ids => params[:route_set_ids] }
|
35
|
+
FileUtils.mkdir_p(set_default_base_path) unless File.exists?(set_default_base_path)
|
36
|
+
File.open(File.join(set_default_base_path,"collections.yml"), "a+") do |file|
|
37
|
+
file.write @data.to_yaml
|
38
|
+
file.close
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Docushin
|
2
|
+
class HomeController < Docushin::ApplicationController
|
3
|
+
before_filter :load_route_set
|
4
|
+
|
5
|
+
def index
|
6
|
+
@routes = Dir["#{File.join(Rails.root, "doc/docushin")}/*.md"].collect do |file|
|
7
|
+
@route_set.find(File.basename(file, ".md"))
|
8
|
+
end
|
9
|
+
@routes = @routes.compact.sort_by(&:updated_at).reverse.take(10)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -1,36 +1,23 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
module Docushin
|
2
|
+
class RoutesController < Docushin::ApplicationController
|
3
|
+
before_filter :load_route_set
|
4
|
+
before_filter :authorize!, :only => [:edit, :update]
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
def show
|
9
|
-
@route = @routes_collection.find_by_filename_hash(params[:id])
|
10
|
-
end
|
11
|
-
|
12
|
-
def edit
|
13
|
-
@route = @routes_collection.find_by_filename_hash(params[:id])
|
14
|
-
end
|
6
|
+
def index
|
7
|
+
end
|
15
8
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
FileUtils.mkdir_p(@path) unless File.exists?(@path)
|
9
|
+
def show
|
10
|
+
@route = @route_set.find(params[:id])
|
11
|
+
end
|
20
12
|
|
21
|
-
|
22
|
-
|
23
|
-
file.write "description: " + params[:route][:description] + "\n"
|
24
|
-
file.write "---\n"
|
25
|
-
file.write params[:route][:content]
|
26
|
-
file.close
|
13
|
+
def edit
|
14
|
+
@route = @route_set.find(params[:id])
|
27
15
|
end
|
28
|
-
redirect_to routes_path
|
29
|
-
end
|
30
16
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
17
|
+
def update
|
18
|
+
@route = @route_set.find(params[:id])
|
19
|
+
@route.update_attributes(params[:route])
|
20
|
+
redirect_to routes_path
|
21
|
+
end
|
35
22
|
end
|
36
|
-
end
|
23
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Awesome
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<% if @collections.empty? %>
|
2
|
+
<h2> You haven't created collections yet. </h2>
|
3
|
+
<% else %>
|
4
|
+
<% @collections.each do |collection| %>
|
5
|
+
<table>
|
6
|
+
<tr><th><%= collection[:title]%> <span><%= link_to("x", collection_path(collection[:id]), :method => :delete) %></span></th></tr>
|
7
|
+
<% collection[:route_set_ids].each do |item| %>
|
8
|
+
<tr>
|
9
|
+
<p>
|
10
|
+
<% route = @route_set.find(item) %>
|
11
|
+
<% if route.saved? %>
|
12
|
+
<td><%= link_to "#{route.description}", route_path(item), :title => "#{route.verb} #{route.path}" %></td>
|
13
|
+
<% else %>
|
14
|
+
<td><%= link_to "Add description to #{route.path}", route_path(item) %></td>
|
15
|
+
<% end %>
|
16
|
+
</p>
|
17
|
+
</tr>
|
18
|
+
<% end %>
|
19
|
+
</table>
|
20
|
+
<% end %>
|
21
|
+
<% end %>
|
22
|
+
|
23
|
+
<%= link_to "Create a new Collection", new_collection_path%>
|
@@ -0,0 +1,52 @@
|
|
1
|
+
<script type="text/javascript">
|
2
|
+
$(document).ready(function() {
|
3
|
+
$("ul.droptrue").sortable({
|
4
|
+
connectWith: "ul"
|
5
|
+
});
|
6
|
+
$("#sortable, #sortable_container").disableSelection();
|
7
|
+
return $("#create_collection").submit(function(e) {
|
8
|
+
e.preventDefault();
|
9
|
+
var routeSetIds = new Array();
|
10
|
+
$.each($("#sortable_container li"), function(key, item) {
|
11
|
+
return routeSetIds.push($(item).attr("id"));
|
12
|
+
});
|
13
|
+
return $.post($(this).attr("action"), {
|
14
|
+
route_set_ids: routeSetIds,
|
15
|
+
title: $("#title").val()
|
16
|
+
}, function(data) {
|
17
|
+
return window.location.replace(window.location.href.replace("/new", ""));
|
18
|
+
});
|
19
|
+
});
|
20
|
+
});
|
21
|
+
</script>
|
22
|
+
<h2>Create a new collection</h2>
|
23
|
+
<%= form_tag collections_path, :id => "create_collection" do %>
|
24
|
+
<table>
|
25
|
+
<tr>
|
26
|
+
<td>
|
27
|
+
Title:
|
28
|
+
</td>
|
29
|
+
<td>
|
30
|
+
<%= text_field_tag :title %>
|
31
|
+
</td>
|
32
|
+
</tr>
|
33
|
+
<tr>
|
34
|
+
<td colspan="2">
|
35
|
+
<ul id="sortable" class="droptrue">
|
36
|
+
<% @route_set.routes.each do |route| %>
|
37
|
+
<li class="ui-state-highlight" id="<%= route.id %>">
|
38
|
+
<span class="label"><%= route.verb %></span> <%= link_to route.path, route_path(:id => generate_name(route.verb, route.path)) %>
|
39
|
+
</li>
|
40
|
+
<% end %>
|
41
|
+
</ul>
|
42
|
+
<ul id="sortable_container" class="droptrue container">
|
43
|
+
</ul>
|
44
|
+
</td>
|
45
|
+
<td>
|
46
|
+
</td>
|
47
|
+
</tr>
|
48
|
+
</table>
|
49
|
+
<div class="actions">
|
50
|
+
<%= submit_tag %>
|
51
|
+
</div>
|
52
|
+
<% end %>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<% unless @routes.empty? %>
|
2
|
+
<div>
|
3
|
+
<h3>Recent updates</h3>
|
4
|
+
<table>
|
5
|
+
<thead>
|
6
|
+
<tr>
|
7
|
+
<th>Resource</th>
|
8
|
+
<th>Updated at</th>
|
9
|
+
</tr>
|
10
|
+
</thead>
|
11
|
+
<tbody>
|
12
|
+
<% @routes.each do |item|%>
|
13
|
+
<tr>
|
14
|
+
<td>
|
15
|
+
<%= link_to item.verb + " " + item.path, route_path(:id => generate_name(item.verb, item.path)) %>
|
16
|
+
</td>
|
17
|
+
<td>
|
18
|
+
<%= time_ago_in_words(Time.at(item.updated_at))%> ago
|
19
|
+
</td>
|
20
|
+
</tr>
|
21
|
+
<% end %>
|
22
|
+
</tbody>
|
23
|
+
</table>
|
24
|
+
</div>
|
25
|
+
<% end %>
|
@@ -1,24 +1,90 @@
|
|
1
1
|
<h3 id="title"><%= @route.verb + " " + @route.path %></h3>
|
2
2
|
<%= form_for(@route) do |f| %>
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
3
|
+
<table>
|
4
|
+
<tr>
|
5
|
+
<td>
|
6
|
+
<%= f.label :description %>
|
7
|
+
</td>
|
8
|
+
<td>
|
9
|
+
<%= f.text_field :description %>
|
10
|
+
</td>
|
11
|
+
</tr>
|
12
|
+
<tr>
|
13
|
+
<td>
|
14
|
+
<%= f.label :content %>
|
15
|
+
</td>
|
16
|
+
<td>
|
17
|
+
<%= f.text_area(:content, :cols => 50, :rows => 20) %>
|
18
|
+
</td>
|
19
|
+
</tr>
|
20
|
+
<tr>
|
21
|
+
<td>
|
22
|
+
</td>
|
23
|
+
<td>
|
24
|
+
|
25
|
+
Docushin parses documents with GitHub Flavored Markdown. Scroll down to read the documentation.
|
26
|
+
</td>
|
27
|
+
</tr>
|
28
|
+
</table>
|
29
|
+
<div class="actions">
|
30
|
+
<%= f.submit %>
|
31
|
+
</div>
|
24
32
|
<% end %>
|
33
|
+
<div class="content">
|
34
|
+
<h2>Markdown Cheat Sheet</h2>
|
35
|
+
|
36
|
+
<div class="cheatsheet-content">
|
37
|
+
|
38
|
+
<div class="mod">
|
39
|
+
<div class="col">
|
40
|
+
<h3>Format Text</h3>
|
41
|
+
<p>Headers</p>
|
42
|
+
<pre># This is an <h1> tag
|
43
|
+
## This is an <h2> tag
|
44
|
+
###### This is an <h6> tag</pre>
|
45
|
+
<p>Text styles</p>
|
46
|
+
<pre>*This text will be italic*
|
47
|
+
_This will also be italic_
|
48
|
+
**This text will be bold**
|
49
|
+
__This will also be bold__
|
50
|
+
|
51
|
+
*You **can** combine them*
|
52
|
+
</pre>
|
53
|
+
</div>
|
54
|
+
<div class="col">
|
55
|
+
<h3>Lists</h3>
|
56
|
+
<p>Unordered</p>
|
57
|
+
<pre>* Item 1
|
58
|
+
* Item 2
|
59
|
+
* Item 2a
|
60
|
+
* Item 2b</pre>
|
61
|
+
<p>Ordered</p>
|
62
|
+
<pre>1. Item 1
|
63
|
+
2. Item 2
|
64
|
+
3. Item 3
|
65
|
+
* Item 3a
|
66
|
+
* Item 3b</pre>
|
67
|
+
</div>
|
68
|
+
<div class="col">
|
69
|
+
<h3>Miscellaneous</h3>
|
70
|
+
<p>Images</p>
|
71
|
+
<pre>![GitHub Logo](/images/logo.png)
|
72
|
+
Format: ![Alt Text](url)
|
73
|
+
</pre>
|
74
|
+
<p>Links</p>
|
75
|
+
<pre>http://github.com - automatic!
|
76
|
+
[GitHub](http://github.com)</pre>
|
77
|
+
<p>Blockquotes</p>
|
78
|
+
<pre>As Kanye West said:
|
79
|
+
|
80
|
+
> We're living the future so
|
81
|
+
> the present is our past.
|
82
|
+
</pre>
|
83
|
+
</div>
|
84
|
+
</div>
|
85
|
+
<div class="rule"></div>
|
86
|
+
|
87
|
+
</div>
|
88
|
+
|
89
|
+
</div><p>
|
90
|
+
<a href="http://github.github.com/github-flavored-markdown/" class="gfm-help" target="_blank">GitHub Flavored Markdown</a></p>
|
@@ -1,24 +1,24 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<h3>Application Routes</h3>
|
2
|
+
<% @route_set.routes.group_by{ |r| r.controller }.each do |controller, routes| %>
|
3
3
|
<table>
|
4
4
|
<thead>
|
5
5
|
<tr>
|
6
|
-
<th
|
6
|
+
<th><%= controller.titleize.gsub("/", "::") %></th>
|
7
7
|
<th>Description</th>
|
8
8
|
</tr>
|
9
9
|
</thead>
|
10
|
-
<tbody>
|
11
|
-
<% routes.each do |route|%>
|
10
|
+
<tbody>
|
11
|
+
<% routes.each do |route|%>
|
12
12
|
<tr>
|
13
13
|
<td class="resource">
|
14
|
-
<%= link_to route.verb
|
14
|
+
<%= link_to "#{route.verb} #{route.path}", route_path(:id => generate_name(route.verb, route.path)) %>
|
15
15
|
</td>
|
16
16
|
<td>
|
17
17
|
<% if file_exists?(route.verb, route.path) %>
|
18
18
|
<%= route.description %>
|
19
|
-
<%= link_to 'Update', edit_route_path(generate_name(route.verb, route.path))
|
19
|
+
<%= link_to 'Update', edit_route_path(generate_name(route.verb, route.path)) if is_in_dev?%>
|
20
20
|
<% else %>
|
21
|
-
<%= link_to 'Create a description', edit_route_path(generate_name(route.verb, route.path))
|
21
|
+
<%= link_to 'Create a description', edit_route_path(generate_name(route.verb, route.path)) if is_in_dev?%>
|
22
22
|
<% end %>
|
23
23
|
</td>
|
24
24
|
</tr>
|
@@ -1,7 +1,8 @@
|
|
1
1
|
<h1 id="title"><%= @route.verb + " " + @route.path %></h1>
|
2
|
-
<
|
3
|
-
<%= File.join(request.protocol, request.host, @route.path) %>
|
4
|
-
<h3>Description</h3>
|
2
|
+
<p><pre class="route-url"><%= File.join(request.protocol, request.host_with_port, @route.path) %></pre></p>
|
5
3
|
<%= @route.description %>
|
6
|
-
<
|
7
|
-
<%= @route.
|
4
|
+
<div class="markdown"><%= @route.content %></div>
|
5
|
+
<%= button_to "Update", edit_route_path(generate_name(@route.verb, @route.path)), :method => :get %>
|
6
|
+
<% if @route.updated_at %>
|
7
|
+
<h4>This document has been updated at: <%= Time.at(@route.updated_at).strftime('%H:%M:%S, %A %d, %B') %></h4>
|
8
|
+
<% end %>
|
@@ -3,98 +3,129 @@
|
|
3
3
|
<head>
|
4
4
|
<meta charset="utf-8" />
|
5
5
|
<title>Routes</title>
|
6
|
+
|
7
|
+
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.js"></script>
|
8
|
+
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.js"></script>
|
9
|
+
<script src="https://raw.github.com/rails/jquery-ujs/master/src/rails.js"></script>
|
10
|
+
|
11
|
+
<script src="https://raw.github.com/coreyti/showdown/v0.3.1/src/showdown.js"></script>
|
12
|
+
<script src="https://raw.github.com/coreyti/showdown/v0.3.1/src/extensions/github.js"></script>
|
13
|
+
<script src="https://raw.github.com/coreyti/showdown/v0.3.1/src/extensions/table.js"></script>
|
14
|
+
|
15
|
+
<script src="https://raw.github.com/ccampbell/rainbow/1.1.8/js/rainbow.js"></script>
|
16
|
+
<script src="https://raw.github.com/ccampbell/rainbow/1.1.8/js/language/generic.js"></script>
|
17
|
+
<script src="https://raw.github.com/ccampbell/rainbow/1.1.8/js/language/javascript.js"></script>
|
18
|
+
|
19
|
+
<script>
|
20
|
+
$(document).ready(function() {
|
21
|
+
var converter = new Showdown.converter({extensions: ["github"] });
|
22
|
+
$(".markdown").each(function() {
|
23
|
+
console.log(this)
|
24
|
+
$(this).html(converter.makeHtml($(this).text()));
|
25
|
+
});
|
26
|
+
});
|
27
|
+
</script>
|
28
|
+
|
6
29
|
<style>
|
7
|
-
body
|
30
|
+
body{background-color:#fff;color:#333;margin:0;}
|
31
|
+
body,p,ol,ul,td{font-family:helvetica, verdana, arial, sans-serif;font-size:13px;line-height:18px;}
|
32
|
+
ul.droptrue{list-style-type:none;float:left;}
|
33
|
+
ul.droptrue.container{min-height:250px;min-width:350px;background:#FFF;border:1px solid gray;}
|
34
|
+
|
35
|
+
#container{width:960px;padding-top:50px;margin:0 auto;}
|
36
|
+
#header-outer{position:fixed;width:100%;top:0;height:40px;z-index:999;-moz-box-shadow:0 1px 3px rgba(0,0,0,0.25),0 -1px 0 rgba(0,0,0,0.1) inset;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.25),0 -1px 0 rgba(0,0,0,0.1) inset;box-shadow:0 1px 3px rgba(0,0,0,0.25),0 -1px 0 rgba(0,0,0,0.1) inset;background:#00A0D1 repeat-x 0 0;}
|
37
|
+
#header{width:960px;margin:0 auto;}
|
38
|
+
#logo{float:left;padding-left:32px;display:block;height:40px;color:#FFF;font-size:150%;font-weight:200;line-height:38px;}
|
39
|
+
.label{display:inline-block;font-size:11.844px;font-weight:700;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;padding:2px 4px;}
|
40
|
+
.route-url{background:#EAF2F5;display:inline-block;margin-right:8px;font-size:12px;line-height:24px;border-radius:3px;padding:0 5px;}
|
41
|
+
|
42
|
+
h1{font-size:28px;font-weight:300;line-height:1.1;margin-bottom:.75em;}
|
43
|
+
table{width:100%;margin:0 0 3em;}
|
44
|
+
tr:hover td,tr:hover td.active{background:#F8F8F8;}
|
45
|
+
td{vertical-align:top;background:#FFF;padding:8px 0;}
|
46
|
+
th{text-align:left;border-bottom:1px solid #EEE;}
|
47
|
+
td.resource{width:60%;}
|
48
|
+
pre{background-color:#eee;font-size:11px;white-space:pre-wrap;padding:10px;}
|
49
|
+
a{text-decoration:none;color:#0080A6;}
|
50
|
+
a:visited{color:#0080A6;}
|
51
|
+
a:hover{text-decoration:underline;color:#0080A6;}
|
52
|
+
a.logo{color:#FFF;text-decoration:none;}
|
53
|
+
li a:hover{background:#0089B3;color:#FFF;text-decoration:none;}
|
54
|
+
|
55
|
+
#title-nav{margin-bottom:0;margin-top:0;}
|
56
|
+
#title-nav li{position:relative;float:left;display:block;line-height:40px;margin-left:20px;padding:0;}
|
57
|
+
#title-nav a{display:block;-webkit-font-smoothing:subpixel-antialiased;text-shadow:0 -1px 0 rgba(0,0,0,0.3);outline:none;color:#BFE4EF;padding:0 10px;}
|
8
58
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
}
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
}
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
}
|
30
|
-
#
|
31
|
-
|
32
|
-
|
33
|
-
}
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
}
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
}
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
}
|
54
|
-
tr
|
55
|
-
|
56
|
-
}
|
57
|
-
td {
|
58
|
-
padding: 8px 0 8px 0;
|
59
|
-
vertical-align: top;
|
60
|
-
background: white;
|
61
|
-
}
|
62
|
-
th {
|
63
|
-
text-align: left;
|
64
|
-
border-bottom: 1px solid #EEE;
|
65
|
-
}
|
66
|
-
td.resource {
|
67
|
-
width: 320px;
|
68
|
-
}
|
69
|
-
pre {
|
70
|
-
background-color: #eee;
|
71
|
-
padding: 10px;
|
72
|
-
font-size: 11px;
|
73
|
-
white-space: pre-wrap;
|
74
|
-
}
|
59
|
+
.right{float:right;}
|
60
|
+
.markdown{padding-top:10px;padding-bottom:10px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13px;line-height:1.6;}
|
61
|
+
.markdown>:first-child{margin-top:0!important;}
|
62
|
+
.markdown>:last-child{margin-bottom:0!important;}
|
63
|
+
.markdown a{color:#4183C4;text-decoration:none;}
|
64
|
+
.markdown a:hover{text-decoration:underline;}
|
65
|
+
.markdown h1,.markdown h2,.markdown h3,.markdown h4,.markdown h5,.markdown h6{font-weight:700;-webkit-font-smoothing:antialiased;margin:20px 0 10px;padding:0;}
|
66
|
+
.markdown h1 tt,.markdown h1 code,.markdown h2 tt,.markdown h2 code,.markdown h3 tt,.markdown h3 code,.markdown h4 tt,.markdown h4 code,.markdown h5 tt,.markdown h5 code,.markdown h6 tt,.markdown h6 code{font-size:inherit;}
|
67
|
+
.markdown h1{font-size:28px;color:#000;}
|
68
|
+
.markdown h2{font-size:24px;border-bottom:1px solid #ccc;color:#000;}
|
69
|
+
.markdown h3{font-size:18px;}
|
70
|
+
.markdown h4{font-size:16px;}
|
71
|
+
.markdown h5{font-size:14px;}
|
72
|
+
.markdown h6{color:#777;font-size:14px;}
|
73
|
+
.markdown p,.markdown blockquote,.markdown ul,.markdown ol,.markdown dl,.markdown li,.markdown table,.markdown pre{margin:15px 0;}
|
74
|
+
.markdown hr{border:0 none;color:#ccc;height:4px;padding:0;}
|
75
|
+
.markdown>h2:first-child,.markdown>h1:first-child,.markdown>h1:first-child+h2,.markdown>h3:first-child,.markdown>h4:first-child,.markdown>h5:first-child,.markdown>h6:first-child{margin-top:0;padding-top:0;}
|
76
|
+
.markdown li p.first{display:inline-block;}
|
77
|
+
.markdown ul,.markdown ol{padding-left:30px;}
|
78
|
+
.markdown dl dt{font-size:14px;font-weight:700;font-style:italic;margin:15px 0 5px;padding:0;}
|
79
|
+
.markdown dl dd{margin:0 0 15px;padding:0 15px;}
|
80
|
+
.markdown blockquote{border-left:4px solid #DDD;color:#777;padding:0 15px;}
|
81
|
+
.markdown table{border-collapse:collapse;border-spacing:0;font-size:100%;font:inherit;padding:0;}
|
82
|
+
.markdown table tr{border-top:1px solid #ccc;background-color:#fff;margin:0;padding:0;}
|
83
|
+
.markdown table tr:nth-child(2n){background-color:#f8f8f8;}
|
84
|
+
.markdown table tr th{font-weight:700;}
|
85
|
+
.markdown table tr th,.markdown table tr td{border:1px solid #ccc;text-align:left;margin:0;padding:6px 13px;}
|
86
|
+
.markdown img{max-width:100%;}
|
87
|
+
.markdown span.frame{display:block;overflow:hidden;}
|
88
|
+
.markdown span.frame>span{border:1px solid #ddd;display:block;float:left;overflow:hidden;width:auto;margin:13px 0 0;padding:7px;}
|
89
|
+
.markdown span.frame span img{display:block;float:left;}
|
90
|
+
.markdown span.frame span span{clear:both;color:#333;display:block;padding:5px 0 0;}
|
91
|
+
.markdown span.align-center>span{display:block;overflow:hidden;text-align:center;margin:13px auto 0;}
|
92
|
+
.markdown span.align-center span img{text-align:center;margin:0 auto;}
|
93
|
+
.markdown span.align-right>span{display:block;overflow:hidden;text-align:right;margin:13px 0 0;}
|
94
|
+
.markdown span.align-right span img{text-align:right;margin:0;}
|
95
|
+
.markdown span.float-left{display:block;margin-right:13px;overflow:hidden;float:left;}
|
96
|
+
.markdown span.float-left span{margin:13px 0 0;}
|
97
|
+
.markdown span.float-right{display:block;margin-left:13px;overflow:hidden;float:right;}
|
98
|
+
.markdown span.float-right>span{display:block;overflow:hidden;text-align:right;margin:13px auto 0;}
|
99
|
+
.markdown code,.markdown tt{white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px;margin:0 2px;padding:0 5px;}
|
100
|
+
.markdown pre>code{white-space:pre;border:none;background:transparent;margin:0;padding:0;}
|
101
|
+
.markdown .highlight pre,.markdown pre{background-color:#f8f8f8;border:1px solid #ccc;font-size:13px;line-height:19px;overflow:auto;border-radius:3px;padding:6px 10px;}
|
102
|
+
.markdown pre code,.markdown pre tt{background-color:transparent;border:none;}
|
103
|
+
.markdown h1+p,.markdown h2+p,.markdown h3+p,.markdown h4+p,.markdown h5+p,.markdown h6+p,.markdown ul li>:first-child,.markdown ol li>:first-child,.markdown dl dt>:first-child,.markdown dl dd>:first-child,.markdown blockquote>:first-child,.markdown table tr th>:first-child,.markdown table tr td>:first-child{margin-top:0;}
|
104
|
+
.markdown ul li>:last-child,.markdown ol li>:last-child,.markdown dl dt>:last-child,.markdown dl dd>:last-child,.markdown blockquote>:last-child,.markdown table tr th>:last-child,.markdown table tr td>:last-child{margin-bottom:0;}
|
105
|
+
.markdown dl,.markdown dl dt:first-child{padding:0;}
|
106
|
+
.markdown span.align-center,.markdown span.align-right{display:block;overflow:hidden;clear:both;}
|
75
107
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
}
|
84
|
-
a.logo{
|
85
|
-
color: white;
|
86
|
-
text-decoration: none;
|
87
|
-
}
|
108
|
+
.rainbow{word-wrap:break-word;background:transparent;}
|
109
|
+
.rainbow .comment{color:#999;}
|
110
|
+
.rainbow .constant{color:#f26521;}
|
111
|
+
.rainbow .string,.rainbow .comment.docstring{color:#854a6f;}
|
112
|
+
.rainbow .entity{color:#4da943;}
|
113
|
+
.rainbow .support,.rainbow .function.call{color:#b6a500;}
|
114
|
+
.rainbow .variable{color:#1e4c66;}
|
88
115
|
</style>
|
89
116
|
</head>
|
90
117
|
<body>
|
91
118
|
<div id="header-outer">
|
92
119
|
<div id="header">
|
93
|
-
<div id="logo"><%= link_to "Docushin",
|
94
|
-
|
120
|
+
<div id="logo"><%= link_to "Docushin", root_path, :class => "logo" %></div>
|
121
|
+
<ul id="title-nav">
|
122
|
+
<li class="leaf"><%= link_to "Routes", routes_path %></li>
|
123
|
+
<li class="leaf last"><%= link_to "Collections", collections_path %></li>
|
124
|
+
</ul>
|
125
|
+
</div>
|
95
126
|
</div>
|
96
127
|
<div id="container">
|
97
128
|
<%= yield %>
|
98
129
|
</div>
|
99
130
|
</body>
|
100
|
-
</html>
|
131
|
+
</html>
|
data/config/routes.rb
CHANGED
data/docushin.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.email = ["tagrudev@gmail.com", "aganov@gmail.com"]
|
7
7
|
gem.description = %q{Builds documentation based on your Ruby on Rails application routes.}
|
8
8
|
gem.summary = %q{Useful for generating docs on your routes.}
|
9
|
-
gem.homepage = "http://github.com/
|
9
|
+
gem.homepage = "http://appsbakery.github.com/docushin/"
|
10
10
|
|
11
11
|
|
12
12
|
gem.files = `git ls-files`.split($\)
|
@@ -20,4 +20,6 @@ Gem::Specification.new do |gem|
|
|
20
20
|
gem.add_development_dependency "pry"
|
21
21
|
gem.add_development_dependency "rake"
|
22
22
|
gem.add_development_dependency "rspec", "~> 2.0"
|
23
|
+
gem.add_development_dependency "capybara"
|
24
|
+
gem.add_development_dependency "capybara-webkit"
|
23
25
|
end
|
data/lib/docushin.rb
CHANGED
data/lib/docushin/route.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'digest/md5'
|
2
|
+
require 'active_support/core_ext/hash/indifferent_access'
|
2
3
|
|
3
4
|
module Docushin
|
4
5
|
class Route
|
@@ -15,8 +16,9 @@ module Docushin
|
|
15
16
|
attr_accessor :data
|
16
17
|
attr_accessor :file_name
|
17
18
|
attr_accessor :content
|
18
|
-
|
19
|
-
|
19
|
+
|
20
|
+
alias :id :file_name
|
21
|
+
|
20
22
|
def initialize(route)
|
21
23
|
@controller = route.defaults[:controller]
|
22
24
|
@base = File.join(Rails.root, 'doc', 'docushin')
|
@@ -25,28 +27,67 @@ module Docushin
|
|
25
27
|
@path = route.path.spec.to_s.sub('(.:format)', '')
|
26
28
|
@requirements = route.requirements
|
27
29
|
@file_name = Digest::MD5.hexdigest(@verb.to_s + @path)
|
28
|
-
|
30
|
+
self.load
|
29
31
|
end
|
30
32
|
|
31
|
-
def
|
32
|
-
|
33
|
+
def description
|
34
|
+
@data["description"]
|
33
35
|
end
|
34
36
|
|
35
|
-
|
37
|
+
def updated_at
|
38
|
+
@data["updated_at"] || File.mtime(File.join(@base,"#{@file_name}.md")).to_i rescue nil
|
39
|
+
end
|
36
40
|
|
37
|
-
|
38
|
-
|
41
|
+
# Updates the attributes of the model from the passed-in hash
|
42
|
+
# and saves the route
|
43
|
+
def update_attributes(attributes)
|
44
|
+
attributes.to_hash
|
45
|
+
self.attributes = attributes
|
46
|
+
self.save
|
47
|
+
end
|
48
|
+
|
49
|
+
def attributes=(attributes)
|
50
|
+
attributes = attributes.with_indifferent_access.to_hash
|
51
|
+
@content = attributes.delete("content")
|
52
|
+
@data = attributes
|
53
|
+
end
|
54
|
+
|
55
|
+
# Saves the route
|
56
|
+
#
|
57
|
+
# If the route is new, a document gets created in the doc folder, otherwise
|
58
|
+
# the existing document gets updated.
|
59
|
+
def save
|
60
|
+
@data["updated_at"] = DateTime.now.to_i
|
61
|
+
FileUtils.mkdir_p(@base) unless File.exists?(@base)
|
62
|
+
File.open(File.join(@base,"#{@file_name}.md"), "w+") do |file|
|
63
|
+
file.write @data.to_yaml
|
64
|
+
file.write "---\n"
|
65
|
+
file.write @content
|
66
|
+
file.close
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Return true if file/route is saved
|
71
|
+
def saved?
|
72
|
+
File.exists?(File.join(@base, "#{@file_name}.md")) ? true : false
|
73
|
+
end
|
74
|
+
|
75
|
+
def persisted?
|
76
|
+
true
|
77
|
+
end
|
39
78
|
|
79
|
+
# Read route's documentation
|
80
|
+
def load
|
40
81
|
begin
|
82
|
+
@content = File.read(File.join(@base, "#{@file_name}.md"))
|
41
83
|
if @content =~ /^(---\s*\n.*?\n?)^(---\s*$\n?)/m
|
42
84
|
@content = $'
|
43
85
|
@data = YAML.load($1)
|
44
|
-
@description = @data['description']
|
45
86
|
end
|
46
87
|
rescue => e
|
47
|
-
#
|
88
|
+
# Do nothing
|
48
89
|
end
|
49
90
|
@data ||= {}
|
50
91
|
end
|
51
92
|
end
|
52
|
-
end
|
93
|
+
end
|
data/lib/docushin/route_set.rb
CHANGED
@@ -1,20 +1,29 @@
|
|
1
1
|
module Docushin
|
2
2
|
class RouteSet
|
3
3
|
attr_accessor :routes
|
4
|
-
|
4
|
+
|
5
5
|
def initialize
|
6
6
|
@routes = []
|
7
7
|
Rails.application.routes.routes.each do |route|
|
8
|
-
next if route.app.is_a?(ActionDispatch::Routing::Mapper::Constraints)
|
8
|
+
# next if route.app.is_a?(ActionDispatch::Routing::Mapper::Constraints)
|
9
9
|
next if route.app.is_a?(Sprockets::Environment)
|
10
10
|
next if route.app == Docushin::Engine
|
11
11
|
|
12
12
|
if (rack_app = discover_rack_app(route.app)) && rack_app.respond_to?(:routes)
|
13
13
|
rack_app.routes.routes.each do |rack_route|
|
14
|
-
|
15
|
-
end
|
14
|
+
add_route Route.new(rack_route)
|
15
|
+
end if rack_app.routes.respond_to?(:routes)
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
|
+
add_route Route.new(route)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_route(route)
|
23
|
+
if Docushin.path_regexp.nil?
|
24
|
+
@routes << route
|
25
|
+
else
|
26
|
+
@routes << route if route.path.match(Docushin.path_regexp)
|
18
27
|
end
|
19
28
|
end
|
20
29
|
|
@@ -27,10 +36,11 @@ module Docushin
|
|
27
36
|
end
|
28
37
|
end
|
29
38
|
|
30
|
-
def
|
39
|
+
def find(hash)
|
31
40
|
@routes.each do |route|
|
32
|
-
return route if route.
|
41
|
+
return route if route.id == hash
|
33
42
|
end
|
43
|
+
nil
|
34
44
|
end
|
35
45
|
end
|
36
|
-
end
|
46
|
+
end
|
data/lib/docushin/version.rb
CHANGED
@@ -3,8 +3,8 @@ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
|
3
3
|
describe Docushin::RouteSet do
|
4
4
|
describe 'Build route set from routes' do
|
5
5
|
let(:routes_collection) { Docushin::RouteSet.new }
|
6
|
-
it 'should have attr_accessor routes that is an array' do
|
6
|
+
it 'should have attr_accessor routes that is an array' do
|
7
7
|
routes_collection.routes.class.should == Array
|
8
8
|
end
|
9
9
|
end
|
10
|
-
end
|
10
|
+
end
|
data/spec/docushin/route_spec.rb
CHANGED
@@ -5,35 +5,48 @@ describe Docushin::Route do
|
|
5
5
|
let(:route) { route_set.routes.first }
|
6
6
|
|
7
7
|
describe 'create a new Route' do
|
8
|
-
it 'should have name, verb, path, requirements, data, content as attr' do
|
8
|
+
it 'should have name, verb, path, requirements, data, content as attr' do
|
9
9
|
route.should respond_to(:name)
|
10
10
|
route.should respond_to(:verb)
|
11
11
|
route.should respond_to(:path)
|
12
12
|
route.should respond_to(:requirements)
|
13
|
+
route.should respond_to(:updated_at)
|
13
14
|
route.should respond_to(:base)
|
14
15
|
route.should respond_to(:data)
|
15
16
|
route.should respond_to(:file_name)
|
16
17
|
route.should respond_to(:content)
|
17
18
|
route.should respond_to(:description)
|
19
|
+
route.should respond_to(:updated_at)
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
|
-
describe 'inspect the new Route' do
|
22
|
-
it 'should have attr defined' do
|
23
|
+
describe 'inspect the new Route' do
|
24
|
+
it 'should have attr defined' do
|
23
25
|
route.base.should == File.join(Rails.root, 'doc', 'docushin')
|
24
|
-
route.file_name.should == Digest::MD5.hexdigest(route.verb.to_s + route.path)
|
26
|
+
route.file_name.should == Digest::MD5.hexdigest(route.verb.to_s + route.path)
|
25
27
|
route.name.should == "foo_index"
|
26
28
|
route.path.should == "/foo"
|
27
29
|
route.requirements.should == {:action=>"index", :controller=>"foo"}
|
28
30
|
route.verb.should == "GET"
|
29
|
-
end
|
31
|
+
end
|
30
32
|
end
|
31
33
|
|
32
34
|
describe 'read markdown file' do
|
33
|
-
it 'should generate data and content' do
|
34
|
-
route.data.should == {"description"=>"I am so awesome"}
|
35
|
+
it 'should generate data and content' do
|
35
36
|
route.description.should == "I am so awesome"
|
36
|
-
route.content.should == "{\"id\":\"4f3a296ac8de6732fe000003\",\"first_name\":\"Todor\",\"last_name\":\"Grudev\",\"
|
37
|
+
route.content.should == "{\"id\":\"4f3a296ac8de6732fe000003\",\"first_name\":\"Todor\",\"last_name\":\"Grudev\",\"gender\":\"male\",\"email\":\"tagrudev@gmail.com\"}\n"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
describe 'update markdown file' do
|
41
|
+
it 'should update specified attributes' do
|
42
|
+
route.save
|
43
|
+
route.updated_at.should == File.mtime(File.join(route.base, "#{route.file_name}.md")).to_i
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe 'check if route is saved' do
|
48
|
+
it 'should return true if the file/route exists' do
|
49
|
+
route.saved?.should == true
|
37
50
|
end
|
38
51
|
end
|
39
|
-
end
|
52
|
+
end
|
data/spec/dummy/config/routes.rb
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/requests_helper')
|
2
|
+
|
3
|
+
feature 'Visit Collections of Docushin', 'I am so awesome I want to be able to make some collections' do
|
4
|
+
let(:route_set) { Docushin::RouteSet.new }
|
5
|
+
let(:route) { route_set.routes.first }
|
6
|
+
|
7
|
+
scenario 'I click on the collections page' do
|
8
|
+
visit "/docushin/collections"
|
9
|
+
page.should have_content("Create a new Collection")
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/requests_helper')
|
2
|
+
|
3
|
+
feature 'Visit Home of Docushin', 'I am so awesome I want to be able to go to my docushin home path' do
|
4
|
+
scenario 'I click on the home page' do
|
5
|
+
visit "/docushin"
|
6
|
+
page.should have_content("Recent updates")
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
data/spec/spec_helper.rb
CHANGED
@@ -4,7 +4,9 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
4
4
|
ENV["RAILS_ENV"] ||= 'test'
|
5
5
|
require File.expand_path("../../spec/dummy/config/environment", __FILE__)
|
6
6
|
|
7
|
-
|
7
|
+
|
8
|
+
require 'capybara/rails'
|
9
|
+
require 'capybara/rspec'
|
8
10
|
require 'bundler/setup'
|
9
11
|
require 'docushin'
|
10
12
|
require 'pry'
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docushin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Todor Grudev
|
@@ -10,60 +9,53 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date:
|
12
|
+
date: 2013-10-28 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: rails
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
|
-
- -
|
18
|
+
- - '>='
|
21
19
|
- !ruby/object:Gem::Version
|
22
20
|
version: '0'
|
23
21
|
type: :development
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
|
-
- -
|
25
|
+
- - '>='
|
29
26
|
- !ruby/object:Gem::Version
|
30
27
|
version: '0'
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
29
|
name: pry
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
31
|
requirements:
|
36
|
-
- -
|
32
|
+
- - '>='
|
37
33
|
- !ruby/object:Gem::Version
|
38
34
|
version: '0'
|
39
35
|
type: :development
|
40
36
|
prerelease: false
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
|
-
- -
|
39
|
+
- - '>='
|
45
40
|
- !ruby/object:Gem::Version
|
46
41
|
version: '0'
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
43
|
name: rake
|
49
44
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
45
|
requirements:
|
52
|
-
- -
|
46
|
+
- - '>='
|
53
47
|
- !ruby/object:Gem::Version
|
54
48
|
version: '0'
|
55
49
|
type: :development
|
56
50
|
prerelease: false
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
52
|
requirements:
|
60
|
-
- -
|
53
|
+
- - '>='
|
61
54
|
- !ruby/object:Gem::Version
|
62
55
|
version: '0'
|
63
56
|
- !ruby/object:Gem::Dependency
|
64
57
|
name: rspec
|
65
58
|
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
59
|
requirements:
|
68
60
|
- - ~>
|
69
61
|
- !ruby/object:Gem::Version
|
@@ -71,11 +63,38 @@ dependencies:
|
|
71
63
|
type: :development
|
72
64
|
prerelease: false
|
73
65
|
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
66
|
requirements:
|
76
67
|
- - ~>
|
77
68
|
- !ruby/object:Gem::Version
|
78
69
|
version: '2.0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: capybara
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: capybara-webkit
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
79
98
|
description: Builds documentation based on your Ruby on Rails application routes.
|
80
99
|
email:
|
81
100
|
- tagrudev@gmail.com
|
@@ -90,8 +109,15 @@ files:
|
|
90
109
|
- LICENSE
|
91
110
|
- README.md
|
92
111
|
- Rakefile
|
112
|
+
- app/controllers/docushin/application_controller.rb
|
113
|
+
- app/controllers/docushin/collections_controller.rb
|
114
|
+
- app/controllers/docushin/home_controller.rb
|
93
115
|
- app/controllers/docushin/routes_controller.rb
|
94
116
|
- app/helpers/docushin/application_helper.rb
|
117
|
+
- app/views/docushin/collections/create.html.erb
|
118
|
+
- app/views/docushin/collections/index.html.erb
|
119
|
+
- app/views/docushin/collections/new.html.erb
|
120
|
+
- app/views/docushin/home/index.html.erb
|
95
121
|
- app/views/docushin/routes/_form.html.erb
|
96
122
|
- app/views/docushin/routes/edit.html.erb
|
97
123
|
- app/views/docushin/routes/index.html.erb
|
@@ -122,12 +148,17 @@ files:
|
|
122
148
|
- spec/dummy/config/initializers/session_store.rb
|
123
149
|
- spec/dummy/config/initializers/wrap_parameters.rb
|
124
150
|
- spec/dummy/config/routes.rb
|
125
|
-
- spec/dummy/
|
126
|
-
- spec/dummy/
|
151
|
+
- spec/dummy/doc/docushin/collections.yml
|
152
|
+
- spec/dummy/doc/docushin/fff1454d69c4340014bef52217525fed.md
|
127
153
|
- spec/dummy/script/rails
|
154
|
+
- spec/requests/collections_spec.rb
|
155
|
+
- spec/requests/home_spec.rb
|
156
|
+
- spec/requests/requests_helper.rb
|
157
|
+
- spec/requests/routes_spec.rb
|
128
158
|
- spec/spec_helper.rb
|
129
|
-
homepage: http://github.com/
|
159
|
+
homepage: http://appsbakery.github.com/docushin/
|
130
160
|
licenses: []
|
161
|
+
metadata: {}
|
131
162
|
post_install_message:
|
132
163
|
rdoc_options: []
|
133
164
|
require_paths:
|
@@ -135,28 +166,20 @@ require_paths:
|
|
135
166
|
- app
|
136
167
|
- config
|
137
168
|
required_ruby_version: !ruby/object:Gem::Requirement
|
138
|
-
none: false
|
139
169
|
requirements:
|
140
|
-
- -
|
170
|
+
- - '>='
|
141
171
|
- !ruby/object:Gem::Version
|
142
172
|
version: '0'
|
143
|
-
segments:
|
144
|
-
- 0
|
145
|
-
hash: 363757421
|
146
173
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
|
-
none: false
|
148
174
|
requirements:
|
149
|
-
- -
|
175
|
+
- - '>='
|
150
176
|
- !ruby/object:Gem::Version
|
151
177
|
version: '0'
|
152
|
-
segments:
|
153
|
-
- 0
|
154
|
-
hash: 363757421
|
155
178
|
requirements: []
|
156
179
|
rubyforge_project:
|
157
|
-
rubygems_version:
|
180
|
+
rubygems_version: 2.0.3
|
158
181
|
signing_key:
|
159
|
-
specification_version:
|
182
|
+
specification_version: 4
|
160
183
|
summary: Useful for generating docs on your routes.
|
161
184
|
test_files:
|
162
185
|
- spec/docushin/route_set_spec.rb
|
@@ -177,7 +200,11 @@ test_files:
|
|
177
200
|
- spec/dummy/config/initializers/session_store.rb
|
178
201
|
- spec/dummy/config/initializers/wrap_parameters.rb
|
179
202
|
- spec/dummy/config/routes.rb
|
180
|
-
- spec/dummy/
|
181
|
-
- spec/dummy/
|
203
|
+
- spec/dummy/doc/docushin/collections.yml
|
204
|
+
- spec/dummy/doc/docushin/fff1454d69c4340014bef52217525fed.md
|
182
205
|
- spec/dummy/script/rails
|
206
|
+
- spec/requests/collections_spec.rb
|
207
|
+
- spec/requests/home_spec.rb
|
208
|
+
- spec/requests/requests_helper.rb
|
209
|
+
- spec/requests/routes_spec.rb
|
183
210
|
- spec/spec_helper.rb
|
File without changes
|
data/spec/dummy/log/test.log
DELETED
File without changes
|