smalruby-editor 0.1.10 → 0.1.12
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 +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
|