smalruby-editor 0.1.20-x86-mingw32 → 0.1.21-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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/app/assets/javascripts/blocks/character.js.coffee.erb +3 -10
  4. data/app/assets/javascripts/blocks/control.js.coffee.erb +2 -1
  5. data/app/assets/javascripts/blocks/data.js.coffee.erb +2 -1
  6. data/app/assets/javascripts/blocks/etc.js.coffee.erb +2 -1
  7. data/app/assets/javascripts/blocks/events.js.coffee.erb +5 -4
  8. data/app/assets/javascripts/blocks/field_character.js.coffee.erb +9 -0
  9. data/app/assets/javascripts/blocks/hardware.js.coffee.erb +171 -54
  10. data/app/assets/javascripts/blocks/looks.js.coffee.erb +2 -1
  11. data/app/assets/javascripts/blocks/motion.js.coffee.erb +4 -16
  12. data/app/assets/javascripts/blocks/operators.js.coffee.erb +2 -1
  13. data/app/assets/javascripts/blocks/pen.js.coffee.erb +2 -1
  14. data/app/assets/javascripts/blocks/ruby.js.coffee.erb +2 -1
  15. data/app/assets/javascripts/blocks/sensing.js.coffee.erb +25 -3
  16. data/app/assets/javascripts/blocks/sound.js.coffee.erb +2 -1
  17. data/app/assets/javascripts/generators/ruby.js.coffee.erb +27 -5
  18. data/app/assets/javascripts/models/source_code.js.coffee +20 -7
  19. data/app/assets/javascripts/views/main_menu_view.js.coffee +5 -7
  20. data/app/assets/stylesheets/editor.css.scss +5 -1
  21. data/app/assets/stylesheets/toolbox.css.scss.erb +29 -24
  22. data/app/controllers/source_codes_controller.rb +7 -36
  23. data/app/helpers/editor_helper.rb +9 -0
  24. data/app/models/concerns/ruby_to_block/block/hardware_button_down_or_up.rb +25 -0
  25. data/app/models/concerns/ruby_to_block/block/hardware_button_not_use_pullup.rb +18 -0
  26. data/app/models/concerns/ruby_to_block/block/hardware_motor_driver.rb +22 -0
  27. data/app/models/concerns/ruby_to_block/block/hardware_motor_driver_set_speed.rb +20 -0
  28. data/app/models/concerns/ruby_to_block/block/hardware_motor_driver_speed.rb +24 -0
  29. data/app/models/concerns/ruby_to_block/block/hardware_on_button_down_or_up.rb +19 -0
  30. data/app/models/concerns/ruby_to_block/block/hardware_operation.rb +15 -0
  31. data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car_set_speed.rb +22 -0
  32. data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car_speed.rb +26 -0
  33. data/app/models/concerns/ruby_to_block/block/ruby_p.rb +19 -0
  34. data/app/models/concerns/ruby_to_block/block/{motion_reach_wall.rb → sensing_reach_wall.rb} +1 -1
  35. data/app/models/concerns/ruby_to_block/block/text.rb +3 -2
  36. data/app/models/source_code.rb +20 -0
  37. data/app/views/editor/_toolbox.html.haml +84 -63
  38. data/app/views/editor/index.html.haml +1 -1
  39. data/demos/adjust_2wd_car.rb.xml +179 -0
  40. data/demos/car_chase.rb.xml +129 -126
  41. data/demos/hardware_led.rb.xml +7 -4
  42. data/demos/pong.rb.xml +17 -14
  43. data/demos/star.rb.xml +115 -112
  44. data/lib/smalruby_editor/version.rb +3 -3
  45. data/lib/smalruby_editor.rb +16 -0
  46. data/public/assets/{application-c8991557a0789ac1bc9220f409e7f1c1.js → application-734570836cdba680c1568220a51af40f.js} +216 -86
  47. data/public/assets/{application-c8991557a0789ac1bc9220f409e7f1c1.js.gz → application-734570836cdba680c1568220a51af40f.js.gz} +0 -0
  48. data/public/assets/{application-d4fe6c0f970efe8eab9267fd08718d96.css → application-898cb749439fba4ce44cffeac1216201.css} +37 -9
  49. data/public/assets/{application-d4fe6c0f970efe8eab9267fd08718d96.css.gz → application-898cb749439fba4ce44cffeac1216201.css.gz} +0 -0
  50. data/public/assets/manifest-332a5a1668194028b55103e0ea45c054.json +1 -1
  51. data/smalruby-editor.gemspec +2 -1
  52. data/spec/acceptance/block_mode/blocks/events/on_hit.feature +2 -0
  53. data/spec/acceptance/block_mode/blocks/hardware/button_down_or_up.feature +79 -0
  54. data/spec/acceptance/block_mode/blocks/hardware/button_not_use_pullup.feature +61 -0
  55. data/spec/acceptance/block_mode/blocks/hardware/motor_driver.feature +73 -0
  56. data/spec/acceptance/block_mode/blocks/hardware/motor_driver_speed.feature +93 -0
  57. data/spec/acceptance/block_mode/blocks/hardware/on_button_down_or_up.feature +87 -0
  58. data/spec/acceptance/block_mode/blocks/hardware/two_wheel_drive_car_speed.feature +111 -0
  59. data/spec/acceptance/block_mode/blocks/motion/reach_wall.feature +1 -1
  60. data/spec/acceptance/block_mode/blocks/operators/text.feature +38 -0
  61. data/spec/acceptance/block_mode/blocks/sensing/hit.feature +98 -52
  62. data/spec/acceptance/block_mode/blocks/sensing/reach_wall.feature +98 -0
  63. data/spec/acceptance/block_mode/demo.feature +3 -1
  64. data/spec/acceptance/standalone/save.feature +51 -0
  65. data/spec/helpers/editor_helper_spec.rb +20 -0
  66. data/spec/javascripts/models/source_code_spec.coffee +40 -0
  67. data/spec/models/concerns/ruby_to_block/block/hardware_spec.rb +269 -0
  68. data/spec/models/concerns/ruby_to_block/block/motion_spec.rb +1 -1
  69. data/spec/models/concerns/ruby_to_block/block/{motion_reach_wall_spec.rb → sensing_reach_wall_spec.rb} +2 -2
  70. data/spec/models/concerns/ruby_to_block/block/text_spec.rb +39 -0
  71. data/spec/models/concerns/ruby_to_block_spec.rb +2 -2
  72. data/spec/models/source_code_spec.rb +53 -0
  73. data/spec/steps/base_steps.rb +5 -0
  74. metadata +56 -12
  75. data/demos/rgb_led_anode.rb.xml +0 -83
