hyperloop 0.0.2 → 0.0.3
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/.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 [](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>
|