smalruby-editor 0.2.1 → 0.2.2

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/LEGAL +4 -3
  3. data/app/assets/javascripts/blocks/character.js.coffee.erb +7 -3
  4. data/app/assets/javascripts/blocks/events.js.coffee.erb +7 -10
  5. data/app/assets/javascripts/blocks/hardware.js.coffee.erb +119 -31
  6. data/app/assets/javascripts/blocks/motion.js.coffee.erb +16 -20
  7. data/app/assets/javascripts/blocks/operators.js.coffee.erb +1 -1
  8. data/app/assets/javascripts/blocks/pen.js.coffee.erb +2 -1
  9. data/app/assets/javascripts/blocks/ruby.js.coffee.erb +3 -3
  10. data/app/assets/javascripts/blocks/sensing.js.coffee.erb +8 -8
  11. data/app/assets/javascripts/blocks/sound.js.coffee.erb +3 -1
  12. data/app/assets/javascripts/fix_blockly.js.erb +105 -0
  13. data/app/assets/javascripts/generators/ruby.js.coffee.erb +3 -0
  14. data/app/assets/javascripts/msg/en_us.js +67 -17
  15. data/app/assets/javascripts/msg/ja.js +151 -95
  16. data/app/assets/javascripts/{smalruby.js.coffee → smalruby.js.coffee.erb} +35 -16
  17. data/app/assets/javascripts/views/character_selector_view.js.coffee +2 -2
  18. data/app/assets/javascripts/views/{load_modal_view.js.coffee → load_modal_view.js.coffee.erb} +8 -2
  19. data/app/assets/javascripts/views/main_menu_view.js.coffee.erb +33 -48
  20. data/app/assets/javascripts/views/signin_modal_view.js.coffee.erb +43 -0
  21. data/app/assets/stylesheets/application.css +3 -1
  22. data/app/assets/stylesheets/toolbox.css.scss.erb +2 -56
  23. data/app/assets/stylesheets/toolbox_default.css.scss.erb +34 -0
  24. data/app/assets/stylesheets/toolbox_smalrubot_s1.css.scss.erb +31 -0
  25. data/app/assets/stylesheets/toolbox_smalrubot_v3.css.scss.erb +32 -0
  26. data/app/controllers/application_controller.rb +5 -0
  27. data/app/controllers/source_codes_controller.rb +6 -3
  28. data/app/helpers/application_helper.rb +12 -0
  29. data/app/helpers/editor_helper.rb +25 -0
  30. data/app/models/concerns/ruby_to_block/block/hardware_smalrubot_s1_action.rb +13 -0
  31. data/app/models/concerns/ruby_to_block/block/hardware_smalrubot_s1_action_with_sec.rb +14 -0
  32. data/app/models/concerns/ruby_to_block/block/hardware_smalrubot_s1_ir_photoreflector_value.rb +29 -0
  33. data/app/models/concerns/ruby_to_block/block/hardware_smalrubot_s1_led_turn_on_or_off.rb +22 -0
  34. data/app/views/editor/_block_tab.html.haml +7 -6
  35. data/app/views/editor/_reset_modal.html.haml +4 -4
  36. data/app/views/editor/_signin_modal.html.haml +8 -9
  37. data/app/views/editor/_toolbox_default.html.haml +504 -0
  38. data/app/views/editor/_toolbox_smalrubot_s1.html.haml +171 -0
  39. data/app/views/editor/_toolbox_smalrubot_v3.html.haml +177 -0
  40. data/app/views/editor/index.html.haml +12 -2
  41. data/app/views/layouts/application.html.erb +1 -0
  42. data/config/environments/production.rb +1 -0
  43. data/config/locales/en.yml +19 -16
  44. data/config/locales/ja.yml +28 -25
  45. data/demos/hardware_led.rb.xml +79 -79
  46. data/lib/smalruby_editor.rb +58 -0
  47. data/lib/smalruby_editor/config.rb +22 -0
  48. data/lib/smalruby_editor/version.rb +1 -1
  49. data/public/blockly/media/anon.jpeg +0 -0
  50. data/public/blockly/media/handclosed.cur +0 -0
  51. data/public/blockly/media/handdelete.cur +0 -0
  52. data/public/blockly/media/progress.gif +0 -0
  53. data/public/blockly/media/sprites.png +0 -0
  54. data/smalruby-editor.gemspec +2 -1
  55. data/spec/acceptance/base.feature +3 -3
  56. data/spec/acceptance/block_mode/blocks/hardware/smalrubot_s1_action.feature +107 -0
  57. data/spec/acceptance/block_mode/blocks/hardware/smalrubot_s1_action_with_sec.feature +151 -0
  58. data/spec/acceptance/block_mode/blocks/hardware/smalrubot_s1_ir_photoreflector_value.feature +100 -0
  59. data/spec/acceptance/block_mode/blocks/hardware/smalrubot_s1_led_turn_on_or_off.feature +73 -0
  60. data/spec/acceptance/ruby_mode/translate.feature +6 -6
  61. data/spec/acceptance/standalone/save.feature +3 -3
  62. data/spec/acceptance/standalone/signin.feature +1 -2
  63. data/spec/lib/smalruby_editor_spec.rb +21 -11
  64. data/spec/models/concerns/ruby_to_block/block/hardware__smalrubot_s1_spec.rb +279 -0
  65. data/vendor/assets/javascripts/blockly/blockly_compressed.js +995 -668
  66. data/vendor/assets/javascripts/blockly/blocks_compressed.js +138 -114
  67. data/vendor/assets/javascripts/blockly/msg/js/en_us.js +6 -6
  68. data/vendor/assets/javascripts/blockly/msg/js/ja.js +42 -28
  69. metadata +66 -25
  70. data/app/assets/javascripts/fix_blockly.js +0 -128
  71. data/app/assets/javascripts/views/signin_modal_view.js.coffee +0 -33
  72. data/app/views/editor/_toolbox.html.haml +0 -496
  73. data/public/blockly/media/trashbody.png +0 -0
  74. data/public/blockly/media/trashlid.png +0 -0
  75. data/public/blockly/media/tree.png +0 -0
