atome 0.5.6.6.0 → 0.5.6.6.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e69d3973a46163db0b12ee3798bf424a134ddd776fefe6073565a89b0ede0424
4
- data.tar.gz: 282f0b4f60cfd45aa0347742bc43e58397276ecc2d1d01fc89733100f5f6a4c5
3
+ metadata.gz: 7f9be61ee0a8afe7d2d0945221f3b5939b87c8b580042008b3074af983e82093
4
+ data.tar.gz: d070e19b2b11923efeae91f05c28c0e309ab787c6f93570f44bac6b2d4a2e999
5
5
  SHA512:
6
- metadata.gz: ec25093999f6c76f352800e9dd49b30babe2cf5d2816e2a0e3f43c93592be2a76bded2a1327916d1037c582fd08234db9f937c4a87a2ae52c87161822ef6d086
7
- data.tar.gz: f61645010752da69b7d3e2c62bfb92f8c237e5f3b731f12077949e6daafc466f0c14f3b21982878850a57f006f80e68c989c1b4b29692a0c1304f3587268ec4c
6
+ metadata.gz: 3b0e7f9c9fffea9072d6e4d09b91f99b5dc2ee2d465837b77ab7ad9fdaa20f56fd7897bc1befb047e8f81a60751ea1d074122abf30e7cf17dc72eba3109d87bf
7
+ data.tar.gz: 127a3ce37bb809b9e664c5188cdf2f0478624da98f89357f671e5de6af4a5544cb9ee35b99efe305a53e1b26fbb43a53d00a72a6103aff6eb6bfb6677ebcdd48
data/lib/atome/atome.rb CHANGED
@@ -44,8 +44,15 @@ class Atome
44
44
  @int8 = {}
45
45
  @css = {}
46
46
  @aid = identity_generator
47
- Universe.add_to_atomes(@aid, self)
47
+
48
48
  @id = new_atome[:id] || @aid
49
+ Universe.atomes.each do |_aid,atome_f|
50
+ if atome_f.id == @id
51
+ puts "===> no for #{@id}"
52
+ return false
53
+ end
54
+ end
55
+ Universe.add_to_atomes(@aid, self)
49
56
  Universe.id_to_aid(@id, @aid)
50
57
  @type = new_atome[:type] || :element
51
58
  @attached = []
@@ -2,42 +2,15 @@
2
2
 
3
3
  new({ atome: :color, type: :hash })
4
4
 
5
- # new({ post: :color }) do |params|
6
- # puts "====> #{params}"
7
- # params
8
- # end
9
- # new({ pre: :color}) do |params|
10
- # alert "==> pre color params : #{params}"
11
- # end
12
-
13
- # new({ atome: :color, type: :hash })do |params|
14
- # puts "1 #{params}______"
15
- # params
16
- # end
17
-
18
- # new ({post: :color}) do |params|
19
- # # # TODO : hack must call it properly thru renderer
20
- # # params[:affect].each do |affected|
21
- # # grab(affected).html.reset_background
22
- # # end
23
- # end
24
5
  new({ sanitizer: :color }) do |params|
25
- # alert "sanitizer color: #{params}"
26
6
  params = create_color_hash(params) unless params.instance_of? Hash
27
- # if params[:id]
28
- # alert "id is #{params[:id]}"
29
- # end
30
- # the condition below is to prevent the creation of multiple unwanted colors with same property and no ID specified
31
7
  unless params[:id]
32
8
  uniq_value = "#{params[:red].to_s.sub('.', '_')}_#{params[:green].to_s.sub('.', '_')}_#{params[:blue].to_s.sub('.', '_')}_#{params[:alpha].to_s.sub('.', '_')}_#{params[:left].to_s.sub('.', '_')}_#{params[:top].to_s.sub('.', '_')}_#{params[:diffusion].to_s.sub('.', '_')}"
33
- params[:id] = "#{@id}_color_#{uniq_value}".to_sym
9
+ params[:id] = "color_#{uniq_value}".to_sym
34
10
  end
35
11
  params
36
12
  end
