smalruby-editor 0.1.15-x86-mingw32 → 0.1.16-x86-mingw32

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +16 -1
  3. data/app/assets/javascripts/blocks/character.js.coffee.erb +8 -1
  4. data/app/assets/javascripts/blocks/hardware.js.coffee.erb +59 -7
  5. data/app/assets/javascripts/blocks/motion.js.coffee.erb +1 -2
  6. data/app/assets/javascripts/models/character.js.coffee +27 -0
  7. data/app/assets/javascripts/smalruby.js.coffee +4 -0
  8. data/app/assets/javascripts/views/character_modal_view.js.coffee +22 -1
  9. data/app/assets/javascripts/views/character_selector_view.js.coffee +7 -6
  10. data/app/assets/stylesheets/application.css +8 -0
  11. data/app/assets/stylesheets/editor.css.scss +15 -5
  12. data/app/controllers/application_controller.rb +4 -7
  13. data/app/models/concerns/ruby_to_block/block/character.rb +14 -6
  14. data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car.rb +1 -1
  15. data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car_commands.rb +15 -0
  16. data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car_run.rb +19 -0
  17. data/app/models/concerns/ruby_to_block/block/motion_set_x.rb +1 -24
  18. data/app/models/concerns/ruby_to_block/block/motion_set_x_y.rb +21 -0
  19. data/app/models/source_code.rb +9 -6
  20. data/app/views/editor/_block_tab.html.haml +3 -1
  21. data/app/views/editor/_character_modal.html.haml +14 -5
  22. data/app/views/editor/_toolbox.html.haml +91 -78
  23. data/bin/smalruby-editor +15 -0
  24. data/lib/smalruby_editor.rb +39 -4
  25. data/lib/smalruby_editor/version.rb +1 -1
  26. data/public/assets/{application-51ab300acd1779bfba20b099e7000b7e.css → application-7f560d8d6d224f87269691c57ca9a376.css} +23 -9
  27. data/public/assets/{application-51ab300acd1779bfba20b099e7000b7e.css.gz → application-7f560d8d6d224f87269691c57ca9a376.css.gz} +0 -0
  28. data/public/assets/{application-dc485e2270d6c5fce20c149d1e2c4f8d.js → application-842ac8f5aa3fcc87bbb0e8b3a0fef5d7.js} +148 -21
  29. data/public/assets/{application-dc485e2270d6c5fce20c149d1e2c4f8d.js.gz → application-842ac8f5aa3fcc87bbb0e8b3a0fef5d7.js.gz} +0 -0
  30. data/public/assets/manifest-332a5a1668194028b55103e0ea45c054.json +1 -1
  31. data/smalruby-editor.gemspec +1 -1
  32. data/spec/acceptance/block_mode/blocks/motion/set_x_y.feature +2 -4
  33. data/spec/lib/smalruby_editor_spec.rb +12 -0
  34. data/spec/models/concerns/ruby_to_block/block/hardware_spec.rb +90 -10
  35. data/spec/models/concerns/ruby_to_block/block/motion_spec.rb +3 -6
  36. metadata +11 -8
@@ -3,7 +3,7 @@ module RubyToBlock
3
3
  module Block
4
4
  class HardwareTwoWheelDriveCar < CharacterMethodCall
5
5
  # rubocop:disable LineLength
6
- blocknize '^\s*' + CHAR_RE + 'two_wheel_drive_car\("(D(?:[2-9]|10))"\).(forward|backward|turn_left|turn_right|stop)\s*$',
6
+ blocknize '^\s*' + CHAR_RE + 'two_wheel_drive_car\("(D(?:[2-9]|10))"\)\.(forward|backward|turn_left|turn_right|stop)\s*$',
7
7
  statement: true
8
8
  # rubocop:enable LineLength
9
9
 
@@ -0,0 +1,15 @@
1
+ # -*- coding: utf-8 -*-
2
+ module RubyToBlock
3
+ module Block
4
+ class HardwareTwoWheelDriveCarCommands < Value
5
+ blocknize '^\s*"(forward|backward|turn_left|turn_right|stop)"\s*$',
6
+ value: true, priority: 1
7
+
8
+ def self.process_match_data(md, context)
9
+ md2 = regexp.match(md[type])
10
+ context.add_value(new(fields: { COMMAND: md2[1] }))
11
+ true
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ # -*- coding: utf-8 -*-
2
+ module RubyToBlock
3
+ module Block
4
+ class HardwareTwoWheelDriveCarRun < CharacterMethodCall
5
+ # rubocop:disable LineLength
6
+ blocknize '^\s*' + CHAR_RE + 'two_wheel_drive_car\("(D(?:[2-9]|10))"\)\.run\(command:\s*("[^"]*")\s*,\s*sec:\s*(\d+)\)\s*$',
7
+ statement: true, inline: true
8
+ # rubocop:enable LineLength
9
+
10
+ def self.process_match_data(md, context)
11
+ md2 = regexp.match(md[type])
12
+ add_character_method_call_block(context, md2[1],
13
+ new(fields: { PIN: md2[2] }),
14
+ SEC: md2[4], COMMAND: md2[3])
15
+ true
16
+ end
17
+ end
18
+ end
19
+ end
@@ -7,32 +7,9 @@ module RubyToBlock
7
7
 
