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
@@ -10,11 +10,11 @@
10
10
  | car2 | car2.png | 0 | 0 | 0 |
11
11
 
12
12
  もし 次のブロックを配置する:
13
- """
14
- %block{:type => "sensing_hit", :x => "0", :y => "0"}
15
- %field{:name => "CHAR"}<
16
- car2
17
- """
13
+ """
14
+ %block{:type => "sensing_hit", :x => "0", :y => "0"}
15
+ %field{:name => "CHAR"}<
16
+ car2
17
+ """
18
18
  かつ ブロックからソースコードを生成する
19
19
 
20
20
  ならば テキストエディタのプログラムは "" であること
@@ -27,22 +27,22 @@
27
27
  | car2 | car2.png | 0 | 0 | 0 |
28
28
 
29
29
  もし 次のブロックを配置する:
30
- """
31
- %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
32
- %value{:name => "ARG"}
33
- %block{:type => "sensing_hit", :x => "0", :y => "0"}
34
- %field{:name => "CHAR"}<
35
- car2
36
- """
30
+ """
31
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
32
+ %value{:name => "ARG"}
33
+ %block{:type => "sensing_hit", :x => "0", :y => "0"}
34
+ %field{:name => "CHAR"}<
35
+ car2
36
+ """
37
37
  かつ ブロックからソースコードを生成する
38
38
 
39
39
  ならば テキストエディタのプログラムは以下であること:
40
- """
41
- require "smalruby"
40
+ """
41
+ require "smalruby"
42
42
 
43
- p("")
43
+ p("")
44
44
 
45
- """
45
+ """
46
46
 
47
47
  シナリオ: キャラクターと文とブロックを配置する
48
48
  前提 "ブロック" タブを表示する
@@ -52,27 +52,32 @@
52
52
  | car2 | car2.png | 0 | 0 | 0 |
53
53
 
54
54
  もし 次のブロックを配置する:
55
- """
56
- %block{:type => "character_new", :x => "21", :y => "15"}
57
- %field{:name => "NAME"}<
58
- car1
59
- %statement{:name => "DO"}
60
- %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
61
- %value{:name => "ARG"}
62
- %block{:type => "sensing_hit", :x => "0", :y => "0"}
63
- %field{:name => "CHAR"}<
64
- car2
65
- """
55
+ """
56
+ %block{:type => "character_new", :x => "21", :y => "15"}
57
+ %field{:name => "NAME"}<
58
+ car1
59
+ %statement{:name => "DO"}
60
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
61
+ %value{:name => "ARG"}
62
+ %block{:type => "sensing_hit", :x => "0", :y => "0"}
63
+ %field{:name => "CHAR"}<
64
+ car2
65
+ %next
66
+ %block{:type => "character_new", :x => "21", :y => "15"}
67
+ %field{:name => "NAME"}<
68
+ car2
69
+ """
66
70
  かつ ブロックからソースコードを生成する
67
71
 
68
72
  ならば テキストエディタのプログラムは以下であること:
69
- """
70
- require "smalruby"
73
+ """
74
+ require "smalruby"
71
75
 
72
- car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
73
- p(car1.hit?(car2))
76
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
77
+ car2 = Character.new(costume: "car2.png", x: 0, y: 0, angle: 0)
78
+ p(car1.hit?(car2))
74
79
 
75
- """
80
+ """
76
81
 
77
82
  シナリオ: キャラクターとイベントと文とブロックを配置する
78
83
  前提 "ブロック" タブを表示する
@@ -82,29 +87,70 @@
82
87
  | car2 | car2.png | 0 | 0 | 0 |
83
88
 
84
89
  もし 次のブロックを配置する:
85
- """
86
- %block{:type => "character_new", :x => "21", :y => "15"}
87
- %field{:name => "NAME"}<
88
- car1
89
- %statement{:name => "DO"}
90
- %block{:type => "events_on_start"}
91
- %statement{:name => "DO"}
92
- %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
93
- %value{:name => "ARG"}
94
- %block{:type => "sensing_hit", :x => "0", :y => "0"}
95
- %field{:name => "CHAR"}<
96
- car2
97
- """
90
+ """
91
+ %block{:type => "character_new", :x => "21", :y => "15"}
92
+ %field{:name => "NAME"}<
93
+ car1
94
+ %statement{:name => "DO"}
95
+ %block{:type => "events_on_start"}
96
+ %statement{:name => "DO"}
97
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
98
+ %value{:name => "ARG"}
99
+ %block{:type => "sensing_hit", :x => "0", :y => "0"}
100
+ %field{:name => "CHAR"}<
101
+ car2
102
+ %next
103
+ %block{:type => "character_new", :x => "21", :y => "15"}
104
+ %field{:name => "NAME"}<
105
+ car2
106
+ """
98
107
  かつ ブロックからソースコードを生成する
99
108
 
100
109
  ならば テキストエディタのプログラムは以下であること:
101
- """
102
- require "smalruby"
110
+ """
111
+ require "smalruby"
103
112
 
104
- car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
113
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
114
+ car2 = Character.new(costume: "car2.png", x: 0, y: 0, angle: 0)
105
115
 
106
- car1.on(:start) do
107
- p(hit?(car2))
108
- end
116
+ car1.on(:start) do
117
+ p(hit?(car2))
118
+ end
109
119
 
110
- """
120
+ """
121
+
122
+ シナリオ: 配置していないキャラクターは常に偽にする
123
+ 前提 "ブロック" タブを表示する
124
+ かつ 次のキャラクターを追加する:
125
+ | name | costumes | x | y | angle |
126
+ | car1 | car1.png | 0 | 0 | 0 |
127
+ | car2 | car2.png | 0 | 0 | 0 |
128
+
129
+ もし 次のブロックを配置する:
130
+ """
131
+ %block{:type => "character_new", :x => "21", :y => "15"}
132
+ %field{:name => "NAME"}<
133
+ car1
134
+ %statement{:name => "DO"}
135
+ %block{:type => "events_on_start"}
136
+ %statement{:name => "DO"}
137
+ %block{:type => "ruby_p", :x => "0", :y => "0", :inline => "true" }
138
+ %value{:name => "ARG"}
139
+ %block{:type => "sensing_hit", :x => "0", :y => "0"}
140
+ %field{:name => "CHAR"}<
141
+ car2
142
+ """
143
+ かつ ブロックからソースコードを生成する
144
+
145
+ ならば テキストエディタのプログラムは以下であること:
146
+ """
147
+ require "smalruby"
148
+
149
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
150
+ car2 = Character.new(costume: "car2.png", x: 0, y: 0, angle: 0)
151
+
152
+ car1.on(:start) do
153
+ p(hit?(car2))
154
+ end
155
+
156
+ """
@@ -0,0 +1,98 @@
1
+ # encoding: utf-8
2
+ # language: ja
3
+ @javascript
4
+ 機能: sensing_reach_wall - 「条件:端に触れた」ブロック
5
+ シナリオ: ブロックのみ配置する
6
+ 前提 "ブロック" タブを表示する
7
+
8
+ もし 次のブロックを配置する:
9
+ """
10
+ %block{:type => "sensing_reach_wall", :x => "0", :y => "0"}
11
+ """
12
+ かつ ブロックからソースコードを生成する
13
+
14
+ ならば テキストエディタのプログラムは "" であること
15
+
16
+ シナリオ: 条件分岐とブロックを配置する
17
+ 前提 "ブロック" タブを表示する
18
+
19
+ もし 次のブロックを配置する:
20
+ """
21
+ %block{:type => "control_if", :x => "0", :y => "0", :inline => "true"}
22
+ %value{:name => "COND"}
23
+ %block{:type => "sensing_reach_wall"}
24
+ """
25
+ かつ ブロックからソースコードを生成する
26
+
27
+ ならば テキストエディタのプログラムは以下であること:
28
+ """
29
+ require "smalruby"
30
+
31
+ if false
32
+
33
+ end
34
+
35
+ """
36
+
37
+ シナリオ: キャラクターと条件分岐とブロックを配置する
38
+ 前提 "ブロック" タブを表示する
39
+ かつ 次のキャラクターを追加する:
40
+ | name | costumes | x | y | angle |
41
+ | car1 | car1.png | 0 | 0 | 0 |
42
+
43
+ もし 次のブロックを配置する:
44
+ """
45
+ %block{:type => "character_new", :x => "21", :y => "15"}
46
+ %field{:name => "NAME"}<
47
+ car1
48
+ %statement{:name => "DO"}
49
+ %block{:type => "control_if", :x => "0", :y => "0", :inline => "true"}
50
+ %value{:name => "COND"}
51
+ %block{:type => "sensing_reach_wall"}
52
+ """
53
+ かつ ブロックからソースコードを生成する
54
+
55
+ ならば テキストエディタのプログラムは以下であること:
56
+ """
57
+ require "smalruby"
58
+
59
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
60
+ if car1.reach_wall?
61
+
62
+ end
63
+
64
+ """
65
+
66
+ シナリオ: キャラクターとイベントと条件分岐とブロックを配置する
67
+ 前提 "ブロック" タブを表示する
68
+ かつ 次のキャラクターを追加する:
69
+ | name | costumes | x | y | angle |
70
+ | car1 | car1.png | 0 | 0 | 0 |
71
+
72
+ もし 次のブロックを配置する:
73
+ """
74
+ %block{:type => "character_new", :x => "21", :y => "15"}
75
+ %field{:name => "NAME"}<
76
+ car1
77
+ %statement{:name => "DO"}
78
+ %block{:type => "events_on_start"}
79
+ %statement{:name => "DO"}
80
+ %block{:type => "control_if", :x => "0", :y => "0", :inline => "true"}
81
+ %value{:name => "COND"}
82
+ %block{:type => "sensing_reach_wall"}
83
+ """
84
+ かつ ブロックからソースコードを生成する
85
+
86
+ ならば テキストエディタのプログラムは以下であること:
87
+ """
88
+ require "smalruby"
89
+
90
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
91
+
92
+ car1.on(:start) do
93
+ if reach_wall?
94
+
95
+ end
96
+ end
97
+
98
+ """
@@ -12,7 +12,9 @@
12
12
  require "smalruby"
