hotchkiss 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE.txt +24 -0
- data/bin/hk +35 -0
- data/lib/hotchkiss/application.rb +62 -0
- data/lib/hotchkiss/controller.rb +48 -0
- data/lib/hotchkiss/errors.rb +0 -0
- data/lib/hotchkiss/fast_responder.rb +18 -0
- data/lib/hotchkiss/router.rb +52 -0
- data/lib/hotchkiss/server.rb +27 -0
- data/lib/hotchkiss/templates/new/Gemfile +7 -0
- data/lib/hotchkiss/templates/new/code/app/controllers/application_controller.rb +3 -0
- data/lib/hotchkiss/templates/new/code/app/routes.rb +3 -0
- data/lib/hotchkiss/templates/new/code/app/views/application.html.erb +11 -0
- data/lib/hotchkiss/templates/new/config/database.rb +1 -0
- data/lib/hotchkiss/templates/new/config/init.rb +8 -0
- data/lib/hotchkiss/templates/new/config.ru +10 -0
- data/lib/hotchkiss/templates/new/public/favicon.ico +0 -0
- data/lib/hotchkiss.rb +11 -0
- metadata +144 -0
data/LICENSE.txt
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
* Copyright (c) 2012, Thibaut Deloffre
|
2
|
+
* All rights reserved.
|
3
|
+
* Redistribution and use in source and binary forms, with or without
|
4
|
+
* modification, are permitted provided that the following conditions are met:
|
5
|
+
*
|
6
|
+
* * Redistributions of source code must retain the above copyright
|
7
|
+
* notice, this list of conditions and the following disclaimer.
|
8
|
+
* * Redistributions in binary form must reproduce the above copyright
|
9
|
+
* notice, this list of conditions and the following disclaimer in the
|
10
|
+
* documentation and/or other materials provided with the distribution.
|
11
|
+
* * Neither the name of RocknRoot nor the names of its contributors may
|
12
|
+
* be used to endorse or promote products derived from this software
|
13
|
+
* without specific prior written permission.
|
14
|
+
*
|
15
|
+
* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY
|
16
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
17
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
18
|
+
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
|
19
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
20
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
21
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
22
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
23
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
24
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/bin/hk
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'thor'
|
4
|
+
require 'rack'
|
5
|
+
require 'tilt'
|
6
|
+
require 'hotchkiss'
|
7
|
+
|
8
|
+
class Generator < Thor
|
9
|
+
|
10
|
+
TEMPLATE_DIR = Gem::Specification.find_by_name("hotchkiss").gem_dir +
|
11
|
+
"/lib/hotchkiss/templates/"
|
12
|
+
|
13
|
+
desc "new NAME", "Create new hotchkiss application directories with skel files."
|
14
|
+
def new(name)
|
15
|
+
dir = Dir.pwd + '/' + name
|
16
|
+
FileUtils.mkdir(dir)
|
17
|
+
FileUtils.cp_r(TEMPLATE_DIR + "new/.", dir)
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "server", "Run development server"
|
21
|
+
def server(port = nil)
|
22
|
+
port ||= 3000
|
23
|
+
host ||= "127.0.0.1"
|
24
|
+
[:INT, :TERM].each { |sig| trap(sig) { exit } }
|
25
|
+
options = {}
|
26
|
+
options[:Host] = host
|
27
|
+
options[:Port] = port
|
28
|
+
options[:config] = "config.ru"
|
29
|
+
options[:server] = :webrick
|
30
|
+
HK::Server.start!(options)
|
31
|
+
end
|
32
|
+
|
33
|
+
end # Generator
|
34
|
+
|
35
|
+
Generator.start(ARGV)
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'rack/utils'
|
2
|
+
|
3
|
+
module HK
|
4
|
+
|
5
|
+
class Application
|
6
|
+
|
7
|
+
@@router = nil
|
8
|
+
@@root = nil
|
9
|
+
@@favicon = nil
|
10
|
+
|
11
|
+
attr_accessor :router, :root
|
12
|
+
|
13
|
+
def self.router=(router)
|
14
|
+
@@router = router if @@router.nil?
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.root=(root)
|
18
|
+
@@root = root if @@root.nil?
|
19
|
+
begin
|
20
|
+
@@favicon = File.read(File.join("#{root}/public/favicon.ico"))
|
21
|
+
rescue
|
22
|
+
@@favicon = nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.root
|
27
|
+
@@root
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.favicon
|
31
|
+
@@favicon
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.burnbabyburn!
|
35
|
+
lambda do |env|
|
36
|
+
begin
|
37
|
+
route = @@router.match?(env)
|
38
|
+
if !route.nil? && route.has_key?(:special)
|
39
|
+
env['hk.controller'] = route[:controller]
|
40
|
+
elsif !route.nil?
|
41
|
+
env['hk.controller'] = "#{route[:controller].capitalize}Controller"
|
42
|
+
else
|
43
|
+
raise Exception, "Unknown route for path: #{env['REQUEST_PATH']}"
|
44
|
+
end
|
45
|
+
env['hk.action'] = route[:action]
|
46
|
+
Object.const_get(env['hk.controller']).new.call(env)
|
47
|
+
rescue Exception => e
|
48
|
+
env['hk.action'] = "on_exception"
|
49
|
+
env['hk.exception'] = e
|
50
|
+
if Object.const_get("ApplicationController").instance_methods(false).include?(:on_exception)
|
51
|
+
env['hk.controller'] = :ApplicationController
|
52
|
+
else
|
53
|
+
env['hk.controller'] = :FastResponder
|
54
|
+
end
|
55
|
+
Object.const_get(env['hk.controller']).new.call(env)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end # Application
|
61
|
+
|
62
|
+
end ## HK
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module HK
|
2
|
+
|
3
|
+
class Controller
|
4
|
+
|
5
|
+
def call(env)
|
6
|
+
@request = Rack::Request.new(env)
|
7
|
+
@response = Rack::Response.new()
|
8
|
+
resp = self.send(env['hk.action'])
|
9
|
+
@response.write(resp)
|
10
|
+
@response.finish
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def params
|
16
|
+
@request.params
|
17
|
+
end
|
18
|
+
|
19
|
+
def redirect_to(url)
|
20
|
+
@response.redirect(url)
|
21
|
+
end
|
22
|
+
|
23
|
+
def render(tpl_name = nil)
|
24
|
+
full_ctrl_name = @request.env['hk.controller']
|
25
|
+
# "ApplicationController" -> "Application".
|
26
|
+
full_ctrl_name = full_ctrl_name[0..-11]
|
27
|
+
tpl_name ||= @request.env['hk.action']
|
28
|
+
tpl_name = '/' + tpl_name.to_s + '.html.erb'
|
29
|
+
controller_dir = full_ctrl_name.downcase
|
30
|
+
view_dir = HK::Application.root + "/code/app/views/"
|
31
|
+
tpl_path = view_dir + controller_dir + tpl_name
|
32
|
+
layout_path = view_dir + "application.html.erb"
|
33
|
+
Tilt.new(layout_path).render(self) do
|
34
|
+
Tilt.new(tpl_path).render(self)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def request
|
39
|
+
@request
|
40
|
+
end
|
41
|
+
|
42
|
+
def status(code)
|
43
|
+
@response.status = code.to_i
|
44
|
+
end
|
45
|
+
|
46
|
+
end # Controller
|
47
|
+
|
48
|
+
end ## HK
|
File without changes
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class FastResponder < HK::Controller
|
2
|
+
|
3
|
+
def favicon
|
4
|
+
@favicon = HK::Application.favicon
|
5
|
+
status @favicon.nil? ? 500 : 200
|
6
|
+
@favicon
|
7
|
+
end
|
8
|
+
|
9
|
+
def on_exception
|
10
|
+
e = request.env["hk.exception"]
|
11
|
+
status 500
|
12
|
+
@class = e.class
|
13
|
+
@message = e.message
|
14
|
+
@backtrace = e.backtrace
|
15
|
+
"<html><title>ERROR</title><body>#{@class} : #{@message}<br />#{@backtrace.join("<br />")}</body><html>"
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module HK
|
2
|
+
|
3
|
+
class Router
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@routes = []
|
7
|
+
yield(self)
|
8
|
+
finish
|
9
|
+
compute
|
10
|
+
end
|
11
|
+
|
12
|
+
def bind(path, infos)
|
13
|
+
route = {}
|
14
|
+
route[:path] = path
|
15
|
+
route = route.merge!(infos)
|
16
|
+
@routes << route
|
17
|
+
end
|
18
|
+
|
19
|
+
def root(infos)
|
20
|
+
raise TypeError unless infos.is_a?(Hash)
|
21
|
+
bind("/", infos)
|
22
|
+
end
|
23
|
+
|
24
|
+
def match?(env)
|
25
|
+
method = env['REQUEST_METHOD']
|
26
|
+
path = env['REQUEST_PATH'].eql?("/") ? "/" : env['REQUEST_PATH'].gsub(/\/$/, '')
|
27
|
+
@routes.each do |route|
|
28
|
+
if path.match(route[:regexp])
|
29
|
+
return route
|
30
|
+
end
|
31
|
+
end
|
32
|
+
return nil
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def compute
|
38
|
+
@routes.each do |route|
|
39
|
+
computed_route = route[:path].gsub!(/((:\w+)|\*)/, /(\w+)/.to_s)
|
40
|
+
computed_route = "^#{route[:path]}$" if computed_route.nil?
|
41
|
+
computed_route = Regexp.new(computed_route)
|
42
|
+
route[:regexp] = computed_route
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def finish
|
47
|
+
@routes << {:path => "/favicon.ico", :action => "favicon", :controller => :FastResponder, :special => true}
|
48
|
+
end
|
49
|
+
|
50
|
+
end # Router
|
51
|
+
|
52
|
+
end ## HK
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module HK
|
2
|
+
|
3
|
+
class Server < Rack::Server
|
4
|
+
|
5
|
+
def initialize(options)
|
6
|
+
@options = options
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.start!(options)
|
10
|
+
new(options).start
|
11
|
+
end
|
12
|
+
|
13
|
+
def options
|
14
|
+
@options
|
15
|
+
end
|
16
|
+
|
17
|
+
def start
|
18
|
+
time = Time.now.strftime("%Y-%m-%d %H:%M:%S")
|
19
|
+
puts "[#{time}] => Hotchkiss - #{HK::VERSION} version"
|
20
|
+
puts "[#{time}] => It rolls on http://#{options[:Host]}:#{options[:Port]}"
|
21
|
+
[:INT, :TERM].each { |sig| trap(sig) { exit } }
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
end # Server
|
26
|
+
|
27
|
+
end ## HK
|
@@ -0,0 +1 @@
|
|
1
|
+
# In 0.0.2
|
Binary file
|
data/lib/hotchkiss.rb
ADDED
metadata
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hotchkiss
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Thibaut Deloffre
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-03-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: thor
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rack
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: tilt
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
description: Ruby web framework
|
95
|
+
email: tib@rocknroot.org
|
96
|
+
executables:
|
97
|
+
- hk
|
98
|
+
extensions: []
|
99
|
+
extra_rdoc_files:
|
100
|
+
- LICENSE.txt
|
101
|
+
files:
|
102
|
+
- lib/hotchkiss/fast_responder.rb
|
103
|
+
- lib/hotchkiss/templates/new/Gemfile
|
104
|
+
- lib/hotchkiss/templates/new/public/favicon.ico
|
105
|
+
- lib/hotchkiss/templates/new/config.ru
|
106
|
+
- lib/hotchkiss/templates/new/code/app/routes.rb
|
107
|
+
- lib/hotchkiss/templates/new/code/app/controllers/application_controller.rb
|
108
|
+
- lib/hotchkiss/templates/new/code/app/views/application.html.erb
|
109
|
+
- lib/hotchkiss/templates/new/config/database.rb
|
110
|
+
- lib/hotchkiss/templates/new/config/init.rb
|
111
|
+
- lib/hotchkiss/errors.rb
|
112
|
+
- lib/hotchkiss/server.rb
|
113
|
+
- lib/hotchkiss/application.rb
|
114
|
+
- lib/hotchkiss/controller.rb
|
115
|
+
- lib/hotchkiss/router.rb
|
116
|
+
- lib/hotchkiss.rb
|
117
|
+
- LICENSE.txt
|
118
|
+
- bin/hk
|
119
|
+
homepage: https://github.com/RocknRoot/hotchkiss
|
120
|
+
licenses:
|
121
|
+
- BSD
|
122
|
+
post_install_message:
|
123
|
+
rdoc_options: []
|
124
|
+
require_paths:
|
125
|
+
- lib
|
126
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
128
|
+
requirements:
|
129
|
+
- - ! '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
+
none: false
|
134
|
+
requirements:
|
135
|
+
- - ! '>='
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
requirements: []
|
139
|
+
rubyforge_project:
|
140
|
+
rubygems_version: 1.8.24
|
141
|
+
signing_key:
|
142
|
+
specification_version: 3
|
143
|
+
summary: It rolls !
|
144
|
+
test_files: []
|