37
- # new({ post: :color }) do
38
- #
39
- # # Atome.global_monitoring(self, [:red, :blue, :blue, :alpha, :left, :right, :diffusion], [:variable1, :variable2])
40
- # end
13
+
41
14
  new({ atome: :image })
42
15
  new({ sanitizer: :image }) do |params|
43
16
  unless params.instance_of? Hash
@@ -131,8 +104,6 @@ new({ atome: :vector })
131
104
  new({ atome: :matrix })
132
105
  new({ atome: :atomized, type: :hash })
133
106
 
134
- # new({ atome: :color, type: :model })
135
- # new({ atome: :color, type: :template })
136
107
 
137
108
 
138
109
 
@@ -3,6 +3,7 @@
3
3
  new({ particle: :touch, category: :event, type: :hash, store: false })
4
4
  new({ sanitizer: :touch }) do |params, user_bloc|
5
5
  # TODO: factorise code below
6
+ # alert "touch_code: #{@touch_code}"
6
7
  @touch ||= {}
7
8
  @touch_code ||= {}
8
9
  option = true
@@ -7,20 +7,23 @@ new({ sanitizer: :id }) do |params|
7
7
  # first we sanitize the the id below
8
8
 
9
9
  params = params.to_sym
10
- # # we check id is already assign
11
- # if Universe.atomes[params]
12
- # # we reassign the old id
13
- # puts "the id : #{params} is already used"
14
- # params = @id
15
- # # return false
16
- # else
17
- if @id.to_sym != params
18
- Universe.update_atome_id(params, self, @id)
19
- else
20
- Universe.add_to_atomes(params, self)
21
- end
10
+ # we check id is already assign
11
+ # the condition below is to prevent the creation of multiple unwanted colors with same property and no ID specified
12
+ # if @id.to_sym != params
13
+ # Universe.update_atome_id(params, self, @id)
14
+ # else
15
+ # Universe.add_to_atomes(params, self)
16
+ # end
22
17
 
18
+
19
+ # Universe.atomes.each do |_aid,atome_f|
20
+ #
21
+ # if atome_f.id == params
22
+ # puts "===> no for #{params}"
23
+ # end
24
+ #
23
25
  # end
26
+
24
27
  params
25
28
  end
26
29
  new({ particle: :name, category: :identity, type: :string })
@@ -114,3 +114,6 @@ new({ after: :pattern })do |params|
114
114
  params
115
115
  end
116
116
  # new({ particle: :border, category: :material, type: :int })
117
+ new({particle: :fill, category: :material, type: :array })
118
+
119
+ new({particle: :opacity, category: :material, type: :int })
@@ -35,7 +35,7 @@ new({ particle: :delete, category: :utility, type: :boolean, render: false }) do
35
35
  id_found = @id.to_sym
36
36
  parent_found = grab(@attach)
37
37
  parent_found.attached.delete(id_found)
38
- Universe.delete(@id)
38
+ Universe.delete(@aid)
39
39
  end
40
40
  elsif params.instance_of? Hash
41
41
 
@@ -211,5 +211,4 @@ def user_login
211
211
 
212
212
  end
213
213
 
214
- puts '------------------------'
215
214
  Universe.allow_history=true
@@ -105,16 +105,21 @@ class Universe
105
105
  def id_to_aid(id, aid)
106
106
  @atomes_ids[id] = aid
107
107
  end
108
-
109
- def update_atome_id(id, atome, prev_id)
110
- @atomes[id] = atome
111
- @atomes.delete(prev_id)
112
- end
108
+ # def update_atome_id(aid, atome, prev_id)
109
+ # @atomes[id] = atome
110
+ # @atomes.delete(prev_id)
111
+ # end
112
+ # def update_atome_id(id, atome, prev_id)
113
+ # @atomes[id] = atome
114
+ # @atomes.delete(prev_id)
115
+ # end
113
116
 
114
117
  def user_atomes
115
118
  collected_id = []
116
119
  @atomes.each do |id_found, atome_found|
117
- collected_id << id_found unless atome_found.tag && atome_found.tag[:system]
120
+ # collected_id << id_found unless atome_found.tag && atome_found.tag[:system]
121
+ collected_id << atome_found.id unless atome_found.tag && atome_found.tag[:system]
122
+
118
123
  end