8
8
  def self.process_match_data(md, context)
9
9
  md2 = regexp.match(md[type])
10
- block = add_character_method_call_block(context, md2[1], new,
11
- X: md2[2])
12
-
13
- md3 = MotionSetY.regexp.match(context.look_next_line)
14
- process_motion_set_y(context, block, md3) if md3
15
-
10
+ add_character_method_call_block(context, md2[1], new, X: md2[2])
16
11
  true
17
12
  end
18
-
19
- def self.process_motion_set_y(context, block, md)
20
- if block.character == get_character(context, md[1])
21
- process_value_string(context, block, md[2], :Y)
22
- context.next_line
23
- end
24
- rescue
25
- return
26
- end
27
- private_class_method :process_motion_set_y
28
-
29
- def type
30
- if @values.key?(:Y)
31
- 'motion_set_x_y'
32
- else
33
- super
34
- end
35
- end
36
13
  end
37
14
  end
38
15
  end
@@ -0,0 +1,21 @@
1
+ # -*- coding: utf-8 -*-
2
+ module RubyToBlock
3
+ module Block
4
+ class MotionSetXY < CharacterMethodCall
5
+ blocknize '^\s*' + CHAR_RE +
6
+ 'position\s*=\s*\[\s*(\S+)\s*,\s*(\S+)\s*\]\s*$',
7
+ statement: true, inline: true
8
+
9
+ def self.process_match_data(md, context)
10
+ md2 = regexp.match(md[type])
11
+ add_character_method_call_block(context, md2[1], new,
12
+ X: md2[2], Y: md2[3])
13
+ true
14
+ end
15
+
16
+ def type
17
+ 'motion_set_x_y'
18
+ end
19
+ end
20
+ end
21
+ end
@@ -4,6 +4,7 @@ require 'tempfile'
4
4
  require 'open3'
5
5
  require 'digest/sha2'
6
6
  require 'bundler'
7
+ require 'smalruby_editor'
7
8
  silence_warnings do
8
9
  require_relative 'concerns/ruby_to_block'
9
10
  end
@@ -72,13 +73,15 @@ class SourceCode < ActiveRecord::Base
72
73
  end
73
74
 
74
75
  def ruby_cmd
75
- path = Pathname('rsdl').expand_path(RbConfig::CONFIG['bindir'])
76
- if path.exist?
77
- path
78
- else
79
- Pathname(RbConfig::CONFIG['RUBY_INSTALL_NAME'])
80
- .expand_path(RbConfig::CONFIG['bindir'])
76
+ if SmalrubyEditor.osx?
77
+ dirs = [RbConfig::CONFIG['bindir']] + ENV['PATH'].split(';')
78
+ dirs.each do |dir|
79
+ path = Pathname('rsdl').expand_path(dir)
80
+ return path if path.exist?
81
+ end
81
82
  end
83
+ Pathname(RbConfig::CONFIG['RUBY_INSTALL_NAME'])
84
+ .expand_path(RbConfig::CONFIG['bindir'])
82
85
  end
83
86
 
84
87
  def open3_capture3_ruby_c
@@ -41,7 +41,9 @@
41
41
  .attributes
42
42
  X: {{- get('x') }} Y: {{- get('y') }}
43
43
  %br
44
- 向き: {{- get('angle') }}°
44
+ 向き:
45
+ %i{class: "{{- rotationStyleIconName() }}"}
46
+ {{- get('angle') }}°
45
47
 
46
48
  %a.add-block-button
47
49
  %i.icon-folder-close-alt
@@ -21,27 +21,36 @@
21
21
  %label.control-label{:for => 'character_name'}<
22
22
  名前
23
23
  .controls
24
- %input#character_name{:name => 'character[name]', :type => 'text', :placeholder => 'car1やball1など', :class => 'input-medium'}
24
+ %input#character_name{:name => 'character[name]', :type => 'text', :placeholder => 'car1やball1など', :class => 'input-large'}
25
25
  .control-group
