serve 1.5.0.pre5 → 1.5.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.
- data/CHANGELOG.rdoc +4 -2
- data/Gemfile +1 -1
- data/Gemfile.lock +13 -8
- data/VERSION +1 -1
- data/lib/serve/application.rb +34 -17
- data/lib/serve/{templates → bootstrap}/Gemfile +3 -3
- data/lib/serve/{templates/README.markdown → bootstrap/README.md} +0 -0
- data/lib/serve/{templates → bootstrap}/compass.config +0 -0
- data/lib/serve/{templates → bootstrap}/config.ru +1 -1
- data/lib/serve/{templates → bootstrap}/gitignore +0 -0
- data/lib/serve/export.rb +3 -12
- data/lib/serve/path.rb +24 -0
- data/lib/serve/project.rb +96 -53
- data/lib/serve/templates/default/public/images/serve-logo.png +0 -0
- data/lib/serve/templates/default/stylesheets/modules/_all.scss +3 -0
- data/lib/serve/templates/default/stylesheets/modules/_links.scss +15 -0
- data/lib/serve/templates/default/stylesheets/modules/_typography.scss +133 -0
- data/lib/serve/templates/default/stylesheets/modules/_utility.scss +15 -0
- data/lib/serve/templates/default/stylesheets/partials/_base.scss +47 -0
- data/lib/serve/templates/default/stylesheets/partials/_content.scss +37 -0
- data/lib/serve/templates/default/stylesheets/partials/_layout.scss +42 -0
- data/lib/serve/templates/default/stylesheets/screen.scss +7 -0
- data/lib/serve/templates/default/views/_layout.html.erb +1 -0
- data/lib/serve/templates/default/views/index.redirect +15 -0
- data/lib/serve/templates/default/views/layouts/default.html.erb +31 -0
- data/lib/serve/templates/default/views/view_helpers.rb +25 -0
- data/lib/serve/templates/default/views/welcome.html.erb +36 -0
- data/spec/application_spec.rb +21 -19
- data/spec/project_spec.rb +34 -34
- data/{lib/serve/templates → spec/stylesheets}/application.scss +0 -0
- data/{lib/serve/templates → spec/views}/_layout.html.erb +0 -0
- data/{lib/serve/templates → spec/views}/hello.html.erb +0 -0
- data/{lib/serve/templates → spec/views}/index.redirect +0 -0
- data/{lib/serve/templates → spec/views}/view_helpers.rb +0 -0
- metadata +31 -24
Binary file
|
@@ -0,0 +1,15 @@
|
|
1
|
+
@mixin basic-link($color: $link-color, $visited: $color, $hover: $color, $decoration: "underline") {
|
2
|
+
&:link {
|
3
|
+
color: $color;
|
4
|
+
@if $decoration == "underline" { text-decoration: underline; }
|
5
|
+
@if $decoration == "plain" { text-decoration: none; }
|
6
|
+
}
|
7
|
+
&:visited {
|
8
|
+
color: $visited;
|
9
|
+
}
|
10
|
+
&:hover {
|
11
|
+
color: $hover;
|
12
|
+
@if $decoration == "underline" { text-decoration: none; }
|
13
|
+
@if $decoration == "plain" { text-decoration: underline; }
|
14
|
+
}
|
15
|
+
}
|
@@ -0,0 +1,133 @@
|
|
1
|
+
// This should be applied to the body of the document:
|
2
|
+
//
|
3
|
+
// body { @include base-font; }
|
4
|
+
//
|
5
|
+
@mixin base-font {
|
6
|
+
color: $text-color;
|
7
|
+
font-family: $base-font-family;
|
8
|
+
font-size: $base-font-size;
|
9
|
+
line-height: $base-line-height;
|
10
|
+
}
|
11
|
+
|
12
|
+
// Typically this should be applied to content portion of the document:
|
13
|
+
//
|
14
|
+
// .content { @include basic-typography; }
|
15
|
+
//
|
16
|
+
// Pass true if you would like to use indented instead of block level paragraphs:
|
17
|
+
//
|
18
|
+
// .content { @include basic-typography(true); }
|
19
|
+
//
|
20
|
+
@mixin basic-typography($indented: $indented-paragraphs) {
|
21
|
+
@include inline-elements;
|
22
|
+
@include headings;
|
23
|
+
@if $indented {
|
24
|
+
@include indented-paragraphs;
|
25
|
+
} @else {
|
26
|
+
@include block-paragraphs;
|
27
|
+
}
|
28
|
+
@include lists;
|
29
|
+
@include fixed-font-elements;
|
30
|
+
}
|
31
|
+
|
32
|
+
// Style inline elements like strong, em, abbr, etc...
|
33
|
+
@mixin inline-elements($loud-color: $loud-color) {
|
34
|
+
@include bold-italic-elements($loud-color);
|
35
|
+
@include misc-inline-elements;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Basic styles for strong, b, em, and i
|
39
|
+
@mixin bold-italic-elements($loud-color: $loud-color) {
|
40
|
+
strong, b { color: $loud-color; font-weight: bold; }
|
41
|
+
em, i { font-style: italic; }
|
42
|
+
}
|
43
|
+
|
44
|
+
// Basic styles for abbr, acronym, sub, sup, and span.caps
|
45
|
+
@mixin misc-inline-elements {
|
46
|
+
abbr, acronym { border-bottom: 1px dotted soften($text-color, 2); }
|
47
|
+
sub, sup { font-size: 85%; }
|
48
|
+
sub { vertical-align: sub; }
|
49
|
+
sup { vertical-align: super; }
|
50
|
+
span.caps { font-size: 95%; }
|
51
|
+
}
|
52
|
+
|
53
|
+
// Basic styles for headings
|
54
|
+
@mixin headings($color: $header-color, $line-height: $base-line-height) {
|
55
|
+
h1, h2, h3, h4, h5, h6 {
|
56
|
+
color: $color;
|
57
|
+
margin: 1em 0;
|
58
|
+
}
|
59
|
+
h1 {
|
60
|
+
font-weight: bold;
|
61
|
+
font-size: 200%;
|
62
|
+
line-height: 0.785 * $line-height;
|
63
|
+
margin: 0.75em 0;
|
64
|
+
}
|
65
|
+
h2 {
|
66
|
+
font-weight: bold;
|
67
|
+
font-size: 170%;
|
68
|
+
line-height: 0.785 * $line-height;
|
69
|
+
}
|
70
|
+
h3 {
|
71
|
+
font-weight: bold;
|
72
|
+
font-size: 140%;
|
73
|
+
line-height: 0.835 * $line-height;
|
74
|
+
margin: 1.25em 0 0.5em;
|
75
|
+
}
|
76
|
+
h4 {
|
77
|
+
font-weight: bold;
|
78
|
+
font-size: 110%;
|
79
|
+
line-height: 0.9 * $line-height;
|
80
|
+
margin: 0.5em 0 0.5em;
|
81
|
+
}
|
82
|
+
h5 {
|
83
|
+
font-style: italic;
|
84
|
+
font-size: 110%;
|
85
|
+
line-height: $line-height;
|
86
|
+
margin: 0.65em 0;
|
87
|
+
}
|
88
|
+
h6 {
|
89
|
+
font-weight: bold;
|
90
|
+
margin-bottom: -0.75em;
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
// Block-level paragraphs with vertical margin
|
95
|
+
@mixin block-paragraphs {
|
96
|
+
p { margin: 1em 0; }
|
97
|
+
}
|
98
|
+
|
99
|
+
// Indented paragraphs
|
100
|
+
@mixin indented-paragraphs($indent: 1em) {
|
101
|
+
p { margin-top: 0.5; margin-bottom: 0.5; }
|
102
|
+
p + p { text-indent: $indent; }
|
103
|
+
}
|
104
|
+
|
105
|
+
// Basic styles for list elements
|
106
|
+
@mixin lists($indent: 2.25em, $ul-list-style: disc, $ol-list-style: decimal) {
|
107
|
+
ul, ol, dl { margin-top: 1em; margin-bottom: 1em; }
|
108
|
+
ul, ol, dd { padding-left: $indent; }
|
109
|
+
ul { list-style: $ul-list-style; }
|
110
|
+
ol { list-style: $ol-list-style; }
|
111
|
+
li { margin-top: 0.5em; margin-bottom: 0.5em; }
|
112
|
+
dt { margin-top: 1em; }
|
113
|
+
dd { margin-bottom: 1em; }
|
114
|
+
}
|
115
|
+
|
116
|
+
// Typewritter styles for fixed-font elements
|
117
|
+
@mixin fixed-font-elements($font-family: $fixed-font-family, $font-size: $fixed-font-size, $line-height: $fixed-line-height) {
|
118
|
+
code, dfn, kbd, samp, tt {
|
119
|
+
font-family: $font-family;
|
120
|
+
font-size: 95%;
|
121
|
+
color: soften($text-color);
|
122
|
+
}
|
123
|
+
pre {
|
124
|
+
background: soften($text-color);
|
125
|
+
color: invert($text-color);
|
126
|
+
font-family: $font-family;
|
127
|
+
font-size: 95%;
|
128
|
+
line-height: $line-height;
|
129
|
+
margin: 1.5em 0;
|
130
|
+
padding: 1em;
|
131
|
+
@include border-radius;
|
132
|
+
}
|
133
|
+
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
@function strengthen($color, $multiplier: 1, $reversed: $reversed-text) {
|
2
|
+
@if $reversed {
|
3
|
+
@return lighten($color, 20% * $multiplier);
|
4
|
+
} @else {
|
5
|
+
@return darken($color, 20% * $multiplier);
|
6
|
+
}
|
7
|
+
}
|
8
|
+
|
9
|
+
@function soften($color, $multiplier: 1, $reversed: $reversed-text) {
|
10
|
+
@if $reversed {
|
11
|
+
@return darken($color, 20% * $multiplier);
|
12
|
+
} @else {
|
13
|
+
@return lighten($color, 20% * $multiplier);
|
14
|
+
}
|
15
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
@import "compass";
|
2
|
+
|
3
|
+
// Reversed?
|
4
|
+
$reversed-text: false;
|
5
|
+
@import "modules/utility";
|
6
|
+
|
7
|
+
// Base Font
|
8
|
+
$base-font-family: "Helvetica Neue", Hevetica, Arial, sans-serif;
|
9
|
+
$base-font-size: 110%;
|
10
|
+
$base-line-height: 1.4;
|
11
|
+
|
12
|
+
// Fixed Font
|
13
|
+
$fixed-font-family: Monaco, "Andale Mono", "Lucida Console", monospace;
|
14
|
+
$fixed-font-size: 85%;
|
15
|
+
$fixed-line-height: $base-line-height;
|
16
|
+
|
17
|
+
// Text Colors
|
18
|
+
$text-color: #333333;
|
19
|
+
$loud-color: strengthen($text-color);
|
20
|
+
$quiet-color: soften($text-color, 1.5);
|
21
|
+
$header-color: strengthen($text-color, 0.66);
|
22
|
+
|
23
|
+
// Link Colors
|
24
|
+
$link-color: #bb3a08;
|
25
|
+
$link-visited-color: #a72;
|
26
|
+
$link-hover-color: #f66933;
|
27
|
+
|
28
|
+
// Theme Colors
|
29
|
+
$background-color: white;
|
30
|
+
$banner-color: #973b12;
|
31
|
+
|
32
|
+
// Paragraphs
|
33
|
+
$indented-paragraphs: false;
|
34
|
+
|
35
|
+
// Layout
|
36
|
+
$body-margin-x: 15%;
|
37
|
+
|
38
|
+
// Border Radius
|
39
|
+
$default-border-radius: 8px;
|
40
|
+
|
41
|
+
@import "modules/all";
|
42
|
+
|
43
|
+
@include global-reset;
|
44
|
+
@include reset-html5;
|
45
|
+
|
46
|
+
html, body { background: $background-color; }
|
47
|
+
body { @include base-font; }
|
@@ -0,0 +1,37 @@
|
|
1
|
+
//
|
2
|
+
// Virtual Content Classes
|
3
|
+
//
|
4
|
+
|
5
|
+
.links {
|
6
|
+
a { @include basic-link($link-color, $link-visited-color, $link-hover-color); }
|
7
|
+
a.more {
|
8
|
+
white-space: nowrap;
|
9
|
+
&:after { content: " »"; }
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
13
|
+
.typography {
|
14
|
+
@include basic-typography;
|
15
|
+
}
|
16
|
+
|
17
|
+
.content {
|
18
|
+
@extend .links;
|
19
|
+
@extend .typography;
|
20
|
+
|
21
|
+
.box {
|
22
|
+
background: #efeacf;
|
23
|
+
border: 1px solid darken(#efeacf, 10);
|
24
|
+
@include border-radius;
|
25
|
+
margin: 1.5em -1em;
|
26
|
+
padding: 1px 1em;
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
|
31
|
+
//
|
32
|
+
// Applied to appropriate elements
|
33
|
+
//
|
34
|
+
|
35
|
+
section[role=main] > article {
|
36
|
+
@extend .content
|
37
|
+
}
|
@@ -0,0 +1,42 @@
|
|
1
|
+
//
|
2
|
+
// Basic layout and styles for site
|
3
|
+
//
|
4
|
+
|
5
|
+
|
6
|
+
header[role=banner] {
|
7
|
+
background: $banner-color;
|
8
|
+
@include background-image(
|
9
|
+
linear-gradient(rgba(black, 0) 0%, rgba(black, 0) 80%, rgba(black, 0.15) 100%),
|
10
|
+
radial-gradient(30% 50px, $banner-color, darken($banner-color, 11) 400px)
|
11
|
+
);
|
12
|
+
padding: 20px $body-margin-x;
|
13
|
+
position: relative;
|
14
|
+
|
15
|
+
a { @include basic-link(mix($banner-color, white, 20%), $hover: white, $decoration: "plain"); }
|
16
|
+
|
17
|
+
.action-link {
|
18
|
+
position: absolute;
|
19
|
+
right: $body-margin-x;
|
20
|
+
top: 55px;
|
21
|
+
a {
|
22
|
+
background: rgba(white, 0.1);
|
23
|
+
@include border-radius;
|
24
|
+
display: block;
|
25
|
+
padding: 0.5em 1em;
|
26
|
+
@include text-shadow(mix($banner-color, black, 50%) 0 1px 0);
|
27
|
+
&:after { content: " ⇢"; }
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
section[role=main] {
|
33
|
+
padding: 1px $body-margin-x;
|
34
|
+
}
|
35
|
+
|
36
|
+
body > footer {
|
37
|
+
padding: 0 $body-margin-x 20px;
|
38
|
+
font-size: 90%;
|
39
|
+
color: $quiet-color;
|
40
|
+
a { @include basic-link($text-color); }
|
41
|
+
p { margin: 1em 0; }
|
42
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render :template => "/layouts/default" %>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Serve has a special file type for mapping HTTP redirects. Redirects make nice
|
2
|
+
end points for form posts or short URLs.
|
3
|
+
|
4
|
+
Redirect URLs can be fully formed, like this:
|
5
|
+
|
6
|
+
http://wiseheartdesign.com/
|
7
|
+
|
8
|
+
Or, relative to the site root, like this:
|
9
|
+
|
10
|
+
/action
|
11
|
+
|
12
|
+
Extra lines at the beginning of a redirect file are ignored. By convention,
|
13
|
+
the last line of a redirect file is the URL to redirect to:
|
14
|
+
|
15
|
+
/welcome
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title><%= @title %></title>
|
6
|
+
<link rel="stylesheet" href="/stylesheets/screen.css">
|
7
|
+
<!--[if IE]>
|
8
|
+
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
9
|
+
<![endif]-->
|
10
|
+
</head>
|
11
|
+
<body>
|
12
|
+
<header role="banner">
|
13
|
+
<h1><a href="/"><%= image "serve-logo" %></a></h1>
|
14
|
+
<div class="action-link"><a href="http://get-serve.com/documentation">Documentation</a></div>
|
15
|
+
</header>
|
16
|
+
<section role="main">
|
17
|
+
<article>
|
18
|
+
<header><h1><%= @title %></h1></header>
|
19
|
+
<%= yield %>
|
20
|
+
</article>
|
21
|
+
</section>
|
22
|
+
<footer>
|
23
|
+
<small>
|
24
|
+
<p>Serve is copyright © 2007-2011 John W. Long and Adam I. Williams. Portions have
|
25
|
+
been contributed by Robert Evans and others. Serve is distributed under a MIT-style
|
26
|
+
license and is open source software. Enjoy!</p>
|
27
|
+
<p>Questions? <a href="http://get-serve.com/mailing-list">Join the mailing list.</a></p>
|
28
|
+
</small>
|
29
|
+
</footer>
|
30
|
+
</body>
|
31
|
+
</html>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#
|
2
|
+
# Methods placed in this module can be used inside of any view.
|
3
|
+
# View helpers allow you to encapsalate complex logic and keep your
|
4
|
+
# views pristine.
|
5
|
+
#
|
6
|
+
module ViewHelpers
|
7
|
+
|
8
|
+
# Calculate the years for a copyright
|
9
|
+
def copyright_years(start_year)
|
10
|
+
end_year = Date.today.year
|
11
|
+
if start_year == end_year
|
12
|
+
"\#{start_year}"
|
13
|
+
else
|
14
|
+
"\#{start_year}–\#{end_year}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Handy for hiding a block of unfinished code
|
19
|
+
def hidden(&block)
|
20
|
+
#no-op
|
21
|
+
end
|
22
|
+
|
23
|
+
# Add your own helpers below...
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<% @title = "You created a structured Serve project!" %>
|
2
|
+
|
3
|
+
<dl>
|
4
|
+
<dt><strong>Views & Layouts</strong></dt>
|
5
|
+
<dd>
|
6
|
+
Your views are stored in the <kbd>views</kbd> folder. Coming from a page-based
|
7
|
+
scripting language like PHP? Views are just like regular pages. The main layout
|
8
|
+
file for this project is stored in <kbd>layouts/default</kbd>.
|
9
|
+
</dd>
|
10
|
+
|
11
|
+
<dt><strong>Stylesheets, Sass & Compass</strong></dt>
|
12
|
+
<dd>
|
13
|
+
This project is pre-configured for <a href="http://sass-lang.com">Sass</a> and
|
14
|
+
<a href="http://compass-style.org">Compass</a>. Store your <kbd>sass</kbd> and
|
15
|
+
<kbd>scss</kbd> files in the root <kbd>stylesheets</kbd> folder. Sass
|
16
|
+
stylesheets will be automatically compiled to CSS and stored in
|
17
|
+
<kbd>public/stylesheets</kbd>.
|
18
|
+
</dd>
|
19
|
+
|
20
|
+
<dt><strong>Static Assets</strong></dt>
|
21
|
+
<dd>
|
22
|
+
Static assets like images, javascripts, and downloads are stored in the
|
23
|
+
<kbd>public</kbd> folder. Put files here that don’t need special
|
24
|
+
processing by Serve.
|
25
|
+
</dd>
|
26
|
+
</dl>
|
27
|
+
|
28
|
+
<div class="box">
|
29
|
+
<h6>Other Template Languages</h6>
|
30
|
+
<p>
|
31
|
+
If you are interested in using Serve with other template languages like Haml,
|
32
|
+
Slim, Markdown, or Textile, remember to edit the project <kbd>Gemfile</kbd>
|
33
|
+
to include the appropriate gems. Then use
|
34
|
+
<a href="http://gembundler.com/">Bundler</a> to install them.
|
35
|
+
</p>
|
36
|
+
</div>
|
data/spec/application_spec.rb
CHANGED
@@ -12,7 +12,7 @@ describe Serve::Application do
|
|
12
12
|
|
13
13
|
:port => 4000,
|
14
14
|
:address => '0.0.0.0',
|
15
|
-
:root =>
|
15
|
+
:root => ".",
|
16
16
|
|
17
17
|
:convert => nil,
|
18
18
|
:create => nil,
|
@@ -59,35 +59,37 @@ describe Serve::Application do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
it "working directory" do
|
62
|
-
parse('')[:root].should ==
|
62
|
+
parse('')[:root].should == '.'
|
63
63
|
dir = File.dirname(__FILE__)
|
64
64
|
parse(dir)[:root].should == File.expand_path(dir)
|
65
65
|
end
|
66
66
|
|
67
67
|
describe "create" do
|
68
68
|
it "with standard arguments" do
|
69
|
-
params = parse('create newapp /Users/user')[:create]
|
70
|
-
params[:name].should == 'newapp'
|
71
|
-
params[:directory].should == '/Users/user'
|
72
|
-
params[:framework].should be_nil
|
73
|
-
end
|
74
|
-
|
75
|
-
it "without parent directory" do
|
76
69
|
params = parse('create newapp')[:create]
|
77
|
-
params[:
|
78
|
-
params[:
|
70
|
+
params[:directory].should == 'newapp'
|
71
|
+
params[:framework].should be_nil
|
72
|
+
params[:template].should be_nil
|
79
73
|
end
|
80
74
|
|
81
75
|
it "with no arguments" do
|
82
|
-
|
76
|
+
params = parse('create')[:create]
|
77
|
+
params[:directory].should == '.'
|
78
|
+
params[:framework].should be_nil
|
79
|
+
params[:template].should be_nil
|
83
80
|
end
|
84
81
|
|
85
82
|
it "with a javascript framework" do
|
86
|
-
params = parse('create newapp
|
87
|
-
params[:
|
88
|
-
params[:directory].should == '/Users/user'
|
83
|
+
params = parse('create newapp -j jquery')[:create]
|
84
|
+
params[:directory].should == 'newapp'
|
89
85
|
params[:framework].should == 'jquery'
|
90
86
|
end
|
87
|
+
|
88
|
+
it "with a template" do
|
89
|
+
params = parse('create newapp --template blank')[:create]
|
90
|
+
params[:directory].should == 'newapp'
|
91
|
+
params[:template].should == 'blank'
|
92
|
+
end
|
91
93
|
end
|
92
94
|
|
93
95
|
describe "convert" do
|
@@ -99,7 +101,7 @@ describe Serve::Application do
|
|
99
101
|
|
100
102
|
it "with no arguments" do
|
101
103
|
params = parse('convert')[:convert]
|
102
|
-
params[:directory].should ==
|
104
|
+
params[:directory].should == '.'
|
103
105
|
params[:framework].should be_nil
|
104
106
|
end
|
105
107
|
|
@@ -119,13 +121,13 @@ describe Serve::Application do
|
|
119
121
|
|
120
122
|
it "export with just an output directory" do
|
121
123
|
params = parse('export output')[:export]
|
122
|
-
params[:input].should ==
|
124
|
+
params[:input].should == '.'
|
123
125
|
params[:output].should == 'output'
|
124
126
|
end
|
125
127
|
|
126
128
|
it "export with no arguments" do
|
127
129
|
params = parse('export')[:export]
|
128
|
-
params[:input].should ==
|
130
|
+
params[:input].should == '.'
|
129
131
|
params[:output].should == 'html'
|
130
132
|
end
|
131
133
|
end
|
@@ -141,7 +143,7 @@ describe Serve::Application do
|
|
141
143
|
args = args.split(' ')
|
142
144
|
@app.parse(*args)
|
143
145
|
end
|
144
|
-
|
146
|
+
|
145
147
|
end
|
146
148
|
|
147
149
|
describe "running" do
|