smalruby-editor 0.1.6 → 0.1.7

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.

Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/blocks/hardware.js.coffee.erb +40 -3
  3. data/app/assets/stylesheets/toolbox.css.scss.erb +1 -6
  4. data/app/controllers/source_codes_controller.rb +5 -1
  5. data/app/models/concerns/ruby_to_block.rb +17 -360
  6. data/app/models/concerns/ruby_to_block/block.rb +97 -0
  7. data/app/models/concerns/ruby_to_block/block/base.rb +251 -0
  8. data/app/models/concerns/ruby_to_block/block/character.rb +42 -0
  9. data/app/models/concerns/ruby_to_block/block/character_event.rb +27 -0
  10. data/app/models/concerns/ruby_to_block/block/character_method_call.rb +29 -0
  11. data/app/models/concerns/ruby_to_block/block/character_new.rb +7 -0
  12. data/app/models/concerns/ruby_to_block/block/character_operation.rb +80 -0
  13. data/app/models/concerns/ruby_to_block/block/control_if.rb +45 -0
  14. data/app/models/concerns/ruby_to_block/block/control_loop.rb +19 -0
  15. data/app/models/concerns/ruby_to_block/block/control_sleep.rb +18 -0
  16. data/app/models/concerns/ruby_to_block/block/do.rb +24 -0
  17. data/app/models/concerns/ruby_to_block/block/else.rb +12 -0
  18. data/app/models/concerns/ruby_to_block/block/end.rb +26 -0
  19. data/app/models/concerns/ruby_to_block/block/events_on_click.rb +14 -0
  20. data/app/models/concerns/ruby_to_block/block/events_on_key_push_or_down.rb +17 -0
  21. data/app/models/concerns/ruby_to_block/block/events_on_start.rb +14 -0
  22. data/app/models/concerns/ruby_to_block/block/hardware_init_hardware.rb +14 -0
  23. data/app/models/concerns/ruby_to_block/block/hardware_led_off.rb +16 -0
  24. data/app/models/concerns/ruby_to_block/block/hardware_led_on.rb +16 -0
  25. data/app/models/concerns/ruby_to_block/block/hardware_on_sensor_change.rb +17 -0
  26. data/app/models/concerns/ruby_to_block/block/hardware_rgb_led_off.rb +18 -0
  27. data/app/models/concerns/ruby_to_block/block/hardware_rgb_led_on.rb +23 -0
  28. data/app/models/concerns/ruby_to_block/block/hardware_sensor_value.rb +23 -0
  29. data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car.rb +26 -0
  30. data/app/models/concerns/ruby_to_block/block/looks_hide.rb +8 -0
  31. data/app/models/concerns/ruby_to_block/block/looks_say.rb +20 -0
  32. data/app/models/concerns/ruby_to_block/block/looks_show.rb +8 -0
  33. data/app/models/concerns/ruby_to_block/block/looks_vanish.rb +8 -0
  34. data/app/models/concerns/ruby_to_block/block/math_number.rb +14 -0
  35. data/app/models/concerns/ruby_to_block/block/motion_change_x_by.rb +20 -0
  36. data/app/models/concerns/ruby_to_block/block/motion_change_y_by.rb +20 -0
  37. data/app/models/concerns/ruby_to_block/block/motion_move.rb +15 -0
  38. data/app/models/concerns/ruby_to_block/block/motion_point_towards_character.rb +24 -0
  39. data/app/models/concerns/ruby_to_block/block/motion_point_towards_mouse.rb +9 -0
  40. data/app/models/concerns/ruby_to_block/block/motion_reach_wall.rb +24 -0
  41. data/app/models/concerns/ruby_to_block/block/motion_rotate_left.rb +20 -0
  42. data/app/models/concerns/ruby_to_block/block/motion_rotate_right.rb +20 -0
  43. data/app/models/concerns/ruby_to_block/block/motion_self_angle.rb +23 -0
  44. data/app/models/concerns/ruby_to_block/block/motion_self_x.rb +23 -0
  45. data/app/models/concerns/ruby_to_block/block/motion_self_y.rb +23 -0
  46. data/app/models/concerns/ruby_to_block/block/motion_set_angle.rb +15 -0
  47. data/app/models/concerns/ruby_to_block/block/motion_set_x.rb +38 -0
  48. data/app/models/concerns/ruby_to_block/block/motion_set_y.rb +15 -0
  49. data/app/models/concerns/ruby_to_block/block/motion_turn.rb +8 -0
  50. data/app/models/concerns/ruby_to_block/block/motion_turn_if_reach_wall.rb +8 -0
  51. data/app/models/concerns/ruby_to_block/block/null.rb +17 -0
  52. data/app/models/concerns/ruby_to_block/block/operators_compare.rb +36 -0
  53. data/app/models/concerns/ruby_to_block/block/operators_false.rb +8 -0
  54. data/app/models/concerns/ruby_to_block/block/operators_true.rb +8 -0
  55. data/app/models/concerns/ruby_to_block/block/require_smalruby.rb +7 -0
  56. data/app/models/concerns/ruby_to_block/block/ruby_comment.rb +16 -0
  57. data/app/models/concerns/ruby_to_block/block/ruby_expression.rb +14 -0
  58. data/app/models/concerns/ruby_to_block/block/ruby_statement.rb +23 -0
  59. data/app/models/concerns/ruby_to_block/block/sensing_hit.rb +23 -0
  60. data/app/models/concerns/ruby_to_block/block/sound_play.rb +15 -0
  61. data/app/models/concerns/ruby_to_block/block/sound_preset_sounds.rb +31 -0
  62. data/app/models/concerns/ruby_to_block/block/text.rb +15 -0
  63. data/app/models/concerns/ruby_to_block/block/value.rb +12 -0
  64. data/app/models/concerns/ruby_to_block/context.rb +97 -0
  65. data/app/models/concerns/ruby_to_block/formatter.rb +26 -0
  66. data/app/models/source_code.rb +3 -1
  67. data/app/views/editor/_toolbox.html.haml +16 -0
  68. data/lib/smalruby_editor/version.rb +3 -3
  69. data/smalruby-editor.gemspec +1 -1
  70. data/spec/acceptance/block_mode/blocks/hardware/two_wheel_drive_car.feature +69 -0
  71. data/spec/acceptance/ruby_mode/translate.feature +1 -1
  72. data/spec/controllers/source_codes_controller_spec.rb +14 -11
  73. data/spec/models/concerns/ruby_to_block/block/character_method_call_spec.rb +175 -0
  74. data/spec/models/concerns/ruby_to_block/block/control_if_spec.rb +75 -0
  75. data/spec/models/concerns/ruby_to_block/block/control_loop_spec.rb +68 -0
  76. data/spec/models/concerns/ruby_to_block/block/events_on_start_spec.rb +120 -0
  77. data/spec/models/concerns/ruby_to_block/block/hardware_spec.rb +120 -0
  78. data/spec/models/concerns/ruby_to_block/block/looks_say_spec.rb +79 -0
  79. data/spec/models/concerns/ruby_to_block/block/looks_spec.rb +74 -0
  80. data/spec/models/concerns/ruby_to_block/block/motion_move_spec.rb +63 -0
  81. data/spec/models/concerns/ruby_to_block/block/motion_reach_wall_spec.rb +67 -0
  82. data/spec/models/concerns/ruby_to_block/block/motion_spec.rb +392 -0
  83. data/spec/models/concerns/ruby_to_block/block/motion_turn_spec.rb +54 -0
  84. data/spec/models/concerns/ruby_to_block/block/require_smalruby_spec.rb +39 -0
  85. data/spec/models/concerns/ruby_to_block/block/ruby_comment_spec.rb +55 -0
  86. data/spec/models/concerns/ruby_to_block/block/ruby_statement_spec.rb +113 -0
  87. data/spec/models/concerns/ruby_to_block/block/shared/block_examples.rb +44 -0
  88. data/spec/models/concerns/ruby_to_block/block/sound_spec.rb +46 -0
  89. data/spec/models/concerns/ruby_to_block/block_spec.rb +49 -0
  90. data/spec/models/concerns/ruby_to_block_spec.rb +421 -217
  91. data/spec/support/ruby_to_block.rb +10 -0
  92. metadata +108 -10
