hyper 0.3.0beta1
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/README.md +81 -0
- data/bin/hyper +24 -0
- data/lib/hyper.rb +40 -0
- data/lib/hyper/generator.rb +109 -0
- data/lib/hyper/response.rb +34 -0
- data/lib/hyper/static.rb +25 -0
- data/lib/hyper/template/Gemfile +1 -0
- data/lib/hyper/template/config.ru +11 -0
- data/lib/hyper/template/templates/layout.html.erb +9 -0
- data/lib/hyper/template/templates/views/index.html.erb +1 -0
- data/lib/hyper/utils.rb +34 -0
- data/lib/hyper/version.rb +11 -0
- metadata +141 -0
data/README.md
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# Hyper
|
2
|
+
|
3
|
+
Hyper is a dead simple, zero-config framework for static HTML websites. Use it to create small HTML sites with static content; host your site anywhere that supports Rack.
|
4
|
+
|
5
|
+
## Quick Start
|
6
|
+
|
7
|
+
Five steps from install to a functioning website:
|
8
|
+
|
9
|
+
$ gem install hyper
|
10
|
+
$ hyper new my_website
|
11
|
+
$ cd my_website
|
12
|
+
$ bundle install
|
13
|
+
$ bundle exec rackup
|
14
|
+
|
15
|
+
Point your browser at <a href="http://0.0.0.0:9292/">0.0.0.0:9292</a> and you'll see your website's home page.
|
16
|
+
|
17
|
+
## Adding Content
|
18
|
+
|
19
|
+
To add content to your site, you just need to know two things:
|
20
|
+
|
21
|
+
1. Shared content (stuff that goes on every page of your website) goes in <code>templates/layout.html.erb</code>
|
22
|
+
2. Page-specific content goes in <code>templates/views/{page}.html.erb</code>
|
23
|
+
|
24
|
+
Put your navigation and header in <code>layout.html.erb</code>. Put the content for your about page in <code>views/about.html.erb</code> (link to the page using <code>/about</code>). It's that simple.
|
25
|
+
|
26
|
+
Also note: your home page content goes in <code>views/index.html.erb</code>; Hyper knows to map the root URL to that file.
|
27
|
+
|
28
|
+
## Stylesheets, Images, Javascripts, Etc
|
29
|
+
|
30
|
+
Put your stylesheets, images, javascripts, etc in <code>public</code>: Hyper will handle the rest. When referencing these files in your HTML, drop the "public" from the path — <code>public/images/logo.png</code> should become <code><img src="/images/logo.png" /></code>.
|
31
|
+
|
32
|
+
## Deployment
|
33
|
+
|
34
|
+
If you love Heroku, deployment is easy:
|
35
|
+
|
36
|
+
$ cd my_website
|
37
|
+
$ heroku create
|
38
|
+
$ git push heroku master
|
39
|
+
|
40
|
+
Any other rack-compatible host should work too.
|
41
|
+
|
42
|
+
## In-Depth
|
43
|
+
|
44
|
+
There's not a whole lot of depth to go into: hyper is intentionally simple. Once you've generated a new site, you'll get the following files and folders:
|
45
|
+
|
46
|
+
<table>
|
47
|
+
<tr>
|
48
|
+
<th>File/Folder</th>
|
49
|
+
<th>Info</th>
|
50
|
+
</tr>
|
51
|
+
<tr>
|
52
|
+
<td><code>templates/layout.html.erb</code></td>
|
53
|
+
<td>The layout for your website. Stuff that's the same on every page (header, navigation, etc) should go here</td>
|
54
|
+
</tr>
|
55
|
+
<tr>
|
56
|
+
<td><code>templates/views</code></td>
|
57
|
+
<td>This is where your page-specific content lives. See "Adding Content for more details"</td>
|
58
|
+
</tr>
|
59
|
+
<tr>
|
60
|
+
<td><code>public</code></td>
|
61
|
+
<td>Put your static assets here</td>
|
62
|
+
</tr>
|
63
|
+
<tr>
|
64
|
+
<td><code>config.ru</code></td>
|
65
|
+
<td>Your site's rack config file. Customize your rack app here (if you don't know rack, just ignore this file)</td>
|
66
|
+
</tr>
|
67
|
+
<tr>
|
68
|
+
<td><code>Gemfile</code></td>
|
69
|
+
<td>For use with Bundler</td>
|
70
|
+
</tr>
|
71
|
+
</table>
|
72
|
+
|
73
|
+
Defaults are set so you don't have to worry about anything outside <code>templates</code> if you don't want to. If you understand rack and want to add middleware, do that in <code>config.ru</code> (but note that Hyper already knows to serve static content from <code>public</code>, so you don't need to use <code>Rack::Static</code>).
|
74
|
+
|
75
|
+
## Author
|
76
|
+
|
77
|
+
I'm <a href="http://www.jameswilding.net">James Wilding</a> and I make Ruby and Rails software.
|
78
|
+
|
79
|
+
## License
|
80
|
+
|
81
|
+
Hyper is released under <a href="http://www.opensource.org/licenses/mit-license.php">the MIT license</a>.
|
data/bin/hyper
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'hyper'
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
options = {}
|
6
|
+
parser = OptionParser.new do |opts|
|
7
|
+
opts.banner = "Usage: hyper new NAME [options]"
|
8
|
+
|
9
|
+
opts.on('-f', '--force', 'Overwrite existing files') do
|
10
|
+
options[:force] = true
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
case ARGV.first
|
15
|
+
when 'new'
|
16
|
+
if name = ARGV[1]
|
17
|
+
parser.parse!
|
18
|
+
Hyper::Generator.new(name, options).generate
|
19
|
+
else
|
20
|
+
puts "Please provide a name"
|
21
|
+
end
|
22
|
+
else
|
23
|
+
puts parser.help
|
24
|
+
end
|
data/lib/hyper.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rack/builder'
|
2
|
+
|
3
|
+
module Hyper
|
4
|
+
autoload :Generator, 'hyper/generator'
|
5
|
+
autoload :Response, 'hyper/response'
|
6
|
+
autoload :Static, 'hyper/static'
|
7
|
+
autoload :Utils, 'hyper/utils'
|
8
|
+
autoload :Version, 'hyper/version'
|
9
|
+
|
10
|
+
extend self
|
11
|
+
|
12
|
+
# @api public
|
13
|
+
def call(env)
|
14
|
+
builder = Rack::Builder.new do
|
15
|
+
use Hyper::Static
|
16
|
+
run Hyper::Response.new
|
17
|
+
end
|
18
|
+
|
19
|
+
builder.to_app.call(env)
|
20
|
+
end
|
21
|
+
|
22
|
+
# @api public
|
23
|
+
def root
|
24
|
+
Pathname.new(Dir.pwd)
|
25
|
+
end
|
26
|
+
|
27
|
+
# @api public
|
28
|
+
def template_root=(path)
|
29
|
+
@template_root = Pathname.new(path)
|
30
|
+
end
|
31
|
+
|
32
|
+
def view_root
|
33
|
+
@view_root ||= template_root.join('views')
|
34
|
+
end
|
35
|
+
|
36
|
+
# @api private
|
37
|
+
def template_root
|
38
|
+
@template_root ||= root.join('templates')
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'term/ansicolor'
|
2
|
+
|
3
|
+
module Hyper
|
4
|
+
# @api private
|
5
|
+
class Generator
|
6
|
+
include Term::ANSIColor
|
7
|
+
|
8
|
+
def initialize(name, options = {})
|
9
|
+
@name = name
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def generate
|
14
|
+
if cannot_generate?
|
15
|
+
error "#{@name} exists (use --force to overwrite)"
|
16
|
+
else
|
17
|
+
create_destination_folder
|
18
|
+
|
19
|
+
template_contents.each do |path|
|
20
|
+
generate_component(path)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def cannot_generate?
|
26
|
+
File.directory?(destination_folder) && !@options[:force]
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
# Paths
|
31
|
+
|
32
|
+
# Returns a glob of paths for files and folders in Hyper's template directory.
|
33
|
+
def template_contents
|
34
|
+
Dir[File.join(template_path, '**/*')]
|
35
|
+
end
|
36
|
+
|
37
|
+
# Returns the path to Hyper's template directory.
|
38
|
+
def template_path
|
39
|
+
File.expand_path(File.dirname(__FILE__) + '/template')
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns a path to use for creating a new file inside the destination directory.
|
43
|
+
def destination_path(path)
|
44
|
+
File.join(destination_folder, common_component_path(path))
|
45
|
+
end
|
46
|
+
|
47
|
+
# Returns the path for the new site directory the user wants to create.
|
48
|
+
def destination_folder
|
49
|
+
File.join(Dir.pwd, @name)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Returns the path component which is shared between template and destination.
|
53
|
+
#
|
54
|
+
# Example:
|
55
|
+
#
|
56
|
+
# path = /users/bob/code/hyper/lib/hyper/template/config.ru
|
57
|
+
# common_component_path(path) # => '/config.ru'
|
58
|
+
#
|
59
|
+
# Used to build destination paths.
|
60
|
+
def common_component_path(path)
|
61
|
+
path.sub(template_path, '')
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns an easy to understand string representing and installation path.
|
65
|
+
#
|
66
|
+
# Example:
|
67
|
+
#
|
68
|
+
# generator = Hyper::Generator.new('my_site')
|
69
|
+
# path = /users/bob/code/hyper/lib/hyper/template/config.ru
|
70
|
+
#
|
71
|
+
# human_component_path(path) # => 'my_site/config.ru'
|
72
|
+
#
|
73
|
+
# Used in CLI output.
|
74
|
+
def human_component_path(path)
|
75
|
+
File.join(@name, common_component_path(path))
|
76
|
+
end
|
77
|
+
|
78
|
+
# Actions
|
79
|
+
def create_destination_folder
|
80
|
+
unless File.directory?(destination_folder)
|
81
|
+
run "mkdir #{destination_folder}"
|
82
|
+
created @name
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Copies a file or folder from Hyper's template to a new site folder.
|
87
|
+
def generate_component(path)
|
88
|
+
run "cp -r #{path} #{destination_path(path)}"
|
89
|
+
created human_component_path(path)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Helpers
|
93
|
+
def created(path)
|
94
|
+
say :created, path, :green
|
95
|
+
end
|
96
|
+
|
97
|
+
def error(message)
|
98
|
+
say :error, message, :red
|
99
|
+
end
|
100
|
+
|
101
|
+
def say(status, message, color)
|
102
|
+
puts "#{send color}#{status} #{bold}#{message}#{reset}"
|
103
|
+
end
|
104
|
+
|
105
|
+
def run(command)
|
106
|
+
system command
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rack/request'
|
2
|
+
require 'tilt'
|
3
|
+
|
4
|
+
|
5
|
+
module Hyper
|
6
|
+
# @api private
|
7
|
+
class Response
|
8
|
+
def call(env)
|
9
|
+
request = Rack::Request.new(env)
|
10
|
+
headers = {'Content-Type' => 'text/html'}
|
11
|
+
layout = Utils.layout_path
|
12
|
+
view = Utils.view_path(request.path)
|
13
|
+
|
14
|
+
if File.file?(view)
|
15
|
+
status = 200
|
16
|
+
body = render_templates(layout, view)
|
17
|
+
else
|
18
|
+
status = 404
|
19
|
+
body = "404 Not Found: #{request.path}"
|
20
|
+
end
|
21
|
+
|
22
|
+
[status, headers, StringIO.new(body)]
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def render_templates(layout, view)
|
27
|
+
render_erb(layout) { render_erb(view) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def render_erb(template, &block)
|
31
|
+
Tilt.new(template, :trim => '-').render(&block)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/hyper/static.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'rack/builder'
|
2
|
+
|
3
|
+
module Hyper
|
4
|
+
# @api private
|
5
|
+
class Static
|
6
|
+
class << self
|
7
|
+
def urls
|
8
|
+
Dir[Hyper.root.join('public/**/*')].map do |file|
|
9
|
+
file.sub(Hyper.root.join('public'), '')
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(app)
|
15
|
+
@app = Rack::Builder.new do
|
16
|
+
use Rack::Static, :urls => Hyper::Static.urls, :root => 'public'
|
17
|
+
run app
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def call(env)
|
22
|
+
@app.call(env)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
gem 'hyper'
|
@@ -0,0 +1 @@
|
|
1
|
+
<p>Find me in <%= __FILE__ -%></p>
|
data/lib/hyper/utils.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
module Hyper
|
2
|
+
# @api private
|
3
|
+
module Utils
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def layout_path
|
7
|
+
File.join(Hyper.template_root, 'layout.html.erb')
|
8
|
+
end
|
9
|
+
|
10
|
+
def view_path(url)
|
11
|
+
File.join(Hyper.template_root, 'views', normalize_url(url) + '.html.erb')
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
# Attempts to standardize URLs by adding 'index' to URLs
|
16
|
+
# which end in "/". Also replaces an empty URL with 'index'.
|
17
|
+
#
|
18
|
+
# normalize_url('') # => '/index'
|
19
|
+
# normalize_url('/') # => '/index'
|
20
|
+
# normalize_url('/folder/') # => '/folder/index'
|
21
|
+
# normalize_url('/page') # => '/page'
|
22
|
+
#
|
23
|
+
# @return [String]
|
24
|
+
def normalize_url(url)
|
25
|
+
if ['', '/'].include?(url) # Root URL
|
26
|
+
'/index'
|
27
|
+
elsif url =~ /.+\/$/ # Folder indexes
|
28
|
+
File.join(url, 'index')
|
29
|
+
else # Everything else
|
30
|
+
url
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hyper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 62196369
|
5
|
+
prerelease: 5
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
- beta
|
11
|
+
- 1
|
12
|
+
version: 0.3.0beta1
|
13
|
+
platform: ruby
|
14
|
+
authors:
|
15
|
+
- James Wilding
|
16
|
+
autorequire:
|
17
|
+
bindir: bin
|
18
|
+
cert_chain: []
|
19
|
+
|
20
|
+
date: 2011-05-18 00:00:00 +01:00
|
21
|
+
default_executable:
|
22
|
+
dependencies:
|
23
|
+
- !ruby/object:Gem::Dependency
|
24
|
+
name: rack
|
25
|
+
prerelease: false
|
26
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
hash: 27
|
32
|
+
segments:
|
33
|
+
- 1
|
34
|
+
- 2
|
35
|
+
- 2
|
36
|
+
version: 1.2.2
|
37
|
+
type: :runtime
|
38
|
+
version_requirements: *id001
|
39
|
+
- !ruby/object:Gem::Dependency
|
40
|
+
name: tilt
|
41
|
+
prerelease: false
|
42
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
hash: 21
|
48
|
+
segments:
|
49
|
+
- 1
|
50
|
+
- 0
|
51
|
+
- 1
|
52
|
+
version: 1.0.1
|
53
|
+
type: :runtime
|
54
|
+
version_requirements: *id002
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: term-ansicolor
|
57
|
+
prerelease: false
|
58
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
hash: 3
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
version: "0"
|
67
|
+
type: :runtime
|
68
|
+
version_requirements: *id003
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 3
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
version: "0"
|
81
|
+
type: :development
|
82
|
+
version_requirements: *id004
|
83
|
+
description: Hyper is a dead simple, zero-config, drop-in framework for static websites on ruby + rack
|
84
|
+
email: office@jameswilding.net
|
85
|
+
executables:
|
86
|
+
- hyper
|
87
|
+
extensions: []
|
88
|
+
|
89
|
+
extra_rdoc_files: []
|
90
|
+
|
91
|
+
files:
|
92
|
+
- lib/hyper/generator.rb
|
93
|
+
- lib/hyper/response.rb
|
94
|
+
- lib/hyper/static.rb
|
95
|
+
- lib/hyper/template/config.ru
|
96
|
+
- lib/hyper/template/Gemfile
|
97
|
+
- lib/hyper/template/templates/layout.html.erb
|
98
|
+
- lib/hyper/template/templates/views/index.html.erb
|
99
|
+
- lib/hyper/utils.rb
|
100
|
+
- lib/hyper/version.rb
|
101
|
+
- lib/hyper.rb
|
102
|
+
- README.md
|
103
|
+
- bin/hyper
|
104
|
+
has_rdoc: true
|
105
|
+
homepage: http://github.com/jameswilding/hyper
|
106
|
+
licenses: []
|
107
|
+
|
108
|
+
post_install_message:
|
109
|
+
rdoc_options: []
|
110
|
+
|
111
|
+
require_paths:
|
112
|
+
- lib
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 3
|
119
|
+
segments:
|
120
|
+
- 0
|
121
|
+
version: "0"
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ">"
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
hash: 25
|
128
|
+
segments:
|
129
|
+
- 1
|
130
|
+
- 3
|
131
|
+
- 1
|
132
|
+
version: 1.3.1
|
133
|
+
requirements: []
|
134
|
+
|
135
|
+
rubyforge_project:
|
136
|
+
rubygems_version: 1.6.2
|
137
|
+
signing_key:
|
138
|
+
specification_version: 3
|
139
|
+
summary: Zero-config framework for static websites
|
140
|
+
test_files: []
|
141
|
+
|