hyperloop 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -0
- data/Gemfile +1 -1
- data/README.md +89 -11
- data/Rakefile +5 -0
- data/bin/hyperloop +7 -0
- data/hyperloop.gemspec +12 -3
- data/lib/hyperloop/application.rb +56 -16
- data/lib/hyperloop/cli.rb +11 -0
- data/lib/hyperloop/generators/site/Gemfile +3 -0
- data/lib/hyperloop/generators/site/_partial.html.erb +1 -0
- data/lib/hyperloop/generators/site/about.html.erb +3 -0
- data/lib/hyperloop/generators/site/app.css +2 -0
- data/lib/hyperloop/generators/site/app.js +2 -0
- data/lib/hyperloop/generators/site/application.html.erb +23 -0
- data/lib/hyperloop/generators/site/bootstrap.css +6805 -0
- data/lib/hyperloop/generators/site/config.ru +4 -0
- data/lib/hyperloop/generators/site/current-time.coffee +3 -0
- data/lib/hyperloop/generators/site/index.html.erb +11 -0
- data/lib/hyperloop/generators/site/jquery.js +8829 -0
- data/lib/hyperloop/generators/site/main.scss +7 -0
- data/lib/hyperloop/generators/site/socool.jpg +0 -0
- data/lib/hyperloop/generators/site.rb +47 -0
- data/lib/hyperloop/response.rb +2 -2
- data/lib/hyperloop/version.rb +1 -1
- data/lib/hyperloop/view/registry.rb +90 -0
- data/lib/hyperloop/view/scope.rb +23 -0
- data/lib/hyperloop/view.rb +73 -0
- data/lib/hyperloop.rb +3 -1
- data/spec/application_spec.rb +155 -19
- data/spec/fixtures/assets/app/assets/images/my-gif.gif +0 -0
- data/spec/fixtures/assets/app/assets/images/my-jpg.jpg +0 -0
- data/spec/fixtures/assets/app/assets/images/my-png.png +0 -0
- data/spec/fixtures/assets/app/assets/javascripts/app.js +1 -0
- data/spec/fixtures/assets/app/assets/javascripts/my-scripts.coffee +1 -0
- data/spec/fixtures/assets/app/assets/shouldfail/shouldfail.css +3 -0
- data/spec/fixtures/assets/app/assets/stylesheets/app.css +1 -0
- data/spec/fixtures/assets/app/assets/stylesheets/my-styles.scss +3 -0
- data/spec/fixtures/assets/app/views/index.html.erb +7 -0
- data/spec/fixtures/assets/app/views/layouts/application.html.erb +15 -0
- data/spec/fixtures/assets/vendor/assets/javascripts/vendored.js +1 -0
- data/spec/fixtures/assets/vendor/assets/stylesheets/vendored.css +3 -0
- data/spec/fixtures/erb/app/views/about.html.erb +10 -0
- data/spec/fixtures/erb/app/views/index.html.erb +10 -0
- data/spec/fixtures/layouts/app/views/index.html.erb +3 -0
- data/spec/fixtures/layouts/app/views/layouts/application.html.erb +12 -0
- data/spec/fixtures/layouts/app/views/subdir/index.html.erb +3 -0
- data/spec/fixtures/partials/app/views/index.html.erb +3 -0
- data/spec/fixtures/partials/app/views/layouts/application.html.erb +12 -0
- data/spec/fixtures/partials/app/views/subdir/_partial.html.erb +1 -0
- data/spec/fixtures/partials/app/views/subdir/index.html.erb +3 -0
- data/spec/fixtures/partials/app/views/subdir/nonroot.html.erb +3 -0
- data/spec/response_spec.rb +3 -3
- data/spec/spec_helper.rb +34 -0
- data/spec/view/registry_spec.rb +56 -0
- data/spec/view/scope_spec.rb +21 -0
- data/spec/view_spec.rb +93 -0
- metadata +202 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2dfb955d1503bb9133c9c4f83c7813a1a65a1f41
|
4
|
+
data.tar.gz: 9321f9d51755fbeef6ef2bd694c3a129d273cbe4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c03dd0d3a042535c644e6db73be972d79783f92ed9a1231889050f3e086693aadb59d0b25716289646ba982737c2d0684c9dd1549993ca27edf4c42c10e9e94
|
7
|
+
data.tar.gz: f97317e18c1b3aa65243650b00d18fd235252799d6b740c5af0f409168e7f12e0bc98683f7424f9cd73bf76f2d0abb02dcb0081bc0b3cea2af64a26cf1e53d5c
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,24 +1,102 @@
|
|
1
|
-
# Hyperloop
|
1
|
+
# Hyperloop [![Build Status](https://travis-ci.org/jakeboxer/hyperloop.png?branch=master)](https://travis-ci.org/jakeboxer/hyperloop)
|
2
2
|
|
3
|
-
|
3
|
+
Hyperloop is a framework that lets you make static websites with a technology stack familiar to Rails programmers.
|
4
4
|
|
5
|
-
|
5
|
+
Before you keep reading, let's get one thing out of the way:
|
6
6
|
|
7
|
-
|
7
|
+
### If you think your website might need a database, do not use Hyperloop.
|
8
8
|
|
9
|
-
|
9
|
+
I came up with the idea for Hyperloop after hearing one too many experienced web developers say "I don't even know how
|
10
|
+
to set up a regular website anymore."
|
10
11
|
|
11
|
-
|
12
|
+
With Hyperloop, you can create a new site just like you would with Rails. You can write ERB and Sass and CoffeeScript
|
13
|
+
and all that other good stuff. You can use layouts and partials and deploy to Heroku.
|
12
14
|
|
13
|
-
|
15
|
+
Basically, you can do all the stuff you're used to with Rails. On top of that, you don't have to type any of the magic
|
16
|
+
incantations that just aren't necessary in a static site. You don't have to set up routes. You don't have to make
|
17
|
+
controllers with a method for every view. You don't have to think about environments or tests or schemas or helpers or
|
18
|
+
any of the other boilerplate directories/files that would clutter up a static site being shoehorned into a Rails app.
|
14
19
|
|
15
|
-
|
20
|
+
## Getting Started
|
16
21
|
|
17
|
-
|
22
|
+
1. Install Hyperloop and Thin at the command prompt if you haven't yet:
|
18
23
|
|
19
|
-
|
24
|
+
gem install hyperloop
|
25
|
+
gem install thin
|
20
26
|
|
21
|
-
|
27
|
+
2. At the command prompt, create a new Hyperloop site:
|
28
|
+
|
29
|
+
hyperloop new mysite
|
30
|
+
|
31
|
+
where "mysite" is the site name.
|
32
|
+
|
33
|
+
3. Change directory to `mysite` and start the web server:
|
34
|
+
|
35
|
+
cd mysite
|
36
|
+
thin start
|
37
|
+
|
38
|
+
4. Go to [http://localhost:3000/](http://localhost:3000/) and you'll see your brand new website!
|
39
|
+
|
40
|
+
## Structure
|
41
|
+
|
42
|
+
### Layout
|
43
|
+
|
44
|
+
Your layout is in `app/views/layouts/application.html.erb`.
|
45
|
+
|
46
|
+
### Views
|
47
|
+
|
48
|
+
Your site root is in `app/views/index.html.erb`.
|
49
|
+
|
50
|
+
If you create `app/views/hello.html.erb`, you'll be able to get to it by going to
|
51
|
+
[http://localhost:3000/hello/](http://localhost:3000/hello/).
|
52
|
+
|
53
|
+
### Subdirectories
|
54
|
+
|
55
|
+
You can nest views in subdirectories. If you create the following files, the following URLs will work:
|
56
|
+
|
57
|
+
- `app/views/people/ted_nyman.html.erb` will make [http://localhost:3000/people/ted_nyman/](http://localhost:3000/people/ted_nyman/) work.
|
58
|
+
- `app/views/people/index.html.erb` will make [http://localhost:3000/people/](http://localhost:3000/people/) work.
|
59
|
+
- `app/views/projects/2013/yeezus.html.erb` will make [http://localhost:3000/projects/2013/yeezus/](http://localhost:3000/projects/2013/yeezus/) work.
|
60
|
+
|
61
|
+
### Partials
|
62
|
+
|
63
|
+
If you create `app/views/_some_section.html.erb`, you'll be able to load it as a partial almost like you would in Rails:
|
64
|
+
|
65
|
+
``` ruby
|
66
|
+
<%= render "some_section" %>
|
67
|
+
```
|
68
|
+
|
69
|
+
Note: In Rails, it's `<%= render :partial => "some_section" %>`, since there are other things you could want to render
|
70
|
+
besides a partial. In Hyperloop, there aren't, so the options hash isn't necessary.
|
71
|
+
|
72
|
+
### CSS, SCSS, Sass, JavaScript, and CoffeeScript
|
73
|
+
|
74
|
+
If you create some files like:
|
75
|
+
|
76
|
+
```
|
77
|
+
app/assets/stylesheets/bootstrap.css
|
78
|
+
app/assets/stylesheets/stylez1.css
|
79
|
+
app/assets/stylesheets/stylez2.scss
|
80
|
+
app/assets/javascripts/jquery.js
|
81
|
+
app/assets/javascripts/scriptz1.js
|
82
|
+
app/assets/javascripts/scriptz2.coffee
|
83
|
+
```
|
84
|
+
|
85
|
+
They'll be included in all your views, so long as you have these two tags:
|
86
|
+
|
87
|
+
``` html
|
88
|
+
<!-- I suggest putting this in between <head> and </head> -->
|
89
|
+
<link href="/assets/stylesheets/app.css" media="all" rel="stylesheet" type="text/css">
|
90
|
+
|
91
|
+
<!-- I suggest putting this at the end of the document body (as in, right before </body>) -->
|
92
|
+
<script src="/assets/javascripts/app.js" type="text/javascript"></script>
|
93
|
+
```
|
94
|
+
|
95
|
+
somewhere in your layout. All your CSS and JS assets belong in these folders, including vendored ones like jQuery and Bootstrap.
|
96
|
+
|
97
|
+
### Images
|
98
|
+
|
99
|
+
If you create `app/assets/images/photo.jpg`, you'll be able to show it in a view with `<img src="/assets/images/photo.jpg">`.
|
22
100
|
|
23
101
|
## Contributing
|
24
102
|
|
data/Rakefile
CHANGED
data/bin/hyperloop
ADDED
data/hyperloop.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require "hyperloop/version"
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "hyperloop"
|
@@ -18,9 +18,18 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency
|
21
|
+
spec.add_dependency "coffee-script", "~> 2.2.0"
|
22
|
+
spec.add_dependency "rack", "~> 1.5"
|
23
|
+
spec.add_dependency "sass", "~> 3.2.12"
|
24
|
+
spec.add_dependency "sprockets", "~> 2.10.0"
|
25
|
+
spec.add_dependency "thor", "~> 0.18.1"
|
26
|
+
spec.add_dependency "tilt", "~> 1.4.1"
|
27
|
+
spec.add_dependency "yui-compressor", "~> 0.12.0"
|
22
28
|
|
23
29
|
spec.add_development_dependency "bundler", "~> 1.3"
|
30
|
+
spec.add_development_dependency "nokogiri", "~> 1.6.0"
|
31
|
+
spec.add_development_dependency "pry"
|
32
|
+
spec.add_development_dependency "pry-debugger"
|
24
33
|
spec.add_development_dependency "rake"
|
25
34
|
spec.add_development_dependency "rspec", "~> 2.14"
|
26
35
|
end
|
@@ -1,26 +1,32 @@
|
|
1
|
-
require
|
1
|
+
require "rack"
|
2
|
+
require "sprockets"
|
3
|
+
require "yui/compressor"
|
2
4
|
|
3
5
|
module Hyperloop
|
4
6
|
class Application
|
5
7
|
include Rack::Utils
|
6
8
|
|
7
9
|
def initialize(root=nil)
|
8
|
-
@root
|
9
|
-
@
|
10
|
+
@root = root
|
11
|
+
@view_registry = View::Registry.new(@root)
|
10
12
|
end
|
11
13
|
|
12
14
|
# Rack call interface.
|
13
15
|
def call(env)
|
14
16
|
request = Rack::Request.new(env)
|
15
17
|
response = Response.new
|
16
|
-
path = view_path(request)
|
17
18
|
|
18
|
-
if
|
19
|
-
# If
|
20
|
-
|
19
|
+
if self.class.asset_path?(request.path) && asset = assets[normalized_asset_path(request.path)]
|
20
|
+
# If the path is for an asset, find the specified asset and use its data
|
21
|
+
# as the response body.
|
22
|
+
response["Content-Type"] = asset.content_type
|
23
|
+
response.write(asset.source)
|
24
|
+
elsif view = @view_registry.find_template_view(normalized_request_path(request.path))
|
25
|
+
# If there's a view at the path, use its data as the response body.
|
26
|
+
data = view.render(request)
|
21
27
|
response.write(data)
|
22
28
|
else
|
23
|
-
# If there's no
|
29
|
+
# If there's no view at the path, 404.
|
24
30
|
response.status = 404
|
25
31
|
end
|
26
32
|
|
@@ -29,17 +35,51 @@ module Hyperloop
|
|
29
35
|
|
30
36
|
private
|
31
37
|
|
32
|
-
# Internal:
|
38
|
+
# Internal: Is the specified path for assets?
|
33
39
|
#
|
34
|
-
#
|
40
|
+
# path - Path to check.
|
35
41
|
#
|
36
|
-
# Returns a
|
37
|
-
def
|
38
|
-
path
|
42
|
+
# Returns a boolean.
|
43
|
+
def self.asset_path?(path)
|
44
|
+
path =~ /^\/assets\/(images|javascripts|stylesheets)\//
|
45
|
+
end
|
46
|
+
|
47
|
+
# Internal: The sprockets environment for the app.
|
48
|
+
#
|
49
|
+
# Returns a Sprockets::Environment.
|
50
|
+
def assets
|
51
|
+
@assets ||= Sprockets::Environment.new do |env|
|
52
|
+
env.append_path(File.join(@root, "app", "assets"))
|
53
|
+
env.append_path(File.join(@root, "vendor", "assets"))
|
54
|
+
|
55
|
+
# compress everything in production
|
56
|
+
if ENV["RACK_ENV"] == "production"
|
57
|
+
env.js_compressor = YUI::JavaScriptCompressor.new(:munge => true)
|
58
|
+
env.css_compressor = YUI::CssCompressor.new
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Internal: Get a normalized version of the specified asset path.
|
64
|
+
#
|
65
|
+
# path - Asset path to normalize
|
66
|
+
#
|
67
|
+
# Returns a string.
|
68
|
+
def normalized_asset_path(path)
|
69
|
+
path.sub(/^\/assets\//, "")
|
70
|
+
end
|
39
71
|
|
40
|
-
|
41
|
-
|
42
|
-
|
72
|
+
# Internal: Get a normalized version of the specified request path.
|
73
|
+
#
|
74
|
+
# path - Request path to normalize
|
75
|
+
#
|
76
|
+
# Returns a string.
|
77
|
+
def normalized_request_path(path)
|
78
|
+
if path == "/"
|
79
|
+
path
|
80
|
+
else
|
81
|
+
path.chomp("/")
|
82
|
+
end
|
43
83
|
end
|
44
84
|
end
|
45
85
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "hyperloop/generators/site"
|
2
|
+
require "thor"
|
3
|
+
|
4
|
+
module Hyperloop
|
5
|
+
class CLI < Thor
|
6
|
+
desc "new SITENAME", "Create a new Hyperloop site. \"hyperloop new my_site\" creates a new site called MySite in \"./my_site\""
|
7
|
+
def new(name)
|
8
|
+
Hyperloop::Generators::Site.start([name])
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<p>Here's a partial! You know it's a partial because the filename starts with an underscore.</p>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title><%= name.capitalize %></title>
|
5
|
+
|
6
|
+
<link href="/assets/stylesheets/app.css" media="all" rel="stylesheet" type="text/css">
|
7
|
+
</head>
|
8
|
+
|
9
|
+
<body>
|
10
|
+
<h1>Welcome to <%= name.capitalize %>!</h1>
|
11
|
+
|
12
|
+
<nav>
|
13
|
+
<ul>
|
14
|
+
<li><a href="/">Home</a></li>
|
15
|
+
<li><a href="/about">About</a></li>
|
16
|
+
</ul>
|
17
|
+
</nav>
|
18
|
+
|
19
|
+
<%%= yield %>
|
20
|
+
|
21
|
+
<script src="/assets/javascripts/app.js" type="text/javascript"></script>
|
22
|
+
</body>
|
23
|
+
</html>
|