wd_sinatra 1.0.6 → 2.0.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 +7 -0
- data/.travis.yml +1 -4
- data/CHANGELOG.md +20 -0
- data/Gemfile +0 -2
- data/LICENSE +4 -2
- data/README.md +28 -19
- data/bin/wd_sinatra +7 -25
- data/lib/wd_sinatra/app_loader.rb +12 -20
- data/lib/wd_sinatra/sinatra_ext.rb +8 -7
- data/lib/wd_sinatra/test_helpers.rb +1 -1
- data/lib/wd_sinatra/version.rb +2 -4
- data/templates/Gemfile +16 -11
- data/templates/{Rakefile → Rakefile.tt} +4 -4
- data/templates/Thorfile +14 -8
- data/templates/api/hello_world.rb +17 -10
- data/templates/bin/console +1 -1
- data/templates/config.ru.tt +6 -0
- data/templates/config/sinatra_config.rb.tt +50 -0
- data/templates/lib/{app.rb → app.rb.tt} +4 -1
- data/templates/lib/hooks.rb +25 -15
- data/templates/test/{test_helpers.rb → test_helpers.rb.tt} +8 -6
- data/test/test_helper.rb +0 -4
- data/test/ws_list_ext_test.rb +6 -6
- data/wd-sinatra.gemspec +11 -7
- metadata +72 -104
- data/templates/config.ru +0 -5
- data/templates/config/middleware.rb +0 -16
- data/templates/config/sinatra_config.rb +0 -18
- data/templates/lib/body_parser.rb +0 -24
- data/templates/lib/tasks/doc.rake +0 -39
- data/templates/lib/tasks/doc_generator/bootstrap/.gitignore +0 -4
- data/templates/lib/tasks/doc_generator/bootstrap/LICENSE +0 -176
- data/templates/lib/tasks/doc_generator/bootstrap/Makefile +0 -47
- data/templates/lib/tasks/doc_generator/bootstrap/README.md +0 -105
- data/templates/lib/tasks/doc_generator/bootstrap/bootstrap.css +0 -2467
- data/templates/lib/tasks/doc_generator/bootstrap/bootstrap.min.css +0 -356
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/css/docs.css +0 -317
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/ico/bootstrap-apple-114x114.png +0 -0
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/ico/bootstrap-apple-57x57.png +0 -0
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/ico/bootstrap-apple-72x72.png +0 -0
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/ico/favicon.ico +0 -0
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/img/bird.png +0 -0
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/img/browsers.png +0 -0
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/img/example-diagram-01.png +0 -0
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/img/example-diagram-02.png +0 -0
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/img/example-diagram-03.png +0 -0
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/img/grid-18px.png +0 -0
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/img/twitter-logo-no-bird.png +0 -0
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/js/application.js +0 -52
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/js/google-code-prettify/prettify.css +0 -94
- data/templates/lib/tasks/doc_generator/bootstrap/docs/assets/js/google-code-prettify/prettify.js +0 -28
- data/templates/lib/tasks/doc_generator/bootstrap/docs/index.html +0 -2037
- data/templates/lib/tasks/doc_generator/bootstrap/docs/javascript.html +0 -798
- data/templates/lib/tasks/doc_generator/bootstrap/examples/container-app.html +0 -119
- data/templates/lib/tasks/doc_generator/bootstrap/examples/fluid.html +0 -122
- data/templates/lib/tasks/doc_generator/bootstrap/examples/hero.html +0 -79
- data/templates/lib/tasks/doc_generator/bootstrap/js/bootstrap-alerts.js +0 -124
- data/templates/lib/tasks/doc_generator/bootstrap/js/bootstrap-buttons.js +0 -64
- data/templates/lib/tasks/doc_generator/bootstrap/js/bootstrap-dropdown.js +0 -55
- data/templates/lib/tasks/doc_generator/bootstrap/js/bootstrap-modal.js +0 -260
- data/templates/lib/tasks/doc_generator/bootstrap/js/bootstrap-popover.js +0 -90
- data/templates/lib/tasks/doc_generator/bootstrap/js/bootstrap-scrollspy.js +0 -107
- data/templates/lib/tasks/doc_generator/bootstrap/js/bootstrap-tabs.js +0 -80
- data/templates/lib/tasks/doc_generator/bootstrap/js/bootstrap-twipsy.js +0 -321
- data/templates/lib/tasks/doc_generator/bootstrap/js/tests/index.html +0 -40
- data/templates/lib/tasks/doc_generator/bootstrap/js/tests/unit/bootstrap-alerts.js +0 -41
- data/templates/lib/tasks/doc_generator/bootstrap/js/tests/unit/bootstrap-buttons.js +0 -42
- data/templates/lib/tasks/doc_generator/bootstrap/js/tests/unit/bootstrap-dropdown.js +0 -52
- data/templates/lib/tasks/doc_generator/bootstrap/js/tests/unit/bootstrap-modal.js +0 -151
- data/templates/lib/tasks/doc_generator/bootstrap/js/tests/unit/bootstrap-popover.js +0 -76
- data/templates/lib/tasks/doc_generator/bootstrap/js/tests/unit/bootstrap-scrollspy.js +0 -31
- data/templates/lib/tasks/doc_generator/bootstrap/js/tests/unit/bootstrap-tabs.js +0 -77
- data/templates/lib/tasks/doc_generator/bootstrap/js/tests/unit/bootstrap-twipsy.js +0 -81
- data/templates/lib/tasks/doc_generator/bootstrap/js/tests/vendor/qunit.css +0 -232
- data/templates/lib/tasks/doc_generator/bootstrap/js/tests/vendor/qunit.js +0 -1510
- data/templates/lib/tasks/doc_generator/bootstrap/lib/bootstrap.less +0 -26
- data/templates/lib/tasks/doc_generator/bootstrap/lib/forms.less +0 -479
- data/templates/lib/tasks/doc_generator/bootstrap/lib/mixins.less +0 -222
- data/templates/lib/tasks/doc_generator/bootstrap/lib/patterns.less +0 -1060
- data/templates/lib/tasks/doc_generator/bootstrap/lib/reset.less +0 -141
- data/templates/lib/tasks/doc_generator/bootstrap/lib/scaffolding.less +0 -139
- data/templates/lib/tasks/doc_generator/bootstrap/lib/tables.less +0 -224
- data/templates/lib/tasks/doc_generator/bootstrap/lib/type.less +0 -187
- data/templates/lib/tasks/doc_generator/bootstrap/lib/variables.less +0 -60
- data/templates/lib/tasks/doc_generator/template.erb +0 -156
@@ -1,187 +0,0 @@
|
|
1
|
-
/* Typography.less
|
2
|
-
* Headings, body text, lists, code, and more for a versatile and durable typography system
|
3
|
-
* ---------------------------------------------------------------------------------------- */
|
4
|
-
|
5
|
-
|
6
|
-
// BODY TEXT
|
7
|
-
// ---------
|
8
|
-
|
9
|
-
p {
|
10
|
-
#font > .shorthand(normal,@basefont,@baseline);
|
11
|
-
margin-bottom: @baseline / 2;
|
12
|
-
small {
|
13
|
-
font-size: @basefont - 2;
|
14
|
-
color: @grayLight;
|
15
|
-
}
|
16
|
-
}
|
17
|
-
|
18
|
-
|
19
|
-
// HEADINGS
|
20
|
-
// --------
|
21
|
-
|
22
|
-
h1, h2, h3, h4, h5, h6 {
|
23
|
-
font-weight: bold;
|
24
|
-
color: @grayDark;
|
25
|
-
small {
|
26
|
-
color: @grayLight;
|
27
|
-
}
|
28
|
-
}
|
29
|
-
h1 {
|
30
|
-
margin-bottom: @baseline;
|
31
|
-
font-size: 30px;
|
32
|
-
line-height: @baseline * 2;
|
33
|
-
small {
|
34
|
-
font-size: 18px;
|
35
|
-
}
|
36
|
-
}
|
37
|
-
h2 {
|
38
|
-
font-size: 24px;
|
39
|
-
line-height: @baseline * 2;
|
40
|
-
small {
|
41
|
-
font-size: 14px;
|
42
|
-
}
|
43
|
-
}
|
44
|
-
h3, h4, h5, h6 {
|
45
|
-
line-height: @baseline * 2;
|
46
|
-
}
|
47
|
-
h3 {
|
48
|
-
font-size: 18px;
|
49
|
-
small {
|
50
|
-
font-size: 14px;
|
51
|
-
}
|
52
|
-
}
|
53
|
-
h4 {
|
54
|
-
font-size: 16px;
|
55
|
-
small {
|
56
|
-
font-size: 12px;
|
57
|
-
}
|
58
|
-
}
|
59
|
-
h5 {
|
60
|
-
font-size: 14px;
|
61
|
-
}
|
62
|
-
h6 {
|
63
|
-
font-size: 13px;
|
64
|
-
color: @grayLight;
|
65
|
-
text-transform: uppercase;
|
66
|
-
}
|
67
|
-
|
68
|
-
|
69
|
-
// COLORS
|
70
|
-
// ------
|
71
|
-
|
72
|
-
// Unordered and Ordered lists
|
73
|
-
ul, ol {
|
74
|
-
margin: 0 0 @baseline 25px;
|
75
|
-
}
|
76
|
-
ul ul,
|
77
|
-
ul ol,
|
78
|
-
ol ol,
|
79
|
-
ol ul {
|
80
|
-
margin-bottom: 0;
|
81
|
-
}
|
82
|
-
ul {
|
83
|
-
list-style: disc;
|
84
|
-
}
|
85
|
-
ol {
|
86
|
-
list-style: decimal;
|
87
|
-
}
|
88
|
-
li {
|
89
|
-
line-height: @baseline;
|
90
|
-
color: @gray;
|
91
|
-
}
|
92
|
-
ul.unstyled {
|
93
|
-
list-style: none;
|
94
|
-
margin-left: 0;
|
95
|
-
}
|
96
|
-
|
97
|
-
// Description Lists
|
98
|
-
dl {
|
99
|
-
margin-bottom: @baseline;
|
100
|
-
dt, dd {
|
101
|
-
line-height: @baseline;
|
102
|
-
}
|
103
|
-
dt {
|
104
|
-
font-weight: bold;
|
105
|
-
}
|
106
|
-
dd {
|
107
|
-
margin-left: @baseline / 2;
|
108
|
-
}
|
109
|
-
}
|
110
|
-
|
111
|
-
// MISC
|
112
|
-
// ----
|
113
|
-
|
114
|
-
// Horizontal rules
|
115
|
-
hr {
|
116
|
-
margin: 20px 0 19px;
|
117
|
-
border: 0;
|
118
|
-
border-bottom: 1px solid #eee;
|
119
|
-
}
|
120
|
-
|
121
|
-
// Emphasis
|
122
|
-
strong {
|
123
|
-
font-style: inherit;
|
124
|
-
font-weight: bold;
|
125
|
-
}
|
126
|
-
em {
|
127
|
-
font-style: italic;
|
128
|
-
font-weight: inherit;
|
129
|
-
line-height: inherit;
|
130
|
-
}
|
131
|
-
.muted {
|
132
|
-
color: @grayLight;
|
133
|
-
}
|
134
|
-
|
135
|
-
// Blockquotes
|
136
|
-
blockquote {
|
137
|
-
margin-bottom: @baseline;
|
138
|
-
border-left: 5px solid #eee;
|
139
|
-
padding-left: 15px;
|
140
|
-
p {
|
141
|
-
#font > .shorthand(300,14px,@baseline);
|
142
|
-
margin-bottom: 0;
|
143
|
-
}
|
144
|
-
small {
|
145
|
-
display: block;
|
146
|
-
#font > .shorthand(300,12px,@baseline);
|
147
|
-
color: @grayLight;
|
148
|
-
&:before {
|
149
|
-
content: '\2014 \00A0';
|
150
|
-
}
|
151
|
-
}
|
152
|
-
}
|
153
|
-
|
154
|
-
// Addresses
|
155
|
-
address {
|
156
|
-
display: block;
|
157
|
-
line-height: @baseline;
|
158
|
-
margin-bottom: @baseline;
|
159
|
-
}
|
160
|
-
|
161
|
-
// Inline and block code styles
|
162
|
-
code, pre {
|
163
|
-
padding: 0 3px 2px;
|
164
|
-
font-family: Monaco, Andale Mono, Courier New, monospace;
|
165
|
-
font-size: 12px;
|
166
|
-
.border-radius(3px);
|
167
|
-
}
|
168
|
-
code {
|
169
|
-
background-color: lighten(@orange, 40%);
|
170
|
-
color: rgba(0,0,0,.75);
|
171
|
-
padding: 1px 3px;
|
172
|
-
}
|
173
|
-
pre {
|
174
|
-
background-color: #f5f5f5;
|
175
|
-
display: block;
|
176
|
-
padding: (@baseline - 1) / 2;
|
177
|
-
margin: 0 0 @baseline;
|
178
|
-
line-height: @baseline;
|
179
|
-
font-size: 12px;
|
180
|
-
border: 1px solid #ccc;
|
181
|
-
border: 1px solid rgba(0,0,0,.15);
|
182
|
-
.border-radius(3px);
|
183
|
-
white-space: pre;
|
184
|
-
white-space: pre-wrap;
|
185
|
-
word-wrap: break-word;
|
186
|
-
|
187
|
-
}
|
@@ -1,60 +0,0 @@
|
|
1
|
-
/* Variables.less
|
2
|
-
* Variables to customize the look and feel of Bootstrap
|
3
|
-
* ----------------------------------------------------- */
|
4
|
-
|
5
|
-
|
6
|
-
// Links
|
7
|
-
@linkColor: #0069d6;
|
8
|
-
@linkColorHover: darken(@linkColor, 15);
|
9
|
-
|
10
|
-
// Grays
|
11
|
-
@black: #000;
|
12
|
-
@grayDark: lighten(@black, 25%);
|
13
|
-
@gray: lighten(@black, 50%);
|
14
|
-
@grayLight: lighten(@black, 75%);
|
15
|
-
@grayLighter: lighten(@black, 90%);
|
16
|
-
@white: #fff;
|
17
|
-
|
18
|
-
// Accent Colors
|
19
|
-
@blue: #049CDB;
|
20
|
-
@blueDark: #0064CD;
|
21
|
-
@green: #46a546;
|
22
|
-
@red: #9d261d;
|
23
|
-
@yellow: #ffc40d;
|
24
|
-
@orange: #f89406;
|
25
|
-
@pink: #c3325f;
|
26
|
-
@purple: #7a43b6;
|
27
|
-
|
28
|
-
// Baseline grid
|
29
|
-
@basefont: 13px;
|
30
|
-
@baseline: 18px;
|
31
|
-
|
32
|
-
// Griditude
|
33
|
-
// Modify the grid styles in mixins.less
|
34
|
-
@gridColumns: 16;
|
35
|
-
@gridColumnWidth: 40px;
|
36
|
-
@gridGutterWidth: 20px;
|
37
|
-
@extraSpace: (@gridGutterWidth * 2); // For our grid calculations
|
38
|
-
@siteWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));
|
39
|
-
|
40
|
-
// Color Scheme
|
41
|
-
// Use this to roll your own color schemes if you like (unused by Bootstrap by default)
|
42
|
-
@baseColor: @blue; // Set a base color
|
43
|
-
@complement: spin(@baseColor, 180); // Determine a complementary color
|
44
|
-
@split1: spin(@baseColor, 158); // Split complements
|
45
|
-
@split2: spin(@baseColor, -158);
|
46
|
-
@triad1: spin(@baseColor, 135); // Triads colors
|
47
|
-
@triad2: spin(@baseColor, -135);
|
48
|
-
@tetra1: spin(@baseColor, 90); // Tetra colors
|
49
|
-
@tetra2: spin(@baseColor, -90);
|
50
|
-
@analog1: spin(@baseColor, 22); // Analogs colors
|
51
|
-
@analog2: spin(@baseColor, -22);
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
// More variables coming soon:
|
56
|
-
// - @basefont to @baseFontSize
|
57
|
-
// - @baseline to @baseLineHeight
|
58
|
-
// - @baseFontFamily
|
59
|
-
// - @primaryButtonColor
|
60
|
-
// - anything else? File an issue on GitHub
|
@@ -1,156 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html lang="en">
|
3
|
-
<head>
|
4
|
-
<meta charset="utf-8">
|
5
|
-
<title>Weasel Diesel - API documentation</title>
|
6
|
-
<meta name="description" content="">
|
7
|
-
<meta name="author" content="">
|
8
|
-
|
9
|
-
<!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
|
10
|
-
<!--[if lt IE 9]>
|
11
|
-
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
|
12
|
-
<![endif]-->
|
13
|
-
|
14
|
-
<!-- Le styles -->
|
15
|
-
<link href="css/bootstrap.css" rel="stylesheet">
|
16
|
-
<style type="text/css">
|
17
|
-
body {
|
18
|
-
padding-top: 60px;
|
19
|
-
}
|
20
|
-
div.api {
|
21
|
-
padding-top: 60px;
|
22
|
-
margin-top: -60px;
|
23
|
-
}
|
24
|
-
</style>
|
25
|
-
|
26
|
-
<!-- Le fav and touch icons -->
|
27
|
-
<link rel="shortcut icon" href="images/favicon.ico">
|
28
|
-
<link rel="apple-touch-icon" href="images/apple-touch-icon.png">
|
29
|
-
<link rel="apple-touch-icon" sizes="72x72" href=images/apple-touch-icon-72x72.png">
|
30
|
-
<link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png">
|
31
|
-
</head>
|
32
|
-
|
33
|
-
<body>
|
34
|
-
|
35
|
-
<div class="topbar">
|
36
|
-
<div class="topbar-inner">
|
37
|
-
<div class="container-fluid">
|
38
|
-
<a class="brand" href="#">Web APIs Documentation</a>
|
39
|
-
<ul class="nav">
|
40
|
-
<li class="active"><a href="index.html">Home</a></li>
|
41
|
-
</ul>
|
42
|
-
</div>
|
43
|
-
</div>
|
44
|
-
</div>
|
45
|
-
|
46
|
-
<div class="container-fluid">
|
47
|
-
<div class="sidebar">
|
48
|
-
<div class="well">
|
49
|
-
<h5>Available APIs</h5>
|
50
|
-
<ul>
|
51
|
-
<% WSList.all.sort{|a,b| a.url <=> b.url}.each do |api| %>
|
52
|
-
<li><a href="#<%= "raw-#{api.verb}-#{api.url}" %>"><%= api.url %> [<%= api.verb.upcase %>]</a></li>
|
53
|
-
<% end %>
|
54
|
-
</ul>
|
55
|
-
</div>
|
56
|
-
</div>
|
57
|
-
<div class="content">
|
58
|
-
<div class="hero-unit">
|
59
|
-
<h1>Web APIs</h1>
|
60
|
-
<p>You will find on left, the list of all the web APIs offered by this app.</p>
|
61
|
-
</div>
|
62
|
-
|
63
|
-
<% WSList.all.each do |api| %>
|
64
|
-
<div class="api" id="<%= "raw-#{api.verb}-#{api.url}" %>">
|
65
|
-
<div>
|
66
|
-
<h2><%= api.verb.upcase %> <%= '[SSL]' if api.ssl %> <%= api.url %></h2>
|
67
|
-
<% if api.auth_required %>
|
68
|
-
<span class='label important'>Authentication required</span>
|
69
|
-
<% end %>
|
70
|
-
<%= "<p>#{api.doc.desc}</p>" if api.doc.desc %>
|
71
|
-
<% unless api.doc.examples.empty? %>
|
72
|
-
<ul>
|
73
|
-
<% api.doc.examples.each do |example| %>
|
74
|
-
<li><code><%= example %></code></li>
|
75
|
-
<% end %>
|
76
|
-
</ul>
|
77
|
-
<% end %>
|
78
|
-
|
79
|
-
<h3>Input parameters description</h3>
|
80
|
-
<%# TODO support for nested namespaced params %>
|
81
|
-
<% api.params.namespaced_params.each do |params| %>
|
82
|
-
<div class='well'>
|
83
|
-
<h4>Namespace: <span style='font-style: italic'><%= params.space_name %></span></h4>
|
84
|
-
<div style='padding-left: 40px'>
|
85
|
-
<% [["Required", :list_required], ["Optional", :list_optional]].each do |label,rule_meth| %>
|
86
|
-
<% unless params.send(rule_meth).empty? %>
|
87
|
-
<h4><%= label %> Params</h4>
|
88
|
-
<ul>
|
89
|
-
<% params.send(rule_meth).each do |rule| %>
|
90
|
-
<li>
|
91
|
-
<span class='label notice'><%= rule.name %></span> of type <span class='label success'><%= rule.options[:type] || 'String' %></span>
|
92
|
-
<% if desc = (api.doc.params_doc[rule.name.to_sym] || rule.options[:doc]) %>
|
93
|
-
<%= desc %>
|
94
|
-
<% end %>
|
95
|
-
</li>
|
96
|
-
<% end %>
|
97
|
-
</ul>
|
98
|
-
<% end %>
|
99
|
-
<% end %>
|
100
|
-
</div>
|
101
|
-
</div>
|
102
|
-
<% end %>
|
103
|
-
|
104
|
-
<% [["Required", :required_rules], ["Optional", :optional_rules]].each do |label,rule_meth| %>
|
105
|
-
<% unless api.send(rule_meth).empty? %>
|
106
|
-
<h3><%= label %> Params</h3>
|
107
|
-
<ul>
|
108
|
-
<% api.send(rule_meth).each do |rule| %>
|
109
|
-
<li>
|
110
|
-
<span class='label notice'><%= rule.name %></span> of type <span class='label success'><%= rule.options[:type] || 'String' %></span>
|
111
|
-
<% if desc = (api.doc.params_doc[rule.name.to_sym] || rule.options[:doc]) %>
|
112
|
-
<%= desc %>
|
113
|
-
<% end %>
|
114
|
-
<% if options = rule.options[:options] %>
|
115
|
-
Value Options: <span class='label'><%= options.join(', ') %></span>
|
116
|
-
<% end %>
|
117
|
-
<% if default = rule.options[:default] %>
|
118
|
-
Default Value: <span class='label'><%= default %></span>
|
119
|
-
<% end %>
|
120
|
-
</li>
|
121
|
-
<% end %>
|
122
|
-
</ul>
|
123
|
-
<% end %>
|
124
|
-
<% end %>
|
125
|
-
|
126
|
-
</div>
|
127
|
-
|
128
|
-
<div>
|
129
|
-
<% if api.response.nodes.any? %>
|
130
|
-
<h3>Response description</h3>
|
131
|
-
<div class='well'>
|
132
|
-
<% api.response.elements.each do |el| %>
|
133
|
-
<%= el.to_html %>
|
134
|
-
<% end %>
|
135
|
-
<% api.response.arrays.each do |arr| %>
|
136
|
-
<%= arr.to_html %>
|
137
|
-
<% end %>
|
138
|
-
</div>
|
139
|
-
</ul>
|
140
|
-
<h4>Response example</h4>
|
141
|
-
<div class='well'><code><%= api.response.to_json %></code></div>
|
142
|
-
<% end %>
|
143
|
-
</div>
|
144
|
-
|
145
|
-
</div>
|
146
|
-
<hr>
|
147
|
-
<% end %>
|
148
|
-
|
149
|
-
<footer>
|
150
|
-
<p>© You <%= Time.now.year %></p>
|
151
|
-
</footer>
|
152
|
-
</div>
|
153
|
-
</div>
|
154
|
-
|
155
|
-
</body>
|
156
|
-
</html>
|