@@ -3,6 +3,15 @@ ja:
3
3
  smalruby_editor: "スモウルビー v%{version}"
4
4
  "ok": "決めた!"
5
5
  cancel: "やめる"
6
+ reset: &reset "リセット"
7
+ login: &login "ログイン"
8
+ name: "名前"
9
+
10
+ controllers:
11
+ source_codes:
12
+ not_ruby_program: "はRubyのプログラムではありません"
13
+ not_exist: "はありません"
14
+ exist: "すでに同じ名前のプログラムがあります"
6
15
 
7
16
  editor:
8
17
  index:
@@ -13,9 +22,9 @@ ja:
13
22
  load: "ロード"
14
23
  save: "セーブ"
15
24
  check: "チェック"
16
- reset: "リセット"
25
+ reset: *reset
17
26
  logout: "ログアウト"
18
- login: "ログイン"
27
+ login: *login
19
28
 
20
29
  block_tab:
21
30
  character: "キャラクター"
@@ -24,30 +33,16 @@ ja:
24
33
  stage: "ステージ"
25
34
 
26
35
  toolbox:
27
- motion: "動き"
28
- motion_move: "移動"
29
- motion_rotate: "回転"
30
- motion_actuator: "アクチュエータ"
31
- looks: "見た目"
32
- sound: ""
33
- pen: "ペン"
34
- data: "データ"
35
- data_variables: "変数"
36
- events: "イベント(〜のとき)"
37
- control: "制御"
38
- control_loop: "繰り返し"
39
- control_wait: "待つ"
40
- control_if: "もし~なら"
41
- sensing: "調べる"
42
- sensing_general: "いろいろ"
43
- sensing_hardware: "ハードウェア"
36
+ motion: "■動き"
37
+ looks: "★見た目"
38
+ sound: "♪音"
39
+ pen: "●ペン"
40
+ data: "☼データ"
41
+ events: "♣イベント"
42
+ control: "◆制御"
43
+ sensing: "◎調べる"
44
44
  operators: "演算"