@@ -197,4 +197,273 @@ end
197
197
  XML
198
198
  end
199
199
  end
200
+
201
+ parts = <<-EOS
202
+ require "smalruby"
203
+
204
+ init_hardware
205
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
206
+
207
+ car1.on(:start) do
208
+ motor_driver("D3").speed = 50
209
+ p(motor_driver("D3").speed)
210
+ motor_driver("D3").forward
211
+ motor_driver("D3").backward
212
+ end
213
+ car1.motor_driver("D3").speed = 50
214
+ p(car1.motor_driver("D3").speed)
215
+ car1.motor_driver("D3").stop
216
+ EOS
217
+ describe compact_source_code(parts) do
218
+ _parts = parts
219
+ let(:data) { _parts }
220
+
221
+ it '結果が正しいこと' do
222
+ should eq_block_xml(<<-XML)
223
+ <character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
224
+ <block type="hardware_init_hardware" />
225
+ <block type="character_new">
226
+ <field name="NAME">car1</field>
227
+ <statement name="DO">
228
+ <block type="events_on_start">
229
+ <statement name="DO">
230
+ <block type="hardware_motor_driver_set_speed" inline="true">
231
+ <field name="PIN">D3</field>
232
+ <value name="SPEED">
233
+ <block type="math_number">
234
+ <field name="NUM">50</field>
235
+ </block>
236
+ </value>
237
+ <next>
238
+ <block type="ruby_p" inline="true">
239
+ <value name="ARG">
240
+ <block type="hardware_motor_driver_speed">
241
+ <field name="PIN">D3</field>
242
+ </block>
243
+ </value>
244
+ <next>
245
+ <block type="hardware_motor_driver">
246
+ <field name="PIN">D3</field>
247
+ <field name="METHOD">forward</field>
248
+ <next>
249
+ <block type="hardware_motor_driver">
250
+ <field name="PIN">D3</field>
251
+ <field name="METHOD">backward</field>
252
+ </block>
253
+ </next>
254
+ </block>
255
+ </next>
256
+ </block>
257
+ </next>
258
+ </block>
259
+ </statement>
260
+ <next>
261
+ <block type="hardware_motor_driver_set_speed" inline="true">
262
+ <field name="PIN">D3</field>
263
+ <value name="SPEED">
264
+ <block type="math_number">
265
+ <field name="NUM">50</field>
266
+ </block>
267
+ </value>
268
+ <next>
269
+ <block type="ruby_p" inline="true">
270
+ <value name="ARG">
271
+ <block type="hardware_motor_driver_speed">
272
+ <field name="PIN">D3</field>
273
+ </block>
274
+ </value>
275
+ <next>
276
+ <block type="hardware_motor_driver">
277
+ <field name="PIN">D3</field>
278
+ <field name="METHOD">stop</field>
279
+ </block>
280
+ </next>
281
+ </block>
282
+ </next>
283
+ </block>
284
+ </next>
285
+ </block>
286
+ </statement>
287
+ </block>
288
+ XML
289
+ end
290
+ end
291
+
292
+ parts = <<-EOS
293
+ require "smalruby"
294
+
295
+ init_hardware
296
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
297
+
298
+ car1.on(:start) do
299
+ two_wheel_drive_car("D5").left_speed = 50
300
+ p(two_wheel_drive_car("D5").left_speed)
301
+ two_wheel_drive_car("D5").forward
302
+ two_wheel_drive_car("D5").backward
303
+ end
304
+ car1.two_wheel_drive_car("D5").right_speed = 50
305
+ p(car1.two_wheel_drive_car("D5").right_speed)
306
+ car1.two_wheel_drive_car("D5").stop
307
+ EOS
308
+ describe compact_source_code(parts) do
309
+ _parts = parts
310
+ let(:data) { _parts }
311
+
312
+ it '結果が正しいこと' do
313
+ should eq_block_xml(<<-XML)
314
+ <character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
315
+ <block type="hardware_init_hardware" />
316
+ <block type="character_new">
317
+ <field name="NAME">car1</field>
318
+ <statement name="DO">
319
+ <block type="events_on_start">
320
+ <statement name="DO">
321
+ <block type="hardware_two_wheel_drive_car_set_speed" inline="true">
322
+ <field name="PIN">D5</field>
323
+ <field name="LOR">left</field>
324
+ <value name="SPEED">
325
+ <block type="math_number">
326
+ <field name="NUM">50</field>
327
+ </block>
328
+ </value>
329
+ <next>
330
+ <block type="ruby_p" inline="true">
331
+ <value name="ARG">
332
+ <block type="hardware_two_wheel_drive_car_speed">
333
+ <field name="PIN">D5</field>
334
+ <field name="LOR">left</field>
335
+ </block>
336
+ </value>
337
+ <next>
338
+ <block type="hardware_two_wheel_drive_car_forward">
339
+ <field name="PIN">D5</field>
340
+ <next>
341
+ <block type="hardware_two_wheel_drive_car_backward">
342
+ <field name="PIN">D5</field>
343
+ </block>
344
+ </next>
345
+ </block>
346
+ </next>
347
+ </block>
348
+ </next>
349
+ </block>
350
+ </statement>
351
+ <next>
352
+ <block type="hardware_two_wheel_drive_car_set_speed" inline="true">
353
+ <field name="PIN">D5</field>
354
+ <field name="LOR">right</field>
355
+ <value name="SPEED">
356
+ <block type="math_number">
357
+ <field name="NUM">50</field>
358
+ </block>
359
+ </value>
360
+ <next>
361
+ <block type="ruby_p" inline="true">
362
+ <value name="ARG">
363
+ <block type="hardware_two_wheel_drive_car_speed">
364
+ <field name="PIN">D5</field>
365
+ <field name="LOR">right</field>
366
+ </block>
367
+ </value>
368
+ <next>
369
+ <block type="hardware_two_wheel_drive_car_stop">
370
+ <field name="PIN">D5</field>
371
+ </block>
372
+ </next>
373
+ </block>
374
+ </next>
375
+ </block>
376
+ </next>
377
+ </block>
378
+ </statement>
379
+ </block>
380
+ XML
381
+ end
382
+ end
383
+
384
+ parts = <<-EOS
385
+ require "smalruby"
386
+
387
+ init_hardware
388
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
389
+
390
+ car1.on(:button_down, "D3") do
391
+ p(button("D3").up?)
392
+ p(button("D3").down?)
393
+ button("D3").not_use_pullup
394
+ end
395
+ p(car1.button("D3").up?)
396
+ p(car1.button("D3").down?)
397
+ car1.button("D3").not_use_pullup
398
+ EOS
399
+ describe compact_source_code(parts) do
400
+ _parts = parts
401
+ let(:data) { _parts }
402
+
403
+ it '結果が正しいこと' do
404
+ should eq_block_xml(<<-XML)
405
+ <character name="car1" x="0" y="0" angle="0" costumes="car1.png" />
406
+ <block type="hardware_init_hardware" />
407
+ <block type="character_new">
408
+ <field name="NAME">car1</field>
409
+ <statement name="DO">
410
+ <block type="hardware_on_button_down_or_up">
411
+ <field name="PIN">D3</field>
412
+ <field name="DOU">down</field>
413
+ <statement name="DO">
414
+ <block type="ruby_p" inline="true">
415
+ <value name="ARG">
416
+ <block type="hardware_button_down_or_up">
417
+ <field name="PIN">D3</field>
418
+ <field name="DOU">up</field>
419
+ </block>
420
+ </value>
421
+ <next>
422
+ <block type="ruby_p" inline="true">
423
+ <value name="ARG">
424
+ <block type="hardware_button_down_or_up">
425
+ <field name="PIN">D3</field>
426
+ <field name="DOU">down</field>
427
+ </block>
428
+ </value>
429
+ <next>
430
+ <block type="hardware_button_not_use_pullup">
431
+ <field name="PIN">D3</field>
432
+ </block>
433
+ </next>
434
+ </block>
435
+ </next>
436
+ </block>
437
+ </statement>
438
+ <next>
439
+ <block type="ruby_p" inline="true">
440
+ <value name="ARG">
441
+ <block type="hardware_button_down_or_up">
442
+ <field name="PIN">D3</field>
443
+ <field name="DOU">up</field>
444
+ </block>
445
+ </value>
446
+ <next>
447
+ <block type="ruby_p" inline="true">
448
+ <value name="ARG">
449
+ <block type="hardware_button_down_or_up">
450
+ <field name="PIN">D3</field>
451
+ <field name="DOU">down</field>
452
+ </block>
453
+ </value>
454
+ <next>
455
+ <block type="hardware_button_not_use_pullup">
456
+ <field name="PIN">D3</field>
457
+ </block>
458
+ </next>
459
+ </block>
460
+ </next>
461
+ </block>
462
+ </next>
463
+ </block>
464
+ </statement>
465
+ </block>
466
+ XML
467
+ end
468
+ end
200
469
  end
