gocart 0.0.1 → 0.0.2
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/LICENSE +0 -0
- data/README.md +0 -0
- data/assets/Gemfile +24 -0
- data/assets/Guardfile +37 -0
- data/assets/Rakefile +5 -0
- data/assets/config.rb +24 -0
- data/assets/spec/javascripts/support/jasmine.yml +86 -0
- data/assets/spec/javascripts/support/jasmine_config.rb +23 -0
- data/assets/spec/javascripts/support/jasmine_runner.rb +32 -0
- data/assets/src/server/http_handler.go +136 -0
- data/assets/src/server/main.go +31 -0
- data/assets/src/server/templates.go +42 -0
- data/assets/src/www/app/coffee/adapters/dummy_data.js.coffee +6 -0
- data/assets/src/www/app/coffee/adapters/reddit.js.coffee +294 -0
- data/assets/src/www/app/coffee/application.js.coffee +23 -0
- data/assets/src/www/app/coffee/controllers/app.js.coffee +69 -0
- data/assets/src/www/app/coffee/controllers/nav.js.coffee +55 -0
- data/assets/src/www/app/coffee/controllers/subreddit_posts.js.coffee +57 -0
- data/assets/src/www/app/coffee/helpers/event_manager.js.coffee +3 -0
- data/assets/src/www/app/coffee/helpers/properties.js.coffee +19 -0
- data/assets/src/www/app/coffee/helpers/storage.js.coffee +14 -0
- data/assets/src/www/app/coffee/libs/3rdparty.js.coffee +7 -0
- data/assets/src/www/app/coffee/libs/deferred.js.coffee +92 -0
- data/assets/src/www/app/coffee/libs/logger.js.coffee +40 -0
- data/assets/src/www/app/coffee/libs/mod_loader.js.coffee +44 -0
- data/assets/src/www/app/coffee/main.js.coffee +42 -0
- data/assets/src/www/app/coffee/models/comment.js.coffee +26 -0
- data/assets/src/www/app/coffee/models/post.js.coffee +27 -0
- data/assets/src/www/app/coffee/models/sub_reddit.js.coffee +18 -0
- data/assets/src/www/app/coffee/widgets/post_detail.js.coffee +2 -0
- data/assets/src/www/app/coffee/widgets/posts.js.coffee +45 -0
- data/assets/src/www/app/coffee/widgets/subreddit_detail.js.coffee +2 -0
- data/assets/src/www/app/coffee/widgets/subreddits.js.coffee +44 -0
- data/assets/src/www/app/images/test.png +0 -0
- data/assets/src/www/app/partials/index.html +92 -0
- data/assets/src/www/app/sass/application.css.scss +136 -0
- data/assets/src/www/app/templates/application.gotmpl +2 -0
- data/assets/src/www/app/templates/base.gotmpl.erb +27 -0
- data/assets/src/www/app/templates/home.gotmpl +9 -0
- data/assets/src/www/spec/coffee/deferred-spec.coffee +202 -0
- data/assets/src/www/spec/coffee/mocks.coffee +137 -0
- data/assets/src/www/spec/coffee/mod_loader-spec.coffee +45 -0
- data/assets/src/www/spec/coffee/properties-spec.coffee +21 -0
- data/assets/src/www/spec/coffee/reddit_adapter-spec.coffee +143 -0
- data/assets/src/www/vendor/css/jq.ui.css +630 -0
- data/assets/src/www/vendor/images/ajax-loader.png +0 -0
- data/assets/src/www/vendor/images/icons-18-black.png +0 -0
- data/assets/src/www/vendor/images/icons-18-white.png +0 -0
- data/assets/src/www/vendor/images/icons-36-black.png +0 -0
- data/assets/src/www/vendor/images/icons-36-white.png +0 -0
- data/assets/src/www/vendor/js/ICanHaz.min.js +10 -0
- data/assets/src/www/vendor/js/jq.mobi.min.js +20 -0
- data/assets/src/www/vendor/js/jq.ui.min.js +90 -0
- data/assets/src/www/vendor/js/jq.web.min.js +58 -0
- data/assets/src/www/vendor/js/phonegap-1.1.0.js +4577 -0
- data/assets/src/www/vendor/js/touch.js +103 -0
- data/assets/tasks/app.rake +34 -0
- data/assets/tasks/jasmine.rake +8 -0
- data/assets/tasks/server.rake +58 -0
- data/assets/tasks/www.rake +163 -0
- data/bin/gocart +25 -0
- data/lib/gocart.rb +5 -6
- data/lib/gocart/base.rb +28 -0
- data/lib/gocart/environment.rb +18 -0
- data/lib/gocart/version.rb +1 -1
- metadata +113 -41
- data/.gitignore +0 -4
- data/Gemfile +0 -4
- data/Rakefile +0 -1
- data/gocarg.go +0 -29
- data/gocart.gemspec +0 -38
@@ -0,0 +1,57 @@
|
|
1
|
+
modLoader.define 'controllers/subreddit_posts', (require, exports) ->
|
2
|
+
_3rdparty = modLoader.require('libs/3rdparty')
|
3
|
+
ich = _3rdparty.ich
|
4
|
+
$ = _3rdparty.$
|
5
|
+
|
6
|
+
RedditAdapter = modLoader.require 'adapters/reddit'
|
7
|
+
PostsWidget = modLoader.require 'widgets/posts'
|
8
|
+
|
9
|
+
class SubRedditPostsController
|
10
|
+
constructor: (options, controller)->
|
11
|
+
@_reddit = options.reddit
|
12
|
+
@_controller = options.controller
|
13
|
+
return
|
14
|
+
|
15
|
+
attachTo: (container)->
|
16
|
+
@_refs =
|
17
|
+
container: container
|
18
|
+
appHeader: $('#header .title h2')
|
19
|
+
content: $('#subreddit-posts .posts')
|
20
|
+
return
|
21
|
+
|
22
|
+
show: (subReddit)->
|
23
|
+
@_refs['appHeader'].text subReddit.title();
|
24
|
+
|
25
|
+
@_loadPosts(@_refs['content'], subReddit)
|
26
|
+
return
|
27
|
+
|
28
|
+
hide: () ->
|
29
|
+
return
|
30
|
+
|
31
|
+
_loadPosts: (container, sub)->
|
32
|
+
# Remove any existing children
|
33
|
+
$('#subreddit-posts .posts > *').remove()
|
34
|
+
|
35
|
+
promise = @_reddit.listSubRedditPost(RedditAdapter.PAGINATE_TYPE.AFTER, null, sub, RedditAdapter.POST_SORT_TYPES.HOT)
|
36
|
+
promise.done (posts) =>
|
37
|
+
postsWidget = PostsWidget.create(sub.title(), posts)
|
38
|
+
postsWidget.appendTo(container)
|
39
|
+
|
40
|
+
if !@_postScroller?
|
41
|
+
options =
|
42
|
+
verticalScroll: true #vertical scrolling
|
43
|
+
horizontalScroll: false #horizontal scrolling
|
44
|
+
scrollBars: false #display scrollbars
|
45
|
+
@_postScroller = $('#posts-wrapper').scroller(options)
|
46
|
+
|
47
|
+
|
48
|
+
return
|
49
|
+
|
50
|
+
promise.fail (error)->
|
51
|
+
container.append ich.error_inline {error: 'Failed to load sub reddit\'s posts :('}
|
52
|
+
return
|
53
|
+
return
|
54
|
+
|
55
|
+
exports.create = (options)->
|
56
|
+
return new SubRedditPostsController(options)
|
57
|
+
return
|
@@ -0,0 +1,19 @@
|
|
1
|
+
modLoader.define 'helpers/properties', (require,exports)->
|
2
|
+
|
3
|
+
_buildProp = (cont, propStore, isStatic)->
|
4
|
+
return (value) ->
|
5
|
+
if value != undefined && !isStatic
|
6
|
+
cont[propStore] = value
|
7
|
+
else if value != undefined && isStatic
|
8
|
+
console.error('unable to set static property '+propStore+' to:',value)
|
9
|
+
|
10
|
+
return cont[propStore]
|
11
|
+
|
12
|
+
exports.add = (cont, props)->
|
13
|
+
for own prop,rules of props
|
14
|
+
propStore = '__auto__'+prop
|
15
|
+
cont[propStore] = if rules.value != undefined then rules.value else null
|
16
|
+
cont[prop] = _buildProp(cont, propStore, rules.static)
|
17
|
+
return
|
18
|
+
|
19
|
+
return
|
@@ -0,0 +1,14 @@
|
|
1
|
+
modLoader.define 'helpers/storage', (require, exports) ->
|
2
|
+
LocalStorage = modLoader.require('libs/3rdparty').LocalStorage
|
3
|
+
|
4
|
+
class StorageManager
|
5
|
+
constructor: (options)->
|
6
|
+
@_types = options.types
|
7
|
+
return
|
8
|
+
|
9
|
+
_registerStorageTypes: (types)->
|
10
|
+
return
|
11
|
+
|
12
|
+
exports.create = (options)->
|
13
|
+
return new StorageManager(options)
|
14
|
+
return
|
@@ -0,0 +1,92 @@
|
|
1
|
+
modLoader.define 'libs/deferred', (require, exports)=>
|
2
|
+
|
3
|
+
context = @
|
4
|
+
|
5
|
+
class Promise
|
6
|
+
constructor: ->
|
7
|
+
@_dones = []
|
8
|
+
@_fails = []
|
9
|
+
@_pendingFinish = false
|
10
|
+
return
|
11
|
+
|
12
|
+
_doDone: (data)->
|
13
|
+
for done in @_dones
|
14
|
+
done.apply(context, data)
|
15
|
+
return
|
16
|
+
|
17
|
+
_doFail: (data)->
|
18
|
+
for fail in @_fails
|
19
|
+
fail.apply(context, data)
|
20
|
+
return
|
21
|
+
|
22
|
+
doFinish: (isResolved, data)->
|
23
|
+
@_pendingFinish = {isResolved: isResolved, data: data}
|
24
|
+
|
25
|
+
if isResolved then @_doDone(data) else @_doFail(data)
|
26
|
+
return
|
27
|
+
|
28
|
+
done: (doneCb)->
|
29
|
+
@_dones.push(doneCb)
|
30
|
+
|
31
|
+
_pending = @_pendingFinish
|
32
|
+
if _pending && _pending.isResolved
|
33
|
+
@doFinish(_pending.isResolved, _pending.data)
|
34
|
+
|
35
|
+
return @
|
36
|
+
|
37
|
+
fail: (failCb)->
|
38
|
+
@_fails.push(failCb)
|
39
|
+
|
40
|
+
_pending = @_pendingFinish
|
41
|
+
if _pending && !_pending.isResolved
|
42
|
+
@doFinish(_pending.isResolved, _pending.data)
|
43
|
+
return @
|
44
|
+
|
45
|
+
then: (doneCb, failCb)->
|
46
|
+
@_dones.push(doneCb) if doneCb?
|
47
|
+
@_fails.push(failCb) if failCb?
|
48
|
+
|
49
|
+
_pending = @_pendingFinish
|
50
|
+
if _pending
|
51
|
+
@doFinish(_pending.isResolved, _pending.data)
|
52
|
+
return @
|
53
|
+
|
54
|
+
|
55
|
+
class Deferred
|
56
|
+
constructor: ->
|
57
|
+
@_promise = null
|
58
|
+
@_pendingFinish = null
|
59
|
+
@_isFinished = false
|
60
|
+
return
|
61
|
+
|
62
|
+
_finish: (isResolved, data)->
|
63
|
+
if @_isFinished
|
64
|
+
return
|
65
|
+
@_isFinished = true
|
66
|
+
|
67
|
+
_promise = @_promise
|
68
|
+
if _promise?
|
69
|
+
_promise.doFinish(isResolved, data)
|
70
|
+
else
|
71
|
+
@_pendingFinish = {isResolved: isResolved, data: data}
|
72
|
+
return
|
73
|
+
|
74
|
+
resolve: (data...)->
|
75
|
+
return @_finish(true, data)
|
76
|
+
|
77
|
+
reject: (data...)->
|
78
|
+
return @_finish(false, data)
|
79
|
+
|
80
|
+
promise: ->
|
81
|
+
promise = new Promise()
|
82
|
+
@_promise = promise
|
83
|
+
@_isFinished = false
|
84
|
+
_pending = @_pendingFinish
|
85
|
+
@_finish(_pending.isResolved, _pending.data) if _pending?
|
86
|
+
return promise
|
87
|
+
|
88
|
+
|
89
|
+
exports.create = ->
|
90
|
+
return new Deferred()
|
91
|
+
|
92
|
+
return
|
@@ -0,0 +1,40 @@
|
|
1
|
+
modLoader.define 'libs/logger', (require,exports)->
|
2
|
+
|
3
|
+
@appLoggerInstance = null
|
4
|
+
|
5
|
+
logger = ->
|
6
|
+
log = (args...)->
|
7
|
+
console.log(args)
|
8
|
+
return
|
9
|
+
|
10
|
+
warn = (args...)->
|
11
|
+
console.log(args)
|
12
|
+
return
|
13
|
+
|
14
|
+
debug = (args...)->
|
15
|
+
console.error(args)
|
16
|
+
return
|
17
|
+
|
18
|
+
error = (args...)->
|
19
|
+
console.error(args)
|
20
|
+
return
|
21
|
+
|
22
|
+
return {
|
23
|
+
log: log
|
24
|
+
warn: warn
|
25
|
+
debug: debug
|
26
|
+
error: error
|
27
|
+
}
|
28
|
+
|
29
|
+
_initLogger = =>
|
30
|
+
@appLoggerInstance = logger()
|
31
|
+
return
|
32
|
+
|
33
|
+
exports.getInstance = (name) =>
|
34
|
+
_initLogger() if !@appLoggerInstance
|
35
|
+
return @appLoggerInstance
|
36
|
+
|
37
|
+
exports.reset = =>
|
38
|
+
delete @appLoggerInstance
|
39
|
+
|
40
|
+
return
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Builds a module loader tool which pulls in functions only once
|
2
|
+
# and returns the exports for each time it is required after that
|
3
|
+
|
4
|
+
@modLoader = (->
|
5
|
+
_modules = {}
|
6
|
+
|
7
|
+
require = (name)->
|
8
|
+
mod = _modules[name]
|
9
|
+
|
10
|
+
if !mod
|
11
|
+
console.error 'Failed to load module '+name+', as it does exist.'
|
12
|
+
return {}
|
13
|
+
|
14
|
+
exports = mod.exports
|
15
|
+
if !exports
|
16
|
+
exports = mod.exports = {}
|
17
|
+
mod.builder(require, exports)
|
18
|
+
|
19
|
+
return exports
|
20
|
+
|
21
|
+
define = (name, builder)->
|
22
|
+
_modules[name] =
|
23
|
+
builder: builder
|
24
|
+
exports: null
|
25
|
+
return
|
26
|
+
|
27
|
+
isDefined = (name)->
|
28
|
+
return _modules[name]?
|
29
|
+
|
30
|
+
isLoaded = (name)->
|
31
|
+
return _modules[name]? && _modules[name].exports
|
32
|
+
|
33
|
+
clearAll = ->
|
34
|
+
_modules = {}
|
35
|
+
return
|
36
|
+
|
37
|
+
return {
|
38
|
+
require: require
|
39
|
+
define: define
|
40
|
+
isDefined: isDefined
|
41
|
+
isLoaded: isLoaded
|
42
|
+
clearAll: clearAll
|
43
|
+
}
|
44
|
+
)()
|
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
# Application main entry point
|
3
|
+
|
4
|
+
$ = modLoader.require('libs/3rdparty').$
|
5
|
+
|
6
|
+
AppController = modLoader.require 'controllers/app'
|
7
|
+
|
8
|
+
Logger = modLoader.require 'libs/logger'
|
9
|
+
RedditAdapter = modLoader.require 'adapters/reddit'
|
10
|
+
|
11
|
+
_onDeviceReady = =>
|
12
|
+
reddit = RedditAdapter.create($.ajax, Logger.getInstance('RedditAdapter'))
|
13
|
+
@narwhalChamp =
|
14
|
+
app: AppController.create({reddit:reddit})
|
15
|
+
|
16
|
+
setTimeout (=>
|
17
|
+
@narwhalChamp.app.start()
|
18
|
+
), 2000
|
19
|
+
return
|
20
|
+
|
21
|
+
onDocLoaded = ->
|
22
|
+
if 'undefined' != typeof device
|
23
|
+
document.addEventListener 'deviceready', _onDeviceReady, true
|
24
|
+
else
|
25
|
+
_onDeviceReady()
|
26
|
+
return
|
27
|
+
|
28
|
+
# This function runs once the page is loaded, but appMobi is not yet active
|
29
|
+
init = ->
|
30
|
+
$.ui.backButtonText="Back"
|
31
|
+
$.useViewport(320,480)
|
32
|
+
onDocLoaded()
|
33
|
+
return
|
34
|
+
window.addEventListener("load",init,false)
|
35
|
+
|
36
|
+
|
37
|
+
# This code prevents users from dragging the page
|
38
|
+
preventDefaultScroll = (event) ->
|
39
|
+
event.preventDefault()
|
40
|
+
window.scroll(0,0)
|
41
|
+
return false
|
42
|
+
document.addEventListener('touchmove', preventDefaultScroll, false)
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
modLoader.define 'models/comment', (require, exports) ->
|
3
|
+
|
4
|
+
Properties = modLoader.require('helpers/properties')
|
5
|
+
|
6
|
+
class Comment
|
7
|
+
constructor: (options)->
|
8
|
+
Properties.add proto,
|
9
|
+
type: {value:'Comment',static:true}
|
10
|
+
author: {value: options.author}
|
11
|
+
body: {value: options.body}
|
12
|
+
ups: {value: options.ups}
|
13
|
+
downs: {value: options.downs}
|
14
|
+
subreddit: {value: options.subreddit}
|
15
|
+
subredditId: {value: options.subredditId}
|
16
|
+
id: {value: options.id}
|
17
|
+
name: {value: options.name}
|
18
|
+
return
|
19
|
+
|
20
|
+
serialize: ->
|
21
|
+
ser = {}
|
22
|
+
return JSON.stringify(ser)
|
23
|
+
|
24
|
+
exports.create = (options)->
|
25
|
+
return new Comment(options)
|
26
|
+
return
|
@@ -0,0 +1,27 @@
|
|
1
|
+
modLoader.define 'models/post', (require,exports)->
|
2
|
+
|
3
|
+
Properties = modLoader.require('helpers/properties')
|
4
|
+
|
5
|
+
class Post
|
6
|
+
constructor: (options)->
|
7
|
+
Properties.add @,
|
8
|
+
type: {value:'Post',static:true}
|
9
|
+
id: {value: options.id}
|
10
|
+
title: {value: options.title}
|
11
|
+
subreddit: {value: options.subreddit}
|
12
|
+
permalink: {value: options.permalink}
|
13
|
+
selftext: {value: options.selftext}
|
14
|
+
url: {value: options.url}
|
15
|
+
created: {value: options.created_utc}
|
16
|
+
numComments: {value: options.num_comments}
|
17
|
+
over_18: {value: options.over_18}
|
18
|
+
author: {value: options.author}
|
19
|
+
ups: {value: options.ups}
|
20
|
+
downs: {value: options.downs}
|
21
|
+
saved: {value: options.saved}
|
22
|
+
return
|
23
|
+
|
24
|
+
exports.create = (options)->
|
25
|
+
return new Post(options)
|
26
|
+
|
27
|
+
return
|
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
modLoader.define 'models/sub_reddit', (require, exports) ->
|
3
|
+
|
4
|
+
Properties = modLoader.require('helpers/properties')
|
5
|
+
|
6
|
+
class SubReddit
|
7
|
+
constructor: (options)->
|
8
|
+
Properties.add @,
|
9
|
+
type: {value:'SubReddit',static:true}
|
10
|
+
id: {value: options.id}
|
11
|
+
title: {value: options.title}
|
12
|
+
name: {value: options.name}
|
13
|
+
url: {value: options.url}
|
14
|
+
return
|
15
|
+
|
16
|
+
exports.create = (options)->
|
17
|
+
return new SubReddit(options)
|
18
|
+
return
|
@@ -0,0 +1,45 @@
|
|
1
|
+
modLoader.define 'widgets/posts', (require, exports) ->
|
2
|
+
ich = modLoader.require('libs/3rdparty').ich
|
3
|
+
|
4
|
+
class Posts
|
5
|
+
constructor: (subTitle, posts)->
|
6
|
+
@subTitle = subTitle
|
7
|
+
@posts = posts
|
8
|
+
return
|
9
|
+
|
10
|
+
appendTo: (toElem)->
|
11
|
+
toElem.append @_render()
|
12
|
+
@_addHandlers()
|
13
|
+
return
|
14
|
+
|
15
|
+
remove: ->
|
16
|
+
return
|
17
|
+
|
18
|
+
# Generates the code which will be used to display this widget
|
19
|
+
_render: ->
|
20
|
+
items = for post in @posts.data
|
21
|
+
{
|
22
|
+
title: post.title()
|
23
|
+
score: post.ups() - post.downs()
|
24
|
+
ago: post.created()
|
25
|
+
poster: post.author()
|
26
|
+
subreddit: post.subreddit()
|
27
|
+
numComments: post.numComments()
|
28
|
+
'nsfw': if post.over_18() == false then '' else 'nsfw'
|
29
|
+
}
|
30
|
+
|
31
|
+
data =
|
32
|
+
subTitle: @subTitle
|
33
|
+
posts: items
|
34
|
+
|
35
|
+
return ich.posts(data)
|
36
|
+
|
37
|
+
_addHandlers: ->
|
38
|
+
return
|
39
|
+
|
40
|
+
_removeHandlers: ->
|
41
|
+
return
|
42
|
+
|
43
|
+
exports.create = (subName, posts)->
|
44
|
+
return new Posts(subName, posts)
|
45
|
+
return
|