119
124
  collected_id
120
125
  end
data/lib/atome/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  # return atome version
4
4
  class Atome
5
- VERSION = '0.5.6.6.0'
5
+ VERSION = '0.5.6.6.5'
6
6
  end
@@ -24,6 +24,7 @@ class HTML
24
24
  @element ||= JS.global[:document].getElementById(id_found.to_s)
25
25
  @id = id_found
26
26
  @original_atome = current_atome
27
+ @touch_removed = {}
27
28
  end
28
29
 
29
30
  def object
@@ -200,7 +201,6 @@ class HTML
200
201
 
201
202
  # alert "hyperedit"
202
203
 
203
-
204
204
  particles_found = particles_found.merge(particles_from_style)
205
205
  current_atome = grab(@id)
206
206
  usr_bloc.call(particles_found)
@@ -495,6 +495,51 @@ class HTML
495
495
  end
496
496
  end
497
497
 
498
+ def fill(params)
499
+ # we remove previous background
500
+ elements_to_remove = @element.getElementsByClassName('background')
501
+
502
+ elements_to_remove = elements_to_remove.to_a
503
+ elements_to_remove.each do |child|
504
+ @element.removeChild(child)
505
+ end
506
+ params.each do |param|
507
+ background_layer = JS.global[:document].createElement("div")
508
+ background_layer[:style][:transform] = "rotate(#{param[:rotate]}deg)" # Applique une rotation de 45 degrés à l'élément
509
+ background_layer[:style][:position] = "absolute"
510
+
511
+ if param[:position]
512
+ background_layer[:style][:top] = "#{param[:position][:x]}px"
513
+ background_layer[:style][:left] = "#{param[:position][:y]}px"
514
+ else
515
+ background_layer[:style][:top] = "0"
516
+ background_layer[:style][:left] = "0"
517
+ end
518
+
519
+ if param[:size]
520
+ background_layer[:style][:width] = "#{param[:size][:x]}px"
521
+ background_layer[:style][:height] = "#{param[:size][:y]}px"
522
+ else
523
+ background_layer[:style][:width] = "100%"
524
+ background_layer[:style][:height] = "100%"
525
+ end
526
+
527
+ atome_path = grab(param[:atome]).path
528
+ background_layer[:style][:backgroundImage] = "url('#{atome_path}')"
529
+ background_layer[:style][:backgroundRepeat] = 'repeat'
530
+ background_layer[:className] = 'background'
531
+ background_layer[:style][:opacity] = param[:opacity]
532
+ if param[:repeat]
533
+ img_width = @original_atome.width / param[:repeat][:x]
534
+ img_height = @original_atome.height / param[:repeat][:y]
535
+ background_layer[:style][:backgroundSize] = "#{img_width}px #{img_height}px"
536
+ else
537
+ background_layer[:style][:backgroundSize] = "#{param[:width]}px #{param[:height]}px"
538
+ end
539
+ @element.appendChild(background_layer)
540
+ end
541
+ end
542
+
498
543
  def filter(property, value)
499
544
  filter_needed = "#{property}(#{value})"
500
545
  @element[:style][:filter] = filter_needed
@@ -1036,60 +1081,75 @@ class HTML
1036
1081
  def touch_tap(_option)
1037
1082
  interact = JS.eval("return interact('##{@id}')")
1038
1083
  @touch_tap = @original_atome.instance_variable_get('@touch_code')[:tap]
1039
- interact.on('tap') do |native_event|
1040
- event = Native(native_event)
1041
- # we use .call instead of instance_eval because instance_eval bring the current object as context
1042
- # and it's lead to a problem of context and force the use of grab(:view) when suing atome method such as shape ,
1043
- # group etc..
1044
- @touch_tap.call(event) if @touch_tap.is_a?(Proc)
1084
+ unless @touch_removed[:tap]
1085
+ interact.on('tap') do |native_event|
1086
+ event = Native(native_event)
1087
+ # we use .call instead of instance_eval because instance_eval bring the current object as context
1088
+ # and it's lead to a problem of context and force the use of grab(:view) when suing atome method such as shape ,
1089
+ # group etc..
1090
+ @touch_tap.call(event) if @touch_tap.is_a?(Proc)
1091
+ end
1045
1092
  end
