gokart 0.0.4 → 0.0.5
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/assets/config/config-debug.json +22 -0
- data/assets/config/config-release.json +22 -0
- data/assets/config.rb +1 -1
- data/assets/src/server/config/config.go +46 -0
- data/assets/src/server/controller/home.go +43 -0
- data/assets/src/server/controller/static_assets.go +57 -0
- data/assets/src/server/main.go +59 -17
- data/assets/src/server/view/home.go +28 -0
- data/assets/src/www/app/erb_helpers/erb_helper.rb +4 -2
- data/assets/src/www/app/scripts/application.js.coffee +9 -4
- data/assets/src/www/app/scripts/pages/home.js +6 -0
- data/assets/src/www/app/scripts/vendor_wrapper.js +11 -0
- data/assets/src/www/app/templates/application.gotmpl +5 -2
- data/assets/src/www/app/templates/base.gotmpl.erb +1 -1
- data/assets/src/www/app/templates/{home.gotmpl → pages/home.gotmpl} +12 -7
- data/assets/src/www/app/templates/partials/test.gotmpl +3 -0
- data/assets/src/www/app/templates/partials/test2.gotmpl +5 -0
- data/assets/src/www/app/templates/partials_end.gotmpl +1 -0
- data/assets/src/www/app/templates/partials_start.gotmpl +1 -0
- data/assets/src/www/spec/all-spec.js +1 -1
- data/assets/src/www/spec/helpers/mocks.coffee +1 -1
- data/assets/src/www/vendor/js/backbone.js +1478 -0
- data/assets/src/www/vendor/js/mustache.js +625 -0
- data/assets/src/www/vendor/js/underscore-min.js +5 -0
- data/assets/src/www/vendor/js/underscore.js +1204 -0
- data/assets/tasks/server.rake +9 -9
- data/assets/tasks/www.rake +2 -18
- data/bin/gokart +7 -0
- data/lib/gokart/base.rb +1 -1
- data/lib/gokart/environment.rb +27 -1
- data/lib/gokart/version.rb +1 -1
- metadata +49 -38
- data/assets/src/server/http_handler.go +0 -139
- data/assets/src/server/my_test.go +0 -13
- data/assets/src/server/templates.go +0 -42
- data/assets/src/www/app/partials/index.html +0 -92
- data/assets/src/www/app/scripts/main.js.coffee +0 -9
@@ -0,0 +1,22 @@
|
|
1
|
+
{
|
2
|
+
"templates": "./bin/assets/templates/*.gotmpl",
|
3
|
+
"assets": "./bin/assets/www-debug",
|
4
|
+
|
5
|
+
"urlAssets": "/assets/",
|
6
|
+
"urlRoot": "/",
|
7
|
+
|
8
|
+
"static": true,
|
9
|
+
"debug": true,
|
10
|
+
|
11
|
+
"http": {
|
12
|
+
"port": 8080,
|
13
|
+
"address": ""
|
14
|
+
},
|
15
|
+
|
16
|
+
"https": {
|
17
|
+
"port": 8081,
|
18
|
+
"address": "",
|
19
|
+
"key": "",
|
20
|
+
"cert": ""
|
21
|
+
}
|
22
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
{
|
2
|
+
"templates": "./bin/assets/templates/*.gotmpl",
|
3
|
+
"assets": "./bin/assets/www-min",
|
4
|
+
|
5
|
+
"urlAssets": "/assets/",
|
6
|
+
"urlRoot": "/",
|
7
|
+
|
8
|
+
"static": true,
|
9
|
+
"debug": false,
|
10
|
+
|
11
|
+
"http": {
|
12
|
+
"port": 8080,
|
13
|
+
"address": ""
|
14
|
+
},
|
15
|
+
|
16
|
+
"https": {
|
17
|
+
"port": 8081,
|
18
|
+
"address": "",
|
19
|
+
"key": "",
|
20
|
+
"cert": ""
|
21
|
+
}
|
22
|
+
}
|
data/assets/config.rb
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
package config
|
2
|
+
|
3
|
+
import (
|
4
|
+
"fmt"
|
5
|
+
"github.com/jasondelponte/golib/config"
|
6
|
+
"net"
|
7
|
+
"path"
|
8
|
+
)
|
9
|
+
|
10
|
+
type Config struct {
|
11
|
+
Http struct {
|
12
|
+
Address string `json:"address"`
|
13
|
+
Port int `json:"port"`
|
14
|
+
} `json:"http"`
|
15
|
+
|
16
|
+
Templates string `json:"templates"`
|
17
|
+
Assets string `json:"assets"`
|
18
|
+
|
19
|
+
URLRoot string `json:"urlRoot"`
|
20
|
+
URLRelAssets string `json:"urlAssets"`
|
21
|
+
|
22
|
+
Debug bool `json:"debug"`
|
23
|
+
|
24
|
+
URLFullAssetsPath string
|
25
|
+
}
|
26
|
+
|
27
|
+
func LoadConfig(fileName string) (*Config, error) {
|
28
|
+
loader := config.NewJsonLoader(fileName)
|
29
|
+
c := new(Config)
|
30
|
+
|
31
|
+
if err := loader.Load(c); err != nil {
|
32
|
+
return nil, err
|
33
|
+
}
|
34
|
+
|
35
|
+
c.URLFullAssetsPath = c.buildURLFullAssetsPath()
|
36
|
+
|
37
|
+
return c, nil
|
38
|
+
}
|
39
|
+
|
40
|
+
func (c Config) GetAddressWithPort() string {
|
41
|
+
return net.JoinHostPort(c.Http.Address, fmt.Sprintf("%d", c.Http.Port))
|
42
|
+
}
|
43
|
+
|
44
|
+
func (c Config) buildURLFullAssetsPath() string {
|
45
|
+
return path.Join(c.URLRoot, c.URLRelAssets) + "/"
|
46
|
+
}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
package controller
|
2
|
+
|
3
|
+
import (
|
4
|
+
"github.com/jasondelponte/golib/net/conn/httpserver"
|
5
|
+
"log"
|
6
|
+
"net/http"
|
7
|
+
"server/config"
|
8
|
+
"server/view"
|
9
|
+
)
|
10
|
+
|
11
|
+
type HomeController struct {
|
12
|
+
view *view.HomeView
|
13
|
+
config *config.Config
|
14
|
+
HandlerFuncs struct {
|
15
|
+
Welcome httpserver.HandlerFunc
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
func NewHomeController(view *view.HomeView, cfg *config.Config) *HomeController {
|
20
|
+
c := &HomeController{
|
21
|
+
view: view,
|
22
|
+
config: cfg,
|
23
|
+
}
|
24
|
+
|
25
|
+
c.HandlerFuncs.Welcome = c.buildWelcomeHandler()
|
26
|
+
|
27
|
+
return c
|
28
|
+
}
|
29
|
+
|
30
|
+
func (c HomeController) buildWelcomeHandler() httpserver.HandlerFunc {
|
31
|
+
return func(w http.ResponseWriter, r *http.Request) {
|
32
|
+
if c.config.Debug {
|
33
|
+
log.Println("HomeController: DEBUG, Request received. Path:", r.URL.Path)
|
34
|
+
}
|
35
|
+
b, err := c.view.RenderWelcome()
|
36
|
+
if err != nil {
|
37
|
+
// TODO error response
|
38
|
+
return
|
39
|
+
}
|
40
|
+
|
41
|
+
w.Write(b)
|
42
|
+
}
|
43
|
+
}
|
@@ -0,0 +1,57 @@
|
|
1
|
+
package controller
|
2
|
+
|
3
|
+
import (
|
4
|
+
"github.com/jasondelponte/golib/net/conn/httpserver"
|
5
|
+
"log"
|
6
|
+
"net/http"
|
7
|
+
"os"
|
8
|
+
"path"
|
9
|
+
"server/config"
|
10
|
+
)
|
11
|
+
|
12
|
+
type StaticAssetController struct {
|
13
|
+
HandlerFuncs struct {
|
14
|
+
StaticAssets httpserver.HandlerFunc
|
15
|
+
}
|
16
|
+
|
17
|
+
config *config.Config
|
18
|
+
urlAssetPathLen int
|
19
|
+
}
|
20
|
+
|
21
|
+
func NewStaticAssetController(cfg *config.Config) *StaticAssetController {
|
22
|
+
c := &StaticAssetController{
|
23
|
+
config: cfg,
|
24
|
+
urlAssetPathLen: len(cfg.URLFullAssetsPath),
|
25
|
+
}
|
26
|
+
|
27
|
+
c.HandlerFuncs.StaticAssets = c.buildStaticHandler()
|
28
|
+
|
29
|
+
return c
|
30
|
+
}
|
31
|
+
|
32
|
+
func (c StaticAssetController) buildStaticHandler() httpserver.HandlerFunc {
|
33
|
+
return func(w http.ResponseWriter, r *http.Request) {
|
34
|
+
if c.config.Debug {
|
35
|
+
log.Println("StaticAssetController: DEBUG, Request received. Path:", r.URL.Path)
|
36
|
+
}
|
37
|
+
|
38
|
+
asset := r.URL.Path[c.urlAssetPathLen:]
|
39
|
+
fullAssetPath := path.Join(c.config.Assets, asset)
|
40
|
+
|
41
|
+
c.serveStaticAsset(fullAssetPath, w, r)
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
func (c StaticAssetController) serveStaticAsset(asset string, w http.ResponseWriter, r *http.Request) {
|
46
|
+
file, err := os.Open(asset)
|
47
|
+
if err != nil {
|
48
|
+
httpserver.ErrHttpResourceNotFound.Report(w)
|
49
|
+
return
|
50
|
+
}
|
51
|
+
stat, err := file.Stat()
|
52
|
+
if err != nil {
|
53
|
+
httpserver.ErrHttpInternalError.Report(w)
|
54
|
+
return
|
55
|
+
}
|
56
|
+
http.ServeContent(w, r, asset, stat.ModTime(), file)
|
57
|
+
}
|
data/assets/src/server/main.go
CHANGED
@@ -2,30 +2,72 @@ package main
|
|
2
2
|
|
3
3
|
import (
|
4
4
|
"flag"
|
5
|
+
"github.com/jasondelponte/golib/net/conn/httpserver"
|
6
|
+
"github.com/jasondelponte/golib/text/html/template"
|
5
7
|
"log"
|
8
|
+
"server/config"
|
9
|
+
"server/controller"
|
10
|
+
"server/view"
|
6
11
|
)
|
7
12
|
|
8
|
-
var
|
9
|
-
var port = flag.Uint("port", 0, "Port address to run the server on")
|
10
|
-
var rootURLPath = flag.String("root", "", "URL Path root of the webapp")
|
11
|
-
var tmplPath = flag.String("tmpl", "assets/templates", "Specifies the directory to use for template assets.")
|
12
|
-
var wwwPath = flag.String("www", "assets/www-debug", "Specifies the directory to use for web assest.")
|
13
|
-
var debug = flag.Bool("debug", false, "Enable debug mode where extra loging is produce, each request will reload templates, and all assets are served from non-concaticated files.")
|
14
|
-
var static = flag.Bool("static", false, "Enables serving up static content from disk")
|
13
|
+
var cfgFile = flag.String("config", "", "Configuration JSON file")
|
15
14
|
|
16
15
|
func main() {
|
17
16
|
flag.Parse()
|
18
17
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
18
|
+
var (
|
19
|
+
cfg *config.Config
|
20
|
+
server *httpserver.HTTPServer
|
21
|
+
tmpl *template.Template
|
22
|
+
err error
|
23
|
+
)
|
24
|
+
|
25
|
+
if cfg, err = config.LoadConfig(*cfgFile); err != nil {
|
26
|
+
log.Fatalln("Failed to load config, ", *cfgFile, ", because", err)
|
27
|
+
return
|
28
|
+
}
|
29
|
+
|
30
|
+
if err = initDatabase(cfg); err != nil {
|
31
|
+
log.Fatalln("Failed to initialize database, because", err)
|
32
|
+
return
|
33
|
+
}
|
34
|
+
|
35
|
+
if tmpl, err = loadTemplates(cfg); err != nil {
|
36
|
+
log.Fatalln("Failed to load HTML templates, because", err)
|
37
|
+
return
|
38
|
+
}
|
39
|
+
|
40
|
+
if server, err = initServer(cfg, tmpl); err != nil {
|
41
|
+
log.Fatalln("Failed to initialize HTTP(s) server configuration, because", err)
|
42
|
+
return
|
43
|
+
}
|
44
|
+
|
45
|
+
server.Run()
|
46
|
+
}
|
47
|
+
|
48
|
+
func initDatabase(cfg *config.Config) error {
|
49
|
+
return nil
|
50
|
+
}
|
51
|
+
|
52
|
+
func loadTemplates(cfg *config.Config) (*template.Template, error) {
|
53
|
+
tmpl := new(template.Template)
|
54
|
+
|
55
|
+
if err := tmpl.Load(cfg.Templates); err != nil {
|
56
|
+
return tmpl, err
|
27
57
|
}
|
28
58
|
|
29
|
-
|
30
|
-
|
59
|
+
return tmpl, nil
|
60
|
+
}
|
61
|
+
|
62
|
+
func initServer(cfg *config.Config, tmpl *template.Template) (*httpserver.HTTPServer, error) {
|
63
|
+
|
64
|
+
server := httpserver.NewHTTPServer(cfg.GetAddressWithPort(), cfg.Debug)
|
65
|
+
|
66
|
+
home := controller.NewHomeController(view.NewHomeView(tmpl, cfg), cfg)
|
67
|
+
server.AddHandlerFunc(cfg.URLRoot, home.HandlerFuncs.Welcome)
|
68
|
+
|
69
|
+
static := controller.NewStaticAssetController(cfg)
|
70
|
+
server.AddHandlerFunc(cfg.URLFullAssetsPath, static.HandlerFuncs.StaticAssets)
|
71
|
+
|
72
|
+
return server, nil
|
31
73
|
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
package view
|
2
|
+
|
3
|
+
import (
|
4
|
+
"github.com/jasondelponte/golib/text/html/template"
|
5
|
+
"server/config"
|
6
|
+
)
|
7
|
+
|
8
|
+
type HomeView struct {
|
9
|
+
template *template.Template
|
10
|
+
config *config.Config
|
11
|
+
}
|
12
|
+
|
13
|
+
func NewHomeView(tmpl *template.Template, cfg *config.Config) *HomeView {
|
14
|
+
return &HomeView{
|
15
|
+
template: tmpl,
|
16
|
+
config: cfg,
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
func (v *HomeView) RenderWelcome() ([]byte, error) {
|
21
|
+
common := template.CommonProps{
|
22
|
+
Title: "GoKart",
|
23
|
+
Debug: v.config.Debug,
|
24
|
+
RootURL: v.config.URLRoot,
|
25
|
+
}
|
26
|
+
|
27
|
+
return v.template.Render("home", common, nil)
|
28
|
+
}
|
@@ -1,10 +1,12 @@
|
|
1
1
|
|
2
2
|
module ErbHelper
|
3
3
|
def ErbHelper.asset_link(asset, prefix)
|
4
|
+
src = "{{PathJoin .RootURL \"/assets/\" \"#{asset}\"}}"
|
4
5
|
if (prefix == 'js')
|
5
|
-
return "<script type=\"text/javascript\" src=\"{
|
6
|
+
return "<script type=\"text/javascript\" src=\"#{src}\"></script>"
|
7
|
+
|
6
8
|
elsif (prefix == 'css')
|
7
|
-
return "<link rel=\"stylesheet\" type=\"text/css\" src=\"{
|
9
|
+
return "<link rel=\"stylesheet\" type=\"text/css\" src=\"#{src}\">"
|
8
10
|
end
|
9
11
|
end
|
10
12
|
|
@@ -1,5 +1,10 @@
|
|
1
1
|
#= require utilities/require
|
2
|
-
#= require
|
3
|
-
#= require
|
4
|
-
#= require
|
5
|
-
#= require
|
2
|
+
#= require vendor_wrapper
|
3
|
+
#= require underscore
|
4
|
+
#= require backbone
|
5
|
+
#= require mustache
|
6
|
+
#= require_tree ./controllers
|
7
|
+
#= require_tree ./models
|
8
|
+
#= require_tree ./pages
|
9
|
+
#= require_tree ./utilities
|
10
|
+
#= require_tree ./views
|
@@ -6,6 +6,7 @@
|
|
6
6
|
{{if .Debug}}{{template "base.header.assets.debug" .}}{{else}}{{template "base.header.assets" .}}{{end}}
|
7
7
|
</head>
|
8
8
|
<body>
|
9
|
+
{{template "html_templates"}}
|
9
10
|
{{end}}
|
10
11
|
|
11
12
|
{{define "base.header.assets"}}
|
@@ -22,7 +23,6 @@
|
|
22
23
|
<% end %>
|
23
24
|
{{end}}
|
24
25
|
|
25
|
-
|
26
26
|
{{define "base.footer"}}
|
27
27
|
</body>
|
28
28
|
</html>
|
@@ -1,16 +1,17 @@
|
|
1
1
|
{{define "home.contents"}}
|
2
2
|
<div class="info-block">
|
3
3
|
<h3>Go Kart</h3>
|
4
|
-
<p>Combination of
|
5
|
-
<p>There are no external
|
4
|
+
<p>Combination of tools which will make developing webapps using go easier. The gokart gem by default combines SASS, Javascript, Coffee Script, Rake, and Sprokets with Go to provide a great development environment. This environment supports test driven development (TDD) with ruby guard and jasmine.</p>
|
5
|
+
<p>There are no external dependencies other than Go and ruby (which I expect you already have...). All dependencies are installed via bundler after the project directory is created.</p>
|
6
6
|
</div>
|
7
7
|
<div class="info-block">
|
8
8
|
<h3>Usage</h3>
|
9
9
|
<p>With ruby (1.9.1 min maybe?) all you need to do is:</p>
|
10
10
|
<p class="code">gem install gokart</p>
|
11
|
-
<p>Once installed to create a new go + sprockets
|
11
|
+
<p>Once installed to create a new go + sprockets environment:</p>
|
12
12
|
<p class="code">gokart APP_NAME</p>
|
13
|
-
<p>This
|
13
|
+
<p>This utility/framework depends on the github.com/jasondelponte/go-utils to run out of the box, but if you choose it would be simple to remove and place with utilities of your choice.<p>
|
14
|
+
<p>There are several rake commands you can use to build/run/deploy the environment. Checkout rake --tasks for a list of them. In general you'll probably only ever need the app:x commands not app:server:x or app:www:x.</p>
|
14
15
|
</div>
|
15
16
|
<div class="info-block">
|
16
17
|
<h4>Environment Structure</h4>
|
@@ -20,18 +21,22 @@
|
|
20
21
|
<li><strong>bin/server/</strong> - Compiled Go http server.</li>
|
21
22
|
<li><strong>bin/assets/templates/</strong> - Compiled Go HTML templates</li>
|
22
23
|
<li><strong>bin/assets/www-min/</strong> - Compiled and minified CSS/JS/images using sprockets</li>
|
23
|
-
<li><strong>bin/assets/www-debug/</strong> - Compiled, but non-minified/
|
24
|
+
<li><strong>bin/assets/www-debug/</strong> - Compiled, but non-minified/concatenated CSS/JS source, images are here also</li>
|
24
25
|
<li><strong>lib/</strong> - Where any Go libraries your app depends on will be installed by running 'go get'. Note: You'll need to set the project into your GOPATH, I haven't figured out a good solution for this yet.</li>
|
25
26
|
<li><strong>spec/javascripts/</strong> - Where all of the compiled JS specs will be written to, and run from. Note: Currently these do not go through sprockets, but only the coffee-script compiler. So no preprocessing is available</li>
|
26
|
-
<li><strong>spec/javascripts/support</strong> - Configuration files for Jasmine. jasmin.yml contains the script
|
27
|
+
<li><strong>spec/javascripts/support</strong> - Configuration files for Jasmine. jasmin.yml contains the script specifying the source files to load, and what order to load them in.</li>
|
27
28
|
<li><strong>src/server/</strong> - All of your Go code will go here following the normal Go 1.0 directory pattern</li>
|
28
29
|
<li><strong>src/www/app/</strong> - All of you Coffee script, sass, and Go Template are found here</li>
|
29
30
|
<li><strong>src/www/spec/</strong> - All coffee script spec files which will be compiled into js and run using jasmine.</li>
|
30
31
|
<li><strong>src/www/vendor/</strong> - js/css/image files for third party tools and libraries</li>
|
31
|
-
<li><strong>tasks/</strong> - Rake tasks to build, run, and test the application. There are
|
32
|
+
<li><strong>tasks/</strong> - Rake tasks to build, run, and test the application. There are several tasks which you can run do 'rake --tasks' to see a complete list of them. 'rake app:test' to run test units, 'rake app:start' to build and run, use startdebug for a debug build. Note: when you do 'rake jasmine' or rake 'app:guard' you probably want to start these tasks in different tabs because they run until killed.</li>
|
32
33
|
</ul>
|
33
34
|
</div>
|
34
35
|
|
36
|
+
<script type="text/javascript">
|
37
|
+
var HomePage = require('pages/home');
|
38
|
+
</script>
|
39
|
+
|
35
40
|
{{end}}
|
36
41
|
|
37
42
|
{{define "home"}}
|
@@ -0,0 +1 @@
|
|
1
|
+
{{end}}
|
@@ -0,0 +1 @@
|
|
1
|
+
{{define "html_templates"}}
|