45
- operators_calculate: "計算"
46
- operators_string: "文字列"
47
- operators_condition: "条件"
48
- etc: "その他"
49
- etc_ruby: "Ruby"
50
- etc_hardware: "ハードウェア"
45
+ etc: "♠その他"
51
46
  hello: "こんにちは!"
52
47
  world: "あいうえお"
53
48
  text: "文章"
@@ -64,3 +59,11 @@ ja:
64
59
  find_program: "プログラムをさがす"
65
60
  computer: "このコンピュータ"
66
61
  remix: "リミックス"
62
+
63
+ reset_modal:
64
+ title: "本当にリセットしますか?"
65
+ message: "作成中のプログラムが消えてしまうよ!"
66
+
67
+ signin_modal:
68
+ message: "あなたの名前をいれて、<br />ほかの人のプログラムとまざらないようにしよう♪"
69
+ username_placeholder: "名前、生徒番号、ニックネームなど"
@@ -1,79 +1,79 @@
1
- <xml xmlns="http://www.w3.org/1999/xhtml">
2
- <character x="261" y="191" name="frog1" costumes="frog1.png" angle="0"></character>
3
- <block type="ruby_comment" x="42" y="-39">
4
- <field name="COMMENT">ライトをぴかっとさせるでよ</field>
5
- </block>
6
- <block type="hardware_init_hardware" x="40" y="6"></block>
7
- <block type="character_new" x="45" y="50">
8
- <field name="NAME">frog1</field>
9
- <statement name="DO">
10
- <block type="events_on_click">
11
- <statement name="DO">
12
- <block type="looks_say" inline="true">
13
- <value name="TEXT">
14
- <block type="text">
15
- <field name="TEXT">ライトをぴかっとさせるでよ♪</field>
16
- </block>
17
- </value>
18
- <next>
19
- <block type="hardware_led_on">
20
- <field name="PIN">D2</field>
21
- <next>
22
- <block type="control_sleep" inline="true">
23
- <value name="SEC">
24
- <block type="math_number">
25
- <field name="NUM">1</field>
26
- </block>
27
- </value>
28
- <next>
29
- <block type="hardware_led_off">
30
- <field name="PIN">D2</field>
31
- <next>
32
- <block type="control_sleep" inline="true">
33
- <value name="SEC">
34
- <block type="math_number">
35
- <field name="NUM">1</field>
36
- </block>
37
- </value>
38
- <next>
39
- <block type="hardware_led_on">
40
- <field name="PIN">D13</field>
41
- <next>
42
- <block type="control_sleep" inline="true">
43
- <value name="SEC">
44
- <block type="math_number">
45
- <field name="NUM">1</field>
46
- </block>
47
- </value>
48
- <next>
49
- <block type="hardware_led_off">
50
- <field name="PIN">D13</field>
51
- <next>
52
- <block type="looks_say" inline="true">
53
- <value name="TEXT">
54
- <block type="text">
55
- <field name="TEXT"></field>
56
- </block>
57
- </value>
58
- </block>
59
- </next>
60
- </block>
61
- </next>
62
- </block>
63
- </next>
64
- </block>
65
- </next>
66
- </block>
67
- </next>
68
- </block>
69
- </next>
70
- </block>
71
- </next>
72
- </block>
73
- </next>
74
- </block>
75
- </statement>
76
- </block>
77
- </statement>
78
- </block>
79
- </xml>
1
+ <xml xmlns="http://www.w3.org/1999/xhtml">
2
+ <character x="261" y="191" name="frog1" costumes="frog1.png" angle="0"></character>
3
+ <block type="ruby_comment" x="42" y="-39">
4
+ <field name="COMMENT">ライトをぴかっとさせるでよ</field>
5
+ </block>
6
+ <block type="hardware_init_hardware" x="40" y="6"></block>
7
+ <block type="character_new" x="45" y="50">
8
+ <field name="NAME">frog1</field>
9
+ <statement name="DO">
10
+ <block type="events_on_click">
11
+ <statement name="DO">
12
+ <block type="looks_say" inline="true">
13
+ <value name="TEXT">
14
+ <block type="text">
15
+ <field name="TEXT">ライトをぴかっとさせるでよ♪</field>
16
+ </block>
17
+ </value>
18
+ <next>
19
+ <block type="hardware_led_turn_on">
20
+ <field name="PIN">D2</field>
21
+ <next>
22
+ <block type="control_sleep" inline="true">
23
+ <value name="SEC">
24
+ <block type="math_number">
25
+ <field name="NUM">1</field>
26
+ </block>
27
+ </value>
28
+ <next>
29
+ <block type="hardware_led_turn_off">
30
+ <field name="PIN">D2</field>
31
+ <next>
32
+ <block type="control_sleep" inline="true">
33
+ <value name="SEC">
34
+ <block type="math_number">
35
+ <field name="NUM">1</field>
36
+ </block>
37
+ </value>
38
+ <next>
39
+ <block type="hardware_led_turn_on">
40
+ <field name="PIN">D13</field>
41
+ <next>
42
+ <block type="control_sleep" inline="true">
43
+ <value name="SEC">
44
+ <block type="math_number">
45
+ <field name="NUM">1</field>
46
+ </block>
47
+ </value>
48
+ <next>
49
+ <block type="hardware_led_turn_off">
50
+ <field name="PIN">D13</field>
51
+ <next>
52
+ <block type="looks_say" inline="true">
53
+ <value name="TEXT">
54
+ <block type="text">
55
+ <field name="TEXT"></field>
56
+ </block>
57
+ </value>
58
+ </block>
59
+ </next>
60
+ </block>
61
+ </next>
62
+ </block>
63
+ </next>
64
+ </block>
65
+ </next>
66
+ </block>
67
+ </next>
68
+ </block>
69
+ </next>
70
+ </block>
71
+ </next>
72
+ </block>
73
+ </next>
74
+ </block>
75
+ </statement>
76
+ </block>
77
+ </statement>
78
+ </block>
79
+ </xml>
@@ -18,6 +18,37 @@ module SmalrubyEditor
18
18
  sound: 300,
