smalruby-editor 0.1.10-x86-mingw32 → 0.1.11-x86-mingw32
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.
Potentially problematic release.
This version of smalruby-editor might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/app/assets/javascripts/blocks/motion.js.coffee.erb +1 -1
- data/app/assets/javascripts/smalruby.js.coffee +18 -0
- data/app/assets/javascripts/views/main_menu_view.js.coffee +38 -1
- data/app/assets/javascripts/views/signin_modal_view.js.coffee +33 -0
- data/app/controllers/application_controller.rb +6 -0
- data/app/controllers/sessions_controller.rb +19 -0
- data/app/controllers/source_codes_controller.rb +20 -9
- data/app/helpers/sessions_helper.rb +2 -0
- data/app/views/editor/_signin_modal.html.haml +22 -0
- data/app/views/editor/_toolbox.html.haml +1 -1
- data/app/views/editor/index.html.haml +31 -1
- data/config/routes.rb +3 -0
- data/lib/smalruby_editor/version.rb +1 -1
- data/public/assets/application-53d651da3309caa498cc0ca6616dbead.css.gz +0 -0
- data/public/assets/{application-0b3c70107ad81ea9fcda6d7d921bd8cf.js → application-669cbc2df60729c4b12d739af7595cc6.js} +98 -4
- data/public/assets/{application-0b3c70107ad81ea9fcda6d7d921bd8cf.js.gz → application-669cbc2df60729c4b12d739af7595cc6.js.gz} +0 -0
- data/public/assets/manifest-332a5a1668194028b55103e0ea45c054.json +1 -1
- data/smalruby-editor.gemspec +1 -1
- data/spec/acceptance/base.feature +1 -0
- data/spec/acceptance/standalone/signin.feature +95 -0
- data/spec/controllers/sessions_controller_spec.rb +74 -0
- data/spec/helpers/sessions_helper_spec.rb +15 -0
- data/spec/steps/base_steps.rb +33 -2
- data/spec/steps/global_variable.rb +38 -11
- metadata +16 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a94273db1c791f6e7ae5c93360482e9ab8fa5076
|
4
|
+
data.tar.gz: fc488f3cb404b1fe0194070df2f1dfadf0b9bedd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 86caaa9bf6cfe611bfed8e65a648dabf4d49c9e8428067916c394fdbe8d700ed7b01fc799e7a0a34883eb8e8123a692127e4e6a6ce98b0a357b6d6eb9e6391b8
|
7
|
+
data.tar.gz: a7c3221eeac8e97d17827fe1014f37d028fece17b479439fbcef9aac3a944357bb2fa63685b05f1f185e0eb44a5515ea425e692f5226e60be6ad0035f535a2ed
|
@@ -270,7 +270,7 @@ Blockly.Blocks['<%= n %>'] =
|
|
270
270
|
|
271
271
|
Blockly.Ruby['<%= n %>'] = (block) ->
|
272
272
|
style = @getFieldValue('STYLE')
|
273
|
-
|
273
|
+
Blockly.Ruby.characterSetVariable_('rotation_style', ":#{style}")
|
274
274
|
|
275
275
|
# 変数:x座標
|
276
276
|
# 変数:y座標
|
@@ -22,12 +22,19 @@ window.errorMessage = (msg, selector = '#messages') ->
|
|
22
22
|
html.fadeIn('slow')
|
23
23
|
return
|
24
24
|
|
25
|
+
window.clearMessages = (selector = '#messages') ->
|
26
|
+
$(selector).empty()
|
27
|
+
|
25
28
|
window.Smalruby =
|
26
29
|
Models: {}
|
27
30
|
Collections: {}
|
28
31
|
Views: {}
|
29
32
|
Routers: {}
|
30
33
|
initialize: ->
|
34
|
+
$.ajaxSetup
|
35
|
+
headers:
|
36
|
+
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
|
37
|
+
|
31
38
|
# HACK: Underscoreのテンプレートの<%, %>はHamlと組み合わせたときに
|
32
39
|
# HTML要素の属性がHamlによってエスケープされてしまうため使いにく
|
33
40
|
# い。そこで、それぞれ{{, }}に変更する。
|
@@ -40,6 +47,8 @@ window.Smalruby =
|
|
40
47
|
@Collections.CharacterSet = new Smalruby.CharacterSet()
|
41
48
|
|
42
49
|
@Views.MainMenuView = new Smalruby.MainMenuView()
|
50
|
+
@Views.SigninModalView = new Smalruby.SigninModalView
|
51
|
+
el: $('#signin-modal')
|
43
52
|
@Views.CharacterSelectorView = new Smalruby.CharacterSelectorView
|
44
53
|
model: @Collections.CharacterSet
|
45
54
|
@Views.CharacterModalView = new Smalruby.CharacterModalView
|
@@ -129,5 +138,14 @@ window.Smalruby =
|
|
129
138
|
xmlDom.insertBefore(e, blocklyDom)
|
130
139
|
Blockly.Xml.domToPrettyText(xmlDom)
|
131
140
|
|
141
|
+
# テキスト入力欄のEnter(Return)キーを無視する
|
142
|
+
ignoreEnterKey: (el) ->
|
143
|
+
el.find('input[type=text]').keypress (e) ->
|
144
|
+
e = window.event if !e
|
145
|
+
if e.keyCode == 13
|
146
|
+
false
|
147
|
+
else
|
148
|
+
true
|
149
|
+
|
132
150
|
$(document).ready ->
|
133
151
|
Smalruby.initialize()
|
@@ -12,6 +12,9 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
12
12
|
'click #save-button': 'onSave'
|
13
13
|
'click #check-button': 'onCheck'
|
14
14
|
'click #reset-button': 'onReset'
|
15
|
+
'click #signin-button': 'onSignin'
|
16
|
+
'click #signout-button': 'onSignout'
|
17
|
+
'click #username-button': 'onUsername'
|
15
18
|
|
16
19
|
initialize: ->
|
17
20
|
$('#filename').keypress (e) ->
|
@@ -87,6 +90,8 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
87
90
|
filename += '.xml' unless filename.match(/\.xml$/)
|
88
91
|
xmlSourceCode = new Smalruby.SourceCode({ filename: filename })
|
89
92
|
|
93
|
+
clearMessages()
|
94
|
+
|
90
95
|
@blockUI
|
91
96
|
title:
|
92
97
|
"""
|
@@ -144,6 +149,8 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
144
149
|
|
145
150
|
sourceCode = @getSourceCode()
|
146
151
|
|
152
|
+
clearMessages()
|
153
|
+
|
147
154
|
@blockUI
|
148
155
|
title:
|
149
156
|
"""
|
@@ -199,6 +206,8 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
199
206
|
else
|
200
207
|
sourceCode = @getSourceCode()
|
201
208
|
|
209
|
+
clearMessages()
|
210
|
+
|
202
211
|
@blockUI
|
203
212
|
title:
|
204
213
|
"""
|
@@ -229,7 +238,7 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
229
238
|
onCheck: (e) ->
|
230
239
|
e.preventDefault()
|
231
240
|
|
232
|
-
|
241
|
+
clearMessages()
|
233
242
|
|
234
243
|
sourceCode = @getSourceCode()
|
235
244
|
|
@@ -265,6 +274,32 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
265
274
|
|
266
275
|
location.reload()
|
267
276
|
|
277
|
+
onSignin: (e) ->
|
278
|
+
e.preventDefault()
|
279
|
+
|
280
|
+
Smalruby.Views.SigninModalView.render()
|
281
|
+
|
282
|
+
onSignout: (e) ->
|
283
|
+
e.preventDefault()
|
284
|
+
|
285
|
+
$.ajax({
|
286
|
+
url: '/signout'
|
287
|
+
type: 'DELETE'
|
288
|
+
})
|
289
|
+
.then(
|
290
|
+
(data) ->
|
291
|
+
$('#signin-button').show()
|
292
|
+
$('#signout-button').hide()
|
293
|
+
$('#username-label').text('')
|
294
|
+
$('#username-button').hide()
|
295
|
+
successMessage('ログアウトしました')
|
296
|
+
->
|
297
|
+
errorMessage('ログアウトに失敗しました')
|
298
|
+
)
|
299
|
+
|
300
|
+
onUsername: (e) ->
|
301
|
+
e.preventDefault()
|
302
|
+
|
268
303
|
getFilename: ->
|
269
304
|
$.trim($('#filename').val())
|
270
305
|
|
@@ -330,6 +365,8 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
330
365
|
if info.error
|
331
366
|
window.errorMessage(info.filename + 'は' + info.error)
|
332
367
|
else
|
368
|
+
clearMessages()
|
369
|
+
|
333
370
|
filename = info.filename
|
334
371
|
if filename.match(/\.xml$/)
|
335
372
|
unless window.blockMode
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# ログインダイアログを表現するビュー
|
2
|
+
Smalruby.SigninModalView = Backbone.View.extend
|
3
|
+
events:
|
4
|
+
'click #signin-modal-ok-button': 'onOk' # FIXME: 本当は#signin-modal .ok-buttonを指定したいができなかった
|
5
|
+
|
6
|
+
initialize: ->
|
7
|
+
Smalruby.ignoreEnterKey(@$el)
|
8
|
+
@$el.on 'shown', =>
|
9
|
+
@$el.find('#signin-modal-username')
|
10
|
+
.focus()
|
11
|
+
|
12
|
+
render: ->
|
13
|
+
@$el.find('#signin-modal-username')
|
14
|
+
.val($('#username-label').text())
|
15
|
+
@$el.modal('show')
|
16
|
+
|
17
|
+
onOk: (e) ->
|
18
|
+
username = @$el.find('input[name=username]').val()
|
19
|
+
$.post('/sessions/', { username: username })
|
20
|
+
.then(
|
21
|
+
(data) ->
|
22
|
+
$('#signin-button').hide()
|
23
|
+
$('#signout-button').show()
|
24
|
+
$('#username-label').text(data)
|
25
|
+
$('#username-button').show()
|
26
|
+
successMessage('ログインしました')
|
27
|
+
new $.Deferred().resolve().promise()
|
28
|
+
->
|
29
|
+
errorMessage('ログインに失敗しました')
|
30
|
+
new $.Deferred().resolve().promise()
|
31
|
+
)
|
32
|
+
.done =>
|
33
|
+
@$el.modal('hide')
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# セッションを扱うコントローラ
|
3
|
+
class SessionsController < ApplicationController
|
4
|
+
before_filter :check_whether_standalone
|
5
|
+
|
6
|
+
def create
|
7
|
+
return head :bad_request if params[:username].blank?
|
8
|
+
|
9
|
+
session[:username] = params[:username].to_s
|
10
|
+
|
11
|
+
render text: session[:username]
|
12
|
+
end
|
13
|
+
|
14
|
+
def destroy
|
15
|
+
session[:username] = nil
|
16
|
+
|
17
|
+
render nothing: true
|
18
|
+
end
|
19
|
+
end
|
@@ -101,7 +101,12 @@ class SourceCodesController < ApplicationController
|
|
101
101
|
|
102
102
|
def run
|
103
103
|
source_code = SourceCode.new(source_code_params)
|
104
|
-
|
104
|
+
if session[:username]
|
105
|
+
s = "~/#{session[:username]}/#{source_code.filename}"
|
106
|
+
else
|
107
|
+
s = "~/#{source_code.filename}"
|
108
|
+
end
|
109
|
+
path = Pathname(s).expand_path
|
105
110
|
render json: source_code.run(path)
|
106
111
|
end
|
107
112
|
|
@@ -118,12 +123,6 @@ class SourceCodesController < ApplicationController
|
|
118
123
|
|
119
124
|
private
|
120
125
|
|
121
|
-
def check_whether_standalone
|
122
|
-
unless standalone?
|
123
|
-
fail "#{self.class.name}##{action_name}はstandaloneモードのみの機能です"
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
126
|
def source_code_params
|
128
127
|
params.require(:source_code).permit(:data, :filename)
|
129
128
|
end
|
@@ -154,10 +153,16 @@ class SourceCodesController < ApplicationController
|
|
154
153
|
end
|
155
154
|
|
156
155
|
def write_source_code(source_code)
|
157
|
-
|
156
|
+
if session[:username]
|
157
|
+
s = "~/#{session[:username]}/#{source_code.filename}"
|
158
|
+
else
|
159
|
+
s = "~/#{source_code.filename}"
|
160
|
+
end
|
161
|
+
path = Pathname(s).expand_path.to_s
|
158
162
|
|
159
163
|
fail 'すでに同じ名前のプログラムがあります' if File.exist?(path) && params[:force].blank?
|
160
164
|
|
165
|
+
FileUtils.mkdir_p(File.dirname(path))
|
161
166
|
File.open(path, 'w') do |f|
|
162
167
|
f.write(source_code.data)
|
163
168
|
end
|
@@ -170,7 +175,13 @@ class SourceCodesController < ApplicationController
|
|
170
175
|
end
|
171
176
|
|
172
177
|
def local_program_paths
|
173
|
-
|
178
|
+
if session[:username]
|
179
|
+
# TODO: session[:username]の/や\をエスケープする
|
180
|
+
s = "~/#{session[:username]}/*.rb.xml"
|
181
|
+
else
|
182
|
+
s = '~/*.rb.xml'
|
183
|
+
end
|
184
|
+
Pathname.glob(Pathname(s).expand_path)
|
174
185
|
end
|
175
186
|
|
176
187
|
def demo_program_paths
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#signin-modal{class: "modal hide fade", tabindex: "-1",
|
2
|
+
role: "dialog", :"aria-hidden" => "true"}
|
3
|
+
.modal-body
|
4
|
+
%h4
|
5
|
+
%i.icon-info-sign
|
6
|
+
あなたの名前をいれて、
|
7
|
+
%br
|
8
|
+
ほかの人のプログラムとまざらないようにしよう♪
|
9
|
+
%form#signin-modal-form.form-horizontal
|
10
|
+
.control-group{for: "username"}
|
11
|
+
%label.control-label{for: "signin-modal-username"}<
|
12
|
+
名前
|
13
|
+
.controls
|
14
|
+
%input#signin-modal-username.input-large{name: "username", type: "text", placeholder: "名前、生徒番号、ニックネームなど"}
|
15
|
+
|
16
|
+
.modal-footer
|
17
|
+
%button#signin-modal-cancel-button.cancel-button{class: "btn", :"data-dismiss" => "modal", :"aria-hidden" => "true"}<
|
18
|
+
%i.icon-remove
|
19
|
+
やめる
|
20
|
+
%button#signin-modal-ok-button.ok-button{class: "btn btn-primary"}<
|
21
|
+
%i.icon-circle-blank
|
22
|
+
ログイン
|
@@ -27,7 +27,7 @@
|
|
27
27
|
.btn-group
|
28
28
|
%a#submenu-button{:class => "dropdown-toggle btn btn-primary", :"data-toggle" => "dropdown", :href => "#"}
|
29
29
|
%i.icon-reorder
|
30
|
-
%ul.dropdown-menu{:class => "pull-right"}
|
30
|
+
%ul#submenu.dropdown-menu{:class => "pull-right"}
|
31
31
|
%li
|
32
32
|
- if standalone?
|
33
33
|
- load_id = 'load-local-button'
|
@@ -53,6 +53,34 @@
|
|
53
53
|
%h4
|
54
54
|
%i.icon-off
|
55
55
|
リセット
|
56
|
+
- if standalone?
|
57
|
+
%li
|
58
|
+
- if session[:username]
|
59
|
+
%a#signout-button
|
60
|
+
%h4
|
61
|
+
%i.icon-eject
|
62
|
+
ログアウト
|
63
|
+
- else
|
64
|
+
%a#signout-button{style: "display: none"}
|
65
|
+
%h4
|
66
|
+
%i.icon-eject
|
67
|
+
ログアウト
|
68
|
+
- if standalone?
|
69
|
+
- if session[:username]
|
70
|
+
%button#signin-button{class: "btn btn-danger", style: "display: none"}<
|
71
|
+
%i.icon-user
|
72
|
+
ログイン
|
73
|
+
%button#username-button{class: "btn btn-success"}<
|
74
|
+
%i.icon-user
|
75
|
+
%span#username-label<
|
76
|
+
= session[:username]
|
77
|
+
- else
|
78
|
+
%button#signin-button{class: "btn btn-danger"}<
|
79
|
+
%i.icon-user
|
80
|
+
ログイン
|
81
|
+
%button#username-button{class: "btn btn-success", style: "display: none"}<
|
82
|
+
%i.icon-user
|
83
|
+
%span#username-label
|
56
84
|
|
57
85
|
#messages
|
58
86
|
|
@@ -62,3 +90,5 @@
|
|
62
90
|
|
63
91
|
#ruby-tab{:class => 'tab-pane modes-tab-pane'}
|
64
92
|
#text-editor
|
93
|
+
|
94
|
+
= render 'signin_modal'
|
data/config/routes.rb
CHANGED
@@ -5,6 +5,9 @@ SmalrubyEditor::Application.routes.draw do
|
|
5
5
|
match '/demo(/:filename)' => 'editor#demo',
|
6
6
|
defaults: { filename: 'car_chase' }, via: :get
|
7
7
|
|
8
|
+
resources :sessions, only: [:create, :destroy]
|
9
|
+
match '/signout', to: 'sessions#destroy', via: 'delete'
|
10
|
+
|
8
11
|
resources :source_codes, only: [:create, :index]
|
9
12
|
post 'source_codes/check'
|
10
13
|
delete 'source_codes/download'
|
Binary file
|
@@ -12526,6 +12526,13 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
|
|
12526
12526
|
html.fadeIn('slow');
|
12527
12527
|
};
|
12528
12528
|
|
12529
|
+
window.clearMessages = function(selector) {
|
12530
|
+
if (selector == null) {
|
12531
|
+
selector = '#messages';
|
12532
|
+
}
|
12533
|
+
return $(selector).empty();
|
12534
|
+
};
|
12535
|
+
|
12529
12536
|
window.Smalruby = {
|
12530
12537
|
Models: {},
|
12531
12538
|
Collections: {},
|
@@ -12534,6 +12541,11 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
|
|
12534
12541
|
initialize: function() {
|
12535
12542
|
var session, textEditor,
|
12536
12543
|
_this = this;
|
12544
|
+
$.ajaxSetup({
|
12545
|
+
headers: {
|
12546
|
+
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
|
12547
|
+
}
|
12548
|
+
});
|
12537
12549
|
_.extend(_.templateSettings, {
|
12538
12550
|
escape: /{{-([\s\S]+?)}}/,
|
12539
12551
|
evaluate: /{{([\s\S]+?)}}/,
|
@@ -12541,6 +12553,9 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
|
|
12541
12553
|
});
|
12542
12554
|
this.Collections.CharacterSet = new Smalruby.CharacterSet();
|
12543
12555
|
this.Views.MainMenuView = new Smalruby.MainMenuView();
|
12556
|
+
this.Views.SigninModalView = new Smalruby.SigninModalView({
|
12557
|
+
el: $('#signin-modal')
|
12558
|
+
});
|
12544
12559
|
this.Views.CharacterSelectorView = new Smalruby.CharacterSelectorView({
|
12545
12560
|
model: this.Collections.CharacterSet
|
12546
12561
|
});
|
@@ -12641,6 +12656,18 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
|
|
12641
12656
|
return xmlDom.insertBefore(e, blocklyDom);
|
12642
12657
|
});
|
12643
12658
|
return Blockly.Xml.domToPrettyText(xmlDom);
|
12659
|
+
},
|
12660
|
+
ignoreEnterKey: function(el) {
|
12661
|
+
return el.find('input[type=text]').keypress(function(e) {
|
12662
|
+
if (!e) {
|
12663
|
+
e = window.event;
|
12664
|
+
}
|
12665
|
+
if (e.keyCode === 13) {
|
12666
|
+
return false;
|
12667
|
+
} else {
|
12668
|
+
return true;
|
12669
|
+
}
|
12670
|
+
});
|
12644
12671
|
}
|
12645
12672
|
};
|
12646
12673
|
|
@@ -13347,7 +13374,10 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
|
|
13347
13374
|
'click #load-button': 'onLoad',
|
13348
13375
|
'click #save-button': 'onSave',
|
13349
13376
|
'click #check-button': 'onCheck',
|
13350
|
-
'click #reset-button': 'onReset'
|
13377
|
+
'click #reset-button': 'onReset',
|
13378
|
+
'click #signin-button': 'onSignin',
|
13379
|
+
'click #signout-button': 'onSignout',
|
13380
|
+
'click #username-button': 'onUsername'
|
13351
13381
|
},
|
13352
13382
|
initialize: function() {
|
13353
13383
|
var _this = this;
|
@@ -13430,6 +13460,7 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
|
|
13430
13460
|
xmlSourceCode = new Smalruby.SourceCode({
|
13431
13461
|
filename: filename
|
13432
13462
|
});
|
13463
|
+
clearMessages();
|
13433
13464
|
this.blockUI({
|
13434
13465
|
title: "<i class=\"icon-play\"></i>\nプログラムの実行中",
|
13435
13466
|
message: 'プログラムの画面に切り替えてください。',
|
@@ -13494,6 +13525,7 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
|
|
13494
13525
|
var sourceCode;
|
13495
13526
|
e.preventDefault();
|
13496
13527
|
sourceCode = this.getSourceCode();
|
13528
|
+
clearMessages();
|
13497
13529
|
this.blockUI({
|
13498
13530
|
title: "プログラムのダウンロード中",
|
13499
13531
|
message: 'プログラムをダウンロードしています。',
|
@@ -13546,6 +13578,7 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
|
|
13546
13578
|
} else {
|
13547
13579
|
sourceCode = this.getSourceCode();
|
13548
13580
|
}
|
13581
|
+
clearMessages();
|
13549
13582
|
this.blockUI({
|
13550
13583
|
title: "プログラムのセーブ中",
|
13551
13584
|
message: 'プログラムをセーブしています。',
|
@@ -13569,6 +13602,7 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
|
|
13569
13602
|
onCheck: function(e) {
|
13570
13603
|
var sourceCode;
|
13571
13604
|
e.preventDefault();
|
13605
|
+
clearMessages();
|
13572
13606
|
sourceCode = this.getSourceCode();
|
13573
13607
|
this.blockUI({
|
13574
13608
|
title: "プログラムのチェック中",
|
@@ -13602,6 +13636,28 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
|
|
13602
13636
|
e.preventDefault();
|
13603
13637
|
return location.reload();
|
13604
13638
|
},
|
13639
|
+
onSignin: function(e) {
|
13640
|
+
e.preventDefault();
|
13641
|
+
return Smalruby.Views.SigninModalView.render();
|
13642
|
+
},
|
13643
|
+
onSignout: function(e) {
|
13644
|
+
e.preventDefault();
|
13645
|
+
return $.ajax({
|
13646
|
+
url: '/signout',
|
13647
|
+
type: 'DELETE'
|
13648
|
+
}).then(function(data) {
|
13649
|
+
$('#signin-button').show();
|
13650
|
+
$('#signout-button').hide();
|
13651
|
+
$('#username-label').text('');
|
13652
|
+
$('#username-button').hide();
|
13653
|
+
return successMessage('ログアウトしました');
|
13654
|
+
}, function() {
|
13655
|
+
return errorMessage('ログアウトに失敗しました');
|
13656
|
+
});
|
13657
|
+
},
|
13658
|
+
onUsername: function(e) {
|
13659
|
+
return e.preventDefault();
|
13660
|
+
},
|
13605
13661
|
getFilename: function() {
|
13606
13662
|
return $.trim($('#filename').val());
|
13607
13663
|
},
|
@@ -13657,6 +13713,7 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
|
|
13657
13713
|
if (info.error) {
|
13658
13714
|
return window.errorMessage(info.filename + 'は' + info.error);
|
13659
13715
|
} else {
|
13716
|
+
clearMessages();
|
13660
13717
|
filename = info.filename;
|
13661
13718
|
if (filename.match(/\.xml$/)) {
|
13662
13719
|
if (!window.blockMode) {
|
@@ -13686,6 +13743,45 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
|
|
13686
13743
|
}
|
13687
13744
|
});
|
13688
13745
|
|
13746
|
+
}).call(this);
|
13747
|
+
(function() {
|
13748
|
+
Smalruby.SigninModalView = Backbone.View.extend({
|
13749
|
+
events: {
|
13750
|
+
'click #signin-modal-ok-button': 'onOk'
|
13751
|
+
},
|
13752
|
+
initialize: function() {
|
13753
|
+
var _this = this;
|
13754
|
+
Smalruby.ignoreEnterKey(this.$el);
|
13755
|
+
return this.$el.on('shown', function() {
|
13756
|
+
return _this.$el.find('#signin-modal-username').focus();
|
13757
|
+
});
|
13758
|
+
},
|
13759
|
+
render: function() {
|
13760
|
+
this.$el.find('#signin-modal-username').val($('#username-label').text());
|
13761
|
+
return this.$el.modal('show');
|
13762
|
+
},
|
13763
|
+
onOk: function(e) {
|
13764
|
+
var username,
|
13765
|
+
_this = this;
|
13766
|
+
username = this.$el.find('input[name=username]').val();
|
13767
|
+
return $.post('/sessions/', {
|
13768
|
+
username: username
|
13769
|
+
}).then(function(data) {
|
13770
|
+
$('#signin-button').hide();
|
13771
|
+
$('#signout-button').show();
|
13772
|
+
$('#username-label').text(data);
|
13773
|
+
$('#username-button').show();
|
13774
|
+
successMessage('ログインしました');
|
13775
|
+
return new $.Deferred().resolve().promise();
|
13776
|
+
}, function() {
|
13777
|
+
errorMessage('ログインに失敗しました');
|
13778
|
+
return new $.Deferred().resolve().promise();
|
13779
|
+
}).done(function() {
|
13780
|
+
return _this.$el.modal('hide');
|
13781
|
+
});
|
13782
|
+
}
|
13783
|
+
});
|
13784
|
+
|
13689
13785
|
}).call(this);
|
13690
13786
|
(function() {
|
13691
13787
|
Blockly.Ruby = new Blockly.Generator('Ruby');
|
@@ -15501,9 +15597,7 @@ case end next return until\
|
|
15501
15597
|
Blockly.Ruby['motion_set_rotation_style'] = function(block) {
|
15502
15598
|
var style;
|
15503
15599
|
style = this.getFieldValue('STYLE');
|
15504
|
-
return "" +
|
15505
|
-
dropSelf: false
|
15506
|
-
})) + "rotation_style = :" + style + "\n";
|
15600
|
+
return Blockly.Ruby.characterSetVariable_('rotation_style', ":" + style);
|
15507
15601
|
};
|
15508
15602
|
|
15509
15603
|
Blockly.Blocks['motion_self_x'] = {
|
Binary file
|
@@ -1 +1 @@
|
|
1
|
-
{"files":{"default-5d1886100d7c8961e9962bbc4bb0c714.xml":{"logical_path":"default.xml","mtime":"2014-02-14T01:28:48+09:00","size":5017,"digest":"5d1886100d7c8961e9962bbc4bb0c714"},"rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml":{"logical_path":"rgb_led_anode.xml","mtime":"2014-02-11T14:17:03+09:00","size":3805,"digest":"91225bef2a8b97f1cefee862a0619b91"},"favicon-a37c90b368fd8ed436cb8f9e9396465c.ico":{"logical_path":"favicon.ico","mtime":"2014-01-21T03:18:02+09:00","size":5430,"digest":"a37c90b368fd8ed436cb8f9e9396465c"},"application-735e172a0df828da16d22f5d3c26671f.js":{"logical_path":"application.js","mtime":"2014-02-19T18:22:09+09:00","size":1440213,"digest":"735e172a0df828da16d22f5d3c26671f"},"application-64a390efe879c386a5950515064f062d.css":{"logical_path":"application.css","mtime":"2014-02-19T14:32:55+09:00","size":119186,"digest":"64a390efe879c386a5950515064f062d"},"jquery-ui/animated-overlay-c48c87b7a95316f4698484e3b85ee4aa.gif":{"logical_path":"jquery-ui/animated-overlay.gif","mtime":"2014-02-04T09:35:48+09:00","size":1738,"digest":"c48c87b7a95316f4698484e3b85ee4aa"},"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-58b63faadd031ca3db096dfdffd90224.png":{"logical_path":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png","mtime":"2014-02-04T09:35:48+09:00","size":180,"digest":"58b63faadd031ca3db096dfdffd90224"},"jquery-ui/ui-bg_flat_75_ffffff_40x100-937399e8b369d64aa075d13a82c00112.png":{"logical_path":"jquery-ui/ui-bg_flat_75_ffffff_40x100.png","mtime":"2014-02-04T09:35:48+09:00","size":178,"digest":"937399e8b369d64aa075d13a82c00112"},"jquery-ui/ui-bg_glass_55_fbf9ee_1x400-a8c503e0f42a081a92a473b0d30ac6cf.png":{"logical_path":"jquery-ui/ui-bg_glass_55_fbf9ee_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":120,"digest":"a8c503e0f42a081a92a473b0d30ac6cf"},"jquery-ui/ui-bg_glass_65_ffffff_1x400-ddcbfe385abc3947937caa0b44e2f5d2.png":{"logical_path":"jquery-ui/ui-bg_glass_65_ffffff_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":105,"digest":"ddcbfe385abc3947937caa0b44e2f5d2"},"jquery-ui/ui-bg_glass_75_dadada_1x400-14dd4a9ad1f21d8c4c7e673ddfb0806f.png":{"logical_path":"jquery-ui/ui-bg_glass_75_dadada_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":111,"digest":"14dd4a9ad1f21d8c4c7e673ddfb0806f"},"jquery-ui/ui-bg_glass_75_e6e6e6_1x400-a43dfabb23b0a987b567b282bad68346.png":{"logical_path":"jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":110,"digest":"a43dfabb23b0a987b567b282bad68346"},"jquery-ui/ui-bg_glass_95_fef1ec_1x400-31c0c791a756266043ee8ea61dacb36a.png":{"logical_path":"jquery-ui/ui-bg_glass_95_fef1ec_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":119,"digest":"31c0c791a756266043ee8ea61dacb36a"},"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100-33edbdb0d2fcebd2a65c2041a28533da.png":{"logical_path":"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100.png","mtime":"2014-02-04T09:35:48+09:00","size":101,"digest":"33edbdb0d2fcebd2a65c2041a28533da"},"jquery-ui/ui-icons_222222_256x240-890385424135de1513f00cbecfb7f990.png":{"logical_path":"jquery-ui/ui-icons_222222_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"890385424135de1513f00cbecfb7f990"},"jquery-ui/ui-icons_2e83ff_256x240-824705ca4aa2610434a358fe4018c9c6.png":{"logical_path":"jquery-ui/ui-icons_2e83ff_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"824705ca4aa2610434a358fe4018c9c6"},"jquery-ui/ui-icons_454545_256x240-254e054f6df453dfac49efbc8b78f79d.png":{"logical_path":"jquery-ui/ui-icons_454545_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"254e054f6df453dfac49efbc8b78f79d"},"jquery-ui/ui-icons_888888_256x240-57c441f87c4289a5372823f506c1182d.png":{"logical_path":"jquery-ui/ui-icons_888888_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"57c441f87c4289a5372823f506c1182d"},"jquery-ui/ui-icons_cd0a0a_256x240-261647ac915575f3981ded254ae8d43e.png":{"logical_path":"jquery-ui/ui-icons_cd0a0a_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"261647ac915575f3981ded254ae8d43e"},"loading-e8e6dd7833131c92a6c3b9c8ccc6a6ac.gif":{"logical_path":"loading.gif","mtime":"2014-01-03T14:44:55+09:00","size":3897,"digest":"e8e6dd7833131c92a6c3b9c8ccc6a6ac"},"progressbar-82023a146fba2a0f6d925629ed2b09c5.gif":{"logical_path":"progressbar.gif","mtime":"2014-01-03T14:44:55+09:00","size":3323,"digest":"82023a146fba2a0f6d925629ed2b09c5"},"application-0047adbc0fb7a529ef7a41b5e0e7d097.js":{"logical_path":"application.js","mtime":"2014-02-20T03:12:12+09:00","size":1441568,"digest":"0047adbc0fb7a529ef7a41b5e0e7d097"},"application-42aa660a3233c7738b7578d30ba040b3.js":{"logical_path":"application.js","mtime":"2014-02-22T15:25:11+09:00","size":1441708,"digest":"42aa660a3233c7738b7578d30ba040b3"},"application-66b65154e7b5dcfe67fa164db6fc5f51.js":{"logical_path":"application.js","mtime":"2014-02-23T21:53:43+09:00","size":1441898,"digest":"66b65154e7b5dcfe67fa164db6fc5f51"},"application-8bfffad1222d4e198f3c7ccc1cbd774f.js":{"logical_path":"application.js","mtime":"2014-02-27T01:28:32+09:00","size":1442504,"digest":"8bfffad1222d4e198f3c7ccc1cbd774f"},"application-4f747690ebc8ec4815ae36021fdb2c44.js":{"logical_path":"application.js","mtime":"2014-03-07T12:36:30+09:00","size":1447094,"digest":"4f747690ebc8ec4815ae36021fdb2c44"},"application-28b7bed56c5389dfa372e972c75b6676.css":{"logical_path":"application.css","mtime":"2014-03-07T10:27:39+09:00","size":119378,"digest":"28b7bed56c5389dfa372e972c75b6676"},"application-3ee566927dc437f1406e5e903da1baf5.js":{"logical_path":"application.js","mtime":"2014-04-30T00:15:32+09:00","size":1452218,"digest":"3ee566927dc437f1406e5e903da1baf5"},"application-5f1777e683ca5d3cf4e0f0374eab6fac.css":{"logical_path":"application.css","mtime":"2014-03-29T10:25:16+09:00","size":120345,"digest":"5f1777e683ca5d3cf4e0f0374eab6fac"},"application-53d651da3309caa498cc0ca6616dbead.css":{"logical_path":"application.css","mtime":"2014-
|
1
|
+
{"files":{"default-5d1886100d7c8961e9962bbc4bb0c714.xml":{"logical_path":"default.xml","mtime":"2014-02-14T01:28:48+09:00","size":5017,"digest":"5d1886100d7c8961e9962bbc4bb0c714"},"rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml":{"logical_path":"rgb_led_anode.xml","mtime":"2014-02-11T14:17:03+09:00","size":3805,"digest":"91225bef2a8b97f1cefee862a0619b91"},"favicon-a37c90b368fd8ed436cb8f9e9396465c.ico":{"logical_path":"favicon.ico","mtime":"2014-01-21T03:18:02+09:00","size":5430,"digest":"a37c90b368fd8ed436cb8f9e9396465c"},"application-735e172a0df828da16d22f5d3c26671f.js":{"logical_path":"application.js","mtime":"2014-02-19T18:22:09+09:00","size":1440213,"digest":"735e172a0df828da16d22f5d3c26671f"},"application-64a390efe879c386a5950515064f062d.css":{"logical_path":"application.css","mtime":"2014-02-19T14:32:55+09:00","size":119186,"digest":"64a390efe879c386a5950515064f062d"},"jquery-ui/animated-overlay-c48c87b7a95316f4698484e3b85ee4aa.gif":{"logical_path":"jquery-ui/animated-overlay.gif","mtime":"2014-02-04T09:35:48+09:00","size":1738,"digest":"c48c87b7a95316f4698484e3b85ee4aa"},"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-58b63faadd031ca3db096dfdffd90224.png":{"logical_path":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png","mtime":"2014-02-04T09:35:48+09:00","size":180,"digest":"58b63faadd031ca3db096dfdffd90224"},"jquery-ui/ui-bg_flat_75_ffffff_40x100-937399e8b369d64aa075d13a82c00112.png":{"logical_path":"jquery-ui/ui-bg_flat_75_ffffff_40x100.png","mtime":"2014-02-04T09:35:48+09:00","size":178,"digest":"937399e8b369d64aa075d13a82c00112"},"jquery-ui/ui-bg_glass_55_fbf9ee_1x400-a8c503e0f42a081a92a473b0d30ac6cf.png":{"logical_path":"jquery-ui/ui-bg_glass_55_fbf9ee_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":120,"digest":"a8c503e0f42a081a92a473b0d30ac6cf"},"jquery-ui/ui-bg_glass_65_ffffff_1x400-ddcbfe385abc3947937caa0b44e2f5d2.png":{"logical_path":"jquery-ui/ui-bg_glass_65_ffffff_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":105,"digest":"ddcbfe385abc3947937caa0b44e2f5d2"},"jquery-ui/ui-bg_glass_75_dadada_1x400-14dd4a9ad1f21d8c4c7e673ddfb0806f.png":{"logical_path":"jquery-ui/ui-bg_glass_75_dadada_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":111,"digest":"14dd4a9ad1f21d8c4c7e673ddfb0806f"},"jquery-ui/ui-bg_glass_75_e6e6e6_1x400-a43dfabb23b0a987b567b282bad68346.png":{"logical_path":"jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":110,"digest":"a43dfabb23b0a987b567b282bad68346"},"jquery-ui/ui-bg_glass_95_fef1ec_1x400-31c0c791a756266043ee8ea61dacb36a.png":{"logical_path":"jquery-ui/ui-bg_glass_95_fef1ec_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":119,"digest":"31c0c791a756266043ee8ea61dacb36a"},"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100-33edbdb0d2fcebd2a65c2041a28533da.png":{"logical_path":"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100.png","mtime":"2014-02-04T09:35:48+09:00","size":101,"digest":"33edbdb0d2fcebd2a65c2041a28533da"},"jquery-ui/ui-icons_222222_256x240-890385424135de1513f00cbecfb7f990.png":{"logical_path":"jquery-ui/ui-icons_222222_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"890385424135de1513f00cbecfb7f990"},"jquery-ui/ui-icons_2e83ff_256x240-824705ca4aa2610434a358fe4018c9c6.png":{"logical_path":"jquery-ui/ui-icons_2e83ff_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"824705ca4aa2610434a358fe4018c9c6"},"jquery-ui/ui-icons_454545_256x240-254e054f6df453dfac49efbc8b78f79d.png":{"logical_path":"jquery-ui/ui-icons_454545_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"254e054f6df453dfac49efbc8b78f79d"},"jquery-ui/ui-icons_888888_256x240-57c441f87c4289a5372823f506c1182d.png":{"logical_path":"jquery-ui/ui-icons_888888_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"57c441f87c4289a5372823f506c1182d"},"jquery-ui/ui-icons_cd0a0a_256x240-261647ac915575f3981ded254ae8d43e.png":{"logical_path":"jquery-ui/ui-icons_cd0a0a_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"261647ac915575f3981ded254ae8d43e"},"loading-e8e6dd7833131c92a6c3b9c8ccc6a6ac.gif":{"logical_path":"loading.gif","mtime":"2014-01-03T14:44:55+09:00","size":3897,"digest":"e8e6dd7833131c92a6c3b9c8ccc6a6ac"},"progressbar-82023a146fba2a0f6d925629ed2b09c5.gif":{"logical_path":"progressbar.gif","mtime":"2014-01-03T14:44:55+09:00","size":3323,"digest":"82023a146fba2a0f6d925629ed2b09c5"},"application-0047adbc0fb7a529ef7a41b5e0e7d097.js":{"logical_path":"application.js","mtime":"2014-02-20T03:12:12+09:00","size":1441568,"digest":"0047adbc0fb7a529ef7a41b5e0e7d097"},"application-42aa660a3233c7738b7578d30ba040b3.js":{"logical_path":"application.js","mtime":"2014-02-22T15:25:11+09:00","size":1441708,"digest":"42aa660a3233c7738b7578d30ba040b3"},"application-66b65154e7b5dcfe67fa164db6fc5f51.js":{"logical_path":"application.js","mtime":"2014-02-23T21:53:43+09:00","size":1441898,"digest":"66b65154e7b5dcfe67fa164db6fc5f51"},"application-8bfffad1222d4e198f3c7ccc1cbd774f.js":{"logical_path":"application.js","mtime":"2014-02-27T01:28:32+09:00","size":1442504,"digest":"8bfffad1222d4e198f3c7ccc1cbd774f"},"application-4f747690ebc8ec4815ae36021fdb2c44.js":{"logical_path":"application.js","mtime":"2014-03-07T12:36:30+09:00","size":1447094,"digest":"4f747690ebc8ec4815ae36021fdb2c44"},"application-28b7bed56c5389dfa372e972c75b6676.css":{"logical_path":"application.css","mtime":"2014-03-07T10:27:39+09:00","size":119378,"digest":"28b7bed56c5389dfa372e972c75b6676"},"application-3ee566927dc437f1406e5e903da1baf5.js":{"logical_path":"application.js","mtime":"2014-04-30T00:15:32+09:00","size":1452218,"digest":"3ee566927dc437f1406e5e903da1baf5"},"application-5f1777e683ca5d3cf4e0f0374eab6fac.css":{"logical_path":"application.css","mtime":"2014-03-29T10:25:16+09:00","size":120345,"digest":"5f1777e683ca5d3cf4e0f0374eab6fac"},"application-53d651da3309caa498cc0ca6616dbead.css":{"logical_path":"application.css","mtime":"2014-05-06T14:59:20+09:00","size":118430,"digest":"53d651da3309caa498cc0ca6616dbead"},"application-0b3c70107ad81ea9fcda6d7d921bd8cf.js":{"logical_path":"application.js","mtime":"2014-04-30T02:04:36+09:00","size":1452582,"digest":"0b3c70107ad81ea9fcda6d7d921bd8cf"},"application-c2d6a82134037eb9a7f6c7d13d2657db.js":{"logical_path":"application.js","mtime":"2014-05-06T21:22:51+09:00","size":1455113,"digest":"c2d6a82134037eb9a7f6c7d13d2657db"},"application-669cbc2df60729c4b12d739af7595cc6.js":{"logical_path":"application.js","mtime":"2014-05-08T04:10:12+09:00","size":1455352,"digest":"669cbc2df60729c4b12d739af7595cc6"}},"assets":{"default.xml":"default-5d1886100d7c8961e9962bbc4bb0c714.xml","rgb_led_anode.xml":"rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml","favicon.ico":"favicon-a37c90b368fd8ed436cb8f9e9396465c.ico","application.js":"application-669cbc2df60729c4b12d739af7595cc6.js","application.css":"application-53d651da3309caa498cc0ca6616dbead.css","jquery-ui/animated-overlay.gif":"jquery-ui/animated-overlay-c48c87b7a95316f4698484e3b85ee4aa.gif","jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-58b63faadd031ca3db096dfdffd90224.png","jquery-ui/ui-bg_flat_75_ffffff_40x100.png":"jquery-ui/ui-bg_flat_75_ffffff_40x100-937399e8b369d64aa075d13a82c00112.png","jquery-ui/ui-bg_glass_55_fbf9ee_1x400.png":"jquery-ui/ui-bg_glass_55_fbf9ee_1x400-a8c503e0f42a081a92a473b0d30ac6cf.png","jquery-ui/ui-bg_glass_65_ffffff_1x400.png":"jquery-ui/ui-bg_glass_65_ffffff_1x400-ddcbfe385abc3947937caa0b44e2f5d2.png","jquery-ui/ui-bg_glass_75_dadada_1x400.png":"jquery-ui/ui-bg_glass_75_dadada_1x400-14dd4a9ad1f21d8c4c7e673ddfb0806f.png","jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png":"jquery-ui/ui-bg_glass_75_e6e6e6_1x400-a43dfabb23b0a987b567b282bad68346.png","jquery-ui/ui-bg_glass_95_fef1ec_1x400.png":"jquery-ui/ui-bg_glass_95_fef1ec_1x400-31c0c791a756266043ee8ea61dacb36a.png","jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100.png":"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100-33edbdb0d2fcebd2a65c2041a28533da.png","jquery-ui/ui-icons_222222_256x240.png":"jquery-ui/ui-icons_222222_256x240-890385424135de1513f00cbecfb7f990.png","jquery-ui/ui-icons_2e83ff_256x240.png":"jquery-ui/ui-icons_2e83ff_256x240-824705ca4aa2610434a358fe4018c9c6.png","jquery-ui/ui-icons_454545_256x240.png":"jquery-ui/ui-icons_454545_256x240-254e054f6df453dfac49efbc8b78f79d.png","jquery-ui/ui-icons_888888_256x240.png":"jquery-ui/ui-icons_888888_256x240-57c441f87c4289a5372823f506c1182d.png","jquery-ui/ui-icons_cd0a0a_256x240.png":"jquery-ui/ui-icons_cd0a0a_256x240-261647ac915575f3981ded254ae8d43e.png","loading.gif":"loading-e8e6dd7833131c92a6c3b9c8ccc6a6ac.gif","progressbar.gif":"progressbar-82023a146fba2a0f6d925629ed2b09c5.gif"}}
|
data/smalruby-editor.gemspec
CHANGED
@@ -68,7 +68,7 @@ Gem::Specification.new do |spec|
|
|
68
68
|
['launchy'],
|
69
69
|
['mime-types', '~> 1.16'],
|
70
70
|
['haml-rails'],
|
71
|
-
['smalruby', '~> 0.0.
|
71
|
+
['smalruby', '~> 0.0.19'],
|
72
72
|
]
|
73
73
|
runtime_dependencies << ['therubyracer'] unless is_windows
|
74
74
|
runtime_dependencies.each do |args|
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# language: ja
|
3
|
+
@javascript
|
4
|
+
@standalone
|
5
|
+
機能: SignIn - ログイン(standaloneモード)
|
6
|
+
背景:
|
7
|
+
前提 セッションをクリアする
|
8
|
+
|
9
|
+
シナリオ: ログイン後、ログアウトする
|
10
|
+
もし "トップページ" にアクセスする
|
11
|
+
|
12
|
+
ならば "メニュー" に "ログイン" を含むこと
|
13
|
+
|
14
|
+
もし "サブメニューボタン" をクリックする
|
15
|
+
|
16
|
+
ならば "サブメニュー" に "ログアウト" を含まないこと
|
17
|
+
|
18
|
+
もし "ログインボタン" をクリックする
|
19
|
+
|
20
|
+
ならば "ログインダイアログ" が表示されていること
|
21
|
+
|
22
|
+
もし "ログインダイアログの名前" に "1102" を指定する
|
23
|
+
かつ "ログインダイアログのログインボタン" をクリックする
|
24
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
25
|
+
|
26
|
+
ならば "メッセージ" に "ログインしました" を含むこと
|
27
|
+
かつ "メニュー" に "1102" を含むこと
|
28
|
+
|
29
|
+
もし "サブメニューボタン" をクリックする
|
30
|
+
|
31
|
+
ならば "サブメニュー" に "ログアウト" を含むこと
|
32
|
+
|
33
|
+
もし サブメニューの "ログアウトボタン" をクリックする
|
34
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
35
|
+
|
36
|
+
ならば "メッセージ" に "ログアウトしました" を含むこと
|
37
|
+
かつ "メニュー" に "ログイン" を含むこと
|
38
|
+
かつ "メニュー" に "1102" を含まないこと
|
39
|
+
|
40
|
+
もし "サブメニューボタン" をクリックする
|
41
|
+
|
42
|
+
ならば "サブメニュー" に "ログアウト" を含まないこと
|
43
|
+
|
44
|
+
シナリオ: 名前を指定せずにログインボタンを押す
|
45
|
+
前提 "トップページ" にアクセスする
|
46
|
+
かつ "ログインボタン" をクリックする
|
47
|
+
|
48
|
+
もし "ログインダイアログの名前" に "" を指定する
|
49
|
+
かつ "ログインダイアログのログインボタン" をクリックする
|
50
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
51
|
+
|
52
|
+
ならば "メッセージ" に "ログインに失敗しました" を含むこと
|
53
|
+
かつ "メニュー" に "ログイン" を含むこと
|
54
|
+
|
55
|
+
シナリオ: ログインをやめる
|
56
|
+
前提 "トップページ" にアクセスする
|
57
|
+
かつ "ログインボタン" をクリックする
|
58
|
+
かつ "ログインダイアログの名前" に "1102" を指定する
|
59
|
+
|
60
|
+
もし "ログインダイアログのやめるボタン" をクリックする
|
61
|
+
|
62
|
+
ならば "メッセージ" に "ログインしました" を含まないこと
|
63
|
+
かつ "メニュー" に "ログイン" を含むこと
|
64
|
+
|
65
|
+
シナリオ: ログイン後にプログラムを実行する
|
66
|
+
前提 "トップページ" にアクセスする
|
67
|
+
かつ "ログインボタン" をクリックする
|
68
|
+
かつ "ログインダイアログの名前" に "1102" を指定する
|
69
|
+
かつ "ログインダイアログのログインボタン" をクリックする
|
70
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
71
|
+
かつ "Ruby" タブを表示する
|
72
|
+
かつ プログラムの名前に "01.rb" を指定する
|
73
|
+
かつ テキストエディタに "puts 'Hello, World!'" を入力済みである
|
74
|
+
|
75
|
+
もし "実行ボタン" をクリックする
|
76
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
77
|
+
|
78
|
+
ならば "~/1102" ディレクトリに "01.rb" が存在すること
|
79
|
+
かつ "~/1102" ディレクトリの "01.rb" の内容が "puts 'Hello, World!'" であること
|
80
|
+
|
81
|
+
シナリオ: ログイン後、リセットする
|
82
|
+
前提 "トップページ" にアクセスする
|
83
|
+
かつ "ログインボタン" をクリックする
|
84
|
+
かつ "ログインダイアログの名前" に "1102" を指定する
|
85
|
+
かつ "ログインダイアログのログインボタン" をクリックする
|
86
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
87
|
+
|
88
|
+
もし サブメニューの "リセットボタン" をクリックする
|
89
|
+
|
90
|
+
ならば "メニュー" に "ログイン" を含まないこと
|
91
|
+
かつ "メニュー" に "1102" を含むこと
|
92
|
+
|
93
|
+
もし "サブメニューボタン" をクリックする
|
94
|
+
|
95
|
+
ならば "サブメニュー" に "ログアウト" を含むこと
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe SessionsController do
|
5
|
+
describe 'ログインする (XHR POST create)' do
|
6
|
+
let(:params) {
|
7
|
+
{
|
8
|
+
username: '1102',
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
12
|
+
context 'RAILS_ENVがstandaloneの場合', set_standalone_rails_env: true do
|
13
|
+
before do
|
14
|
+
xhr :post, :create, params, {}
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'レスポンスボディ' do
|
18
|
+
subject { response.body }
|
19
|
+
|
20
|
+
it { should eq('1102') }
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'session' do
|
24
|
+
subject { session }
|
25
|
+
|
26
|
+
describe '[:username]' do
|
27
|
+
subject { super()[:username] }
|
28
|
+
|
29
|
+
it { should eq(params[:username]) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'RAILS_ENVがstandaloneではない場合' do
|
35
|
+
it do
|
36
|
+
expect {
|
37
|
+
xhr :post, :create, params, {}
|
38
|
+
}.to raise_exception
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'ログアウトする (DELETE destroy)' do
|
44
|
+
let(:_session) {
|
45
|
+
{
|
46
|
+
username: '1102',
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
context 'RAILS_ENVがstandaloneの場合', set_standalone_rails_env: true do
|
51
|
+
before do
|
52
|
+
xhr :delete, :destroy, {}, _session
|
53
|
+
end
|
54
|
+
|
55
|
+
describe 'session' do
|
56
|
+
subject { session }
|
57
|
+
|
58
|
+
describe '[:username]' do
|
59
|
+
subject { super()[:username] }
|
60
|
+
|
61
|
+
it { should be_nil }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'RAILS_ENVがstandaloneではない場合' do
|
67
|
+
it do
|
68
|
+
expect {
|
69
|
+
xhr :post, :create, params, {}
|
70
|
+
}.to raise_exception
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# Specs in this file have access to a helper object that includes
|
4
|
+
# the SessionsHelper. For example:
|
5
|
+
#
|
6
|
+
# describe SessionsHelper do
|
7
|
+
# describe "string concat" do
|
8
|
+
# it "concats two strings with spaces" do
|
9
|
+
# expect(helper.concat_strings("this","that")).to eq("this that")
|
10
|
+
# end
|
11
|
+
# end
|
12
|
+
# end
|
13
|
+
describe SessionsHelper do
|
14
|
+
pending "add some examples to (or delete) #{__FILE__}"
|
15
|
+
end
|
data/spec/steps/base_steps.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
step 'セッションをクリアする' do
|
4
|
+
Capybara.reset_sessions!
|
5
|
+
end
|
6
|
+
|
3
7
|
step ':name にアクセスする' do |name|
|
4
8
|
visit NAME_INFO[name][:path]
|
5
9
|
|
@@ -25,6 +29,10 @@ step ':name が表示されていること' do |name|
|
|
25
29
|
expect(page).to have_selector(NAME_INFO[name][:selector])
|
26
30
|
end
|
27
31
|
|
32
|
+
step ':name が表示されていないこと' do |name|
|
33
|
+
expect(page).not_to have_selector(NAME_INFO[name][:selector])
|
34
|
+
end
|
35
|
+
|
28
36
|
step ':name にタブを切り替える' do |name|
|
29
37
|
page.execute_script(<<-JS)
|
30
38
|
$('#tabs a[href=\"#{NAME_INFO[name][:selector]}\"]').click()
|
@@ -36,8 +44,12 @@ step ':name タブを表示する' do |name|
|
|
36
44
|
step %("#{name}タブ" にタブを切り替える)
|
37
45
|
end
|
38
46
|
|
47
|
+
step ':name に :value を指定する' do |name, value|
|
48
|
+
fill_in(NAME_INFO.key?(name) ? NAME_INFO[name][:id] : name, with: value)
|
49
|
+
end
|
50
|
+
|
39
51
|
step 'プログラムの名前に :filename を指定する' do |filename|
|
40
|
-
|
52
|
+
step %("プログラム名の入力欄" に "#{filename}" を指定する)
|
41
53
|
end
|
42
54
|
|
43
55
|
step 'サブメニューの :name をクリックする' do |name|
|
@@ -128,7 +140,7 @@ step ':name に :message を含むこと' do |name, message|
|
|
128
140
|
end
|
129
141
|
|
130
142
|
step ':name に :message を含まないこと' do |name, message|
|
131
|
-
expect(page.find(NAME_INFO[name][:selector])).
|
143
|
+
expect(page.find(NAME_INFO[name][:selector])).not_to have_content(message)
|
132
144
|
end
|
133
145
|
|
134
146
|
step 'ページをリロードする' do
|
@@ -228,3 +240,22 @@ step 'ホームディレクトリの :filename の内容が :program である
|
|
228
240
|
path = Pathname("~/#{filename}").expand_path
|
229
241
|
expect(path.read).to eq(program)
|
230
242
|
end
|
243
|
+
|
244
|
+
step ':directory ディレクトリに :program という内容の :filename が存在する' do
|
245
|
+
|directory, program, filename|
|
246
|
+
File.open(Pathname("#{directory}/#{filename}").expand_path, 'w') do |f|
|
247
|
+
f.write(program)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
step ':directory ディレクトリに :filename が存在すること' do
|
252
|
+
|directory, filename|
|
253
|
+
path = Pathname("#{directory}/#{filename}").expand_path
|
254
|
+
expect(path).to be_exist
|
255
|
+
end
|
256
|
+
|
257
|
+
step ':directory ディレクトリの :filename の内容が :program であること' do
|
258
|
+
|directory, filename, program|
|
259
|
+
path = Pathname("#{directory}/#{filename}").expand_path
|
260
|
+
expect(path.read).to eq(program)
|
261
|
+
end
|
@@ -16,48 +16,75 @@
|
|
16
16
|
|
17
17
|
'ブロックタブ' => {
|
18
18
|
id: 'block-tab',
|
19
|
-
selector: '#block-tab',
|
20
19
|
},
|
21
20
|
'Rubyタブ' => {
|
22
21
|
id: 'ruby-tab',
|
23
|
-
selector: '#ruby-tab',
|
24
22
|
},
|
25
23
|
'テキストエディタ' => {
|
26
24
|
id: 'text-editor',
|
27
|
-
selector: '#text-editor',
|
28
25
|
},
|
29
26
|
'プログラム名の入力欄' => {
|
30
27
|
id: 'filename',
|
31
|
-
selector: '#filename',
|
32
28
|
},
|
33
29
|
|
30
|
+
# メニュー/サブメニューのボタン
|
31
|
+
'メニュー' => {
|
32
|
+
selector: '#main-menu',
|
33
|
+
},
|
34
|
+
'サブメニュー' => {
|
35
|
+
selector: '#submenu',
|
36
|
+
},
|
37
|
+
'ログインボタン' => {
|
38
|
+
id: 'signin-button',
|
39
|
+
},
|
34
40
|
'ダウンロードボタン' => {
|
35
41
|
id: 'download-button',
|
36
|
-
selector: '#download-button',
|
37
42
|
},
|
38
43
|
'実行ボタン' => {
|
39
44
|
id: 'run-button',
|
40
|
-
|
45
|
+
},
|
46
|
+
'サブメニューボタン' => {
|
47
|
+
id: 'submenu-button',
|
41
48
|
},
|
42
49
|
'ロードボタン' => {
|
43
50
|
id: 'load-button',
|
44
|
-
selector: '#load-button',
|
45
51
|
},
|
46
52
|
'セーブボタン' => {
|
47
53
|
id: 'save-button',
|
48
|
-
selector: '#save-button',
|
49
54
|
},
|
50
55
|
'チェックボタン' => {
|
51
56
|
id: 'check-button',
|
52
|
-
selector: '#check-button',
|
53
57
|
},
|
54
58
|
'リセットボタン' => {
|
55
59
|
id: 'reset-button',
|
56
|
-
|
60
|
+
},
|
61
|
+
'ログアウトボタン' => {
|
62
|
+
id: 'signout-button',
|
57
63
|
},
|
58
64
|
|
59
65
|
'メッセージ' => {
|
60
66
|
id: 'messages',
|
61
|
-
|
67
|
+
},
|
68
|
+
|
69
|
+
# ダイアログ
|
70
|
+
'ログインダイアログ' => {
|
71
|
+
selector: '#signin-modal',
|
72
|
+
},
|
73
|
+
|
74
|
+
# ログインダイアログ
|
75
|
+
'ログインダイアログの名前' => {
|
76
|
+
id: 'signin-modal-username',
|
77
|
+
},
|
78
|
+
'ログインダイアログのログインボタン' => {
|
79
|
+
id: 'signin-modal-ok-button',
|
80
|
+
},
|
81
|
+
'ログインダイアログのやめるボタン' => {
|
82
|
+
id: 'signin-modal-cancel-button',
|
62
83
|
},
|
63
84
|
}
|
85
|
+
|
86
|
+
::NAME_INFO.values.each do |value|
|
87
|
+
if value.key?(:id) && !value.key?(:selector)
|
88
|
+
value[:selector] = "##{value[:id]}"
|
89
|
+
end
|
90
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smalruby-editor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.11
|
5
5
|
platform: x86-mingw32
|
6
6
|
authors:
|
7
7
|
- Kouji Takao
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -184,14 +184,14 @@ dependencies:
|
|
184
184
|
requirements:
|
185
185
|
- - ~>
|
186
186
|
- !ruby/object:Gem::Version
|
187
|
-
version: 0.0.
|
187
|
+
version: 0.0.19
|
188
188
|
type: :runtime
|
189
189
|
prerelease: false
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
191
191
|
requirements:
|
192
192
|
- - ~>
|
193
193
|
- !ruby/object:Gem::Version
|
194
|
-
version: 0.0.
|
194
|
+
version: 0.0.19
|
195
195
|
- !ruby/object:Gem::Dependency
|
196
196
|
name: bundler
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -275,6 +275,7 @@ files:
|
|
275
275
|
- app/assets/javascripts/views/character_selector_view.js.coffee
|
276
276
|
- app/assets/javascripts/views/load_modal_view.js.coffee
|
277
277
|
- app/assets/javascripts/views/main_menu_view.js.coffee
|
278
|
+
- app/assets/javascripts/views/signin_modal_view.js.coffee
|
278
279
|
- app/assets/stylesheets/application.css
|
279
280
|
- app/assets/stylesheets/editor.css.scss
|
280
281
|
- app/assets/stylesheets/flatstrap-custom.css.scss
|
@@ -284,9 +285,11 @@ files:
|
|
284
285
|
- app/controllers/application_controller.rb
|
285
286
|
- app/controllers/concerns/.keep
|
286
287
|
- app/controllers/editor_controller.rb
|
288
|
+
- app/controllers/sessions_controller.rb
|
287
289
|
- app/controllers/source_codes_controller.rb
|
288
290
|
- app/helpers/application_helper.rb
|
289
291
|
- app/helpers/editor_helper.rb
|
292
|
+
- app/helpers/sessions_helper.rb
|
290
293
|
- app/mailers/.keep
|
291
294
|
- app/models/.keep
|
292
295
|
- app/models/concerns/.keep
|
@@ -355,6 +358,7 @@ files:
|
|
355
358
|
- app/views/editor/_block_tab.html.haml
|
356
359
|
- app/views/editor/_character_modal.html.haml
|
357
360
|
- app/views/editor/_load_modal.html.haml
|
361
|
+
- app/views/editor/_signin_modal.html.haml
|
358
362
|
- app/views/editor/_toolbox.html.haml
|
359
363
|
- app/views/editor/demo.html.erb
|
360
364
|
- app/views/editor/index.html.haml
|
@@ -526,12 +530,15 @@ files:
|
|
526
530
|
- spec/acceptance/ruby_mode/translate.feature
|
527
531
|
- spec/acceptance/standalone/run.feature
|
528
532
|
- spec/acceptance/standalone/save.feature
|
533
|
+
- spec/acceptance/standalone/signin.feature
|
529
534
|
- spec/controllers/editor_controller_spec.rb
|
535
|
+
- spec/controllers/sessions_controller_spec.rb
|
530
536
|
- spec/controllers/source_codes_controller_spec.rb
|
531
537
|
- spec/fixtures/files/01.rb
|
532
538
|
- spec/fixtures/files/01.rb.xml
|
533
539
|
- spec/fixtures/files/favicon.ico
|
534
540
|
- spec/helpers/editor_helper_spec.rb
|
541
|
+
- spec/helpers/sessions_helper_spec.rb
|
535
542
|
- spec/javascripts/collections/character_set_spec.coffee
|
536
543
|
- spec/javascripts/models/character_spec.coffee
|
537
544
|
- spec/javascripts/models/scene_spec.coffee
|
@@ -573,10 +580,10 @@ files:
|
|
573
580
|
- vendor/assets/javascripts/blockly/msg/js/ja.js
|
574
581
|
- vendor/assets/javascripts/jquery.blockUI.js
|
575
582
|
- vendor/assets/stylesheets/.keep
|
576
|
-
- public/assets/application-0b3c70107ad81ea9fcda6d7d921bd8cf.js
|
577
|
-
- public/assets/application-0b3c70107ad81ea9fcda6d7d921bd8cf.js.gz
|
578
583
|
- public/assets/application-53d651da3309caa498cc0ca6616dbead.css
|
579
584
|
- public/assets/application-53d651da3309caa498cc0ca6616dbead.css.gz
|
585
|
+
- public/assets/application-669cbc2df60729c4b12d739af7595cc6.js
|
586
|
+
- public/assets/application-669cbc2df60729c4b12d739af7595cc6.js.gz
|
580
587
|
- public/assets/favicon-a37c90b368fd8ed436cb8f9e9396465c.ico
|
581
588
|
- public/assets/jquery-ui/animated-overlay-c48c87b7a95316f4698484e3b85ee4aa.gif
|
582
589
|
- public/assets/jquery-ui/ui-bg_flat_0_aaaaaa_40x100-58b63faadd031ca3db096dfdffd90224.png
|
@@ -699,12 +706,15 @@ test_files:
|
|
699
706
|
- spec/acceptance/ruby_mode/translate.feature
|
700
707
|
- spec/acceptance/standalone/run.feature
|
701
708
|
- spec/acceptance/standalone/save.feature
|
709
|
+
- spec/acceptance/standalone/signin.feature
|
702
710
|
- spec/controllers/editor_controller_spec.rb
|
711
|
+
- spec/controllers/sessions_controller_spec.rb
|
703
712
|
- spec/controllers/source_codes_controller_spec.rb
|
704
713
|
- spec/fixtures/files/01.rb
|
705
714
|
- spec/fixtures/files/01.rb.xml
|
706
715
|
- spec/fixtures/files/favicon.ico
|
707
716
|
- spec/helpers/editor_helper_spec.rb
|
717
|
+
- spec/helpers/sessions_helper_spec.rb
|
708
718
|
- spec/javascripts/collections/character_set_spec.coffee
|
709
719
|
- spec/javascripts/models/character_spec.coffee
|
710
720
|
- spec/javascripts/models/scene_spec.coffee
|