1093
+
1046
1094
  end
1047
1095
 
1048
1096
  def touch_double(_option)
1049
1097
  interact = JS.eval("return interact('##{@id}')")
1050
1098
  @touch_double = @original_atome.instance_variable_get('@touch_code')[:double]
1051
- interact.on('doubletap') do |native_event|
1052
- event = Native(native_event)
1053
- # we use .call instead of instance_eval because instance_eval bring the current object as context
1054
- # and it's lead to a problem of context and force the use of grab(:view) when suing atome method such as shape ,
1055
- # group etc..
1056
- @touch_double.call(event) if @touch_double.is_a?(Proc)
1099
+ unless @touch_removed[:double]
1100
+ interact.on('doubletap') do |native_event|
1101
+ event = Native(native_event)
1102
+ # we use .call instead of instance_eval because instance_eval bring the current object as context
1103
+ # and it's lead to a problem of context and force the use of grab(:view) when suing atome method such as shape ,
1104
+ # group etc..
1105
+ @touch_double.call(event) if @touch_double.is_a?(Proc)
1106
+ end
1057
1107
  end
1108
+
1058
1109
  end
1059
1110
 
1060
1111
  def touch_long(_option)
1061
1112
  @touch_long = @original_atome.instance_variable_get('@touch_code')[:long]
1062
1113
  interact = JS.eval("return interact('##{@id}')")
1063
- interact.on('hold') do |native_event|
1064
- event = Native(native_event)
1065
- # we use .call instead of instance_eval because instance_eval bring the current object as context
1066
- # and it's lead to a problem of context and force the use of grab(:view) when suing atome method such as shape ,
1067
- # group etc..
1068
- @touch_long.call(event) if @touch_long.is_a?(Proc)
1114
+ unless @touch_removed[:long]
1115
+ interact.on('hold') do |native_event|
1116
+ event = Native(native_event)
1117
+ # we use .call instead of instance_eval because instance_eval bring the current object as context
1118
+ # and it's lead to a problem of context and force the use of grab(:view) when suing atome method such as shape ,
1119
+ # group etc..
1120
+ @touch_long.call(event) if @touch_long.is_a?(Proc)
1121
+ end
1069
1122
  end
1123
+
1070
1124
  end
1071
1125
 
1072
1126
  def touch_down(_option)
1073
1127
  @touch_down = @original_atome.instance_variable_get('@touch_code')[:down]
1074
1128
  interact = JS.eval("return interact('##{@id}')")
1075
- interact.on('down') do |native_event|
1076
- event = Native(native_event)
1077
- # we use .call instead of instance_eval because instance_eval bring the current object as context
1078
- # and it's lead to a problem of context and force the use of grab(:view) when suing atome method such as shape ,
1079
- # group etc..
1080
- @touch_down.call(event) if @touch_down.is_a?(Proc)
1129
+ unless @touch_removed[:down]
1130
+ interact.on('down') do |native_event|
1131
+ event = Native(native_event)
1132
+ # we use .call instead of instance_eval because instance_eval bring the current object as context
1133
+ # and it's lead to a problem of context and force the use of grab(:view) when suing atome method such as shape ,
1134
+ # group etc..
1135
+ @touch_down.call(event) if @touch_down.is_a?(Proc)
1136
+ end
1137
+
1081
1138
  end
1082
1139
  end
1083
1140
 
1084
1141
  def touch_up(_option)
1085
- @touch_up = @original_atome.instance_variable_get('@touch_code')[:up]
1086
1142
  interact = JS.eval("return interact('##{@id}')")