19
19
  }
20
20
 
21
+ # http://c4se.hatenablog.com/entry/2013/08/04/190937 をほぼコピーした
22
+ def hsv_to_rgb(h, s, v)
23
+ s /= 100.0
24
+ v /= 100.0
25
+ c = v * s
26
+ x = c * (1 - ((h / 60.0) % 2 - 1).abs)
27
+ m = v - c
28
+ r, g, b = *(
29
+ case
30
+ when h < 60 then [c, x, 0]
31
+ when h < 120 then [x, c, 0]
32
+ when h < 180 then [0, c, x]
33
+ when h < 240 then [0, x, c]
34
+ when h < 300 then [x, 0, c]
35
+ else [c, 0, x]
36
+ end
37
+ )
38
+ [r, g, b].map { |channel|
39
+ sprintf('%02x', ((channel + m) * 255).ceil)
40
+ }.join
41
+ end
42
+ module_function :hsv_to_rgb
43
+
44
+ # return smalruby's home directory
45
+ # (default is '~/.smalruby-editor').
46
+ def home_directory
47
+ path = ENV['SMALRUBY_EDITOR_HOME'] || '~/.smalruby-editor'
48
+ Pathname(path).expand_path
49
+ end
50
+ module_function :home_directory
51
+
21
52
  def create_home_directory(home_dir = nil)
22
53
  if home_dir.blank?
23
54
  path = ENV['SMALRUBY_EDITOR_HOME'] || '~/.smalruby-editor'
@@ -25,6 +56,7 @@ module SmalrubyEditor
25
56
  end
26
57
  create_under_home_directories(home_dir)
27
58
  create_database_yml(home_dir)
59
+ create_config_yml(home_dir)
28
60
  home_dir
29
61
  end
30
62
  module_function :create_home_directory