@@ -276,7 +276,7 @@ car1.point_towards(car1)
276
276
  <next>
277
277
  <block type="control_if" inline="true">
278
278
  <value name="COND">
279
- <block type="motion_reach_wall" />
279
+ <block type="sensing_reach_wall" />
280
280
  </value>
281
281
  <statement name="THEN">
282
282
  <block type="motion_turn" />
@@ -4,7 +4,7 @@ require_relative 'shared/block_examples'
4
4
 
5
5
  # rubocop:disable EmptyLines, LineLength
6
6
 
7
- describe RubyToBlock::Block::MotionReachWall, to_blocks: true do
7
+ describe RubyToBlock::Block::SensingReachWall, to_blocks: true do
8
8
  parts = <<-EOS
9
9
  if reach_wall?
10
10
 
@@ -18,7 +18,7 @@ end
18
18
  should eq_block_xml(<<-XML)
19
19
  <block type="control_if" inline="true">
20
20
  <value name="COND">
21
- <block type="motion_reach_wall" />
21
+ <block type="sensing_reach_wall" />
22
22
  </value>
23
23
  </block>
24
24
  XML
@@ -0,0 +1,39 @@
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::Text, to_blocks: true do
8
+ parts = <<-EOS
9
+ require "smalruby"
10
+
11
+ p("こんにちは")
12
+ p("\\"\\"")
13
+ EOS
14
+ describe compact_source_code(parts) do
15
+ _parts = parts
16
+ let(:data) { _parts }
17
+
18
+ it '結果が正しいこと' do
19
+ should eq_block_xml(<<-XML)
20
+ <block type="ruby_p" inline="true">
21
+ <value name="ARG">
22
+ <block type="text">
23
+ <field name="TEXT">こんにちは</field>
24
+ </block>
25
+ </value>
26
+ <next>
27
+ <block type="ruby_p" inline="true">
28
+ <value name="ARG">
29
+ <block type="text">
30
+ <field name="TEXT">&quot;&quot;</field>
31
+ </block>
32
+ </value>
33
+ </block>
34
+ </next>
35
+ </block>
36
+ XML
37
+ end
38
+ end
39
+ end
@@ -102,7 +102,7 @@ end
102
102
  <next>
