woyo-server 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/lib/woyo/server/server.rb +155 -29
  3. data/lib/woyo/server/version.rb +1 -1
  4. data/public/server/css/server.css +6 -6
  5. data/public/server/ember-1.6.1-kit/README.md +36 -0
  6. data/public/server/ember-1.6.1-kit/css/normalize.css +406 -0
  7. data/public/server/ember-1.6.1-kit/css/style.css +4 -0
  8. data/public/server/ember-1.6.1-kit/index.html +31 -0
  9. data/public/server/ember-1.6.1-kit/js/app.js +11 -0
  10. data/public/server/ember-1.6.1-kit/js/libs/ember-1.6.1.js +46762 -0
  11. data/public/server/ember-1.6.1-kit/js/libs/ember-data-1.0.0-beta.8.js +12053 -0
  12. data/public/server/ember-1.6.1-kit/js/libs/handlebars-1.1.2.js +2595 -0
  13. data/public/server/ember-1.6.1-kit/js/libs/jquery-1.10.2.js +9789 -0
  14. data/public/server/ember-1.6.1-kit/tests/runner.css +14 -0
  15. data/public/server/ember-1.6.1-kit/tests/runner.js +13 -0
  16. data/public/server/ember-1.6.1-kit/tests/tests.js +31 -0
  17. data/public/server/ember-1.6.1-kit/tests/vendor/qunit-1.12.0.css +244 -0
  18. data/public/server/ember-1.6.1-kit/tests/vendor/qunit-1.12.0.js +2212 -0
  19. data/public/server/ember-1.7.0/ember.js +48219 -0
  20. data/public/server/ember-animate-0.3.5/README.md +112 -0
  21. data/public/server/ember-animate-0.3.5/bower.json +25 -0
  22. data/public/server/ember-animate-0.3.5/ember-animate.js +256 -0
  23. data/public/server/ember-data-1.0.0-beta.9/ember-data.js +12877 -0
  24. data/public/server/handlebars-1.1.2/handlebars.js +2595 -0
  25. data/public/server/jquery-1.10.2/jquery.js +9789 -0
  26. data/public/server/js/play.js +246 -0
  27. data/public/server/js/server.js +5 -65
  28. data/todo.txt +17 -10
  29. data/views/server/layout.erb +37 -0
  30. data/views/server/play.erb +74 -0
  31. data/views/server/start.erb +22 -0
  32. metadata +29 -10
  33. data/views/server/actions.haml +0 -6
  34. data/views/server/item.haml +0 -7
  35. data/views/server/layout.haml +0 -25
  36. data/views/server/location.haml +0 -8
  37. data/views/server/way.haml +0 -6
  38. data/views/server/world.haml +0 -15
