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.

Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.rubocop.yml +8 -0
  4. data/README.rdoc +3 -0
  5. data/app/assets/javascripts/application.js +0 -1
  6. data/app/assets/javascripts/models/source_code.js.coffee +5 -2
  7. data/app/assets/javascripts/smalruby.js.coffee +18 -11
  8. data/app/assets/javascripts/views/main_menu_view.js.coffee +139 -81
  9. data/app/controllers/source_codes_controller.rb +7 -0
  10. data/app/models/concerns/ruby_to_block.rb +391 -0
  11. data/app/models/source_code.rb +3 -2
  12. data/app/views/editor/demo.html.erb +1 -1
  13. data/app/views/editor/index.html.haml +2 -2
  14. data/config/routes.rb +1 -0
  15. data/{app/assets/demos → demos}/default.xml +0 -0
  16. data/{app/assets/demos → demos}/rgb_led_anode.xml +82 -82
  17. data/lib/smalruby_editor/version.rb +3 -3
  18. data/lib/tasks/release.rake +0 -4
  19. data/public/assets/{application-0047adbc0fb7a529ef7a41b5e0e7d097.js → application-8bfffad1222d4e198f3c7ccc1cbd774f.js} +179 -144
  20. data/public/assets/{application-0047adbc0fb7a529ef7a41b5e0e7d097.js.gz → application-8bfffad1222d4e198f3c7ccc1cbd774f.js.gz} +0 -0
  21. data/public/assets/manifest-332a5a1668194028b55103e0ea45c054.json +1 -1
  22. data/smalruby-editor.gemspec +0 -6
  23. data/spec/acceptance/base.feature +119 -0
  24. data/spec/acceptance/block_mode/translate.feature +14 -0
  25. data/spec/acceptance/ruby_mode/translate.feature +65 -0
  26. data/spec/acceptance/standalone/run.feature +14 -1
  27. data/spec/controllers/source_codes_controller_spec.rb +22 -0
  28. data/{public/assets/default-5d1886100d7c8961e9962bbc4bb0c714.xml → spec/fixtures/files/01.rb.xml} +0 -0
  29. data/spec/models/concerns/ruby_to_block_spec.rb +329 -0
  30. data/spec/steps/base_steps.rb +230 -0
  31. data/spec/steps/block_mode_steps.rb +9 -1
  32. data/spec/steps/fix_turnip.rb +28 -0
  33. data/spec/steps/text_editor_steps.rb +52 -193
  34. metadata +19 -97
  35. data/app/assets/javascripts/ruby_mode.js.coffee.erb +0 -12
  36. data/public/assets/rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml +0 -83
  37. data/spec/acceptance/ruby_mode/base.feature +0 -33
  38. data/spec/steps/ace_steps.rb +0 -77
@@ -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-0047adbc0fb7a529ef7a41b5e0e7d097.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"}}
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"}}
@@ -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
@@ -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 = &apos;a&apos;</field>
212
+ <next>
213
+ <block type="ruby_statement">
214
+ <field name="STATEMENT">if s == &apos;a&apos;</field>
215
+ <next>
216
+ <block type="ruby_statement">
217
+ <field name="STATEMENT"> puts &apos;エー&apos;</field>
218
+ <next>
219
+ <block type="ruby_statement">
220
+ <field name="STATEMENT">elsif s == &apos;b&apos;</field>
221
+ <next>
222
+ <block type="ruby_statement">
223
+ <field name="STATEMENT"> puts &apos;ビー&apos;</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 &apos;その他&apos;</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 &quot;エー&quot;</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 &quot;ビー&quot;</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