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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c0fd1e1c1ac0cd96b592ef565dd79515c3a17ef1
4
- data.tar.gz: 71559aeb796dad900fa57fc3d0049af1c9551840
3
+ metadata.gz: 5d0c3b1eb6ccfa689358c830b85b033b747e0172
4
+ data.tar.gz: fd2f5f2fd5b4a6e417b780b4bc4e7fadfc3ecb3b
5
5
  SHA512:
6
- metadata.gz: 010878bf174e8c1f432555b98f6f98a7ec0d76fec1c2ee4547141474090bc196d45bf76af81e733738276e8e8aa45a47eb0345b040549375606a2cb294ee48b6
7
- data.tar.gz: 718936cbb47e95cf428e3ae60887878d0aeaa60526be5933f5d2f48b15786e24e8b72228df2d4d22a63ec2990d68243b6079776fe53a3cd4616a92a0fbe40869
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
- "#{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
- module SmalrubyEditor
2
- VERSION = '0.1.10'
3
- end
1
+ module SmalrubyEditor
2
+ VERSION = '0.1.12'
3
+ end
@@ -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.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-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: 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