@@ -0,0 +1,246 @@
1
+
2
+ App = Ember.Application.create({
3
+ LOG_TRANSITIONS: true
4
+ });
5
+
6
+ App.IndexRoute = Ember.Route.extend({
7
+ beforeModel: function() {
8
+ this.transitionTo('location', initial_location_id);
9
+ }
10
+ });
11
+
12
+ App.Router.map(function() {
13
+ this.resource('location', { path: '/location/:location_id' }); //, function() {
14
+ });
15
+
16
+ // location
17
+
18
+ App.LocationRoute = Ember.Route.extend({
19
+ model: function(params) {
20
+ return this.store.find('location', params.location_id);
21
+ }
22
+ });
23
+
24
+ App.LocationController = Ember.ObjectController.extend({
25
+ });
26
+
27
+ App.LocationView = Ember.View.extend({
28
+ willAnimateIn : function () {
29
+ console.log('location willAnimateIn');
30
+ this.$().css("opacity", 0);
31
+ },
32
+ animateIn : function (done) {
33
+ console.log('location animateIn');
34
+ this.$().fadeTo(woyo.time.page_in, 1, done);
35
+ },
36
+ animateOut : function (done) {
37
+ console.log('location animateIn');
38
+ this.$().fadeTo(woyo.time.page_out, 0, done);
39
+ }
40
+ })
41
+
42
+ App.Location = DS.Model.extend({
43
+ name: DS.attr(),
44
+ description: DS.attr(),
45
+ items: DS.hasMany('item', {async:true}),
46
+ ways: DS.hasMany('way', {async:true})
47
+ });
48
+
49
+ // way
50
+
51
+ App.WayController = Ember.ObjectController.extend({
52
+ });
53
+
54
+ App.WayView = Ember.View.extend({
55
+ willAnimateIn: function () {
56
+ console.log('way willAnimateIn');
57
+ this.$().css("opacity", 0);
58
+ },
59
+ animateIn: function (done) {
60
+ console.log('way animateIn');
61
+ this.$().fadeTo(woyo.time.page_in, 1, done);
62
+ },
63
+ animateOut: function (done) {
64
+ console.log('way animateOut');
65
+ this.$().fadeTo(woyo.time.page_out, 0, done);
66
+ }
67
+ });
68
+
69
+ App.Way = DS.Model.extend({
70
+ location: DS.belongsTo('location'),
71
+ name: DS.attr(),
72
+ description: DS.attr(),
73
+ actions: DS.hasMany('action', {async:false}),
74
+ div_id: function() { return 'way-' + this.get('id'); }.property('id')
75
+ });
76
+
77
+ // item
78
+
79
+ App.ItemRoute = Ember.Route.extend({
80
+ beforeModel: function() {
81
+ console.log("item beforeModel");
82
+ },
83
+ // model: function(params) {
84
+ // return this.store.find('item', params.item_id);
85
+ // },
86
+ afterModel: function() {
87
+ console.log("item afterModel");
88
+ }
89
+ });
90
+
91
+ App.ItemController = Ember.ObjectController.extend({
92
+ });
93
+
94
+ App.ItemView = Ember.View.extend({
95
+ willAnimateIn: function () {
96
+ console.log('item willAnimateIn');
97
+ this.$().css("opacity", 0);
98
+ },
99
+ animateIn: function (done) {
100
+ console.log('item animateIn');
101
+ this.$().fadeTo(woyo.time.page_in, 1, done);
102
+ },
103
+ animateOut: function (done) {
104
+ console.log('item animateOut');
105
+ this.$().fadeTo(woyo.time.page_out, 0, done);
106
+ }
107
+ });
108
+
109
+ App.Item = DS.Model.extend({
110
+ location: DS.belongsTo('location'),
111
+ name: DS.attr(),
112
+ description: DS.attr(),
113
+ actions: DS.hasMany('action', {async:false}),
114
+ div_id: function() { return 'item-' + this.get('id'); }.property('id'),
115
+ didLoad: function() {
116
+ console.log('item didLoad');
117
+ }
118
+ });
119
+
120
+ // action
121
+
122
+ App.ActionController = Ember.ObjectController.extend({
123
+ actions: {
124
+ execute: function() {
125
+ this.get( 'execution' ).reload().then( function( execution ) {
126
+ var changes = execution.get('changes');
127
+ var result = execution.get('result')
128
+ var action = execution.get('action');
129
+ var owner = action.get('owner');
130
+ var location = owner.get('location');
131
+ // todo: make this work for all changes...
132
+ // todo: transitions for changes to ember bound fields ?
133
+ for ( change in changes ) {
134
+ if ( change == "description" || change == "name" ) {
135
+ location.set( change, changes[change] );
136
+ }
137
+ if ( change == "item" ) {
138
+ var items_changed = changes.item;
139
+ for ( item_id in items_changed ) {
140
+ var item = location.get( 'items' ).findProperty( 'id', item_id );
141
+ if ( item ) {
142
+ attrs_changed = items_changed[item_id];
143
+ for ( attr_id in attrs_changed ) {
144
+ var attr = item.get(attr_id);
145
+ if ( attr ) {
146
+ item.set( attr_id, attrs_changed[attr_id] );
147
+ };
148
+ };
149
+ };
150
+ };
151
+ };
152
+ if ( change == "way" ) {
153
+ var ways_changed = changes.way;
154
+ for ( way_id in ways_changed ) {
155
+ var way = location.get( 'ways' ).findProperty( 'id', way_id );
156
+ if ( way ) {
157
+ attrs_changed = ways_changed[way_id];
158
+ for ( attr_id in attrs_changed ) {
159
+ var attr = way.get(attr_id);
160
+ if ( attr ) {
161
+ way.set( attr_id, attrs_changed[attr_id] );
162
+ };
163
+ };
164
+ };
165
+ };
166
+ };
167
+ };
168
+ if ( result.location ) {
169
+ setTimeout(function(){ window.location.assign("/play"); }, woyo.time.go_delay);
170
+ } else {
171
+ setTimeout(function(){ execution.set( 'display_describe', null ); }, woyo.time.action_delay);
172
+ };
173
+ });
174
+ }
175
+ }
176
+ });
177
+
178
+ App.ActionView = Ember.View.extend({
179
+ willAnimateIn: function () {
180
+ console.log('action willAnimateIn');
181
+ this.$().css("opacity", 0);
182
+ },
183
+ animateIn: function (done) {
184
+ console.log('action animateIn');
185
+ this.$().fadeTo(woyo.time.page_in, 1, done);
186
+ },
187
+ animateOut: function (done) {
188
+ console.log('action animateOut');
189
+ this.$().fadeTo(woyo.time.page_out, 0, done);
190
+ }
191
+ });
192
+
193
+ App.Action = DS.Model.extend({
194
+ item: DS.belongsTo('item'),
195
+ way: DS.belongsTo('way'),
196
+ name: DS.attr(),
197
+ description: DS.attr(),
198
+ execution: DS.belongsTo('execution', {async:false}),
199
+ owner: function() { return this.get('item') || this.get('way'); }.property('item','way'),
200
+ display_description: function() { return this.get('description') || this.get('name'); }.property('description','way')
201
+ });
202
+
203
+ // execution
204
+
205
+ App.ExecutionController = Ember.ObjectController.extend({
206
+ });
207
+
208
+ App.ExecutionView = Ember.View.extend({
209
+ willAnimateIn: function () {
210
+ console.log('execution willAnimateIn');
211
+ this.$().css("opacity", 0);
212
+ },
213
+ animateIn: function (done) {
214
+ console.log('execution animateIn');
215
+ this.$().fadeTo(woyo.time.page_in, 1, done);
216
+ },
217
+ animateOut: function (done) {
218
+ console.log('execution animateOut');
219
+ this.$().fadeTo(woyo.time.page_out, 0, done);
220
+ }
221
+ });
222
+
223
+ App.Execution = DS.Model.extend({
224
+ action: DS.belongsTo('action'),
225
+ result: DS.attr(),
226
+ describe: DS.attr(),
227
+ changes: DS.attr(),
228
+ display_describe: function(key, value, old) {
229
+ // computed property to display describe lets me erase the displayed value without making the record dirty
230
+ // a clean record permits reload from the server for subsequent action executions
231
+ if ( arguments.length == 1 ) {
232
+ return this.get('describe');
233
+ } else {
234
+ return value;
235
+ }
236
+ }.property('describe')
237
+ });
238
+
239
+ // functions
240
+
241
+ function hold(delay_time){
242
+ var dfd = $.Deferred();
243
+ setTimeout(function(){ dfd.resolve(); }, delay_time);
244
+ return dfd.promise();
245
+ }
246
+
@@ -3,78 +3,18 @@ $(document).foundation();
3
3
 