@@ -468,24 +468,27 @@ describe SourceCodesController do
468
468
  end
469
469
 
470
470
  describe 'プログラムをXML形式のブロックに変換する (POST to_blocks)' do
471
+ let(:data) { 'data' }
472
+
471
473
  before do
474
+ allow_any_instance_of(SourceCode).to receive(:to_blocks) {
475
+ fail if data == '__FAIL__'
476
+ 'success'
477
+ }
478
+
472
479
  post :to_blocks, source_code: { data: data }
473
480
  end
474
481
 
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
+ context '成功する場合' do
483
+ it 'SourceCode#to_blocksの結果をそのまま返すこと' do
484
+ expect(response.body).to eq('success')
482
485
  end
486
+ end
483
487
 
484
- context '失敗する場合' do
485
- let(:data) { '__FAIL__' }
488
+ context '失敗する場合' do
489
+ let(:data) { '__FAIL__' }
486
490
 
487
- it { expect(response.status).to eq(400) }
488
- end
491
+ it { expect(response.status).to eq(400) }
489
492
  end
490
493
  end
491
494
  end
@@ -0,0 +1,175 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+ require_relative 'shared/block_examples'
4
+
5
+ # ここではCharacterMethodCallのexamplesとしてlooks_sayブロックを利用
6
+ # します。そのかわりlooks_sayのようにCharacterMethodCallを継承したブ
7
+ # ロックでは最低限のexamplesしか実装しません。
8
+
9
+ # rubocop:disable EmptyLines, LineLength
10
+
11
+ describe RubyToBlock::Block::CharacterMethodCall, to_blocks: true do
12
+ parts = <<-EOS
13
+ say(message: "こんにちは")
14
+ EOS
15
+ describe compact_source_code(parts), on_start_data: true do
16
+ _parts = parts
17
+ let(:parts) { _parts }
18
+
19
+ it '結果が正しいこと' do
20
+ should eq_block_xml(<<-XML)
21
+ <block type="looks_say" inline="true">
22
+ <value name="TEXT">
23
+ <block type="text">
24
+ <field name="TEXT">こんにちは</field>
25
+ </block>
26
+ </value>
27
+ </block>
28
+ XML
29
+ end
30
+ end
31
+
32
+ parts = <<-EOS
33
+ self.say(message: "こんにちは")
34
+ EOS
35
+ describe compact_source_code(parts), on_start_data: true do
36
+ _parts = parts
37
+ let(:parts) { _parts }
38
+
39
+ it '結果が正しいこと' do
40
+ should eq_block_xml(<<-XML)
41
+ <block type="looks_say" inline="true">
42
+ <value name="TEXT">
43
+ <block type="text">
44
+ <field name="TEXT">こんにちは</field>
45
+ </block>
46
+ </value>
47
+ </block>
48
+ XML
49
+ end
50
+ end
51
+
52
+ parts = <<-EOS
53
+ say(message: "こんにちは")
54
+ puts "Hello, World!"
55
+ EOS
56
+ describe compact_source_code(parts), on_start_data: true do
57
+ _parts = parts
58
+ let(:parts) { _parts }
59
+
60
+ it '結果が正しいこと' do
61
+ should eq_block_xml(<<-XML)
62
+ <block type="looks_say" inline="true">
63
+ <value name="TEXT">
64
+ <block type="text">
65
+ <field name="TEXT">こんにちは</field>
66
+ </block>
67
+ </value>
68
+ <next>
69
+ <block type="ruby_statement">
70
+ <field name="STATEMENT">puts &quot;Hello, World!&quot;</field>
71
+ </block>
72
+ </next>
73
+ </block>
74
+ XML
75
+ end
76
+ end
77
+
78
+ parts = <<-EOS
79
+ car1.say(message: "こんにちは")
80
+ EOS
81
+ describe compact_source_code(parts), character_new_data: true do
82
+ _parts = parts
83
+ let(:parts) { _parts }
84
+
85
+ it '結果が正しいこと' do
86
+ should eq_block_xml(<<-XML)
87
+ <block type="looks_say" inline="true">
88
+ <value name="TEXT">
89
+ <block type="text">
90
+ <field name="TEXT">こんにちは</field>
91
+ </block>
92
+ </value>
93
+ </block>
94
+ XML
95
+ end
96
+ end
97
+
98
+ parts = <<-EOS
99
+ car1.say(message: "こんにちは")
100
+ car1.say(message: "こんにちは")
101
+ EOS
102
+ describe compact_source_code(parts), character_new_data: true do
103
+ _parts = parts
104
+ let(:parts) { _parts }
105
+
106
+ it '結果が正しいこと' do
107
+ should eq_block_xml(<<-XML)
108
+ <block type="looks_say" inline="true">
109
+ <value name="TEXT">
110
+ <block type="text">
111
+ <field name="TEXT">こんにちは</field>
112
+ </block>
113
+ </value>
114
+ <next>
115
+ <block type="looks_say" inline="true">
116
+ <value name="TEXT">
117
+ <block type="text">
118
+ <field name="TEXT">こんにちは</field>
119
+ </block>
120
+ </value>
121
+ </block>
122
+ </next>
123
+ </block>
124
+ XML
125
+ end
126
+ end
127
+
128
+ parts = <<-EOS
129
+ car1.say(message: "こんにちは")
130
+ unknown.say(message: "こんにちは")
131
+ say(message: "こんにちは")
132
+ EOS
133
+ describe compact_source_code(parts), character_new_data: true do
134
+ _parts = parts
135
+ let(:parts) { _parts }
136
+
137
+ it '結果が正しいこと' do
138
+ should eq_block_xml(<<-XML)
139
+ <block type="looks_say" inline="true">
140
+ <value name="TEXT">
141
+ <block type="text">
142
+ <field name="TEXT">こんにちは</field>
143
+ </block>
144
+ </value>
145
+ <next>
146
+ <block type="ruby_statement">
147
+ <field name="STATEMENT">unknown.say(message: &quot;こんにちは&quot;)</field>
148
+ <next>
149
+ <block type="ruby_statement">
150
+ <field name="STATEMENT">say(message: &quot;こんにちは&quot;)</field>
151
+ </block>
152
+ </next>
153
+ </block>
154
+ </next>
155
+ </block>
156
+ XML
157
+ end
158
+ end
159
+
160
+ _data = <<-EOS
161
+ say(message: "こんにちは")
162
+ EOS
163
+ describe compact_source_code(_data) do
164
+ __data = _data
165
+ let(:data) { __data }
166
+
167
+ it '結果が正しいこと' do
168
+ should eq_block_xml(<<-XML)
169
+ <block type="ruby_statement">
170
+ <field name="STATEMENT">say(message: &quot;こんにちは&quot;)</field>
171
+ </block>
172
+ XML
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,75 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+ require_relative 'shared/block_examples'
4
+
5
+ # rubocop:disable EmptyLines, LineLength
6
+
7
+ describe RubyToBlock::Block::ControlIf,
8
+ RubyToBlock::Block::OperatorsTrue,
9
+ RubyToBlock::Block::OperatorsFalse,
10
+ to_blocks: true do
11
+ _data = <<-EOS
12
+ if true
13
+
14
+ end
15
+ EOS
16
+ describe compact_source_code(_data) do
17
+ __data = _data
18
+ let(:data) { __data }
19
+
20
+ it '結果が正しいこと' do
21
+ should eq_block_xml(<<-XML)
22
+ <block type="control_if" inline="true">
23
+ <value name="COND">
24
+ <block type="operators_true" />
25
+ </value>
26
+ </block>
27
+ XML
28
+ end
29
+ end
30
+
31
+ _data = <<-EOS
32
+ if false
33
+
34
+ end
35
+ EOS
36
+ describe compact_source_code(_data) do
37
+ __data = _data
38
+ let(:data) { __data }
39
+
40
+ it '結果が正しいこと' do
41
+ should eq_block_xml(<<-XML)
42
+ <block type="control_if" inline="true">
43
+ <value name="COND">
44
+ <block type="operators_false" />
45
+ </value>
46
+ </block>
47
+ XML
48
+ end
49
+ end
50
+
51
+ _data = <<-EOS
52
+ if true
53
+ puts "Hello, World!"
54
+ end
55
+ EOS
56
+ describe compact_source_code(_data) do
57
+ __data = _data
58
+ let(:data) { __data }
59
+
60
+ it '結果が正しいこと' do
61
+ should eq_block_xml(<<-XML)
62
+ <block type="control_if" inline="true">
63
+ <value name="COND">
64
+ <block type="operators_true" />
65
+ </value>
66
+ <statement name="THEN">
67
+ <block type="ruby_statement">
68
+ <field name="STATEMENT">puts &quot;Hello, World!&quot;</field>
69
+ </block>
70
+ </statement>
71
+ </block>
72
+ XML
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,68 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+ require_relative 'shared/block_examples'
4
+
5
+ # rubocop:disable EmptyLines, LineLength
6
+
7
+ describe RubyToBlock::Block::ControlLoop, to_blocks: true do
8
+ parts = <<-EOS
9
+ loop do
10
+
11
+ end
12
+ EOS
13
+ describe compact_source_code(parts), on_start_data: true do
14
+ _parts = parts
15
+ let(:parts) { _parts }
16
+
17
+ it '結果が正しいこと' do
18
+ should eq_block_xml(<<-XML)
19
+ <block type="control_loop" />
20
+ XML
21
+ end
22
+ end
23
+
24
+ parts = <<-EOS
25
+ loop do
26
+ puts "Hello, World!"
27
+ end
28
+ EOS
29
+ describe compact_source_code(parts), on_start_data: true do
30
+ _parts = parts
31
+ let(:parts) { _parts }
32
+
33
+ it '結果が正しいこと' do
34
+ should eq_block_xml(<<-XML)
35
+ <block type="control_loop">
36
+ <statement name="DO">
37
+ <block type="ruby_statement">
38
+ <field name="STATEMENT">puts &quot;Hello, World!&quot;</field>
39
+ </block>
40
+ </statement>
41
+ </block>
42
+ XML
43
+ end
44
+ end
45
+
46
+ _data = <<-EOS
47
+ loop do
48
+
49
+ end
50
+ EOS
51
+ describe compact_source_code(_data) do
52
+ __data = _data
53
+ let(:data) { __data }
54
+
55
+ it '結果が正しいこと' do
56
+ should eq_block_xml(<<-XML)
57
+ <block type="ruby_statement">
58
+ <field name="STATEMENT">loop do</field>
59
+ <next>
60
+ <block type="ruby_statement">
61
+ <field name="STATEMENT">end</field>
62
+ </block>
63
+ </next>
64
+ </block>
65
+ XML
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,120 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+ require_relative 'shared/block_examples'
4
+
5
+ # rubocop:disable EmptyLines, LineLength
6
+
7
+ describe RubyToBlock::Block::EventsOnStart, to_blocks: true do
8
+ parts = <<-EOS
9
+ car1.on(:start) do
10
+
11
+ end
12
+ EOS
13
+ describe compact_source_code(parts), character_new_data: true do
14
+ _parts = parts
15
+ let(:parts) { _parts }
16
+
17
+ it '結果が正しいこと' do
18
+ should eq_block_xml(<<-XML)
19
+ <block type="events_on_start" />
20
+ XML
21
+ end
22
+ end
23
+
24
+ parts = <<-EOS
25
+ cat1 = Character.new(costume: "cat1.png", x: 200, y: 150, angle: 90)
26
+
27
+ car1.on(:start) do
28
+
29
+ end
30
+
31
+ car1.on(:start) do
32
+
33
+ end
34
+
35
+
36
+ cat1.on(:start) do
37
+
38
+ end
39
+ EOS
40
+ describe compact_source_code(parts), character_new_data: true do
41
+ _parts = parts
42
+ let(:parts) { _parts }
43
+
44
+ it '結果が正しいこと' do
45
+ should eq_block_xml(<<-XML)
46
+ <character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
47
+ <character name="cat1" x="200" y="150" angle="90" costumes="cat1.png" />
48
+ <block type="character_new">
49
+ <field name="NAME">car1</field>
50
+ <statement name="DO">
51
+ <block type="events_on_start">
52
+ <next>
53
+ <block type="events_on_start" />
54
+ </next>
55
+ </block>
56
+ </statement>
57
+ </block>
58
+ <block type="character_new">
59
+ <field name="NAME">cat1</field>
60
+ <statement name="DO">
61
+ <block type="events_on_start" />
62
+ </statement>
63
+ </block>
64
+ XML
65
+ end
66
+ end
67
+
68
+ parts = <<-EOS
69
+ cat1 = Character.new(costume: "cat1.png", x: 200, y: 150, angle: 90)
70
+
71
+ car1.on(:start) do
72
+
73
+ cat1.on(:start) do
74
+
75
+ end
76
+ end
77
+ EOS
78
+ describe compact_source_code(parts), character_new_data: true do
79
+ _parts = parts
80
+ let(:parts) { _parts }
81
+
82
+ it '結果が正しいこと' do
83
+ should eq_block_xml(<<-XML)
84
+ <character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
85
+ <character name="cat1" x="200" y="150" angle="90" costumes="cat1.png" />
86
+ <block type="character_new">
87
+ <field name="NAME">car1</field>
88
+ <statement name="DO">
89
+ <block type="events_on_start">
90
+ <statement name="DO">
91
+ <block type="character_new">
92
+ <field name="NAME">cat1</field>
93
+ <statement name="DO">
94
+ <block type="events_on_start" />
95
+ </statement>
96
+ </block>
97
+ </statement>
98
+ </block>
99
+ </statement>
100
+ </block>
101
+ XML
102
+ end
103
+ end
104
+
105
+ parts = <<-EOS
106
+ on(:start) do
107
+
108
+ end
109
+ EOS
110
+ describe compact_source_code(parts), on_start_data: true do
111
+ _parts = parts
112
+ let(:parts) { _parts }
113
+
114
+ it '結果が正しいこと' do
115
+ should eq_block_xml(<<-XML)
116
+ <block type="events_on_start" />
117
+ XML
118
+ end
119
+ end
120
+ end