26
26
  %label.control-label{:for => 'character_x'}<
27
27
  X座標
28
28
  .controls
29
- %input#character_x{:name => 'character[x]', :type => 'range', :min => '0', :max => '639', :class => 'input-medium'}
29
+ %input#character_x{:name => 'character[x]', :type => 'range', :min => '0', :max => '639', :class => 'input-large'}
30
30
  %span#character_x_value{:class => 'character_value'}
31
31
  300
32
32
  .control-group
33
33
  %label.control-label{:for => 'character_y'}<
34
34
  Y座標
35
35
  .controls
36
- %input#character_y{:name => 'character[y]', :type => 'range', :min => '0', :max => '439', :class => 'input-medium'}
36
+ %input#character_y{:name => 'character[y]', :type => 'range', :min => '0', :max => '439', :class => 'input-large'}
37
37
  %span#character_y_value{:class => 'character_value'}
38
38
  200
39
39
  .control-group
40
40
  %label.control-label{:for => 'character_angle'}<
41
41
  向き
42
42
  .controls
43
- %input#character_angle{:name => 'character[angle]', :type => 'range', :min => '0', :max => '359', :class => 'input-medium'}
44
- %span#character_angle_value{:class => 'character_value'}
43
+ #character_rotation_style.btn-group
44
+ %button#character_rotation_style_free.btn{type: "button", class: "btn-small", value: "free"}<
45
+ %i.icon-repeat
46
+ %button#character_rotation_style_left_right.btn{type: "button", class: "btn-small", value: "left_right"}<
47
+ %i.icon-resize-horizontal
48
+ %button#character_rotation_style_none.btn{type: "button", class: "btn-small", value: "none"}<
49
+ %i.icon-arrow-right
50
+ %input#character_angle{:name => 'character[angle]', :type => 'range', :min => '0', :max => '359', :class => 'input-small', style: "margin-left: 4px;"}
51
+ %span#character_angle_vector{:class => 'character_value'}
52
+
53
+ %span#character_angle_value{:class => 'character_value', style: "margin-left: 4px;"}
45
54
  100°
46
55
 
47
56
  .modal-footer
@@ -341,87 +341,100 @@
341
341
  %block{:type => "#{category}_p"}
342
342
 
343
343
  - category = 'hardware'
344
- %category{:name => 'アクチュエータ'}
344
+ %category{:name => 'ハードウェア'}
345
345
  %category{:name => '準備'}
346
346
  -# ハードウェアを準備する
347
347
  %block{:type => "#{category}_init_hardware"}
348
348
 