@@ -93,5 +125,31 @@ standalone:
93
125
  f.write(DATABASE_YML_TEMPLATE.gsub(/%db_path%/, db_path.to_s))
94
126
  end
95
127
  end
128
+
129
+ CONFIG_YML_TEMPLATE = <<-EOS
130
+ #toolbox_name: default
131
+ #toolbox_css_name: default
132
+ features:
133
+ - add_character_from_beginning
134
+ #- disabled_new_character
135
+ #- auto_init_hardware
136
+ #- readonly_ruby_mode
137
+ #- must_signin
138
+ #- enabled_hardware_blocks_on_default
139
+ #- enabled_2wd_car_blocks_on_default
140
+ #- enabled_smalrubot_v3_blocks_on_default
141
+ #- enabled_smalrubot_s1_blocks_on_default
142
+ EOS
143
+
144
+ def create_config_yml(home_dir)
145
+ config_yml_path = home_dir.join('config', 'config.yml')
146
+ unless config_yml_path.exist?
147
+ File.open(config_yml_path, 'w') do |f|
148
+ f.write(CONFIG_YML_TEMPLATE)
149
+ end
150
+ end
151
+ end
96
152
  end
97
153
  end
154
+
155
+ require 'smalruby_editor/config'
@@ -0,0 +1,22 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module SmalrubyEditor
4
+ class Config < Settingslogic
5
+ if Rails.env.test?
6
+ source({})
7
+ else
8
+ path = SmalrubyEditor.home_directory.join('config', 'config.yml')
9
+ if path.exist?
10
+ source(path)
11
+ else
12
+ source({})
13
+ end
14
+ end
15
+ suppress_errors(true)
16
+
17
+ def enabled?(feature)
18
+ features.try(:include?, feature)
19
+ end
20
+ module_function :enabled?
21
+ end
22
+ end
@@ -1,3 +1,3 @@
1
1
  module SmalrubyEditor
2
- VERSION = '0.2.1'
2
+ VERSION = '0.2.2'
3
3
  end
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -68,7 +68,8 @@ Gem::Specification.new do |spec|
68
68
  ['mime-types', '~> 1.16'],
69
69
  ['haml-rails'],
70
70
  ['nokogiri'],
71
- ['smalruby', '~> 0.1.2'],
71
+ ['settingslogic'],
72
+ ['smalruby', '~> 0.1.3'],
72
73
  ]
73
74
  runtime_dependencies << ['therubyracer'] unless is_windows
74
75
  runtime_dependencies.each do |args|
@@ -26,7 +26,7 @@
26
26
  ならば 次のXMLと同等のブロックが配置されていること:
27
27
  """
28
28
  <xml>
29
- <block type="ruby_statement" x="0" y="0">
29
+ <block type="ruby_statement" id="1" x="0" y="0">
30
30
  <field name="STATEMENT">stage1 = Stage.new(color: "white")</field>
31
31
  </block>
32
32
  </xml>
@@ -65,7 +65,7 @@
65
65
  ならば 次のXMLと同等のブロックが配置されていること:
66
66
  """
67
67
  <xml>
68
- <block type="ruby_statement" x="0" y="0">
68
+ <block type="ruby_statement" id="1" x="0" y="0">
69
69
  <field name="STATEMENT">stage1 = Stage.new(color: "white")</field>
70
70
  </block>
71
71
  </xml>
@@ -153,7 +153,7 @@
153
153
  ならば 次のXMLと同等のブロックが配置されていること:
154
154
  """
155
155
  <xml>
156
- <block type="ruby_statement" x="0" y="0">
156
+ <block type="ruby_statement" id="1" x="0" y="0">
157
157
  <field name="STATEMENT">stage1 = Stage.new(color: "white")</field>
158
158
  </block>
159
159
  </xml>
@@ -0,0 +1,107 @@
1
+ # encoding: utf-8
2
+ # language: en
3
+ @javascript
4
+ Feature: hardware_smalrubot_s1_action block
5
+ Background:
6
+ Given "ブロック" タブを表示する
7
+ And キャラクターcar1を追加する
8
+
9
+ Scenario: ブロックのみ配置する
10
+ When 次のブロックを配置する:
11
+ """
12
+ %block{:type => "hardware_smalrubot_s1_action", :x => "0", :y => "0"}
13
+ %field{:name => "ACTION"}<
14
+ backward
15
+ """
16
+ And ブロックからソースコードを生成する
17
+
18
+ Then テキストエディタのプログラムは "" であること
19
+
20
+ Scenario: キャラクターとブロックを配置する
21
+ When 次のブロックを配置する:
22
+ """
23
+ %block{:type => "character_new", :x => "21", :y => "15"}
24
+ %field{:name => "NAME"}<
25
+ car1
26
+ %statement{:name => "DO"}
27
+ %block{:type => "hardware_smalrubot_s1_action", :x => "0", :y => "0"}
28
+ %field{:name => "ACTION"}<
29
+ forward
30
+ %next
31
+ %block{:type => "hardware_smalrubot_s1_action", :x => "0", :y => "0"}
32
+ %field{:name => "ACTION"}<
33
+ backward
34
+ %next
35
+ %block{:type => "hardware_smalrubot_s1_action", :x => "0", :y => "0"}
36
+ %field{:name => "ACTION"}<
37
+ turn_left
38
+ %next
39
+ %block{:type => "hardware_smalrubot_s1_action", :x => "0", :y => "0"}
40
+ %field{:name => "ACTION"}<
41
+ turn_right
42
+ %next
43
+ %block{:type => "hardware_smalrubot_s1_action", :x => "0", :y => "0"}
44
+ %field{:name => "ACTION"}<
45
+ stop
46
+ """
47
+ And ブロックからソースコードを生成する
48
+
49
+ Then テキストエディタのプログラムは以下であること:
50
+ """
51
+ require "smalruby"
52
+
53
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
54
+ car1.smalrubot_s1.forward
55
+ car1.smalrubot_s1.backward
56
+ car1.smalrubot_s1.turn_left
57
+ car1.smalrubot_s1.turn_right
58
+ car1.smalrubot_s1.stop
59
+
60
+ """
61
+
62
+ Scenario: キャラクターとイベントとブロックを配置する
63
+ When 次のブロックを配置する:
64
+ """
65
+ %block{:type => "character_new", :x => "21", :y => "15"}
66
+ %field{:name => "NAME"}<
67
+ car1
68
+ %statement{:name => "DO"}
69
+ %block{:type => "events_on_start"}
70
+ %statement{:name => "DO"}
71
+ %block{:type => "hardware_smalrubot_s1_action", :x => "0", :y => "0"}
72
+ %field{:name => "ACTION"}<
73
+ forward
74
+ %next
75
+ %block{:type => "hardware_smalrubot_s1_action", :x => "0", :y => "0"}
76
+ %field{:name => "ACTION"}<
77
+ backward
78
+ %next
79
+ %block{:type => "hardware_smalrubot_s1_action", :x => "0", :y => "0"}
80
+ %field{:name => "ACTION"}<
81
+ turn_left
82
+ %next
83
+ %block{:type => "hardware_smalrubot_s1_action", :x => "0", :y => "0"}
84
+ %field{:name => "ACTION"}<
85
+ turn_right
86
+ %next
87
+ %block{:type => "hardware_smalrubot_s1_action", :x => "0", :y => "0"}
88
+ %field{:name => "ACTION"}<
89
+ stop
90
+ """
91
+ And ブロックからソースコードを生成する
92
+
93
+ Then テキストエディタのプログラムは以下であること:
94
+ """
95
+ require "smalruby"
96
+
97
+ car1 = Character.new(costume: "car1.png", x: 0, y: 0, angle: 0)
98
+
99
+ car1.on(:start) do
100
+ smalrubot_s1.forward
101
+ smalrubot_s1.backward
102
+ smalrubot_s1.turn_left
103
+ smalrubot_s1.turn_right
104
+ smalrubot_s1.stop
105
+ end
106
+
107
+ """