smalruby-editor 0.1.23-x86-mingw32 → 0.1.24-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.
- checksums.yaml +4 -4
- data/.rspec +0 -1
- data/.rubocop.yml +4 -0
- data/.ruby-version +1 -1
- data/.travis.yml +1 -1
- data/Guardfile +45 -0
- data/app/assets/javascripts/application.js +0 -1
- data/app/assets/javascripts/msg/ja.js +1 -1
- data/app/assets/stylesheets/toolbox.css.scss.erb +1 -16
- data/app/controllers/source_codes_controller.rb +12 -7
- data/app/models/source_code.rb +34 -1
- data/app/views/editor/_toolbox.html.haml +155 -143
- data/app/views/editor/index.html.haml +4 -4
- data/app/views/layouts/application.html.erb +2 -2
- data/bin/bundle +1 -1
- data/bin/rails +5 -1
- data/bin/rake +5 -1
- data/bin/rspec +7 -0
- data/bin/spring +20 -0
- data/bin/teaspoon +7 -0
- data/lib/smalruby_editor/version.rb +3 -3
- data/smalruby-editor.gemspec +0 -1
- data/spec/models/source_code_spec.rb +88 -1
- data/spec/spec_helper.rb +114 -137
- metadata +13 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 42f6d2af5f4f6c84ae004c8ce00075e298c78d2f
|
4
|
+
data.tar.gz: 850e6b965ebdd14beccf80b57e49295dda964d2c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fadf35fb278a419515c9d8b4ac222d0bbfbf2f82cbb515d1a0619a38b2c4001684aef925ecd702232b4e041f030577a9dc544e191149cffe6879b05c66850fed
|
7
|
+
data.tar.gz: 21cb579247d0979cf0be7ce503207f3ba35f2ce42a80b61a9330c320672ed1429722db5d866b44694d2a81a47c7b46d2d933b5c3c91d21de31458d612c879268
|
data/.rspec
CHANGED
data/.rubocop.yml
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.
|
1
|
+
2.1.5
|
data/.travis.yml
CHANGED
data/Guardfile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
## Uncomment and set this to only include directories you want to watch
|
5
|
+
# directories %(app lib config test spec feature)
|
6
|
+
|
7
|
+
## Uncomment to clear the screen before every task
|
8
|
+
# clearing :on
|
9
|
+
|
10
|
+
group :red_green_refactor, halt_on_fail: true do
|
11
|
+
guard :rubocop, all_on_start: false do
|
12
|
+
watch(%r{.+\.rb$})
|
13
|
+
watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
|
14
|
+
end
|
15
|
+
|
16
|
+
guard :rspec, cmd: 'bundle exec bin/rspec' do
|
17
|
+
watch(%r{^spec/.+_spec\.rb$})
|
18
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
19
|
+
watch('spec/spec_helper.rb') { "spec" }
|
20
|
+
|
21
|
+
# Rails example
|
22
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
23
|
+
watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
24
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
25
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
26
|
+
watch('config/routes.rb') { "spec/routing" }
|
27
|
+
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
28
|
+
|
29
|
+
# Capybara features specs
|
30
|
+
watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
|
31
|
+
|
32
|
+
# Turnip features and steps
|
33
|
+
watch(%r{^spec/acceptance/(.+)\.feature$})
|
34
|
+
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
guard 'livereload' do
|
39
|
+
watch(%r{app/views/.+\.(erb|haml|slim)$})
|
40
|
+
watch(%r{app/helpers/.+\.rb})
|
41
|
+
watch(%r{public/.+\.(css|js|html)})
|
42
|
+
watch(%r{config/locales/.+\.yml})
|
43
|
+
# Rails Assets Pipeline
|
44
|
+
watch(%r{(app|vendor)(/assets/\w+/(.+\.(css|js|html|png|jpg))).*}) { |m| "/assets/#{m[3]}" }
|
45
|
+
end
|
@@ -80,7 +80,7 @@ Blockly.Msg.BLOCKS_SENSING_DOWN = Blockly.Msg.BLOCKS_SENSING_PUSH;
|
|
80
80
|
Blockly.Msg.BLOCKS_SENSING_M_LBUTTON = '左ボタン';
|
81
81
|
Blockly.Msg.BLOCKS_SENSING_M_MBUTTON = '中ボタン';
|
82
82
|
Blockly.Msg.BLOCKS_SENSING_M_RBUTTON = '右ボタン';
|
83
|
-
Blockly.Msg.BLOCKS_SENSING_UP = '
|
83
|
+
Blockly.Msg.BLOCKS_SENSING_UP = '離された';
|
84
84
|
Blockly.Msg.BLOCKS_SENSING_REACH_WALL = '端に触れた';
|
85
85
|
Blockly.Msg.BLOCKS_SENSING_INPUT_KEY_PUSH_OR_DOWN_PREFIX = 'キーボードの';
|
86
86
|
Blockly.Msg.BLOCKS_SENSING_INPUT_KEY_PUSH_OR_DOWN_MIDDLE = 'が';
|
@@ -27,29 +27,15 @@
|
|
27
27
|
colors = SmalrubyEditor::COLORS
|
28
28
|
|
29
29
|
hues = [
|
30
|
-
colors[:motion],
|
31
|
-
colors[:motion],
|
32
|
-
colors[:motion],
|
33
30
|
colors[:motion],
|
34
31
|
colors[:looks],
|
35
32
|
colors[:sound],
|
36
33
|
colors[:pen],
|
37
34
|
colors[:data],
|
38
|
-
colors[:data],
|
39
35
|
colors[:events],
|
40
36
|
colors[:control],
|
41
|
-
colors[:control],
|
42
|
-
colors[:control],
|
43
|
-
colors[:control],
|
44
37
|
colors[:sensing],
|
45
|
-
colors[:sensing],
|
46
|
-
colors[:sensing],
|
47
|
-
colors[:operators],
|
48
|
-
colors[:operators],
|
49
38
|
colors[:operators],
|
50
|
-
colors[:operators],
|
51
|
-
colors[:etc],
|
52
|
-
colors[:etc],
|
53
39
|
colors[:etc],
|
54
40
|
]
|
55
41
|
|
@@ -57,11 +43,10 @@
|
|
57
43
|
[hsv_to_rgb(h, 100, 80), hsv_to_rgb(h, 100, 100)]
|
58
44
|
}
|
59
45
|
|
60
|
-
ids = (0..9).to_a + ('a'..'z').to_a
|
61
46
|
colors.each.with_index(1) do |(color, active_color), index|
|
62
47
|
%>
|
63
48
|
|
64
|
-
|
49
|
+
div[aria-level="1"][aria-posinset="<%= index %>"] {
|
65
50
|
.blocklyTreeRow {
|
66
51
|
margin-bottom: 1px;
|
67
52
|
padding-top: 1px;
|
@@ -9,16 +9,21 @@ class SourceCodesController < ApplicationController
|
|
9
9
|
localPrograms: [],
|
10
10
|
demoPrograms: [],
|
11
11
|
}
|
12
|
+
|
13
|
+
select_and_get_summary = proc { |path|
|
14
|
+
s = SourceCode.new(filename: path.basename.to_s, data: path.read)
|
15
|
+
next if raspberrypi? && s.include_block?(/^(hardware_|pen_)/)
|
16
|
+
s.summary
|
17
|
+
}
|
18
|
+
|
12
19
|
if standalone?
|
13
|
-
res[:localPrograms] =
|
14
|
-
|
15
|
-
}
|
20
|
+
res[:localPrograms] =
|
21
|
+
local_program_paths.map(&select_and_get_summary).compact
|
16
22
|
end
|
17
23
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
}
|
24
|
+
demo_program_paths = Pathname.glob(Rails.root.join('demos/*.rb.xml'))
|
25
|
+
res[:demoPrograms] =
|
26
|
+
demo_program_paths.map(&select_and_get_summary).compact
|
22
27
|
|
23
28
|
render json: res
|
24
29
|
end
|
data/app/models/source_code.rb
CHANGED
@@ -67,7 +67,7 @@ class SourceCode < ActiveRecord::Base
|
|
67
67
|
# ソースコードの概要を取得する
|
68
68
|
def summary
|
69
69
|
res = {}
|
70
|
-
if
|
70
|
+
if xml?
|
71
71
|
res[:filename] = filename.sub(/\.xml\z/, '')
|
72
72
|
|
73
73
|
doc = Nokogiri::HTML.parse(data)
|
@@ -84,8 +84,41 @@ class SourceCode < ActiveRecord::Base
|
|
84
84
|
res
|
85
85
|
end
|
86
86
|
|
87
|
+
# 指定した命令ブロックを含んでいるかどうかを返す
|
88
|
+
#
|
89
|
+
# @param [String|Regexp] type 命令ブロックの種類
|
90
|
+
# @return [Boolean] 命令ブロックを含む場合はtrue、そうでない場合はfalse
|
91
|
+
def include_block?(type)
|
92
|
+
if xml?
|
93
|
+
doc = Nokogiri::HTML.parse(data)
|
94
|
+
if type.is_a?(Regexp)
|
95
|
+
doc.xpath(%(//block[matches(@type, '#{type.source}')]),
|
96
|
+
MatchesXPathFunction.new).length > 0
|
97
|
+
else
|
98
|
+
doc.xpath(%(//block[@type="#{type}"])).length > 0
|
99
|
+
end
|
100
|
+
else
|
101
|
+
false
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# ソースコードの種別がXML形式かどうかを返す
|
106
|
+
def xml?
|
107
|
+
!!(/\.xml\z/ =~ filename)
|
108
|
+
end
|
109
|
+
|
87
110
|
private
|
88
111
|
|
112
|
+
class MatchesXPathFunction
|
113
|
+
def matches(node_set, regex)
|
114
|
+
node_set.select { |node|
|
115
|
+
node.value =~ /#{regex}/
|
116
|
+
}
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
private_constant :MatchesXPathFunction
|
121
|
+
|
89
122
|
def validate_filename
|
90
123
|
if File.basename(filename) != filename
|
91
124
|
errors.add(:filename, 'includes directory separator(s)')
|
@@ -40,10 +40,12 @@
|
|
40
40
|
= toolbox_number_value('Y', 0)
|
41
41
|
|
42
42
|
-# 変数:x座標
|
43
|
-
|
43
|
+
- if !raspberrypi?
|
44
|
+
%block{:type => "#{category}_self_x"}
|
44
45
|
|
45
46
|
-# 変数:y座標
|
46
|
-
|
47
|
+
- if !raspberrypi?
|
48
|
+
%block{:type => "#{category}_self_y"}
|
47
49
|
|
48
50
|
%category{:name => t('.motion_rotate')}
|
49
51
|
-# もし端に着いたら、跳ね返る
|
@@ -77,64 +79,66 @@
|
|
77
79
|
%block{:type => "#{category}_set_rotation_style"}
|
78
80
|
|
79
81
|
-# 変数:向き
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
%
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
82
|
+
- if !raspberrypi?
|
83
|
+
%block{:type => "#{category}_self_angle"}
|
84
|
+
|
85
|
+
- if !raspberrypi?
|
86
|
+
- category = 'hardware'
|
87
|
+
%category{:name => t('.motion_actuator')}
|
88
|
+
- subcategory = 'servo'
|
89
|
+
-# サーボ[▼PIN]を( )度(5~180)にする
|
90
|
+
%block{:type => "#{category}_#{subcategory}_set_position"}
|
91
|
+
= toolbox_number_value('POS', 90)
|
92
|
+
|
93
|
+
- subcategory = 'two_wheel_drive_car'
|
94
|
+
-# 2WD車[▼PIN]を( )秒[▼コマンド]
|
95
|
+
%block{:type => "#{category}_#{subcategory}_run"}
|
96
|
+
= toolbox_pin_field('D5')
|
97
|
+
= toolbox_number_value('SEC', 1)
|
98
|
+
%value{:name => 'COMMAND'}
|
99
|
+
%block{:type => "#{category}_#{subcategory}_commands"}
|
100
|
+
|
101
|
+
-# [▼コマンド]
|
102
|
+
%block{:type => "#{category}_#{subcategory}_commands"}
|
103
|
+
%field{:name => 'COMMAND'}<
|
104
|
+
forward
|
105
|
+
|
106
|
+
-# 2WD車[▼PIN]を進める
|
107
|
+
%block{:type => "#{category}_#{subcategory}_forward"}
|
108
|
+
= toolbox_pin_field('D5')
|
109
|
+
|
110
|
+
-# 2WD車[▼PIN]をバックさせる
|
111
|
+
%block{:type => "#{category}_#{subcategory}_backward"}
|
112
|
+
= toolbox_pin_field('D5')
|
113
|
+
|
114
|
+
-# 2WD車[▼PIN]を左に曲げる
|
115
|
+
%block{:type => "#{category}_#{subcategory}_turn_left"}
|
116
|
+
= toolbox_pin_field('D5')
|
117
|
+
|
118
|
+
-# 2WD車[▼PIN]を右に曲げる
|
119
|
+
%block{:type => "#{category}_#{subcategory}_turn_right"}
|
120
|
+
= toolbox_pin_field('D5')
|
121
|
+
|
122
|
+
-# 2WD車[▼PIN]を止める
|
123
|
+
%block{:type => "#{category}_#{subcategory}_stop"}
|
124
|
+
= toolbox_pin_field('D5')
|
125
|
+
|
126
|
+
-# 2WD車[▼PIN]の[▼LOR]の速度を<SPEED>%にする
|
127
|
+
%block{:type => "#{category}_#{subcategory}_set_speed"}
|
128
|
+
= toolbox_pin_field('D5')
|
129
|
+
= toolbox_number_value('SPEED', 100)
|
130
|
+
|
131
|
+
- subcategory = 'motor_driver'
|
132
|
+
-# (モータードライバ[▼PIN]で)モーターを[▼正転させる]
|
133
|
+
%block{:type => "#{category}_#{subcategory}"}
|
134
|
+
= toolbox_pin_field('D6')
|
135
|
+
%field{:name => 'METHOD'}<
|
136
|
+
forward
|
137
|
+
|
138
|
+
-# (モータードライバ[▼PIN]の)モーターの速度を<SPEED>%にする
|
139
|
+
%block{:type => "#{category}_#{subcategory}_set_speed"}
|
140
|
+
= toolbox_pin_field('D6')
|
141
|
+
= toolbox_number_value('SPEED', 100)
|
138
142
|
|
139
143
|
- category = 'looks'
|
140
144
|
%category{:name => t('.looks')}
|
@@ -179,35 +183,36 @@
|
|
179
183
|
-# [▼プリセット画像]
|
180
184
|
-#%block{:type => "#{category}_preset_images"}
|
181
185
|
|
182
|
-
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
+
- if !raspberrypi?
|
187
|
+
- category = 'hardware'
|
188
|
+
- subcategory = 'led'
|
189
|
+
-# LED[▼PIN]をオンにする
|
190
|
+
%block{:type => "#{category}_#{subcategory}_on"}
|
186
191
|
|
187
|
-
|
188
|
-
|
192
|
+
-# LED[▼PIN]をオフにする
|
193
|
+
%block{:type => "#{category}_#{subcategory}_off"}
|
189
194
|
|
190
|
-
|
191
|
-
|
192
|
-
|
195
|
+
- subcategory = 'rgb_led'
|
196
|
+
-# RGB LED[▼アノード]コモン[▼PIN]を[カラー]にする
|
197
|
+
%block{:type => "#{category}_#{subcategory}_on"}
|
193
198
|
|
194
|
-
|
195
|
-
|
199
|
+
-# RGB LED[▼アノード]コモン[▼PIN]をオフにする
|
200
|
+
%block{:type => "#{category}_#{subcategory}_off"}
|
196
201
|
|
197
|
-
|
198
|
-
|
199
|
-
|
202
|
+
- subcategory = 'seven_segment_display'
|
203
|
+
-# 7セグディスプレイに[▼0-9]を表示する
|
204
|
+
%block{:type => "#{category}_#{subcategory}_show"}
|
200
205
|
|
201
|
-
|
202
|
-
|
206
|
+
-# 7セグディスプレイをオフにする
|
207
|
+
%block{:type => "#{category}_#{subcategory}_off"}
|
203
208
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
209
|
+
- subcategory = 'lcd'
|
210
|
+
-# LCDに( )を表示する
|
211
|
+
%block{:type => "#{category}_#{subcategory}_puts"}
|
212
|
+
= toolbox_text_value('TEXT', 'Hello')
|
208
213
|
|
209
|
-
|
210
|
-
|
214
|
+
-# LCDをクリアする
|
215
|
+
%block{:type => "#{category}_#{subcategory}_clear"}
|
211
216
|
|
212
217
|
- category = 'sound'
|
213
218
|
%category{:name => t('.sound')}
|
@@ -224,14 +229,15 @@
|
|
224
229
|
|
225
230
|
- category = 'pen'
|
226
231
|
%category{:name => t('.pen')}
|
227
|
-
|
228
|
-
|
232
|
+
- if !raspberrypi?
|
233
|
+
-# ペンを下ろす
|
234
|
+
%block{:type => "#{category}_down_pen"}
|
229
235
|
|
230
|
-
|
231
|
-
|
236
|
+
-# ペンを上げる
|
237
|
+
%block{:type => "#{category}_up_pen"}
|
232
238
|
|
233
|
-
|
234
|
-
|
239
|
+
-# ペンの色を[カラー]にする
|
240
|
+
%block{:type => "#{category}_set_pen_color"}
|
235
241
|
|
236
242
|
%category{:name => t('.data')}
|
237
243
|
%category{:name => t('.data_variables'), :custom => 'VARIABLE'}
|
@@ -251,12 +257,13 @@
|
|
251
257
|
-# [▼キャラクター]にぶつかったとき
|
252
258
|
%block{:type => "#{category}_on_hit"}
|
253
259
|
|
254
|
-
-
|
255
|
-
|
256
|
-
|
260
|
+
- if !raspberrypi?
|
261
|
+
- category = 'hardware'
|
262
|
+
-# センサー[▼PIN]が変化したとき
|
263
|
+
%block{:type => "#{category}_on_sensor_change"}
|
257
264
|
|
258
|
-
|
259
|
-
|
265
|
+
-# ボタン[▼PIN]が[▼押された]とき
|
266
|
+
%block{:type => "#{category}_on_button_down_or_up"}
|
260
267
|
|
261
268
|
- category = 'control'
|
262
269
|
%category{:name => t('.control')}
|
@@ -274,11 +281,12 @@
|
|
274
281
|
-# 繰り返しから脱出する
|
275
282
|
%block{:type => "#{category}_break"}
|
276
283
|
|
277
|
-
|
278
|
-
|
284
|
+
- if !raspberrypi?
|
285
|
+
-# 次の繰り返しにジャンプする
|
286
|
+
%block{:type => "#{category}_next"}
|
279
287
|
|
280
|
-
|
281
|
-
|
288
|
+
-# 現在の繰り返しをやり直す
|
289
|
+
%block{:type => "#{category}_redo"}
|
282
290
|
|
283
291
|
%category{:name => t('.control_wait')}
|
284
292
|
-# ( )秒待つ
|
@@ -336,29 +344,31 @@
|
|
336
344
|
-# 変数:[▼キャラクター]の[▼プロパティ]
|
337
345
|
%block{:type => "#{category}_character_property"}
|
338
346
|
|
339
|
-
|
340
|
-
|
347
|
+
- if !raspberrypi?
|
348
|
+
-# 変数:現在の[▼時]
|
349
|
+
%block{:type => "#{category}_time_now"}
|
341
350
|
|
342
|
-
|
343
|
-
|
351
|
+
-# 変数:2000年からの日数
|
352
|
+
%block{:type => "#{category}_days_since_2000"}
|
344
353
|
|
345
|
-
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
354
|
+
- if !raspberrypi?
|
355
|
+
- category = 'hardware'
|
356
|
+
%category{:name => t('.sensing_hardware')}
|
357
|
+
-# センサー[▼PIN]
|
358
|
+
%block{:type => "#{category}_sensor_value"}
|
359
|
+
= toolbox_pin_field('A0')
|
350
360
|
|
351
|
-
|
352
|
-
|
353
|
-
|
361
|
+
-# 条件:ボタン[▼PIN]が[▼押された]
|
362
|
+
%block{:type => "#{category}_button_down_or_up"}
|
363
|
+
= toolbox_pin_field('D3')
|
354
364
|
|
355
|
-
|
356
|
-
|
357
|
-
|
365
|
+
-# 2WD車[▼PIN]の[▼LOR]の速度%
|
366
|
+
%block{:type => "#{category}_two_wheel_drive_car_speed"}
|
367
|
+
= toolbox_pin_field('D5')
|
358
368
|
|
359
|
-
|
360
|
-
|
361
|
-
|
369
|
+
-# (モータードライバ[▼PIN]の)モーターの速度(%)
|
370
|
+
%block{:type => "#{category}_motor_driver_speed"}
|
371
|
+
= toolbox_pin_field('D6')
|
362
372
|
|
363
373
|
- category = 'operators'
|
364
374
|
%category{:name => t('.operators')}
|
@@ -381,19 +391,20 @@
|
|
381
391
|
= toolbox_number_value('B', 10)
|
382
392
|
|
383
393
|
-# 変数:( )を( )で割った余り
|
384
|
-
|
385
|
-
|
386
|
-
|
394
|
+
- if !raspberrypi?
|
395
|
+
%block{:type => "#{category}_modulo"}
|
396
|
+
= toolbox_number_value('A', 5)
|
397
|
+
= toolbox_number_value('B', 2)
|
387
398
|
|
388
|
-
|
389
|
-
|
390
|
-
|
399
|
+
-# 変数:( )を丸める
|
400
|
+
%block{:type => "#{category}_round"}
|
401
|
+
= toolbox_number_value('A', 0.5)
|
391
402
|
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
403
|
+
-# 変数:( )の[▼数学関数]
|
404
|
+
%block{:type => "#{category}_math_method"}
|
405
|
+
= toolbox_number_value('NUM', 9)
|
406
|
+
%field{:name => 'METHOD'}<
|
407
|
+
Math.sqrt(%num%)
|
397
408
|
|
398
409
|
-# 数値
|
399
410
|
%block{:type => 'math_number'}
|
@@ -447,25 +458,26 @@
|
|
447
458
|
%block{:type => "#{category}_false"}
|
448
459
|
|
449
460
|
%category{:name => t('.etc')}
|
450
|
-
-
|
451
|
-
|
452
|
-
|
453
|
-
|
461
|
+
- if !raspberrypi?
|
462
|
+
- category = 'ruby'
|
463
|
+
%category{:name => t('.etc_ruby')}
|
464
|
+
-# 文
|
465
|
+
%block{:type => "#{category}_statement"}
|
454
466
|
|
455
|
-
|
456
|
-
|
467
|
+
-# 式
|
468
|
+
%block{:type => "#{category}_expression"}
|
457
469
|
|
458
|
-
|
459
|
-
|
470
|
+
-# コメント
|
471
|
+
%block{:type => "#{category}_comment"}
|
460
472
|
|
461
|
-
|
462
|
-
|
473
|
+
-# p
|
474
|
+
%block{:type => "#{category}_p"}
|
463
475
|
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
476
|
+
- category = 'hardware'
|
477
|
+
%category{:name => t('.etc_hardware')}
|
478
|
+
-# ハードウェアを準備する
|
479
|
+
%block{:type => "#{category}_init_hardware"}
|
468
480
|
|
469
|
-
|
470
|
-
|
471
|
-
|
481
|
+
-# ボタン[▼PIN]のプルアップ抵抗を使わない
|
482
|
+
%block{:type => "#{category}_button_not_use_pullup"}
|
483
|
+
= toolbox_pin_field('D3')
|
@@ -41,16 +41,16 @@
|
|
41
41
|
= t('.check')
|
42
42
|
%button#reset-button.btn{class: "btn-primary"}<
|
43
43
|
%i.icon-off
|
44
|
-
= t('
|
44
|
+
= t('.reset')
|
45
45
|
- if standalone?
|
46
46
|
- if session[:username]
|
47
47
|
%button#signout-button.btn{class: "btn-primary"}<
|
48
48
|
%i.icon-eject
|
49
|
-
= t('logout')
|
49
|
+
= t('.logout')
|
50
50
|
- else
|
51
51
|
%button#signout-button.btn{class: "btn-primary", style: "display: none"}<
|
52
52
|
%i.icon-eject
|
53
|
-
= t('logout')
|
53
|
+
= t('.logout')
|
54
54
|
|
55
55
|
- else
|
56
56
|
.btn-group
|
@@ -127,4 +127,4 @@
|
|
127
127
|
|
128
128
|
- if raspberrypi?
|
129
129
|
%script{type: "text/javascript"}
|
130
|
-
$(function() { $('div[
|
130
|
+
$(function() { $('div[aria-level="1"][aria-posinset="4"],div[aria-level="1"][aria-posinset="10"]').hide(); });
|
@@ -10,8 +10,8 @@
|
|
10
10
|
<meta name="msapplication-square150x150logo" content="square.png" />
|
11
11
|
<meta name="msapplication-wide310x150logo" content="wide.png" />
|
12
12
|
<meta name="msapplication-square310x310logo" content="large.png" />
|
13
|
-
<%= stylesheet_link_tag "application", media: "all"
|
14
|
-
<%= javascript_include_tag "application"
|
13
|
+
<%= stylesheet_link_tag "application", media: "all" %>
|
14
|
+
<%= javascript_include_tag "application" %>
|
15
15
|
<%= javascript_include_tag "blockly/msg/js/#{blockly_message_locale_name}" %>
|
16
16
|
<%= javascript_include_tag "msg/#{blockly_message_locale_name}" %>
|
17
17
|
<%= csrf_meta_tags %>
|
data/bin/bundle
CHANGED
data/bin/rails
CHANGED
data/bin/rake
CHANGED
data/bin/rspec
ADDED
data/bin/spring
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# This file loads spring without using Bundler, in order to be fast
|
4
|
+
# It gets overwritten when you run the `spring binstub` command
|
5
|
+
|
6
|
+
unless defined?(Spring)
|
7
|
+
require 'rubygems'
|
8
|
+
require 'bundler'
|
9
|
+
|
10
|
+
re = /^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m
|
11
|
+
if (match = Bundler.default_lockfile.read.match(re))
|
12
|
+
ENV['GEM_PATH'] =
|
13
|
+
([Bundler.bundle_path.to_s] + Gem.path).join(File::PATH_SEPARATOR)
|
14
|
+
ENV['GEM_HOME'] = ''
|
15
|
+
Gem.paths = ENV
|
16
|
+
|
17
|
+
gem 'spring', match[1]
|
18
|
+
require 'spring/binstub'
|
19
|
+
end
|
20
|
+
end
|
data/bin/teaspoon
ADDED
@@ -1,3 +1,3 @@
|
|
1
|
-
module SmalrubyEditor
|
2
|
-
VERSION =
|
3
|
-
end
|
1
|
+
module SmalrubyEditor
|
2
|
+
VERSION = '0.1.24'
|
3
|
+
end
|
data/smalruby-editor.gemspec
CHANGED
@@ -77,7 +77,7 @@ describe SourceCode, 'Rubyのソースコードを表現するモデル' do
|
|
77
77
|
end
|
78
78
|
|
79
79
|
describe '#summary', 'プログラムの概要を取得する' do
|
80
|
-
describe 'XML形式'do
|
80
|
+
describe 'XML形式' do
|
81
81
|
let(:xml_path) { rb_path + '.xml' }
|
82
82
|
let(:data) { Rails.root.join(xml_path).read }
|
83
83
|
let(:source_code) {
|
@@ -128,4 +128,91 @@ describe SourceCode, 'Rubyのソースコードを表現するモデル' do
|
|
128
128
|
end
|
129
129
|
end
|
130
130
|
end
|
131
|
+
|
132
|
+
describe '#include_block?' do
|
133
|
+
describe 'XML形式' do
|
134
|
+
let(:data) { Rails.root.join(xml_path).read }
|
135
|
+
let(:source_code) {
|
136
|
+
SourceCode.new(filename: File.basename(xml_path), data: data)
|
137
|
+
}
|
138
|
+
|
139
|
+
subject { source_code.include_block?(type) }
|
140
|
+
|
141
|
+
context 'ソースコードにハードウェア関連ブロックを含む場合' do
|
142
|
+
let(:xml_path) { 'demos/adjust_2wd_car.rb.xml' }
|
143
|
+
|
144
|
+
context '引数にhardware_init_hardwareを指定する' do
|
145
|
+
let(:type) { 'hardware_init_hardware' }
|
146
|
+
|
147
|
+
it { should be_true }
|
148
|
+
end
|
149
|
+
|
150
|
+
context '引数にハードウェア関連ブロックを指定する' do
|
151
|
+
let(:type) { /^hardware_/ }
|
152
|
+
|
153
|
+
it { should be_true }
|
154
|
+
end
|
155
|
+
|
156
|
+
context '引数にpen_down_penを指定する' do
|
157
|
+
let(:type) { 'pen_down_pen' }
|
158
|
+
|
159
|
+
it { should be_false }
|
160
|
+
end
|
161
|
+
|
162
|
+
context '引数にペン関連ブロックを指定する' do
|
163
|
+
let(:type) { /^pen_/ }
|
164
|
+
|
165
|
+
it { should be_false }
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
context 'ソースコードにハードウェア関連ブロックを含まない場合' do
|
170
|
+
let(:xml_path) { 'demos/star.rb.xml' }
|
171
|
+
|
172
|
+
context '引数にhardware_init_hardwareを指定する' do
|
173
|
+
let(:type) { 'hardware_init_hardware' }
|
174
|
+
|
175
|
+
it { should be_false }
|
176
|
+
end
|
177
|
+
|
178
|
+
context '引数にハードウェア関連ブロックを指定する' do
|
179
|
+
let(:type) { /^hardware_/ }
|
180
|
+
|
181
|
+
it { should be_false }
|
182
|
+
end
|
183
|
+
|
184
|
+
context '引数にpen_down_penを指定する' do
|
185
|
+
let(:type) { 'pen_down_pen' }
|
186
|
+
|
187
|
+
it { should be_true }
|
188
|
+
end
|
189
|
+
|
190
|
+
context '引数にペン関連ブロックを指定する' do
|
191
|
+
let(:type) { /^pen_/ }
|
192
|
+
|
193
|
+
it { should be_true }
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
describe '#xml?' do
|
200
|
+
let(:source_code) {
|
201
|
+
SourceCode.new(filename: File.basename(path))
|
202
|
+
}
|
203
|
+
|
204
|
+
subject { source_code.xml? }
|
205
|
+
|
206
|
+
context 'a' do
|
207
|
+
let(:path) { 'car1.rb' }
|
208
|
+
|
209
|
+
it { should be_false }
|
210
|
+
end
|
211
|
+
|
212
|
+
context 'b' do
|
213
|
+
let(:path) { 'car1.rb.xml' }
|
214
|
+
|
215
|
+
it { should be_true }
|
216
|
+
end
|
217
|
+
end
|
131
218
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,154 +1,131 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require 'rubygems'
|
3
|
-
require 'spork'
|
4
|
-
# uncomment the following line to use spork with the debugger
|
5
|
-
# require 'spork/ext/ruby-debug'
|
6
|
-
|
7
|
-
Spork.prefork do
|
8
|
-
# Loading more in this block will cause your tests to run faster. However,
|
9
|
-
# if you change any configuration or code from libraries loaded here, you'll
|
10
|
-
# need to restart spork for it take effect.
|
11
|
-
|
12
|
-
ENV['RAILS_ENV'] ||= 'test'
|
13
|
-
require File.expand_path('../../config/environment', __FILE__)
|
14
|
-
require 'rspec/rails'
|
15
|
-
require 'rspec/autorun'
|
16
|
-
require 'capybara/dsl'
|
17
|
-
require 'capybara/rspec'
|
18
|
-
require 'capybara/poltergeist'
|
19
|
-
require 'turnip'
|
20
|
-
require 'turnip/capybara'
|
21
|
-
require 'simplecov' if ENV['COVERAGE'] || ENV['COVERALLS']
|
22
|
-
|
23
|
-
# Requires supporting ruby files with custom matchers and macros, etc,
|
24
|
-
# in spec/support/ and its subdirectories.
|
25
|
-
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
|
26
|
-
|
27
|
-
# Checks for pending migrations before tests are run.
|
28
|
-
# If you are not using ActiveRecord, you can remove this line.
|
29
|
-
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)
|
30
|
-
|
31
|
-
RSpec.configure do |config|
|
32
|
-
# ## Mock Framework
|
33
|
-
#
|
34
|
-
# If you prefer to use mocha, flexmock or RR, uncomment the
|
35
|
-
# appropriate line:
|
36
|
-
#
|
37
|
-
# config.mock_with :mocha
|
38
|
-
# config.mock_with :flexmock
|
39
|
-
# config.mock_with :rr
|
40
|
-
|
41
|
-
# Remove this line if you're not using ActiveRecord or
|
42
|
-
# ActiveRecord fixtures
|
43
|
-
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
44
|
-
|
45
|
-
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
46
|
-
# examples within a transaction, remove the following line or assign false
|
47
|
-
# instead of true.
|
48
|
-
config.use_transactional_fixtures = false
|
49
|
-
|
50
|
-
# If true, the base class of anonymous controllers will be inferred
|
51
|
-
# automatically. This will be the default behavior in future versions of
|
52
|
-
# rspec-rails.
|
53
|
-
config.infer_base_class_for_anonymous_controllers = false
|
54
|
-
|
55
|
-
# Run specs in random order to surface order dependencies. If you find an
|
56
|
-
# order dependency and want to debug it, you can fix the order by providing
|
57
|
-
# the seed, which is printed after each run.
|
58
|
-
# --seed 1234
|
59
|
-
config.order = 'random'
|
60
|
-
|
61
|
-
twb = (ENV['TARGET_WEB_BROWZER'] || ENV['TWB']).try(:downcase)
|
62
|
-
case twb
|
63
|
-
when 'firefox', 'ie', 'chrome'
|
64
|
-
Capybara.register_driver :selenium do |app|
|
65
|
-
opts = { browser: twb.to_sym }
|
66
|
-
|
67
|
-
dir = downloads_dir.to_s
|
68
|
-
dir.gsub!(File::SEPARATOR, File::ALT_SEPARATOR) if windows?
|
69
|
-
case twb
|
70
|
-
when 'firefox'
|
71
|
-
opts[:profile] = profile = Selenium::WebDriver::Firefox::Profile.new
|
72
|
-
profile['browser.download.folderList'] = 2 # custom location
|
73
|
-
profile['browser.download.dir'] = dir
|
74
|
-
profile['browser.helperApps.neverAsk.saveToDisk'] = 'text/plain'
|
75
|
-
when 'ie'
|
76
|
-
opts[:introduce_flakiness_by_ignoring_security_domains] = true
|
77
|
-
when 'chrome'
|
78
|
-
FileUtils.mkdir_p(dir)
|
79
|
-
opts[:prefs] = {
|
80
|
-
download: {
|
81
|
-
prompt_for_download: false,
|
82
|
-
default_directory: dir,
|
83
|
-
directory_upgrade: true,
|
84
|
-
}
|
85
|
-
}
|
86
|
-
|
87
|
-
opts[:switches] =
|
88
|
-
%w(
|
89
|
-
--ignore-certificate-errors
|
90
|
-
--disable-popup-blocking
|
91
|
-
--disable-translate
|
92
|
-
)
|
93
|
-
end
|
94
3
|
|
95
|
-
|
4
|
+
ENV['RAILS_ENV'] ||= 'test'
|
5
|
+
require File.expand_path('../../config/environment', __FILE__)
|
6
|
+
require 'rspec/rails'
|
7
|
+
require 'rspec/autorun'
|
8
|
+
require 'capybara/dsl'
|
9
|
+
require 'capybara/rspec'
|
10
|
+
require 'capybara/poltergeist'
|
11
|
+
require 'turnip'
|
12
|
+
require 'turnip/capybara'
|
13
|
+
require 'simplecov' if ENV['COVERAGE'] || ENV['COVERALLS']
|
14
|
+
|
15
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
16
|
+
# in spec/support/ and its subdirectories.
|
17
|
+
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
|
18
|
+
|
19
|
+
# Checks for pending migrations before tests are run.
|
20
|
+
# If you are not using ActiveRecord, you can remove this line.
|
21
|
+
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)
|
22
|
+
|
23
|
+
RSpec.configure do |config|
|
24
|
+
# ## Mock Framework
|
25
|
+
#
|
26
|
+
# If you prefer to use mocha, flexmock or RR, uncomment the
|
27
|
+
# appropriate line:
|
28
|
+
#
|
29
|
+
# config.mock_with :mocha
|
30
|
+
# config.mock_with :flexmock
|
31
|
+
# config.mock_with :rr
|
32
|
+
|
33
|
+
# Remove this line if you're not using ActiveRecord or
|
34
|
+
# ActiveRecord fixtures
|
35
|
+
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
36
|
+
|
37
|
+
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
38
|
+
# examples within a transaction, remove the following line or assign false
|
39
|
+
# instead of true.
|
40
|
+
config.use_transactional_fixtures = false
|
41
|
+
|
42
|
+
# If true, the base class of anonymous controllers will be inferred
|
43
|
+
# automatically. This will be the default behavior in future versions of
|
44
|
+
# rspec-rails.
|
45
|
+
config.infer_base_class_for_anonymous_controllers = false
|
46
|
+
|
47
|
+
# Run specs in random order to surface order dependencies. If you find an
|
48
|
+
# order dependency and want to debug it, you can fix the order by providing
|
49
|
+
# the seed, which is printed after each run.
|
50
|
+
# --seed 1234
|
51
|
+
config.order = 'random'
|
52
|
+
|
53
|
+
twb = (ENV['TARGET_WEB_BROWZER'] || ENV['TWB']).try(:downcase)
|
54
|
+
case twb
|
55
|
+
when 'firefox', 'ie', 'chrome'
|
56
|
+
Capybara.register_driver :selenium do |app|
|
57
|
+
opts = { browser: twb.to_sym }
|
58
|
+
|
59
|
+
dir = downloads_dir.to_s
|
60
|
+
dir.gsub!(File::SEPARATOR, File::ALT_SEPARATOR) if windows?
|
61
|
+
case twb
|
62
|
+
when 'firefox'
|
63
|
+
opts[:profile] = profile = Selenium::WebDriver::Firefox::Profile.new
|
64
|
+
profile['browser.download.folderList'] = 2 # custom location
|
65
|
+
profile['browser.download.dir'] = dir
|
66
|
+
profile['browser.helperApps.neverAsk.saveToDisk'] = 'text/plain'
|
67
|
+
when 'ie'
|
68
|
+
opts[:introduce_flakiness_by_ignoring_security_domains] = true
|
69
|
+
when 'chrome'
|
70
|
+
FileUtils.mkdir_p(dir)
|
71
|
+
opts[:prefs] = {
|
72
|
+
download: {
|
73
|
+
prompt_for_download: false,
|
74
|
+
default_directory: dir,
|
75
|
+
directory_upgrade: true,
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
opts[:switches] =
|
80
|
+
%w(
|
81
|
+
--ignore-certificate-errors
|
82
|
+
--disable-popup-blocking
|
83
|
+
--disable-translate
|
84
|
+
)
|
96
85
|
end
|
97
|
-
Capybara.javascript_driver = :selenium
|
98
|
-
else
|
99
|
-
Capybara.javascript_driver = :poltergeist
|
100
|
-
Capybara.register_driver(:poltergeist) { |app|
|
101
|
-
Capybara::Poltergeist::Driver.new(app, timeout: 120)
|
102
|
-
}
|
103
|
-
end
|
104
86
|
|
105
|
-
|
106
|
-
config.include ERB::Util, type: :helper
|
107
|
-
config.include ERB::Util, type: :feature
|
108
|
-
config.include ActionView::Helpers::JavaScriptHelper, type: :feature
|
109
|
-
|
110
|
-
config.after(javascript: true) do
|
111
|
-
page.execute_script('window.onbeforeunload = null')
|
112
|
-
FileUtils.rm_rf(downloads_dir) if selenium?
|
87
|
+
Capybara::Selenium::Driver.new(app, opts)
|
113
88
|
end
|
89
|
+
Capybara.javascript_driver = :selenium
|
90
|
+
else
|
91
|
+
Capybara.javascript_driver = :poltergeist
|
92
|
+
Capybara.register_driver(:poltergeist) { |app|
|
93
|
+
Capybara::Poltergeist::Driver.new(app, timeout: 120)
|
94
|
+
}
|
95
|
+
end
|
114
96
|
|
115
|
-
|
116
|
-
|
97
|
+
config.include JsonSpec::Helpers
|
98
|
+
config.include ERB::Util, type: :helper
|
99
|
+
config.include ERB::Util, type: :feature
|
100
|
+
config.include ActionView::Helpers::JavaScriptHelper, type: :feature
|
117
101
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
end
|
102
|
+
config.after(javascript: true) do
|
103
|
+
page.execute_script('window.onbeforeunload = null')
|
104
|
+
FileUtils.rm_rf(downloads_dir) if selenium?
|
105
|
+
end
|
123
106
|
|
124
|
-
|
125
|
-
|
126
|
-
ENV['HOME'] = @_home
|
127
|
-
Rails.env = ENV['RAILS_ENV'] = @_rails_env
|
107
|
+
config.before(javascript: true, standalone: true) do
|
108
|
+
page.driver.restart
|
128
109
|
|
129
|
-
|
130
|
-
|
110
|
+
@_rails_env = Rails.env
|
111
|
+
Rails.env = ENV['RAILS_ENV'] = 'standalone'
|
112
|
+
@_home = ENV['HOME']
|
113
|
+
@_tmpdir = ENV['HOME'] = Dir.mktmpdir('smalruby-')
|
114
|
+
end
|
131
115
|
|
132
|
-
|
133
|
-
|
134
|
-
|
116
|
+
config.after(javascript: true, standalone: true) do
|
117
|
+
FileUtils.remove_entry_secure(@_tmpdir)
|
118
|
+
ENV['HOME'] = @_home
|
119
|
+
Rails.env = ENV['RAILS_ENV'] = @_rails_env
|
135
120
|
|
136
|
-
|
137
|
-
DatabaseRewinder.clean
|
138
|
-
end
|
121
|
+
page.driver.restart
|
139
122
|
end
|
140
|
-
end
|
141
|
-
|
142
|
-
Spork.each_run do
|
143
|
-
# This code will be run each time you run your specs.
|
144
123
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
# railties-3.2.3/lib/rails/application/finisher.rb あたりを参考に
|
149
|
-
Rails.application.reloaders.each { |reloader| reloader.execute_if_updated }
|
124
|
+
config.before :suite do
|
125
|
+
DatabaseRewinder.clean_all
|
126
|
+
end
|
150
127
|
|
151
|
-
|
152
|
-
|
128
|
+
config.after :each do
|
129
|
+
DatabaseRewinder.clean
|
153
130
|
end
|
154
131
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smalruby-editor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.24
|
5
5
|
platform: x86-mingw32
|
6
6
|
authors:
|
7
7
|
- Kouji Takao
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -80,20 +80,6 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 4.0.0
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: turbolinks
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :runtime
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: jbuilder
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -252,6 +238,7 @@ files:
|
|
252
238
|
- ".ruby-version"
|
253
239
|
- ".simplecov"
|
254
240
|
- ".travis.yml"
|
241
|
+
- Guardfile
|
255
242
|
- LEGAL
|
256
243
|
- LICENSE
|
257
244
|
- Procfile
|
@@ -403,7 +390,10 @@ files:
|
|
403
390
|
- bin/bundle
|
404
391
|
- bin/rails
|
405
392
|
- bin/rake
|
393
|
+
- bin/rspec
|
406
394
|
- bin/smalruby-editor
|
395
|
+
- bin/spring
|
396
|
+
- bin/teaspoon
|
407
397
|
- config.ru
|
408
398
|
- config/application.rb
|
409
399
|
- config/boot.rb
|
@@ -450,10 +440,10 @@ files:
|
|
450
440
|
- public/422.html
|
451
441
|
- public/500.html
|
452
442
|
- public/apple-touch-icon.png
|
453
|
-
- public/assets/application-
|
454
|
-
- public/assets/application-
|
455
|
-
- public/assets/application-
|
456
|
-
- public/assets/application-
|
443
|
+
- public/assets/application-d5358d75a2c4e570c749b333c59b55ab.css
|
444
|
+
- public/assets/application-d5358d75a2c4e570c749b333c59b55ab.css.gz
|
445
|
+
- public/assets/application-fda71a642d958ffbaf90185c471d6e51.js
|
446
|
+
- public/assets/application-fda71a642d958ffbaf90185c471d6e51.js.gz
|
457
447
|
- public/assets/blockly/msg/js/en_us-6f7333af29688596ef863fa36a22cb41.js
|
458
448
|
- public/assets/blockly/msg/js/en_us-6f7333af29688596ef863fa36a22cb41.js.gz
|
459
449
|
- public/assets/blockly/msg/js/ja-d2cbf808bda8180571bc5f39141a98fe.js
|
@@ -474,11 +464,11 @@ files:
|
|
474
464
|
- public/assets/jquery-ui/ui-icons_888888_256x240-ce584ffa171c3ea9a018cf0d7bec65c8.png
|
475
465
|
- public/assets/jquery-ui/ui-icons_cd0a0a_256x240-747e96029e8dedcabc224e5f7d1f2ede.png
|
476
466
|
- public/assets/loading-e77296be32d066d3e29d3bf9803fa417.gif
|
477
|
-
- public/assets/manifest-
|
467
|
+
- public/assets/manifest-1a9856df207640ec658271db34b30dbb.json
|
478
468
|
- public/assets/msg/en_us-893d970ff8061fbe7459f009582c4df5.js
|
479
469
|
- public/assets/msg/en_us-893d970ff8061fbe7459f009582c4df5.js.gz
|
480
|
-
- public/assets/msg/ja-
|
481
|
-
- public/assets/msg/ja-
|
470
|
+
- public/assets/msg/ja-4d22bd0341f464f9d1b9f373121bce6d.js
|
471
|
+
- public/assets/msg/ja-4d22bd0341f464f9d1b9f373121bce6d.js.gz
|
482
472
|
- public/assets/progressbar-ee8fb1222f286f625bbf7332844a6a0c.gif
|
483
473
|
- public/blockly/media/1x1.gif
|
484
474
|
- public/blockly/media/click.mp3
|