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.
Files changed (71) 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 +86 -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 +136 -0
  11. data/assets/src/server/main.go +31 -0
  12. data/assets/src/server/templates.go +42 -0
  13. data/assets/src/www/app/coffee/adapters/dummy_data.js.coffee +6 -0
  14. data/assets/src/www/app/coffee/adapters/reddit.js.coffee +294 -0
  15. data/assets/src/www/app/coffee/application.js.coffee +23 -0
  16. data/assets/src/www/app/coffee/controllers/app.js.coffee +69 -0
  17. data/assets/src/www/app/coffee/controllers/nav.js.coffee +55 -0
  18. data/assets/src/www/app/coffee/controllers/subreddit_posts.js.coffee +57 -0
  19. data/assets/src/www/app/coffee/helpers/event_manager.js.coffee +3 -0
  20. data/assets/src/www/app/coffee/helpers/properties.js.coffee +19 -0
  21. data/assets/src/www/app/coffee/helpers/storage.js.coffee +14 -0
  22. data/assets/src/www/app/coffee/libs/3rdparty.js.coffee +7 -0
  23. data/assets/src/www/app/coffee/libs/deferred.js.coffee +92 -0
  24. data/assets/src/www/app/coffee/libs/logger.js.coffee +40 -0
  25. data/assets/src/www/app/coffee/libs/mod_loader.js.coffee +44 -0
  26. data/assets/src/www/app/coffee/main.js.coffee +42 -0
  27. data/assets/src/www/app/coffee/models/comment.js.coffee +26 -0
  28. data/assets/src/www/app/coffee/models/post.js.coffee +27 -0
  29. data/assets/src/www/app/coffee/models/sub_reddit.js.coffee +18 -0
  30. data/assets/src/www/app/coffee/widgets/post_detail.js.coffee +2 -0
  31. data/assets/src/www/app/coffee/widgets/posts.js.coffee +45 -0
  32. data/assets/src/www/app/coffee/widgets/subreddit_detail.js.coffee +2 -0
  33. data/assets/src/www/app/coffee/widgets/subreddits.js.coffee +44 -0
  34. data/assets/src/www/app/images/test.png +0 -0
  35. data/assets/src/www/app/partials/index.html +92 -0
  36. data/assets/src/www/app/sass/application.css.scss +136 -0
  37. data/assets/src/www/app/templates/application.gotmpl +2 -0
  38. data/assets/src/www/app/templates/base.gotmpl.erb +27 -0
  39. data/assets/src/www/app/templates/home.gotmpl +9 -0
  40. data/assets/src/www/spec/coffee/deferred-spec.coffee +202 -0
  41. data/assets/src/www/spec/coffee/mocks.coffee +137 -0
  42. data/assets/src/www/spec/coffee/mod_loader-spec.coffee +45 -0
  43. data/assets/src/www/spec/coffee/properties-spec.coffee +21 -0
  44. data/assets/src/www/spec/coffee/reddit_adapter-spec.coffee +143 -0
  45. data/assets/src/www/vendor/css/jq.ui.css +630 -0
  46. data/assets/src/www/vendor/images/ajax-loader.png +0 -0
  47. data/assets/src/www/vendor/images/icons-18-black.png +0 -0
  48. data/assets/src/www/vendor/images/icons-18-white.png +0 -0
  49. data/assets/src/www/vendor/images/icons-36-black.png +0 -0
  50. data/assets/src/www/vendor/images/icons-36-white.png +0 -0
  51. data/assets/src/www/vendor/js/ICanHaz.min.js +10 -0
  52. data/assets/src/www/vendor/js/jq.mobi.min.js +20 -0
  53. data/assets/src/www/vendor/js/jq.ui.min.js +90 -0
  54. data/assets/src/www/vendor/js/jq.web.min.js +58 -0
  55. data/assets/src/www/vendor/js/phonegap-1.1.0.js +4577 -0
  56. data/assets/src/www/vendor/js/touch.js +103 -0
  57. data/assets/tasks/app.rake +34 -0
  58. data/assets/tasks/jasmine.rake +8 -0
  59. data/assets/tasks/server.rake +58 -0
  60. data/assets/tasks/www.rake +163 -0
  61. data/bin/gocart +25 -0
  62. data/lib/gocart.rb +5 -6
  63. data/lib/gocart/base.rb +28 -0
  64. data/lib/gocart/environment.rb +18 -0
  65. data/lib/gocart/version.rb +1 -1
  66. metadata +113 -41
  67. data/.gitignore +0 -4
  68. data/Gemfile +0 -4
  69. data/Rakefile +0 -1
  70. data/gocarg.go +0 -29
  71. 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,3 @@
1
+ modLoader.define 'helpers/event_manager', (require, exports)->
2
+
3
+ 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,7 @@
1
+
2
+ modLoader.define 'libs/3rdparty', (require,exports) ->
3
+
4
+ exports.$ = $
5
+ exports.ich = ich
6
+
7
+ 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,2 @@
1
+ modLoader.define 'app/widgets/post_detail', (require, exports) ->
2
+ 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