1087
- interact.on('up') do |native_event|
1088
- event = Native(native_event)
1089
- # we use .call instead of instance_eval because instance_eval bring the current object as context
1090
- # and it's lead to a problem of context and force the use of grab(:view) when suing atome method such as shape ,
1091
- # group etc..
1092
- @touch_up.call(event) if @touch_up.is_a?(Proc)
1143
+ @touch_up = @original_atome.instance_variable_get('@touch_code')[:up]
1144
+ unless @touch_removed[:up]
1145
+ interact.on('up') do |native_event|
1146
+ event = Native(native_event)
1147
+ # we use .call instead of instance_eval because instance_eval bring the current object as context
1148
+ # and it's lead to a problem of context and force the use of grab(:view) when suing atome method such as shape ,
1149
+ # group etc..
1150
+ @touch_up.call(event) if @touch_up.is_a?(Proc)
1151
+ end
1152
+
1093
1153
  end
1094
1154
  end
1095
1155
 
@@ -1097,15 +1157,25 @@ class HTML
1097
1157
  case option
1098
1158
  when :double
1099
1159
  @touch_double = ''
1160
+ @touch_removed[:double] = true
1100
1161
  when :down
1101
1162
  @touch_down = ''
1163
+ @touch_removed[:down] = true
1102
1164
  when :long
1165
+ @touch_removed[:long] = true
1103
1166
  @touch_long = ''
1104
1167
  when :tap
1168
+ @touch_removed[:tap] = true
1105
1169
  @touch_tap = ''
1106
1170
  when :up
1171
+ @touch_removed[:up] = true
1107
1172
  @touch_up = ''
1108
1173
  else
1174
+ @touch_removed[:double] = true
1175
+ @touch_removed[:down] = true
1176
+ @touch_removed[:long] = true
1177
+ @touch_removed[:tap] = true
1178
+ @touch_removed[:up] = true
1109
1179
  @touch_double = ''
1110
1180
  @touch_down = ''
1111
1181
  @touch_long = ''
@@ -72,4 +72,13 @@ end
72
72
  new({ method: :thickness, type: :integer, renderer: :html})
73
73
 
74
74
  # end
75
- new({ method: :pattern, type: :integer, renderer: :html})
75
+ new({ method: :pattern, type: :integer, renderer: :html})
76
+
77
+ new({ method: :fill, renderer: :html }) do |params|
78
+ html.fill(params)
79
+ end
80
+
81
+ new({ method: :opacity, type: :integer, renderer: :html}) do |value|
82
+ # html.opacity(value)
83
+ html.style('opacity',value)
84
+ end
@@ -4,4 +4,7 @@
4
4
  # aid is used to provide an unique and persistent id for any atome
5
5
  b=box({ left: 12, id: :the_first_box })
6
6
 
7
- puts " atome aid is : #{ b.aid}"
7
+ puts " atome aid is : #{b.aid}"
8
+ wait 1 do
9
+ hook(b.aid).color(:red)
10
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ b=box({width: 300, height: 333, color: {alpha: 0}})
4
+ image({id: :logo,path: 'medias/images/logos/atome.svg', width: 66, left: 555})
5
+ grab(:black_matter).image({id: :planet,path: 'medias/images/red_planet.png', width: 66,height: 66, left: 555, top: 180})
6
+
7
+
8
+ b.fill([atome: :logo, width: 33, height: 33 ])
9
+ b.overflow(:hidden)
10
+ wait 1 do
11
+ b.fill([atome: :planet, width: 33, height: 33 ])
12
+ wait 1 do
13
+ b.fill([{atome: :planet,repeat: {x: 5, y: 3}}])
14
+ wait 1 do
15
+ b.fill([{atome: :planet,width: 33, height: 33 ,rotate: 33, size: { x: 800,y: 600 }, position: { x:-200,y: -200 } }])
16
+ wait 3 do
17
+ b.fill([{atome: :planet,repeat: {x: 5, y: 3}}, { atome: :logo, width: 33, height: 33 , opacity: 0.3} ])
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ b.drag(true)
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ image({id: :planet,path: 'medias/images/red_planet.png', width: 66,height: 66, left: 33, top: 33})
4
+ b=box({width: 66, height: 66, color: :yellowgreen})
5
+
6
+ wait 1 do
7
+
8
+ b.opacity(0.3)
9
+ end
@@ -1 +1,4 @@
1
1
  # frozen_string_literal: true