4
4
  $(document).ready( function() {
5
5
 
6
- var woyo = {
6
+ woyo = {
7
7
  time: {
8
8
  page_in: 1000,
9
9
  page_out: 1000,
10
10
  go_slide: 1000,
11
11
  go_fade: 1000,
12
- go_delay: 2000
12
+ go_delay: 2000,
13
+ action_slide: 1000,
14
+ action_fade: 1000,
15
+ action_delay: 2000
13
16
  }
14
17
  };
15
18
 
16
- $("body").fadeIn(woyo.time.page_in);
17
-
18
- $(".way .go").click( function() {
19
- $go_link = $(this);
20
- go_url = $go_link.attr("href");
21
- $.get( go_url, function(json) {
22
- if ( json.going.length > 0 ) {
23
- $go_link
24
- .siblings(".going")
25
- .text(json.going)
26
- .slideDown(woyo.time.go_slide)
27
- .animate({opacity: 1}, woyo.time.go_fade)
28
- .delay(woyo.time.go_delay)
29
- .queue( function(next) {
30
- if ( json.go == true ) {
31
- $("body").fadeOut(woyo.time.page_out, function() {
32
- window.location.reload(true);
33
- });
34
- };
35
- next();
36
- });
37
- } else {
38
- if ( json.go == true ) {
39
- $("body").fadeOut(woyo.time.page_out, function() {
40
- window.location.reload(true);
41
- });
42
- };
43
- };
44
- });
45
- return false;
46
- });
47
-
48
- $("a.do").click( function() {
49
- owner = $("#" + $(this).parent().attr("owner_element"));
50
- do_url = $(this).attr("href");
51
- $.get( do_url, function(json) {
52
- // todo: handle multiple texts in describe array not just a string
53
- if ( json.describe.length > 0 ) {
54
- owner
55
- .children(".describe-actions")
56
- .text(json.describe)
57
- .slideDown(woyo.time.go_slide)
58
- .animate({opacity: 1}, woyo.time.go_fade)
59
- .delay(woyo.time.go_delay)
60
- .queue( function(next) {
61
- if ( json.changes.length > 0 ) {
62
- $("body").fadeOut(woyo.time.page_out, function() {
63
- window.location.reload(true);
64
- });
65
- };
66
- next();
67
- });
68
- } else {
69
- if ( json.changes.length > 0 ) {
70
- $("body").fadeOut(woyo.time.page_out, function() {
71
- window.location.reload(true);
72
- });
73
- };
74
- };
75
- });
76
- return false;
77
- });
78
-
79
19
  });
80
20
 
data/todo.txt CHANGED
@@ -1,5 +1,21 @@
1
1
 
2
- ! Smooth transitions for going ways
2
+
3
+ / loads page
4
+ locations [ :id1, :id2, ... ]
5
+ location/:id { id: :id, name: 'name' description: [ 'text1', 'text2', ... ] }
6
+ location/:id/ways [ :id1, :id2, ... ]
7
+ location/:id/way/:id { id: :id, name: 'name', description: [ 'text1', 'text2', ... ], to: :to_id }
8
+ location/:id/items [ :id1, :id2, ... ]
9
+ location/:id/item/:id { id: :id, name: 'name', description: [ 'text1', 'text2', ... ] }
10
+ location/:id/item/:id/actions [ :id1, :id2, ... ]
11
+ location/:id/item/:id/actions/:id { id: :id, name: 'name', description: [ 'text1', 'text2', ... ] }
12
+
13
+
14
+
15
+
16
+
17
+
18
+
3
19
  ! Multiline descriptions
4
20
  <br/> => <br/> # html in text
5
21
  <br> => <br/> # html in text + fixup tag ?
@@ -8,13 +24,4 @@
8
24
  \n => <br/> # convert
9
25
  \n\n => </p><p ... > # convert - set params for new paragraph
10
26
 
11
- Debugger
12
- Use haml tenplate for default page including layout.haml
13
- Test location description states
14
- Document DSL attributes and groups usage
15
- -> way descriptions
16
- -> way going
17
- -> location descriptions
18
- Auto generate DSL docs from tests ?
19
- Test worlds in separate files - useful for manual testing
20
27
 
@@ -0,0 +1,37 @@
1
+ <html>
2
+
3
+ <head>
4
+
5
+ <meta charset="utf-8"></meta>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"></meta>
7
+ <link rel="stylesheet" href="/foundation-5.2.2/css/foundation.css"></link>
8
+ <link rel="stylesheet" href="/css/server.css"></link>
9
+ <script src="/foundation-5.2.2/js/vendor/modernizr.js"></script>
10
+
11
+ <title>
12
+ <%= case
13
+ when @world
14
+ @world.name
15
+ when @location
16
+ @location.name
17
+ end %>
18
+ </title>
19
+
20
+ </head>
21
+
22
+ <body>
23
+
24
+ <script src="/foundation-5.2.2/js/vendor/jquery.js"/></script>
25
+ <script src="/foundation-5.2.2/js/foundation.min.js"></script>
26
+ <script src="/handlebars-1.1.2/handlebars.js"></script>
27
+ <script src="/ember-1.7.0/ember.js"></script>
28
+ <script src="/ember-data-1.0.0-beta.9/ember-data.js"></script>
29
+ <script src="/ember-animate-0.3.5/ember-animate.js"></script>
30
+ <script src="/js/server.js"></script>
31
+
32
+ <%= yield %>
33
+
34
+ </body>
35
+
36
+ </html>
37
+
@@ -0,0 +1,74 @@
1
+
2
+ <script type="text/x-handlebars">
3
+ <div class="row">
4
+ <div class="large-12 columns">
5
+ {{outlet}}
6
+ </div>
7
+ </div>
8
+ </script>
9
+
10
+ <script type="text/x-handlebars" data-template-name="location">
11
+ <div class="row">
12
+ <div class="large-12 columns">
13
+ <h1>{{name}}</h1>
14
+ <p>{{description}}</p>
15
+ {{#each item in items}}
16
+ {{render "item" item}}
17
+ {{/each}}
18
+ {{#each way in ways}}
19
+ {{render "way" way}}
20
+ {{/each}}
21
+ </div>
22
+ </div>
23
+ </script>
24
+
25
+ <script type="text/x-handlebars" data-template-name="item">
26
+ <div class="row">
27
+ <div class="large-12 columns">
28
+ <div {{bind-attr id=item.div_id}}>
29
+ <p class="description">{{description}}</p>
30
+ {{#each action in actions}}
31
+ {{render "execution" action.execution}}
32
+ {{/each}}
33
+ <ul>
34
+ {{#each action in actions}}
35
+ {{render "action" action}}
36
+ {{/each}}
37
+ </ul>
38
+ </div>
39
+ </div>
40
+ </div>
41
+ </script>
42
+
43
+ <script type="text/x-handlebars" data-template-name="way">
44
+ <div class="row">
45
+ <div class="large-12 columns">
46
+ <div {{bind-attr id=way.div_id}}>
47
+ <p class="description">{{description}}</p>
48
+ {{#each action in actions}}
49
+ {{render "execution" action.execution}}
50
+ {{/each}}
51
+ <ul>
52
+ {{#each action in actions}}
53
+ {{render "action" action}}
54
+ {{/each}}
55
+ </ul>
56
+ </div>
57
+ </div>
58
+ </div>
59
+ </script>
60
+
61
+ <script type="text/x-handlebars" data-template-name="action">
62
+ <li class="action"><a {{action 'execute'}}>{{display_description}}</a></li>
63
+ </script>
64
+
65
+ <script type="text/x-handlebars" data-template-name="execution">
66
+ <p class="describe-execution">{{display_describe}}</p>
67
+ </script>
68
+
69
+ <script type="text/javascript">
70
+ <%= "var initial_location_id = '#{@location.id}';" %>
71
+ </script>
72
+
73
+ <script src="/js/play.js"></script>
74
+