349
- %category{:name => 'LED'}
350
- -# LED[▼ピン]をオンにする
351
- %block{:type => "#{category}_led_on"}
352
-
353
- -# LED[▼ピン]をオフにする
354
- %block{:type => "#{category}_led_off"}
355
-
356
- %category{:name => 'RGB LED'}
357
- -# RGB LED[▼アノード]コモン[▼ピン]を[カラー]にする
358
- %block{:type => "#{category}_rgb_led_on"}
359
-
360
- -# RGB LED[▼アノード]コモン[▼ピン]をオフにする
361
- %block{:type => "#{category}_rgb_led_off"}
362
-
363
- -#%category{:name => '7セグディスプレイ'}
364
- -# -# 7セグディスプレイに[▼0-9]を表示する
365
- -# %block{:type => "#{category}_seven_segment_display_show"}
366
- -#
367
- -# -# 7セグディスプレイをオフにする
368
- -# %block{:type => "#{category}_seven_segment_display_off"}
369
-
370
- -#%category{:name => 'LCD'}
371
- -# -# LCDに( )を表示する
372
- -# %block{:type => "#{category}_lcd_puts"}
373
- -# = toolbox_text_value('TEXT', 'Hello')
374
- -#
375
- -# -# LCDをクリアする
376
- -# %block{:type => "#{category}_lcd_clear"}
377
-
378
- -#%category{:name => 'サーボ'}
379
- -# -# サーボ[▼ピン]を( )度(5~180)にする
380
- -# %block{:type => "#{category}_servo_set_position"}
381
- -# = toolbox_number_value('POS', 90)
382
-
383
- %category{:name => '車'}
384
- -# 2WD車[▼ピン]を進める」ブロック
385
- %block{:type => "#{category}_two_wheel_drive_car_forward"}
386
- %field{:name => 'PIN'}<
387
- D6
388
-
389
- -# 「2WD車[▼ピン]をバックさせる」ブロック
390
- %block{:type => "#{category}_two_wheel_drive_car_backward"}
391
- %field{:name => 'PIN'}<
392
- D6
393
-
394
- -# 「2WD車[▼ピン]を左に曲げる」ブロック
395
- %block{:type => "#{category}_two_wheel_drive_car_turn_left"}
396
- %field{:name => 'PIN'}<
397
- D6
398
-
399
- -# 「2WD車[▼ピン]を右に曲げる」ブロック
400
- %block{:type => "#{category}_two_wheel_drive_car_turn_right"}
401
- %field{:name => 'PIN'}<
402
- D6
403
-
404
- -# 「2WD車[▼ピン]を止める」ブロック
405
- %block{:type => "#{category}_two_wheel_drive_car_stop"}
406
- %field{:name => 'PIN'}<
407
- D6
349
+ %category{:name => 'アクチュエータ'}
350
+ %category{:name => 'LED'}
351
+ -# LED[▼ピン]をオンにする
352
+ %block{:type => "#{category}_led_on"}
353
+
354
+ -# LED[▼ピン]をオフにする
355
+ %block{:type => "#{category}_led_off"}
356
+
357
+ -# RGB LED[▼アノード]コモン[▼ピン]を[カラー]にする
358
+ -#%block{:type => "#{category}_rgb_led_on"}
359
+
360
+ -# RGB LED[▼アノード]コモン[▼ピン]をオフにする
361
+ -#%block{:type => "#{category}_rgb_led_off"}
362
+
363
+ -# 7セグディスプレイに[▼0-9]を表示する
364
+ -#%block{:type => "#{category}_seven_segment_display_show"}
365
+
366
+ -# 7セグディスプレイをオフにする
367
+ -#%block{:type => "#{category}_seven_segment_display_off"}
368
+
369
+ -#%category{:name => 'LCD'}
370
+ -# LCDに( )を表示する
371
+ %block{:type => "#{category}_lcd_puts"}
372
+ = toolbox_text_value('TEXT', 'Hello')
373
+
374
+ -# LCDをクリアする
375
+ %block{:type => "#{category}_lcd_clear"}
376
+
377
+ -#%category{:name => 'サーボ'}
378
+ -# サーボ[▼ピン]を( )度(5~180)にする
379
+ %block{:type => "#{category}_servo_set_position"}
380
+ = toolbox_number_value('POS', 90)
381
+
382
+ - subcategory = 'two_wheel_drive_car'
383
+ %category{:name => '車'}
384
+ -# 2WD車[▼ピン]を( )秒[▼コマンド]
385
+ %block{:type => "#{category}_#{subcategory}_run"}
386
+ %field{:name => 'PIN'}<
387
+ D6
388
+ = toolbox_number_value('SEC', 1)
389
+ %value{:name => 'COMMAND'}
390
+ %block{:type => "#{category}_#{subcategory}_commands"}
391
+
392
+ -# [▼コマンド]
393
+ %block{:type => "#{category}_#{subcategory}_commands"}
394
+ %field{:name => 'COMMAND'}<
395
+ forward
396
+
397
+ -# 2WD車[▼ピン]を進める
398
+ %block{:type => "#{category}_#{subcategory}_forward"}
399
+ %field{:name => 'PIN'}<
400
+ D6
401
+
402
+ -# 2WD車[▼ピン]をバックさせる
403
+ %block{:type => "#{category}_#{subcategory}_backward"}
404
+ %field{:name => 'PIN'}<
405
+ D6
406
+
407
+ -# 2WD車[▼ピン]を左に曲げる
408
+ %block{:type => "#{category}_#{subcategory}_turn_left"}
409
+ %field{:name => 'PIN'}<
410
+ D6
411
+
412
+ -# 2WD車[▼ピン]を右に曲げる
413
+ %block{:type => "#{category}_#{subcategory}_turn_right"}
414
+ %field{:name => 'PIN'}<
415
+ D6
416
+
417
+ -# 2WD車[▼ピン]を止める
418
+ %block{:type => "#{category}_#{subcategory}_stop"}
419
+ %field{:name => 'PIN'}<
420
+ D6
421
+
422
+ %category{:name => 'センサー'}
423
+ -# センサー[▼PIN]
424
+ %block{:type => "#{category}_sensor_value"}
425
+
426
+ -# センサー[▼PIN]が変化したとき
427
+ %block{:type => "#{category}_on_sensor_change"}
408
428
 
409
429
  -#%category{:name => 'ボタン'}