2
+
3
+
4
+
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ color({ id: :creation_layer_col, alpha: 1 })
4
+
5
+ b = box({ top: :auto, bottom: 0, id: :box_tool })
6
+
7
+ b.touch(:down) do
8
+ creation_layer = box({ top: 0, left: 0, id: :creation_layer, width: '100%', height: '100%', apply: :creation_layer_col })
9
+ creation_layer.touch(:down) do |event|
10
+ left_found = event[:pageX].to_i
11
+ top_found = event[:pageY].to_i
12
+ box({ left: left_found, top: top_found ,id: "tutu_#{Universe.atomes.length}", color: :red})
13
+ creation_layer.delete(true)
14
+ creation_layer.touch({ remove: :down })
15
+ puts Universe.atomes.length
16
+ puts "=> #{Universe.user_atomes}"
17
+ end
18
+ end
19
+
20
+ # c= color({ red: 1, id: :toto })
21
+ # # puts c.aid
22
+ # puts Universe.atomes.length
23
+ # wait 0.5 do
24
+ # c= color({ red: 1, id: :toto })
25
+ # # puts c.aid
26
+ # puts Universe.atomes.length
27
+ # end
28
+
29
+ # wait 1 do
30
+ # c= color({ red: 1, id: :toto })
31
+ # puts c.aid
32
+ # puts Universe.atomes.length
33
+ # wait 1 do
34
+ # c= color({ red: 1, id: :toto })
35
+ # puts c.aid
36
+ # puts Universe.atomes.length
37
+ # wait 1 do
38
+ # c= color({ red: 1, id: :toto })
39
+ # puts c.aid
40
+ # puts Universe.atomes.length
41
+ # wait 1 do
42
+ # c= color({ red: 1, id: :toto })
43
+ # puts c.aid
44
+ # puts Universe.atomes.length
45
+ # alert "=> #{Universe.user_atomes}"
46
+ # end
47
+ # end
48
+ # end
49
+ # end
@@ -4,7 +4,10 @@ b = box({ left: 666, color: :blue, smooth: 6, id: :the_box2 })
4
4
 
5
5
  t=text({id: :the_text, data: 'type of touch : ?'})
6
6
 
7
- t.touch(:down) do
7
+ t.touch(:down) do |event|
8
+
9
+ puts event[:pageX]
10
+ puts event[:pageY]
8
11
  b.touch({remove: :down})
9
12
  # b.touch(:remove) # or b.touch(false) to remove all touches bindings
10
13
  t.data('touch down killed')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: atome
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.6.6.0
4
+ version: 0.5.6.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean-Eric Godard
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-03-10 00:00:00.000000000 Z
11
+ date: 2024-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: artoo
@@ -553,6 +553,7 @@ files:
553
553
  - vendor/assets/application/examples/encrypt.rb
554
554
  - vendor/assets/application/examples/example.rb
555
555
  - vendor/assets/application/examples/file.rb
556
+ - vendor/assets/application/examples/fill.rb
556
557
  - vendor/assets/application/examples/find.rb
557
558
  - vendor/assets/application/examples/fit.rb
558
559
  - vendor/assets/application/examples/generator_and_build.rb
@@ -579,6 +580,7 @@ files:
579
580
  - vendor/assets/application/examples/on_resize.rb
580
581
  - vendor/assets/application/examples/on_the_fly_ruby_code_loading.rb
581
582
  - vendor/assets/application/examples/online.rb
583
+ - vendor/assets/application/examples/opacity.rb
582
584
  - vendor/assets/application/examples/over.rb
583
585
  - vendor/assets/application/examples/paint.rb
584
586
  - vendor/assets/application/examples/particles.rb
@@ -610,6 +612,7 @@ files:
610
612
  - vendor/assets/application/examples/terminal.rb
611
613
  - vendor/assets/application/examples/test.rb
612
614
  - vendor/assets/application/examples/text.rb
615
+ - vendor/assets/application/examples/tools.rb
613
616
  - vendor/assets/application/examples/touch.rb
614
617
  - vendor/assets/application/examples/type_mutation.rb
615
618
  - vendor/assets/application/examples/unit.rb