smalruby-editor 0.1.10 → 0.1.12
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 +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 +3 -3
- 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: 5d0c3b1eb6ccfa689358c830b85b033b747e0172
|
4
|
+
data.tar.gz: fd2f5f2fd5b4a6e417b780b4bc4e7fadfc3ecb3b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b5f1176c344d643f5b697de5145bdc40735cbf7401ed821ae21365ab01723fdca92f9cdb06b03ffbd41c8b0b6ae490ed57934a3dacdfd78a47450c365a55642
|
7
|
+
data.tar.gz: fafaaabc40d904f250a8926cda983e70490bb50947a940c65c800663acb6d93669852b4101fc666c046a76b9cda4316a28c7fa0153dc8b8e65d37b196780f088
|
@@ -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'
|
@@ -1,3 +1,3 @@
|
|
1
|
-
module SmalrubyEditor
|
2
|
-
VERSION = '0.1.
|
3
|
-
end
|
1
|
+
module SmalrubyEditor
|
2
|
+
VERSION = '0.1.12'
|
3
|
+
end
|
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.12
|
5
5
|
platform: ruby
|
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: therubyracer
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -289,6 +289,7 @@ files:
|
|
289
289
|
- app/assets/javascripts/views/character_selector_view.js.coffee
|
290
290
|
- app/assets/javascripts/views/load_modal_view.js.coffee
|
291
291
|
- app/assets/javascripts/views/main_menu_view.js.coffee
|
292
|
+
- app/assets/javascripts/views/signin_modal_view.js.coffee
|
292
293
|
- app/assets/stylesheets/application.css
|
293
294
|
- app/assets/stylesheets/editor.css.scss
|
294
295
|
- app/assets/stylesheets/flatstrap-custom.css.scss
|
@@ -298,9 +299,11 @@ files:
|
|
298
299
|
- app/controllers/application_controller.rb
|
299
300
|
- app/controllers/concerns/.keep
|
300
301
|
- app/controllers/editor_controller.rb
|
302
|
+
- app/controllers/sessions_controller.rb
|
301
303
|
- app/controllers/source_codes_controller.rb
|
302
304
|
- app/helpers/application_helper.rb
|
303
305
|
- app/helpers/editor_helper.rb
|
306
|
+
- app/helpers/sessions_helper.rb
|
304
307
|
- app/mailers/.keep
|
305
308
|
- app/models/.keep
|
306
309
|
- app/models/concerns/.keep
|
@@ -369,6 +372,7 @@ files:
|
|
369
372
|
- app/views/editor/_block_tab.html.haml
|
370
373
|
- app/views/editor/_character_modal.html.haml
|
371
374
|
- app/views/editor/_load_modal.html.haml
|
375
|
+
- app/views/editor/_signin_modal.html.haml
|
372
376
|
- app/views/editor/_toolbox.html.haml
|
373
377
|
- app/views/editor/demo.html.erb
|
374
378
|
- app/views/editor/index.html.haml
|
@@ -540,12 +544,15 @@ files:
|
|
540
544
|
- spec/acceptance/ruby_mode/translate.feature
|
541
545
|
- spec/acceptance/standalone/run.feature
|
542
546
|
- spec/acceptance/standalone/save.feature
|
547
|
+
- spec/acceptance/standalone/signin.feature
|
543
548
|
- spec/controllers/editor_controller_spec.rb
|
549
|
+
- spec/controllers/sessions_controller_spec.rb
|
544
550
|
- spec/controllers/source_codes_controller_spec.rb
|
545
551
|
- spec/fixtures/files/01.rb
|
546
552
|
- spec/fixtures/files/01.rb.xml
|
547
553
|
- spec/fixtures/files/favicon.ico
|
548
554
|
- spec/helpers/editor_helper_spec.rb
|
555
|
+
- spec/helpers/sessions_helper_spec.rb
|
549
556
|
- spec/javascripts/collections/character_set_spec.coffee
|
550
557
|
- spec/javascripts/models/character_spec.coffee
|
551
558
|
- spec/javascripts/models/scene_spec.coffee
|
@@ -587,10 +594,10 @@ files:
|
|
587
594
|
- vendor/assets/javascripts/blockly/msg/js/ja.js
|
588
595
|
- vendor/assets/javascripts/jquery.blockUI.js
|
589
596
|
- vendor/assets/stylesheets/.keep
|
590
|
-
- public/assets/application-0b3c70107ad81ea9fcda6d7d921bd8cf.js
|
591
|
-
- public/assets/application-0b3c70107ad81ea9fcda6d7d921bd8cf.js.gz
|
592
597
|
- public/assets/application-53d651da3309caa498cc0ca6616dbead.css
|
593
598
|
- public/assets/application-53d651da3309caa498cc0ca6616dbead.css.gz
|
599
|
+
- public/assets/application-669cbc2df60729c4b12d739af7595cc6.js
|
600
|
+
- public/assets/application-669cbc2df60729c4b12d739af7595cc6.js.gz
|
594
601
|
- public/assets/favicon-a37c90b368fd8ed436cb8f9e9396465c.ico
|
595
602
|
- public/assets/jquery-ui/animated-overlay-c48c87b7a95316f4698484e3b85ee4aa.gif
|
596
603
|
- public/assets/jquery-ui/ui-bg_flat_0_aaaaaa_40x100-58b63faadd031ca3db096dfdffd90224.png
|
@@ -713,12 +720,15 @@ test_files:
|
|
713
720
|
- spec/acceptance/ruby_mode/translate.feature
|
714
721
|
- spec/acceptance/standalone/run.feature
|
715
722
|
- spec/acceptance/standalone/save.feature
|
723
|
+
- spec/acceptance/standalone/signin.feature
|
716
724
|
- spec/controllers/editor_controller_spec.rb
|
725
|
+
- spec/controllers/sessions_controller_spec.rb
|
717
726
|
- spec/controllers/source_codes_controller_spec.rb
|
718
727
|
- spec/fixtures/files/01.rb
|
719
728
|
- spec/fixtures/files/01.rb.xml
|
720
729
|
- spec/fixtures/files/favicon.ico
|
721
730
|
- spec/helpers/editor_helper_spec.rb
|
731
|
+
- spec/helpers/sessions_helper_spec.rb
|
722
732
|
- spec/javascripts/collections/character_set_spec.coffee
|
723
733
|
- spec/javascripts/models/character_spec.coffee
|
724
734
|
- spec/javascripts/models/scene_spec.coffee
|