13
13
 
14
14
  car1 = Character.new(costume: "car2.png", x: 0, y: 0, angle: 0)
15
- car2 = Character.new(costume: "car3.png", x: 0, y: 415, angle: 0)
15
+ car2 = Character.new(costume: "car4.png", x: 0, y: 415, angle: 0)
16
+ # 車のおいかけっこ
17
+
16
18
  # 逃げる車
17
19
 
18
20
  car1.on(:start) do
@@ -43,3 +43,54 @@
43
43
  ならば 確認メッセージ "前に01.rbという名前でセーブしているけど本当にセーブしますか?\nセーブすると前に作成したプログラムは消えてしまうよ!" を表示すること
44
44
  かつ "メッセージ" に "セーブをキャンセルしました" を含むこと
45
45
  かつ ホームディレクトリの "01.rb" の内容が "puts 'Hello, World!'" であること
46
+
47
+ シナリオテンプレート: ブロックモードでセーブボタンを押してローカルマシンにプログラムを保存できる
48
+ 前提 "ブロック" タブを表示する
49
+ かつ 次のキャラクターを追加する:
50
+ | name | costumes | x | y | angle |
51
+ | car1 | car4.png | 300 | 200 | 90 |
52
+ かつ 次のブロックを配置する:
53
+ """
54
+ %block{:type => "character_new", :x => "0", :y => "0"}
55
+ %field{:name => "NAME"}<
56
+ car1
57
+ %statement{:name => "DO"}
58
+ %block{:type => "motion_move", :x => "0", :y => "0"}
59
+ %value{:name => "STEP"}
60
+ %block{:type => "math_number"}
61
+ %field{:name => "NUM"}<
62
+ 10
63
+ """
64
+ かつ プログラムの名前に "<プログラムの名前>" を指定する
65
+
66
+ もし サブメニューの "セーブボタン" をクリックする
67
+ かつ JavaScriptによるリクエストが終わるまで待つ
68
+
69
+ ならば "メッセージ" に "セーブしました" を含むこと
70
+ かつ ホームディレクトリに "<保存したファイルの名前>" が存在すること
71
+ かつ ホームディレクトリの "<保存したファイルの名前>" が次の内容であること:
72
+ """
73
+ <xml>
74
+ <character x="300" y="200" name="car1" costumes="car4.png" angle="90"></character>
75
+ <block type="character_new" x="0" y="0">
76
+ <field name="NAME">car1</field>
77
+ <statement name="DO">
78
+ <block type="motion_move" inline="true">
79
+ <value name="STEP">
80
+ <block type="math_number">
81
+ <field name="NUM">10</field>
82
+ </block>
83
+ </value>
84
+ </block>
85
+ </statement>
86
+ </block>
87
+ </xml>
88
+ """
89
+
90
+ 例:
91
+ | プログラムの名前 | 保存したファイルの名前 |
92
+ | 01.rb | 01.rb.xml |
93
+ | 01.xml | 01.rb.xml |
94
+ | 01.rb.xml | 01.rb.xml |
95
+ | 01 | 01.rb.xml |
96
+
@@ -47,6 +47,26 @@ describe EditorHelper do
47
47
  end
