gokart 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/LICENSE +0 -0
  2. data/README.md +0 -0
  3. data/assets/Gemfile +24 -0
  4. data/assets/Guardfile +37 -0
  5. data/assets/Rakefile +5 -0
  6. data/assets/config.rb +24 -0
  7. data/assets/spec/javascripts/support/jasmine.yml +76 -0
  8. data/assets/spec/javascripts/support/jasmine_config.rb +23 -0
  9. data/assets/spec/javascripts/support/jasmine_runner.rb +32 -0
  10. data/assets/src/server/http_handler.go +139 -0
  11. data/assets/src/server/main.go +31 -0
  12. data/assets/src/server/my_test.go +13 -0
  13. data/assets/src/server/templates.go +42 -0
  14. data/assets/src/www/app/coffee/application.js.coffee +6 -0
  15. data/assets/src/www/app/coffee/helpers/properties.js.coffee +19 -0
  16. data/assets/src/www/app/coffee/libs/deferred.js.coffee +92 -0
  17. data/assets/src/www/app/coffee/libs/logger.js.coffee +40 -0
  18. data/assets/src/www/app/coffee/libs/mod_loader.js.coffee +44 -0
  19. data/assets/src/www/app/coffee/main.js.coffee +10 -0
  20. data/assets/src/www/app/partials/index.html +92 -0
  21. data/assets/src/www/app/sass/application.css.scss +136 -0
  22. data/assets/src/www/app/templates/application.gotmpl +2 -0
  23. data/assets/src/www/app/templates/base.gotmpl.erb +31 -0
  24. data/assets/src/www/app/templates/home.gotmpl +30 -0
  25. data/assets/src/www/spec/coffee/deferred-spec.coffee +202 -0
  26. data/assets/src/www/spec/coffee/mocks.coffee +137 -0
  27. data/assets/src/www/spec/coffee/mod_loader-spec.coffee +45 -0
  28. data/assets/src/www/spec/coffee/properties-spec.coffee +21 -0
  29. data/assets/tasks/app.rake +34 -0
  30. data/assets/tasks/jasmine.rake +8 -0
  31. data/assets/tasks/server.rake +58 -0
  32. data/assets/tasks/www.rake +162 -0
  33. data/bin/gokart +28 -0
  34. data/lib/gokart/base.rb +59 -0
  35. data/lib/gokart/environment.rb +39 -0
  36. data/lib/gokart/version.rb +3 -0
  37. data/lib/gokart.rb +8 -0
  38. metadata +253 -0
