smalruby-editor 0.1.5-x86-mingw32 → 0.1.6-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of smalruby-editor might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.rubocop.yml +8 -0
- data/README.rdoc +3 -0
- data/app/assets/javascripts/application.js +0 -1
- data/app/assets/javascripts/models/source_code.js.coffee +5 -2
- data/app/assets/javascripts/smalruby.js.coffee +18 -11
- data/app/assets/javascripts/views/main_menu_view.js.coffee +139 -81
- data/app/controllers/source_codes_controller.rb +7 -0
- data/app/models/concerns/ruby_to_block.rb +391 -0
- data/app/models/source_code.rb +3 -2
- data/app/views/editor/demo.html.erb +1 -1
- data/app/views/editor/index.html.haml +2 -2
- data/config/routes.rb +1 -0
- data/{app/assets/demos → demos}/default.xml +0 -0
- data/{app/assets/demos → demos}/rgb_led_anode.xml +82 -82
- data/lib/smalruby_editor/version.rb +3 -3
- data/lib/tasks/release.rake +0 -4
- data/public/assets/{application-0047adbc0fb7a529ef7a41b5e0e7d097.js → application-8bfffad1222d4e198f3c7ccc1cbd774f.js} +179 -144
- data/public/assets/{application-0047adbc0fb7a529ef7a41b5e0e7d097.js.gz → application-8bfffad1222d4e198f3c7ccc1cbd774f.js.gz} +0 -0
- data/public/assets/manifest-332a5a1668194028b55103e0ea45c054.json +1 -1
- data/smalruby-editor.gemspec +0 -6
- data/spec/acceptance/base.feature +119 -0
- data/spec/acceptance/block_mode/translate.feature +14 -0
- data/spec/acceptance/ruby_mode/translate.feature +65 -0
- data/spec/acceptance/standalone/run.feature +14 -1
- data/spec/controllers/source_codes_controller_spec.rb +22 -0
- data/{public/assets/default-5d1886100d7c8961e9962bbc4bb0c714.xml → spec/fixtures/files/01.rb.xml} +0 -0
- data/spec/models/concerns/ruby_to_block_spec.rb +329 -0
- data/spec/steps/base_steps.rb +230 -0
- data/spec/steps/block_mode_steps.rb +9 -1
- data/spec/steps/fix_turnip.rb +28 -0
- data/spec/steps/text_editor_steps.rb +52 -193
- metadata +19 -97
- data/app/assets/javascripts/ruby_mode.js.coffee.erb +0 -12
- data/public/assets/rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml +0 -83
- data/spec/acceptance/ruby_mode/base.feature +0 -33
- data/spec/steps/ace_steps.rb +0 -77
Binary file
|
@@ -1 +1 @@
|
|
1
|
-
{"files":{"default-5d1886100d7c8961e9962bbc4bb0c714.xml":{"logical_path":"default.xml","mtime":"2014-02-14T01:28:48+09:00","size":5017,"digest":"5d1886100d7c8961e9962bbc4bb0c714"},"rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml":{"logical_path":"rgb_led_anode.xml","mtime":"2014-02-11T14:17:03+09:00","size":3805,"digest":"91225bef2a8b97f1cefee862a0619b91"},"favicon-a37c90b368fd8ed436cb8f9e9396465c.ico":{"logical_path":"favicon.ico","mtime":"2014-01-21T03:18:02+09:00","size":5430,"digest":"a37c90b368fd8ed436cb8f9e9396465c"},"application-735e172a0df828da16d22f5d3c26671f.js":{"logical_path":"application.js","mtime":"2014-02-19T18:22:09+09:00","size":1440213,"digest":"735e172a0df828da16d22f5d3c26671f"},"application-64a390efe879c386a5950515064f062d.css":{"logical_path":"application.css","mtime":"2014-02-19T14:32:55+09:00","size":119186,"digest":"64a390efe879c386a5950515064f062d"},"jquery-ui/animated-overlay-c48c87b7a95316f4698484e3b85ee4aa.gif":{"logical_path":"jquery-ui/animated-overlay.gif","mtime":"2014-02-04T09:35:48+09:00","size":1738,"digest":"c48c87b7a95316f4698484e3b85ee4aa"},"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-58b63faadd031ca3db096dfdffd90224.png":{"logical_path":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png","mtime":"2014-02-04T09:35:48+09:00","size":180,"digest":"58b63faadd031ca3db096dfdffd90224"},"jquery-ui/ui-bg_flat_75_ffffff_40x100-937399e8b369d64aa075d13a82c00112.png":{"logical_path":"jquery-ui/ui-bg_flat_75_ffffff_40x100.png","mtime":"2014-02-04T09:35:48+09:00","size":178,"digest":"937399e8b369d64aa075d13a82c00112"},"jquery-ui/ui-bg_glass_55_fbf9ee_1x400-a8c503e0f42a081a92a473b0d30ac6cf.png":{"logical_path":"jquery-ui/ui-bg_glass_55_fbf9ee_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":120,"digest":"a8c503e0f42a081a92a473b0d30ac6cf"},"jquery-ui/ui-bg_glass_65_ffffff_1x400-ddcbfe385abc3947937caa0b44e2f5d2.png":{"logical_path":"jquery-ui/ui-bg_glass_65_ffffff_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":105,"digest":"ddcbfe385abc3947937caa0b44e2f5d2"},"jquery-ui/ui-bg_glass_75_dadada_1x400-14dd4a9ad1f21d8c4c7e673ddfb0806f.png":{"logical_path":"jquery-ui/ui-bg_glass_75_dadada_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":111,"digest":"14dd4a9ad1f21d8c4c7e673ddfb0806f"},"jquery-ui/ui-bg_glass_75_e6e6e6_1x400-a43dfabb23b0a987b567b282bad68346.png":{"logical_path":"jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":110,"digest":"a43dfabb23b0a987b567b282bad68346"},"jquery-ui/ui-bg_glass_95_fef1ec_1x400-31c0c791a756266043ee8ea61dacb36a.png":{"logical_path":"jquery-ui/ui-bg_glass_95_fef1ec_1x400.png","mtime":"2014-02-04T09:35:48+09:00","size":119,"digest":"31c0c791a756266043ee8ea61dacb36a"},"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100-33edbdb0d2fcebd2a65c2041a28533da.png":{"logical_path":"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100.png","mtime":"2014-02-04T09:35:48+09:00","size":101,"digest":"33edbdb0d2fcebd2a65c2041a28533da"},"jquery-ui/ui-icons_222222_256x240-890385424135de1513f00cbecfb7f990.png":{"logical_path":"jquery-ui/ui-icons_222222_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"890385424135de1513f00cbecfb7f990"},"jquery-ui/ui-icons_2e83ff_256x240-824705ca4aa2610434a358fe4018c9c6.png":{"logical_path":"jquery-ui/ui-icons_2e83ff_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"824705ca4aa2610434a358fe4018c9c6"},"jquery-ui/ui-icons_454545_256x240-254e054f6df453dfac49efbc8b78f79d.png":{"logical_path":"jquery-ui/ui-icons_454545_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"254e054f6df453dfac49efbc8b78f79d"},"jquery-ui/ui-icons_888888_256x240-57c441f87c4289a5372823f506c1182d.png":{"logical_path":"jquery-ui/ui-icons_888888_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"57c441f87c4289a5372823f506c1182d"},"jquery-ui/ui-icons_cd0a0a_256x240-261647ac915575f3981ded254ae8d43e.png":{"logical_path":"jquery-ui/ui-icons_cd0a0a_256x240.png","mtime":"2014-02-04T09:35:48+09:00","size":4369,"digest":"261647ac915575f3981ded254ae8d43e"},"loading-e8e6dd7833131c92a6c3b9c8ccc6a6ac.gif":{"logical_path":"loading.gif","mtime":"2014-01-03T14:44:55+09:00","size":3897,"digest":"e8e6dd7833131c92a6c3b9c8ccc6a6ac"},"progressbar-82023a146fba2a0f6d925629ed2b09c5.gif":{"logical_path":"progressbar.gif","mtime":"2014-01-03T14:44:55+09:00","size":3323,"digest":"82023a146fba2a0f6d925629ed2b09c5"},"application-0047adbc0fb7a529ef7a41b5e0e7d097.js":{"logical_path":"application.js","mtime":"2014-02-20T03:12:12+09:00","size":1441568,"digest":"0047adbc0fb7a529ef7a41b5e0e7d097"}},"assets":{"default.xml":"default-5d1886100d7c8961e9962bbc4bb0c714.xml","rgb_led_anode.xml":"rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml","favicon.ico":"favicon-a37c90b368fd8ed436cb8f9e9396465c.ico","application.js":"application-
|
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"}},"assets":{"default.xml":"default-5d1886100d7c8961e9962bbc4bb0c714.xml","rgb_led_anode.xml":"rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml","favicon.ico":"favicon-a37c90b368fd8ed436cb8f9e9396465c.ico","application.js":"application-8bfffad1222d4e198f3c7ccc1cbd774f.js","application.css":"application-64a390efe879c386a5950515064f062d.css","jquery-ui/animated-overlay.gif":"jquery-ui/animated-overlay-c48c87b7a95316f4698484e3b85ee4aa.gif","jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-58b63faadd031ca3db096dfdffd90224.png","jquery-ui/ui-bg_flat_75_ffffff_40x100.png":"jquery-ui/ui-bg_flat_75_ffffff_40x100-937399e8b369d64aa075d13a82c00112.png","jquery-ui/ui-bg_glass_55_fbf9ee_1x400.png":"jquery-ui/ui-bg_glass_55_fbf9ee_1x400-a8c503e0f42a081a92a473b0d30ac6cf.png","jquery-ui/ui-bg_glass_65_ffffff_1x400.png":"jquery-ui/ui-bg_glass_65_ffffff_1x400-ddcbfe385abc3947937caa0b44e2f5d2.png","jquery-ui/ui-bg_glass_75_dadada_1x400.png":"jquery-ui/ui-bg_glass_75_dadada_1x400-14dd4a9ad1f21d8c4c7e673ddfb0806f.png","jquery-ui/ui-bg_glass_75_e6e6e6_1x400.png":"jquery-ui/ui-bg_glass_75_e6e6e6_1x400-a43dfabb23b0a987b567b282bad68346.png","jquery-ui/ui-bg_glass_95_fef1ec_1x400.png":"jquery-ui/ui-bg_glass_95_fef1ec_1x400-31c0c791a756266043ee8ea61dacb36a.png","jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100.png":"jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100-33edbdb0d2fcebd2a65c2041a28533da.png","jquery-ui/ui-icons_222222_256x240.png":"jquery-ui/ui-icons_222222_256x240-890385424135de1513f00cbecfb7f990.png","jquery-ui/ui-icons_2e83ff_256x240.png":"jquery-ui/ui-icons_2e83ff_256x240-824705ca4aa2610434a358fe4018c9c6.png","jquery-ui/ui-icons_454545_256x240.png":"jquery-ui/ui-icons_454545_256x240-254e054f6df453dfac49efbc8b78f79d.png","jquery-ui/ui-icons_888888_256x240.png":"jquery-ui/ui-icons_888888_256x240-57c441f87c4289a5372823f506c1182d.png","jquery-ui/ui-icons_cd0a0a_256x240.png":"jquery-ui/ui-icons_cd0a0a_256x240-261647ac915575f3981ded254ae8d43e.png","loading.gif":"loading-e8e6dd7833131c92a6c3b9c8ccc6a6ac.gif","progressbar.gif":"progressbar-82023a146fba2a0f6d925629ed2b09c5.gif"}}
|
data/smalruby-editor.gemspec
CHANGED
@@ -61,19 +61,13 @@ Gem::Specification.new do |spec|
|
|
61
61
|
['sass-rails', '~> 4.0.0'],
|
62
62
|
['uglifier', '>= 1.3.0'],
|
63
63
|
['coffee-rails', '~> 4.0.0'],
|
64
|
-
['jquery-rails'],
|
65
64
|
['turbolinks'],
|
66
65
|
['jbuilder', '~> 2.0'],
|
67
|
-
['ace-rails-ap'],
|
68
66
|
['flatstrap-sass'],
|
69
|
-
['jquery-fileupload-rails'],
|
70
67
|
['shared-mime-info'],
|
71
68
|
['launchy'],
|
72
69
|
['mime-types', '~> 1.16'],
|
73
70
|
['haml-rails'],
|
74
|
-
['jquery-ui-rails'],
|
75
|
-
['eco-source', '>= 1.1.0.rc.1'],
|
76
|
-
['backbone-on-rails'],
|
77
71
|
['smalruby'],
|
78
72
|
]
|
79
73
|
runtime_dependencies << ['therubyracer'] unless is_windows
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# language: ja
|
3
|
+
@javascript
|
4
|
+
機能: Base - 基本
|
5
|
+
シナリオ: トップページにアクセスする
|
6
|
+
もし "トップページ" にアクセスする
|
7
|
+
|
8
|
+
ならば "ブロックタブ" が表示されていること
|
9
|
+
かつ "プログラム名の入力欄" が表示されていること
|
10
|
+
かつ "ダウンロードボタン" が表示されていること
|
11
|
+
|
12
|
+
シナリオ: ブロックモードでブロックを配置後にページを遷移する
|
13
|
+
前提 "ブロック" タブを表示する
|
14
|
+
|
15
|
+
もし 次のブロック("ruby_statement")を配置する:
|
16
|
+
"""
|
17
|
+
%block{:type => "ruby_statement", :x => "0", :y => "0"}
|
18
|
+
%field{:name => "STATEMENT"}<
|
19
|
+
stage1 = Stage.new(color: "white")
|
20
|
+
"""
|
21
|
+
かつ プログラムの名前に "01.rb" を指定する
|
22
|
+
かつ ページをリロードする
|
23
|
+
かつ 警告ダイアログの "dismiss" ボタンをクリックする
|
24
|
+
|
25
|
+
ならば 次のXMLと同等のブロックが配置されていること:
|
26
|
+
"""
|
27
|
+
<xml>
|
28
|
+
<block type="ruby_statement" x="0" y="0">
|
29
|
+
<field name="STATEMENT">stage1 = Stage.new(color: "white")</field>
|
30
|
+
</block>
|
31
|
+
</xml>
|
32
|
+
"""
|
33
|
+
かつ "プログラム名の入力欄" は "01.rb" であること
|
34
|
+
|
35
|
+
シナリオ: プログラムを変更していない状態でブロックモードからRubyモードに切り替えてページを遷移する
|
36
|
+
前提 "ブロック" タブを表示する
|
37
|
+
かつ "files/01.rb.xml" をロードする
|
38
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
39
|
+
|
40
|
+
もし "Rubyタブ" にタブを切り替える
|
41
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
42
|
+
かつ ページをリロードする
|
43
|
+
|
44
|
+
ならば 次のXMLと同等のブロックが配置されていること:
|
45
|
+
"""
|
46
|
+
<xml></xml>
|
47
|
+
"""
|
48
|
+
かつ "プログラム名の入力欄" は "" であること
|
49
|
+
|
50
|
+
シナリオ: プログラムを変更した状態でブロックモードからRubyモードに切り替えてページを遷移する
|
51
|
+
前提 "ブロック" タブを表示する
|
52
|
+
かつ 次のブロック("ruby_statement")を配置する:
|
53
|
+
"""
|
54
|
+
%block{:type => "ruby_statement", :x => "0", :y => "0"}
|
55
|
+
%field{:name => "STATEMENT"}<
|
56
|
+
stage1 = Stage.new(color: "white")
|
57
|
+
"""
|
58
|
+
かつ プログラムの名前に "01.rb" を指定する
|
59
|
+
|
60
|
+
もし "Rubyタブ" にタブを切り替える
|
61
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
62
|
+
かつ ページをリロードする
|
63
|
+
|
64
|
+
ならば 次のXMLと同等のブロックが配置されていること:
|
65
|
+
"""
|
66
|
+
<xml>
|
67
|
+
<block type="ruby_statement" x="0" y="0">
|
68
|
+
<field name="STATEMENT">stage1 = Stage.new(color: "white")</field>
|
69
|
+
</block>
|
70
|
+
</xml>
|
71
|
+
"""
|
72
|
+
かつ "プログラム名の入力欄" は "01.rb" であること
|
73
|
+
|
74
|
+
シナリオ: エディタ画面を表示してRubyタブに切り替える
|
75
|
+
前提 "トップページ" にアクセスする
|
76
|
+
|
77
|
+
もし "Rubyタブ" にタブを切り替える
|
78
|
+
|
79
|
+
ならば "Rubyタブ" が表示されていること
|
80
|
+
かつ "テキストエディタ" が表示されていること
|
81
|
+
かつ "プログラム名の入力欄" が表示されていること
|
82
|
+
かつ "ダウンロードボタン" が表示されていること
|
83
|
+
かつ テキストエディタにフォーカスがあること
|
84
|
+
かつ テキストエディタの 0 行目の 0 文字目にカーソルがあること
|
85
|
+
|
86
|
+
シナリオ: Rubyモードでプログラムを入力後にページを遷移する
|
87
|
+
もし "Ruby" タブを表示する
|
88
|
+
かつ テキストエディタに "puts 'Hello, World!'" を入力済みである
|
89
|
+
かつ プログラムの名前に "01.rb" を指定する
|
90
|
+
かつ ページをリロードする
|
91
|
+
かつ 警告ダイアログの "dismiss" ボタンをクリックする
|
92
|
+
|
93
|
+
ならば テキストエディタのプログラムは "puts 'Hello, World!'" であること
|
94
|
+
かつ "プログラム名の入力欄" は "01.rb" であること
|
95
|
+
|
96
|
+
シナリオ: プログラムを変更していない状態でRubyモードからブロックモードに切り替えてページを遷移する
|
97
|
+
前提 "Ruby" タブを表示する
|
98
|
+
かつ "files/01.rb" をロードする
|
99
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
100
|
+
|
101
|
+
もし "ブロックタブ" にタブを切り替える
|
102
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
103
|
+
かつ ページをリロードする
|
104
|
+
|
105
|
+
ならば テキストエディタのプログラムは "" であること
|
106
|
+
かつ "プログラム名の入力欄" は "" であること
|
107
|
+
|
108
|
+
シナリオ: プログラムを変更した状態でRubyモードからブロックモードに切り替えてページを遷移する
|
109
|
+
前提 "Ruby" タブを表示する
|
110
|
+
かつ テキストエディタに "puts 'Hello, World!'" を入力済みである
|
111
|
+
かつ プログラムの名前に "01.rb" を指定する
|
112
|
+
|
113
|
+
もし "ブロックタブ" にタブを切り替える
|
114
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
115
|
+
かつ ページをリロードする
|
116
|
+
かつ 警告ダイアログの "dismiss" ボタンをクリックする
|
117
|
+
|
118
|
+
ならば テキストエディタのプログラムは "puts 'Hello, World!'" であること
|
119
|
+
かつ "プログラム名の入力欄" は "01.rb" であること
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# language: ja
|
3
|
+
@javascript
|
4
|
+
機能: Translate - ブロックからRubyのソースコードに変換できる
|
5
|
+
背景:
|
6
|
+
前提 "ブロック" タブを表示する
|
7
|
+
|
8
|
+
シナリオ: ブロックを配置していない状態でRubyのソースコードに変換する
|
9
|
+
前提 すべてのブロックをクリアする
|
10
|
+
かつ テキストエディタに "puts 'Hello, World!'" を入力済みである
|
11
|
+
|
12
|
+
もし "Rubyタブ" にタブを切り替える
|
13
|
+
|
14
|
+
ならば テキストエディタのプログラムは "" であること
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# language: ja
|
3
|
+
@javascript
|
4
|
+
機能: Translate - Rubyのソースコードからブロックに変換できる
|
5
|
+
背景:
|
6
|
+
前提 "Ruby" タブを表示する
|
7
|
+
かつ すべてのブロックをクリアする
|
8
|
+
|
9
|
+
シナリオ: Rubyのソースコードからブロックに変換する
|
10
|
+
前提 テキストエディタにプログラムを入力済みである:
|
11
|
+
"""
|
12
|
+
require "smalruby"
|
13
|
+
|
14
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
15
|
+
|
16
|
+
car1.on(:start) do
|
17
|
+
loop do
|
18
|
+
move(10)
|
19
|
+
turn_if_reach_wall
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
"""
|
24
|
+
|
25
|
+
もし "ブロックタブ" にタブを切り替える
|
26
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
27
|
+
|
28
|
+
ならば 次のXMLと同等のブロックが配置されていること:
|
29
|
+
"""
|
30
|
+
<xml>
|
31
|
+
<character x="0" y="0" name="car1" costumes="car1.png" angle="0"></character>
|
32
|
+
<block type="character_new" x="4" y="4">
|
33
|
+
<field name="NAME">car1</field>
|
34
|
+
<statement name="DO">
|
35
|
+
<block type="events_on_start">
|
36
|
+
<statement name="DO">
|
37
|
+
<block type="control_loop">
|
38
|
+
<statement name="DO">
|
39
|
+
<block type="motion_move" inline="true">
|
40
|
+
<value name="STEP">
|
41
|
+
<block type="math_number">
|
42
|
+
<field name="NUM">10</field>
|
43
|
+
</block>
|
44
|
+
</value>
|
45
|
+
<next>
|
46
|
+
<block type="motion_turn_if_reach_wall"></block>
|
47
|
+
</next>
|
48
|
+
</block>
|
49
|
+
</statement>
|
50
|
+
</block>
|
51
|
+
</statement>
|
52
|
+
</block>
|
53
|
+
</statement>
|
54
|
+
</block>
|
55
|
+
</xml>
|
56
|
+
"""
|
57
|
+
|
58
|
+
シナリオ: Rubyのソースコードからブロックへの変換に失敗する
|
59
|
+
前提 テキストエディタに "__FAIL__" を入力済みである
|
60
|
+
|
61
|
+
もし "ブロックタブ" にタブを切り替える
|
62
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
63
|
+
|
64
|
+
ならば ブロックが配置されていないこと
|
65
|
+
かつ テキストエディタのプログラムは "__FAIL__" であること
|
@@ -3,11 +3,12 @@
|
|
3
3
|
@javascript
|
4
4
|
@standalone
|
5
5
|
機能: Run - プログラムの実行(standaloneモード)
|
6
|
-
|
6
|
+
背景:
|
7
7
|
前提 "Ruby" タブを表示する
|
8
8
|
かつ プログラムの名前に "01.rb" を指定する
|
9
9
|
かつ テキストエディタに "puts Hello, World!'" を入力済みである
|
10
10
|
|
11
|
+
シナリオ: 実行前にプログラムのシンタックスエラーをチェックできる
|
11
12
|
もし "実行ボタン" をクリックする
|
12
13
|
かつ JavaScriptによるリクエストが終わるまで待つ
|
13
14
|
|
@@ -15,3 +16,15 @@
|
|
15
16
|
かつ "メッセージ" に "プログラムを実行できませんでした" を含むこと
|
16
17
|
かつ "メッセージ" に "1行、19文字: syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '('" を含むこと
|
17
18
|
かつ "メッセージ" に "1行: unterminated string meets end of file" を含むこと
|
19
|
+
|
20
|
+
シナリオ: 既存のファイルがある状態でプログラムを実行し、上書き保存をキャンセルする
|
21
|
+
前提 ホームディレクトリに "n = 0" という内容の "01.rb" が存在する
|
22
|
+
かつ 確認ダイアログをキャンセルするようにしておく
|
23
|
+
|
24
|
+
もし "実行ボタン" をクリックする
|
25
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
26
|
+
かつ JavaScriptによるリクエストが終わるまで待つ
|
27
|
+
|
28
|
+
ならば 確認メッセージ "前に01.rbという名前でセーブしているけど本当にセーブしますか?\nセーブすると前に作成したプログラムは消えてしまうよ!" を表示すること
|
29
|
+
かつ "メッセージ" に "プログラムの実行をキャンセルしました" を含むこと
|
30
|
+
かつ ホームディレクトリの "01.rb" の内容が "n = 0" であること
|
@@ -466,4 +466,26 @@ describe SourceCodesController do
|
|
466
466
|
end
|
467
467
|
end
|
468
468
|
end
|
469
|
+
|
470
|
+
describe 'プログラムをXML形式のブロックに変換する (POST to_blocks)' do
|
471
|
+
before do
|
472
|
+
post :to_blocks, source_code: { data: data }
|
473
|
+
end
|
474
|
+
|
475
|
+
describe '動作確認用のモックアップ' do
|
476
|
+
context '成功する場合' do
|
477
|
+
let(:data) { SourceCode::SUCCESS_DATA_MOCK }
|
478
|
+
|
479
|
+
it 'XML形式のブロックを返すこと' do
|
480
|
+
expect(response.body).to eq(SourceCode::SUCCESS_XML_MOCK)
|
481
|
+
end
|
482
|
+
end
|
483
|
+
|
484
|
+
context '失敗する場合' do
|
485
|
+
let(:data) { '__FAIL__' }
|
486
|
+
|
487
|
+
it { expect(response.status).to eq(400) }
|
488
|
+
end
|
489
|
+
end
|
490
|
+
end
|
469
491
|
end
|
data/{public/assets/default-5d1886100d7c8961e9962bbc4bb0c714.xml → spec/fixtures/files/01.rb.xml}
RENAMED
File without changes
|
@@ -0,0 +1,329 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
def compact_source_code(source_code)
|
5
|
+
source_code.lines.map(&:strip).reject(&:empty?).join(';')[0...80]
|
6
|
+
end
|
7
|
+
|
8
|
+
# rubocop:disable EmptyLines, LineLength
|
9
|
+
|
10
|
+
describe RubyToBlock do
|
11
|
+
describe '#to_blocks' do
|
12
|
+
let(:source_code) { SourceCode.new(data: data) }
|
13
|
+
|
14
|
+
subject { source_code.to_blocks }
|
15
|
+
|
16
|
+
_data = <<-EOS.strip_heredoc
|
17
|
+
require "smalruby"
|
18
|
+
EOS
|
19
|
+
describe compact_source_code(_data) do
|
20
|
+
__data = _data
|
21
|
+
let(:data) { __data }
|
22
|
+
|
23
|
+
it { should eq('') }
|
24
|
+
end
|
25
|
+
|
26
|
+
_data = <<-EOS.strip_heredoc
|
27
|
+
require "smalruby"
|
28
|
+
|
29
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
30
|
+
|
31
|
+
car1.on(:start) do
|
32
|
+
|
33
|
+
end
|
34
|
+
EOS
|
35
|
+
describe compact_source_code(_data) do
|
36
|
+
__data = _data
|
37
|
+
let(:data) { __data }
|
38
|
+
|
39
|
+
it '結果が正しいこと' do
|
40
|
+
should eq(<<-XML.strip_heredoc)
|
41
|
+
<xml xmlns="http://www.w3.org/1999/xhtml">
|
42
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
43
|
+
<block type="character_new">
|
44
|
+
<field name="NAME">car1</field>
|
45
|
+
<statement name="DO">
|
46
|
+
<block type="events_on_start" />
|
47
|
+
</statement>
|
48
|
+
</block>
|
49
|
+
</xml>
|
50
|
+
XML
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
_data = <<-EOS.strip_heredoc
|
55
|
+
require "smalruby"
|
56
|
+
|
57
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
58
|
+
cat1 = Character.new(costume: "cat1.png", x: 200, y: 150, angle: 90)
|
59
|
+
|
60
|
+
car1.on(:start) do
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
car1.on(:start) do
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
cat1.on(:start) do
|
70
|
+
|
71
|
+
end
|
72
|
+
EOS
|
73
|
+
describe compact_source_code(_data) do
|
74
|
+
__data = _data
|
75
|
+
let(:data) { __data }
|
76
|
+
|
77
|
+
it '結果が正しいこと' do
|
78
|
+
should eq(<<-XML.strip_heredoc)
|
79
|
+
<xml xmlns="http://www.w3.org/1999/xhtml">
|
80
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
81
|
+
<character name="cat1" x="200" y="150" angle="90" costumes="cat1.png" />
|
82
|
+
<block type="character_new">
|
83
|
+
<field name="NAME">car1</field>
|
84
|
+
<statement name="DO">
|
85
|
+
<block type="events_on_start">
|
86
|
+
<next>
|
87
|
+
<block type="events_on_start" />
|
88
|
+
</next>
|
89
|
+
</block>
|
90
|
+
</statement>
|
91
|
+
</block>
|
92
|
+
<block type="character_new">
|
93
|
+
<field name="NAME">cat1</field>
|
94
|
+
<statement name="DO">
|
95
|
+
<block type="events_on_start" />
|
96
|
+
</statement>
|
97
|
+
</block>
|
98
|
+
</xml>
|
99
|
+
XML
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
_data = <<-EOS.strip_heredoc
|
104
|
+
require "smalruby"
|
105
|
+
|
106
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
107
|
+
cat1 = Character.new(costume: "cat1.png", x: 200, y: 150, angle: 90)
|
108
|
+
|
109
|
+
car1.on(:start) do
|
110
|
+
|
111
|
+
cat1.on(:start) do
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
115
|
+
EOS
|
116
|
+
describe compact_source_code(_data) do
|
117
|
+
__data = _data
|
118
|
+
let(:data) { __data }
|
119
|
+
|
120
|
+
it '結果が正しいこと' do
|
121
|
+
should eq(<<-XML.strip_heredoc)
|
122
|
+
<xml xmlns="http://www.w3.org/1999/xhtml">
|
123
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
124
|
+
<character name="cat1" x="200" y="150" angle="90" costumes="cat1.png" />
|
125
|
+
<block type="character_new">
|
126
|
+
<field name="NAME">car1</field>
|
127
|
+
<statement name="DO">
|
128
|
+
<block type="events_on_start">
|
129
|
+
<statement name="DO">
|
130
|
+
<block type="character_new">
|
131
|
+
<field name="NAME">cat1</field>
|
132
|
+
<statement name="DO">
|
133
|
+
<block type="events_on_start" />
|
134
|
+
</statement>
|
135
|
+
</block>
|
136
|
+
</statement>
|
137
|
+
</block>
|
138
|
+
</statement>
|
139
|
+
</block>
|
140
|
+
</xml>
|
141
|
+
XML
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
_data = <<-EOS.strip_heredoc
|
146
|
+
require "smalruby"
|
147
|
+
|
148
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
149
|
+
|
150
|
+
car1.on(:start) do
|
151
|
+
|
152
|
+
on(:start) do
|
153
|
+
|
154
|
+
end
|
155
|
+
end
|
156
|
+
EOS
|
157
|
+
describe compact_source_code(_data) do
|
158
|
+
__data = _data
|
159
|
+
let(:data) { __data }
|
160
|
+
|
161
|
+
it '結果が正しいこと' do
|
162
|
+
should eq(<<-XML.strip_heredoc)
|
163
|
+
<xml xmlns="http://www.w3.org/1999/xhtml">
|
164
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
165
|
+
<block type="character_new">
|
166
|
+
<field name="NAME">car1</field>
|
167
|
+
<statement name="DO">
|
168
|
+
<block type="events_on_start">
|
169
|
+
<statement name="DO">
|
170
|
+
<block type="events_on_start" />
|
171
|
+
</statement>
|
172
|
+
</block>
|
173
|
+
</statement>
|
174
|
+
</block>
|
175
|
+
</xml>
|
176
|
+
XML
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
_data = <<-EOS.strip_heredoc
|
181
|
+
require "smalruby"
|
182
|
+
|
183
|
+
car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
|
184
|
+
|
185
|
+
car1.on(:start) do
|
186
|
+
|
187
|
+
s = 'a'
|
188
|
+
if s == 'a'
|
189
|
+
puts 'エー'
|
190
|
+
elsif s == 'b'
|
191
|
+
puts 'ビー'
|
192
|
+
else
|
193
|
+
puts 'その他'
|
194
|
+
end
|
195
|
+
end
|
196
|
+
EOS
|
197
|
+
describe compact_source_code(_data) do
|
198
|
+
__data = _data
|
199
|
+
let(:data) { __data }
|
200
|
+
|
201
|
+
it '結果が正しいこと' do
|
202
|
+
should eq(<<-XML.strip_heredoc)
|
203
|
+
<xml xmlns="http://www.w3.org/1999/xhtml">
|
204
|
+
<character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
|
205
|
+
<block type="character_new">
|
206
|
+
<field name="NAME">car1</field>
|
207
|
+
<statement name="DO">
|
208
|
+
<block type="events_on_start">
|
209
|
+
<statement name="DO">
|
210
|
+
<block type="ruby_statement">
|
211
|
+
<field name="STATEMENT">s = 'a'</field>
|
212
|
+
<next>
|
213
|
+
<block type="ruby_statement">
|
214
|
+
<field name="STATEMENT">if s == 'a'</field>
|
215
|
+
<next>
|
216
|
+
<block type="ruby_statement">
|
217
|
+
<field name="STATEMENT"> puts 'エー'</field>
|
218
|
+
<next>
|
219
|
+
<block type="ruby_statement">
|
220
|
+
<field name="STATEMENT">elsif s == 'b'</field>
|
221
|
+
<next>
|
222
|
+
<block type="ruby_statement">
|
223
|
+
<field name="STATEMENT"> puts 'ビー'</field>
|
224
|
+
<next>
|
225
|
+
<block type="ruby_statement">
|
226
|
+
<field name="STATEMENT">else</field>
|
227
|
+
<next>
|
228
|
+
<block type="ruby_statement">
|
229
|
+
<field name="STATEMENT"> puts 'その他'</field>
|
230
|
+
<next>
|
231
|
+
<block type="ruby_statement">
|
232
|
+
<field name="STATEMENT">end</field>
|
233
|
+
</block>
|
234
|
+
</next>
|
235
|
+
</block>
|
236
|
+
</next>
|
237
|
+
</block>
|
238
|
+
</next>
|
239
|
+
</block>
|
240
|
+
</next>
|
241
|
+
</block>
|
242
|
+
</next>
|
243
|
+
</block>
|
244
|
+
</next>
|
245
|
+
</block>
|
246
|
+
</next>
|
247
|
+
</block>
|
248
|
+
</statement>
|
249
|
+
</block>
|
250
|
+
</statement>
|
251
|
+
</block>
|
252
|
+
</xml>
|
253
|
+
XML
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
_data = <<-EOS.strip_heredoc
|
258
|
+
require "smalruby"
|
259
|
+
|
260
|
+
s = :a
|
261
|
+
case s
|
262
|
+
when :a
|
263
|
+
puts "エー"
|
264
|
+
when :b
|
265
|
+
puts "ビー"
|
266
|
+
end
|
267
|
+
EOS
|
268
|
+
describe compact_source_code(_data) do
|
269
|
+
__data = _data
|
270
|
+
let(:data) { __data }
|
271
|
+
|
272
|
+
it '結果が正しいこと' do
|
273
|
+
should eq(<<-XML.strip_heredoc)
|
274
|
+
<xml xmlns="http://www.w3.org/1999/xhtml">
|
275
|
+
<block type="ruby_statement">
|
276
|
+
<field name="STATEMENT">s = :a</field>
|
277
|
+
<next>
|
278
|
+
<block type="ruby_statement">
|
279
|
+
<field name="STATEMENT">case s</field>
|
280
|
+
<next>
|
281
|
+
<block type="ruby_statement">
|
282
|
+
<field name="STATEMENT">when :a</field>
|
283
|
+
<next>
|
284
|
+
<block type="ruby_statement">
|
285
|
+
<field name="STATEMENT"> puts "エー"</field>
|
286
|
+
<next>
|
287
|
+
<block type="ruby_statement">
|
288
|
+
<field name="STATEMENT">when :b</field>
|
289
|
+
<next>
|
290
|
+
<block type="ruby_statement">
|
291
|
+
<field name="STATEMENT"> puts "ビー"</field>
|
292
|
+
<next>
|
293
|
+
<block type="ruby_statement">
|
294
|
+
<field name="STATEMENT">end</field>
|
295
|
+
</block>
|
296
|
+
</next>
|
297
|
+
</block>
|
298
|
+
</next>
|
299
|
+
</block>
|
300
|
+
</next>
|
301
|
+
</block>
|
302
|
+
</next>
|
303
|
+
</block>
|
304
|
+
</next>
|
305
|
+
</block>
|
306
|
+
</next>
|
307
|
+
</block>
|
308
|
+
</xml>
|
309
|
+
XML
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
describe '動作確認用のモックアップ' do
|
314
|
+
context '成功する場合' do
|
315
|
+
let(:data) { SourceCode::SUCCESS_DATA_MOCK }
|
316
|
+
|
317
|
+
it 'XML形式のブロックを返すこと' do
|
318
|
+
should eq(SourceCode::SUCCESS_XML_MOCK)
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
context '失敗する場合' do
|
323
|
+
let(:data) { '__FAIL__' }
|
324
|
+
|
325
|
+
it { expect { subject }.to raise_error }
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|