smalruby-editor 0.1.10-x86-mingw32 → 0.1.11-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of smalruby-editor might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5b8dda68c5dc107e14e40d6a0c2a6f7c9a99984d
4
- data.tar.gz: a3a4d48e697c9d2ee18a9e96d0961b339d74c1ef
3
+ metadata.gz: a94273db1c791f6e7ae5c93360482e9ab8fa5076
4
+ data.tar.gz: fc488f3cb404b1fe0194070df2f1dfadf0b9bedd
5
5
  SHA512:
6
- metadata.gz: 6e7ad3307bc4c7f228d6a09084d788575d8d0feb5bf87ad6bd4a4614f4e57ca00880d9578aae32b05fc9aff99e30e46ed4e8f71de0dc38fee91c9a24c7322def
7
- data.tar.gz: 4b31ca4008ee3b37bccb75c9bdf3c9d22a20e8bafb0e99677bc163dc8031d346153f36d4782f56639d7d85b183fba8175dec86a10e6625ab5b50b4817dad449a
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
- "#{Blockly.Ruby.rn({ dropSelf: false })}rotation_style = :#{style}\n"
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
- # TODO: 既存のシンタックスに関するエラーメッセージをcloseしておく
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')
@@ -21,4 +21,10 @@ class ApplicationController < ActionController::Base
21
21
  false
22
22
  end
23
23
  end
24
+
25
+ def check_whether_standalone
26
+ unless standalone?
27
+ fail "#{self.class.name}##{action_name}はstandaloneモードのみの機能です"
28
+ end
29
+ end
24
30
  end
@@ -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
- path = Pathname("~/#{source_code.filename}").expand_path
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
- path = Pathname("~/#{source_code.filename}").expand_path.to_s
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
- Pathname.glob(Pathname('~/*.rb.xml').expand_path)
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,2 @@
1
+ module SessionsHelper
2
+ end
@@ -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
+ ログイン
@@ -73,7 +73,7 @@
73
73
  %block{:type => "#{category}_point_towards_character"}
74
74
 
75
75
  -# 回転方法を[▼]にする
76
- -#%block{:type => "#{category}_set_rotation_style"}
76
+ %block{:type => "#{category}_set_rotation_style"}
77
77
 
78
78
  -# 変数:向き
79
79
  %block{:type => "#{category}_self_angle"}
@@ -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'
@@ -1,3 +1,3 @@
1
1
  module SmalrubyEditor
2
- VERSION = '0.1.10'
2
+ VERSION = '0.1.11'
3
3
  end
@@ -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 "" + (Blockly.Ruby.rn({
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'] = {
@@ -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-04-30T00:23:14+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"}},"assets":{"default.xml":"default-5d1886100d7c8961e9962bbc4bb0c714.xml","rgb_led_anode.xml":"rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml","favicon.ico":"favicon-a37c90b368fd8ed436cb8f9e9396465c.ico","application.js":"application-0b3c70107ad81ea9fcda6d7d921bd8cf.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"}}
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"}}
@@ -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.16'],
71
+ ['smalruby', '~> 0.0.19'],
72
72
  ]
73
73
  runtime_dependencies << ['therubyracer'] unless is_windows
74
74
  runtime_dependencies.each do |args|
@@ -8,6 +8,7 @@
8
8
  ならば "ブロックタブ" が表示されていること
9
9
  かつ "プログラム名の入力欄" が表示されていること
10
10
  かつ "ダウンロードボタン" が表示されていること
11
+ かつ "ログインボタン" が表示されていないこと
11
12
 
12
13
  シナリオ: ブロックモードでブロックを配置後にページを遷移する
13
14
  前提 "ブロック" タブを表示する
@@ -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
@@ -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
- fill_in('filename', with: filename)
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])).to have_no_content(message)
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
- selector: '#run-button',
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
- selector: '#reset-button',
60
+ },
61
+ 'ログアウトボタン' => {
62
+ id: 'signout-button',
57
63
  },
58
64
 
59
65
  'メッセージ' => {
60
66
  id: 'messages',
61
- selector: '#messages',
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.10
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-04-29 00:00:00.000000000 Z
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.16
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.16
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