410
- -# -# 条件:ボタン[▼]を押している
411
- -# %block{:type => "#{category}_button_down"}
412
- -#
413
- -# -# 条件:ボタン[▼]を離している
414
- -# %block{:type => "#{category}_button_up"}
415
- -#
416
- -# -# ボタン[▼]を押したとき
417
- -# %block{:type => "#{category}_on_button_down"}
418
- -#
419
- -# -# ボタン[▼]を離したとき
420
- -# %block{:type => "#{category}_on_button_up"}
421
-
422
- %category{:name => 'センサー'}
423
- -# センサー[▼PIN]
424
- %block{:type => "#{category}_sensor_value"}
425
-
426
- -# センサー[▼PIN]が変化したとき
427
- %block{:type => "#{category}_on_sensor_change"}
430
+ -# 条件:ボタン[▼]を押している
431
+ %block{:type => "#{category}_button_down"}
432
+
433
+ -# 条件:ボタン[▼]を離している
434
+ %block{:type => "#{category}_button_up"}
435
+
436
+ -# ボタン[▼]を押したとき
437
+ %block{:type => "#{category}_on_button_down"}
438
+
439
+ -# ボタン[▼]を離したとき
440
+ %block{:type => "#{category}_on_button_up"}
data/bin/smalruby-editor CHANGED
@@ -84,6 +84,21 @@ end
84
84
  Rails::Server.new.tap do |server|
85
85
  require APP_PATH
86
86
  Dir.chdir(Rails.application.root)
87
+ if (pid_path = Pathname(server.default_options[:pid])).exist?
88
+ if SmalrubyEditor.windows?
89
+ pid = pid_path.read.to_i
90
+ require 'csv'
91
+ s = `tasklist /FI "IMAGENAME eq ruby.exe" /FO csv`
92
+ s.force_encoding('CP932')
93
+ csv = CSV.parse(s)
94
+ csv.shift # ヘッダを除去
95
+ pids = csv.map { |row| row[1].to_i }
96
+ if pids.include?(pid)
97
+ Process.kill('KILL', pid)
98
+ end
99
+ pid_path.unlink
100
+ end
101
+ end
87
102
  server.start
88
103
  end
89
104
  # rubocop:enable all
@@ -1,3 +1,4 @@
1
+ # -*- coding: utf-8 -*-
1
2
  require 'smalruby_editor/version'
2
3
 
3
4
  module SmalrubyEditor
@@ -12,6 +13,42 @@ module SmalrubyEditor
12
13
  end
13
14
  module_function :create_home_directory
14
15
 
16
+ # Raspberry Piかどうかを返す
17
+ def raspberrypi?
18
+ if Rails.env != 'test' &&
19
+ (ENV['SMALRUBY_EDITOR_RASPBERRYPI_MODE'] ||
20
+ File.exist?(Rails.root.join('tmp', 'raspberrypi')))
21
+ true
22
+ else
23
+ RbConfig::CONFIG['arch'] == 'armv6l-linux-eabihf'
24
+ end
25
+ end
26
+ module_function :raspberrypi?
27
+
28
+ # Mac OS Xかどうかを返す
29
+ def osx?
30
+ if Rails.env != 'test' &&
31
+ (ENV['SMALRUBY_EDITOR_OSX_MODE'] ||
32
+ File.exist?(Rails.root.join('tmp', 'osx')))
33
+ true
34
+ else
35
+ /darwin/ =~ RbConfig::CONFIG['arch']
36
+ end
37
+ end
38
+ module_function :osx?
39
+
40
+ # Windowsかどうかを返す
41
+ def windows?
42
+ if Rails.env != 'test' &&
43
+ (ENV['SMALRUBY_EDITOR_WINDOWS_MODE'] ||
44
+ File.exist?(Rails.root.join('tmp', 'windows')))
45
+ true
46
+ else
47
+ /windows|mingw|cygwin/i.match(RbConfig::CONFIG['arch'])
48
+ end
49
+ end
50
+ module_function :windows?
51
+
15
52
  class << self
16
53
  private
17
54
 
@@ -36,10 +73,8 @@ standalone:
36
73
  def create_database_yml(home_dir)
37
74
  database_yml_path = home_dir.join('config', 'database.yml')
38
75
  db_path = home_dir.join('db', 'standalone.sqlite3')
39
- unless File.exist?(database_yml_path)
40
- File.open(database_yml_path, 'w') do |f|
41
- f.write(DATABASE_YML_TEMPLATE.gsub(/%db_path%/, db_path.to_s))
42
- end
76
+ File.open(database_yml_path, 'w') do |f|
77
+ f.write(DATABASE_YML_TEMPLATE.gsub(/%db_path%/, db_path.to_s))
43
78
  end
44
79
  end
45
80
  end