48
48
  end
49
49
 
50
+ describe '#toolbox_pin_field' do
51
+ subject { toolbox_pin_field(value, name) }
52
+
53
+ let(:name) { 'PIN' }
54
+ let(:value) { 'D5' }
55
+
56
+ it { should be_html_safe }
57
+ it { should include(%(<field name="#{h name}">#{h value}</field>)) }
58
+
59
+ context '名前にタグを含む場合', name_include_html: true do
60
+ it { should include(%(<field name="#{h name}">#{h value}</field>)) }
61
+ end
62
+
63
+ context '名前を省略した場合' do
64
+ subject { toolbox_pin_field(value) }
65
+
66
+ it { should include(%(<field name="PIN">#{h value}</field>)) }
67
+ end
68
+ end
69
+
50
70
  describe '#toolbox_number_value' do
51
71
  subject { toolbox_number_value(name, value) }
52
72
 
@@ -0,0 +1,40 @@
1
+ describe 'Smalruby.SourceCode', ->
2
+ klass = Smalruby.SourceCode
3
+ self = null
4
+
5
+ describe '#getRbxmlFilename', ->
6
+ describe 'filenameが01.rbのとき', ->
7
+ beforeEach ->
8
+ self = new klass
9
+ filename: '01.rb'
10
+ data: 'puts "Hello, World!"'
11
+
12
+ it '01.rb.xmlを返すこと', ->
13
+ expect(self.getRbxmlFilename()).to.equal('01.rb.xml')
14
+
15
+ describe 'filenameが01のとき', ->
16
+ beforeEach ->
17
+ self = new klass
18
+ filename: '01'
19
+ data: 'puts "Hello, World!"'
20
+
21
+ it '01.rb.xmlを返すこと', ->
22
+ expect(self.getRbxmlFilename()).to.equal('01.rb.xml')
23
+
24
+ describe 'filenameが01.xmlのとき', ->
25
+ beforeEach ->
26
+ self = new klass
27
+ filename: '01.xml'
28
+ data: 'puts "Hello, World!"'
29
+
30
+ it '01.rb.xmlを返すこと', ->
31
+ expect(self.getRbxmlFilename()).to.equal('01.rb.xml')
32
+
33
+ describe 'filenameが01.rb.xmlのとき', ->
34
+ beforeEach ->
35
+ self = new klass
36
+ filename: '01.rb.xml'
37
+ data: 'puts "Hello, World!"'
38
+
39
+ it '01.rb.xmlを返すこと', ->
40
+ expect(self.getRbxmlFilename()).to.equal('01.rb.xml')