@@ -0,0 +1,45 @@
1
+ describe 'Module Loader Spec', ->
2
+
3
+ beforeEach ->
4
+ modLoader.clearAll()
5
+ return
6
+
7
+ it 'should be defined as a global object', ->
8
+ expect(modLoader).toBeDefined()
9
+ return
10
+
11
+ it 'should be able to define a new module', ->
12
+ modLoader.define 'testmod-1', (require, exports)->
13
+ return
14
+
15
+ expect(modLoader.isDefined('testmod-1')).toBe(true)
16
+ return
17
+
18
+ it 'should be able to define a new module with exports', ->
19
+ modLoader.define 'testmod-1', (require, exports)->
20
+ exports.isLoaded = true
21
+ return
22
+
23
+ exports = modLoader.require 'testmod-1'
24
+ expect(exports).toBeDefined()
25
+ expect(exports.isLoaded).toBe(true)
26
+ return
27
+
28
+ it 'should only load a module once and cache the exports', ->
29
+ numLoaded = 0
30
+ modLoader.define 'testmod-1', (require, exports)->
31
+ numLoaded++
32
+ exports.isLoaded = true
33
+ return
34
+
35
+ exports = modLoader.require 'testmod-1'
36
+ expect(exports).toBeDefined()
37
+ expect(exports.isLoaded).toBe(true)
38
+ expect(numLoaded).toBe(1)
39
+
40
+ exports = modLoader.require 'testmod-1'
41
+ expect(exports).toBeDefined()
42
+ expect(exports.isLoaded).toBe(true)
43
+ expect(numLoaded).toBe(1)
44
+
45
+ return
@@ -0,0 +1,21 @@
1
+ describe 'Properties generator', ->
2
+ Properties = modLoader.require 'helpers/properties'
3
+
4
+ it 'should be able to add properties to a object', ->
5
+ obj = {}
6
+ Properties.add obj,
7
+ val1: {value:'test 1 value',static:true}
8
+ val2: {value: 'test 2 value'}
9
+
10
+ expect(obj.__auto__val1).toBe('test 1 value')
11
+ expect(obj.val1()).toBe('test 1 value')
12
+ expect(obj.__auto__val2).toBe('test 2 value')
13
+ expect(obj.val2()).toBe('test 2 value')
14
+
15
+ obj.val1('failed value')
16
+ expect(obj.val1()).toBe('test 1 value')
17
+
18
+ obj.val2('failed value 2')
19
+ expect(obj.val2()).toBe('failed value 2')
20
+ return
21
+ return
@@ -0,0 +1,34 @@
1
+
2
+ namespace :app do
3
+ desc 'Default action to perform, builds the app then runs it'
4
+ task :default => [:start]
5
+
6
+ desc 'Builds build app source files'
7
+ task :build => ['www:build', 'server:build']
8
+
9
+ desc 'Cleans the build paths for build parts of the app'
10
+ task :clean => [:stop, 'www:clean', 'server:clean']
11
+
12
+ desc 'Cleans the build paths then builds are source files'
13
+ task :rebuild => [:clean, :build]
14
+
15
+ desc 'Runs the test units for build source files'
16
+ task :test => ['www:test', 'server:test']
17
+
18
+ desc 'Stops and restarts the server'
19
+ task :restart => [:stop, :start]
20
+
21
+ desc 'Builds the app if needed, and starts it'
22
+ task :start => [:build, 'server:start']
23
+
24
+ desc 'Builds the app if wth debug, and starts it'
25
+ task :startdebug => [:build, 'server:startdebug']
26
+
27
+ desc 'Stops the server if it was running'
28
+ task :stop => ['server:stop']
29
+
30
+ desc 'Runs the guard command within bundler'
31
+ task :guard => [:rebuild] do
32
+ `bundle exec guard`
33
+ end
34
+ end
@@ -0,0 +1,8 @@
1
+ begin
2
+ require 'jasmine'
3
+ load 'jasmine/tasks/jasmine.rake'
4
+ rescue LoadError
5
+ task :jasmine do
6
+ abort "Jasmine is not available. In order to run jasmine, you must: (sudo) gem install jasmine"
7
+ end
8
+ end
@@ -0,0 +1,58 @@
1
+ require 'rake'
2
+
3
+ namespace :app do
4
+ namespace :server do
5
+ task :init do
6
+ dirs = []
7
+ dirs << GO_BUILD_PATH
8
+
9
+ dirs.each do |path|
10
+ begin
11
+ FileUtils::mkdir_p(path) if (!FileTest::directory?(path))
12
+ rescue
13
+ puts "Failed to create directory #{path}"
14
+ end
15
+ end
16
+ end
17
+
18
+ desc 'Builds the existing source'
19
+ task :build => [:init] do
20
+ `GOPATH="#{ROOT}" go install #{GO_APP_NAME} 1>&2`
21
+ end
22
+
23
+ desc 'Cleans the build path'
24
+ task :clean do
25
+ paths = []
26
+ paths << File.join(GO_BUILD_PATH, 'server')
27
+
28
+ paths.each do |path|
29
+ begin
30
+ FileUtils::rm_rf path
31
+ rescue
32
+ puts "Failed to clean server's #{path}"
33
+ end
34
+ end
35
+ end
36
+
37
+ desc 'Runs the test units for the source files'
38
+ task :test => [:build] do
39
+ `GOPATH="#{ROOT}" go test #{GO_APP_NAME} 1>&2`
40
+ end
41
+
42
+ desc 'Runs the server, killing old instance if there was one.'
43
+ task :start, [:port, :static] => [:stop] do |t, args|
44
+ args.with_defaults(:port => 8080, :static => :true)
45
+ `./bin/#{GO_APP_NAME} -port=#{args[:port]} -static=#{args[:static]} -tmpl="#{TMPL_BUILD_PATH}" -www="#{MIN_WWW_PATH}"`
46
+ end
47
+
48
+ desc 'Runs the server, killing old instance if there was one.'
49
+ task :startdebug, [:port] => [:stop] do |t, args|
50
+ args.with_defaults(:port => 8080, :static => :true)
51
+ `./bin/#{GO_APP_NAME} -port=#{args[:port]} -debug=true -static=true -tmpl="#{TMPL_BUILD_PATH}" -www="#{DEBUG_WWW_PATH}"`
52
+ end
53
+
54
+ desc 'Stops the server if it was running'
55
+ task :stop do
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,162 @@
1
+ require 'fileutils'
2
+ require 'coffee_script'
3
+ require 'sass'
4
+ require 'yui/compressor'
5
+ require 'uglifier'
6
+ require 'sprockets'
7
+
8
+ sprockets = (Sprockets::Environment.new(ROOT) { |env| env.logger = Logger.new(STDOUT) })
9
+ sprockets.append_path WWW_SRC_VENDOR_PATH.join('css').to_s
10
+ sprockets.append_path WWW_SRC_APP_PATH.join('sass').to_s
11
+ sprockets.append_path WWW_SRC_VENDOR_PATH.join('js').to_s
12
+ sprockets.append_path WWW_SRC_APP_PATH.join('coffee').to_s
13
+ sprockets.append_path WWW_SRC_APP_PATH.join('templates').to_s
14
+ # Note: Requires JVM for YUI
15
+ sprockets.css_compressor = YUI::CssCompressor.new
16
+ sprockets.js_compressor = Uglifier.new(mangle: true)
17
+
18
+ # Add the go template mime type/extension so we can specify the directive processors in them
19
+ sprockets.register_mime_type('text/gotmpl', '.gotmpl')
20
+ sprockets.register_processor('text/gotmpl', Sprockets::DirectiveProcessor)
21
+
22
+
23
+ desc 'Iterates over the input directory building a list of coffee files to compile'
24
+ def coffee(inDir, outDir)
25
+ Dir.glob("#{inDir}/**/*.coffee").each do |file|
26
+ outFile = file.partition(inDir)[2]
27
+ next if (outFile.empty?)
28
+ outFile.sub!(/coffee$/, 'js')
29
+ coffee_compile(file, outDir+outFile)
30
+ end
31
+ end
32
+
33
+ desc 'Compiles the coffee script file and writes it to the out'
34
+ def coffee_compile(inFile, outFile)
35
+ begin
36
+ File.delete(outFile) if (FileTest::file?(outFile))
37
+ FileUtils::mkdir_p(File.dirname(outFile)) if (!FileTest::directory?(File.dirname(outFile)))
38
+
39
+ f = File.new(outFile, "w")
40
+ f.write(CoffeeScript.compile(File.read(inFile)))
41
+ f.close()
42
+ rescue
43
+ puts "Failed to compile #{inFile} to #{outFile}"
44
+ end
45
+ end
46
+
47
+ namespace :app do
48
+ namespace :www do
49
+ task :init do
50
+ paths = []
51
+ paths << MIN_WWW_PATH.join('js')
52
+ paths << MIN_WWW_PATH.join('css')
53
+ paths << MIN_WWW_PATH.join('images')
54
+ paths << MIN_WWW_PATH.join('partials')
55
+ paths << DEBUG_WWW_PATH.join('js')
56
+ paths << DEBUG_WWW_PATH.join('css')
57
+ paths << DEBUG_WWW_PATH.join('images')
58
+ paths << DEBUG_WWW_PATH.join('partials')
59
+ paths << TMPL_BUILD_PATH
60
+
61
+ paths.each do |path|
62
+ begin
63
+ FileUtils::mkdir_p(path) if (!FileTest::directory?(path))
64
+ rescue
65
+ puts "Failed to create directory #{path}"
66
+ end
67
+ end
68
+ end
69
+
70
+ task :spec_coffee do
71
+ coffee "#{WWW_SRC_SPEC_PATH}/coffee", WWW_SPEC_PATH.to_s
72
+ end
73
+
74
+ task :images do
75
+ from = WWW_SRC_APP_PATH.join('images')
76
+ to = DEBUG_WWW_PATH
77
+ begin
78
+ FileUtils::cp_r from, to
79
+ rescue
80
+ puts "Failed to copy directory #{from} to #{to}"
81
+ end
82
+ end
83
+
84
+ task :partials do
85
+ from = WWW_SRC_APP_PATH.join('partials')
86
+ to = DEBUG_WWW_PATH
87
+ begin
88
+ FileUtils::cp_r from, to
89
+ rescue
90
+ puts "Failed to copy directory #{from} to #{to}"
91
+ end
92
+ end
93
+
94
+ task :vendor do
95
+ from = "#{WWW_SRC_VENDOR_PATH}/images"
96
+ to = DEBUG_WWW_PATH.join('vendor', 'images')
97
+ begin
98
+ FileUtils::cp_r from, to
99
+ rescue
100
+ puts "Failed to copy directory #{from} to #{to}"
101
+ end
102
+ end
103
+
104
+ desc 'Compiles the asset files into those usable by the browser'
105
+ task :compile do
106
+ ASSET_BUNDLES.each do |bundle|
107
+ assets = sprockets.find_asset(bundle)
108
+
109
+ # drop all extentions except the first
110
+ realname = assets.pathname.basename.to_s.split(".")[0..1].join(".")
111
+ prefix = File.extname(realname).split('.').last
112
+ outfile = MIN_WWW_PATH.join(prefix, realname)
113
+
114
+ assets.write_to(outfile)
115
+ assets.write_to("#{outfile}.gz")
116
+
117
+ # For each asset in the bundle write them to the debug output
118
+ assets.to_a.each do |asset|
119
+ # strip filename.css.foo.bar.css multiple extensions, but maintain the base directory of the file
120
+ realname = asset.pathname.basename.to_s.split(".")[0..1].join(".")
121
+ outPath = DEBUG_WWW_PATH.join(prefix, File.dirname(asset.logical_path))
122
+ FileUtils::mkdir_p(outPath) if (!FileTest::directory?(outPath))
123
+ asset.write_to(outPath.join(realname))
124
+ end
125
+ end
126
+ end
127
+
128
+ desc 'Compiles the go template files and concats them'
129
+ task :compile_templates do
130
+ assets = sprockets.find_asset("application.gotmpl")
131
+
132
+ # drop all extentions except the first
133
+ realname = assets.pathname.basename.to_s.split(".")[0..1].join(".")
134
+ outfile = TMPL_BUILD_PATH.join(realname)
135
+
136
+ assets.write_to(outfile)
137
+ end
138
+
139
+ desc 'Builds the existing source'
140
+ task :build => [:init,:compile,:compile_templates,:spec_coffee,:images,:partials]
141
+
142
+ desc 'Cleans the build path'
143
+ task :clean do
144
+ paths = []
145
+ paths << ASSETS_PATH
146
+ paths << TMPL_BUILD_PATH
147
+ paths << Dir.glob("#{WWW_SPEC_PATH}/*.js")
148
+
149
+ paths.each do |path|
150
+ begin
151
+ FileUtils::rm_rf path
152
+ rescue
153
+ puts "Failed to clean www's #{path}"
154
+ end
155
+ end
156
+ end
157
+
158
+ desc 'Runs the test units for the source files'
159
+ task :test => [:build, 'jasmine:ci']
160
+
161
+ end
162
+ end
data/bin/gokart ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'gokart'
4
+ require 'pathname'
5
+ require 'open3'
6
+
7
+
8
+ root = Pathname(File.dirname(__FILE__)).join('../')
9
+ app_name = ARGV[0]
10
+ gokart = Gokart::Environment.new(root, app_name)
11
+
12
+ unless gokart.app_name_valid?
13
+ exit(-1)
14
+ end
15
+
16
+ unless gokart.build_app
17
+ $stderr.puts "Failed to build the gokart app #{app_name}"
18
+ exit(-1)
19
+ end
20
+
21
+ Dir.chdir(app_name)
22
+
23
+ Open3.popen3('bundle install') do | i, o, e |
24
+ while (out = o.gets || err = e.gets)
25
+ $stdout.puts out unless out.nil?
26
+ $stderr.puts err unless err.nil?
27
+ end
28
+ end
@@ -0,0 +1,59 @@
1
+ require 'fileutils'
2
+
3
+ module Gokart
4
+ attr_reader :app_name, :app_parent_path, :app_base_path, :assets_path
5
+ attr_accessor :logger
6
+
7
+ class Base
8
+ #
9
+ def app_name_valid?
10
+ unless File.stat(@app_parent_path).readable?
11
+ @logger.fatal("App parent directory is not readable")
12
+ return false
13
+ end
14
+ unless File.stat(@app_parent_path).writable?
15
+ @logger.fatal("App parent directory is not writable")
16
+ return false
17
+ end
18
+ if Dir.exist?(@app_base_path)
19
+ @logger.fatal("App #{@app_name} directory already exists")
20
+ return false
21
+ end
22
+ return true
23
+ end
24
+
25
+ def build_app
26
+ return false unless create_dirs()
27
+ return false unless copy_files()
28
+
29
+ return true
30
+ end
31
+
32
+ def create_dirs
33
+ directories().each() do |dir|
34
+ begin
35
+ FileUtils::mkdir_p dir
36
+ rescue Exception => e
37
+ @logger.fatal "Failed to create directory #{dir}, because #{e}"
38
+ return false
39
+ end
40
+ end
41
+ return true
42
+ end
43
+
44
+ def copy_files
45
+ Dir.glob(@assets_path.join("**","*")).each() do | inFile |
46
+ begin
47
+ outFile = inFile.partition(@assets_path.to_s)[2]
48
+ next if outFile.empty? || FileTest::directory?(inFile)
49
+ FileUtils::cp inFile, @app_base_path.to_s()+outFile
50
+ rescue Exception => e
51
+ @logger.fatal "Failed to copy #{outFile} to #{@app_base_path}, because #{e}"
52
+ return false
53
+ end
54
+ end
55
+
56
+ return true
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,39 @@
1
+ require 'gokart/base'
2
+
3
+ require 'pathname'
4
+ require 'logger'
5
+
6
+ module Gokart
7
+ class Environment < Base
8
+ def initialize(root, app_name)
9
+ @logger = Logger.new($stderr)
10
+ @logger.level = Logger::FATAL
11
+
12
+ @app_parent_path = Pathname(Dir.pwd.to_s)
13
+ @app_base_path = @app_parent_path.join(app_name)
14
+ @app_name = app_name
15
+ @assets_path = Pathname(root).join('assets')
16
+ end
17
+
18
+ def directories
19
+ paths = [
20
+ Pathname(@app_base_path).join('bin'),
21
+ Pathname(@app_base_path).join('lib'),
22
+ Pathname(@app_base_path).join('spec','javascripts','support'),
23
+ Pathname(@app_base_path).join('src','server'),
24
+ Pathname(@app_base_path).join('src','www','app','coffee','helpers'),
25
+ Pathname(@app_base_path).join('src','www','app','coffee','libs'),
26
+ Pathname(@app_base_path).join('src','www','app','coffee'),
27
+ Pathname(@app_base_path).join('src','www','app','images'),
28
+ Pathname(@app_base_path).join('src','www','app','partials'),
29
+ Pathname(@app_base_path).join('src','www','app','sass'),
30
+ Pathname(@app_base_path).join('src','www','app','templates'),
31
+ Pathname(@app_base_path).join('src','www','spec','coffee'),
32
+ Pathname(@app_base_path).join('src','www','vendor','css'),
33
+ Pathname(@app_base_path).join('src','www','vendor','images'),
34
+ Pathname(@app_base_path).join('src','www','vendor','js'),
35
+ Pathname(@app_base_path).join('tasks'),
36
+ ]
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,3 @@
1
+ module Gokart
2
+ VERSION = "0.0.1"
3
+ end
data/lib/gokart.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'gokart/version'
2
+
3
+ require 'logger'
4
+
5
+ module Gokart
6
+ autoload :Base, "gokart/base"
7
+ autoload :Environment, "gokart/environment"
8
+ end