103
103
  <block type="control_if" inline="true">
104
104
  <value name="COND">
105
- <block type="motion_reach_wall" />
105
+ <block type="sensing_reach_wall" />
106
106
  </value>
107
107
  <statement name="THEN">
108
108
  <block type="motion_turn" />
@@ -305,7 +305,7 @@ end
305
305
  <next>
306
306
  <block type="control_if" inline="true">
307
307
  <value name="COND">
308
- <block type="motion_reach_wall" />
308
+ <block type="sensing_reach_wall" />
309
309
  </value>
310
310
  <statement name="THEN">
311
311
  <block type="motion_turn" />
@@ -75,4 +75,57 @@ describe SourceCode, 'Rubyのソースコードを表現するモデル' do
75
75
 
76
76
  it { should eq(Digest::SHA256.hexdigest(data)) }
77
77
  end
78
+
79
+ describe '#summary', 'プログラムの概要を取得する' do
80
+ describe 'XML形式'do
81
+ let(:xml_path) { rb_path + '.xml' }
82
+ let(:data) { Rails.root.join(xml_path).read }
83
+ let(:source_code) {
84
+ SourceCode.new(filename: File.basename(xml_path), data: data)
85
+ }
86
+
87
+ subject { source_code.summary }
88
+
89
+ {
90
+ car_chase: {
91
+ title: '車のおいかけっこ',
92
+ filename: 'car_chase.rb',
93
+ imageUrl: '/smalruby/assets/car2.png',
94
+ },
95
+ star: {
96
+ title: 'クリックスターだにゃ~',
97
+ filename: 'star.rb',
98
+ imageUrl: '/smalruby/assets/cat1.png',
99
+ },
100
+ pong: {
101
+ title: 'ピンポンゲーム',
102
+ filename: 'pong.rb',
103
+ imageUrl: '/smalruby/assets/cat2.png',
104
+ },
105
+ hardware_led: {
106
+ title: 'ライトをぴかっとさせるでよ',
107
+ filename: 'hardware_led.rb',
108
+ imageUrl: '/smalruby/assets/frog1.png',
109
+ },
110
+ adjust_2wd_car: {
111
+ title: '2WD車の左右のモーターを調整する',
112
+ filename: 'adjust_2wd_car.rb',
113
+ imageUrl: '/smalruby/assets/car2.png',
114
+ },
115
+ }.each do |name, summary|
116
+ _rb_path = "demos/#{name}.rb"
117
+ context "'#{_rb_path + '.xml'}'" do
118
+ let(:rb_path) { _rb_path }
119
+
120
+ summary.each do |key, value|
121
+ describe key do
122
+ subject { super()[key] }
123
+
124
+ it { should eq(value) }
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
78
131
  end
@@ -254,6 +254,11 @@ step 'ホームディレクトリの :filename の内容が :program である
254
254
  expect(path.read).to eq(program)
255
255
  end
256
256
 
257
+ step 'ホームディレクトリの :filename が次の内容であること:' do |filename, program|
258
+ path = Pathname("~/#{filename}").expand_path
259
+ expect(path.read).to eq(program)
260
+ end
261
+
257
262
  step ':directory ディレクトリに :program という内容の :filename が存在する' do
258
263
  |directory, program, filename|
259
264
  File.open(Pathname("#{directory}/#{filename}").expand_path, 'w') do |f|