glimr 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. data/lib/glimr.rb +2 -0
  2. data/lib/glimr/configurable.rb +37 -0
  3. data/lib/glimr/default_theme/button_bg.png +0 -0
  4. data/lib/glimr/default_theme/button_bg_down.png +0 -0
  5. data/lib/glimr/default_theme/button_cover.png +0 -0
  6. data/lib/glimr/default_theme/button_cover_down.png +0 -0
  7. data/lib/glimr/default_theme/button_focus.png +0 -0
  8. data/lib/glimr/default_theme/checkbox_bg.png +0 -0
  9. data/lib/glimr/default_theme/checkbox_checked_bg.png +0 -0
  10. data/lib/glimr/default_theme/font.ttf +0 -0
  11. data/lib/glimr/default_theme/hscroller_bg.png +0 -0
  12. data/lib/glimr/default_theme/radiobutton_bg.png +0 -0
  13. data/lib/glimr/default_theme/radiobutton_checked_bg.png +0 -0
  14. data/lib/glimr/default_theme/resizer_down.png +0 -0
  15. data/lib/glimr/default_theme/resizer_up.png +0 -0
  16. data/lib/glimr/default_theme/scroll_down_down.png +0 -0
  17. data/lib/glimr/default_theme/scroll_down_up.png +0 -0
  18. data/lib/glimr/default_theme/scroll_hknob_down.png +0 -0
  19. data/lib/glimr/default_theme/scroll_hknob_up.png +0 -0
  20. data/lib/glimr/default_theme/scroll_left_down.png +0 -0
  21. data/lib/glimr/default_theme/scroll_left_up.png +0 -0
  22. data/lib/glimr/default_theme/scroll_right_down.png +0 -0
  23. data/lib/glimr/default_theme/scroll_right_up.png +0 -0
  24. data/lib/glimr/default_theme/scroll_up_down.png +0 -0
  25. data/lib/glimr/default_theme/scroll_up_up.png +0 -0
  26. data/lib/glimr/default_theme/scroll_vknob_down.png +0 -0
  27. data/lib/glimr/default_theme/scroll_vknob_up.png +0 -0
  28. data/lib/glimr/default_theme/text_cursor.png +0 -0
  29. data/lib/glimr/default_theme/text_cursor_insert.png +0 -0
  30. data/lib/glimr/default_theme/text_input_bg.png +0 -0
  31. data/lib/glimr/default_theme/vscroller_bg.png +0 -0
  32. data/lib/glimr/event.rb +41 -0
  33. data/lib/glimr/eventlistener.rb +209 -0
  34. data/lib/glimr/layoutable.rb +520 -0
  35. data/lib/glimr/renderer.rb +2 -0
  36. data/lib/glimr/renderer/camera.rb +63 -0
  37. data/lib/glimr/renderer/geometry.rb +194 -0
  38. data/lib/glimr/renderer/glutwindow.rb +387 -0
  39. data/lib/glimr/renderer/light.rb +43 -0
  40. data/lib/glimr/renderer/material.rb +66 -0
  41. data/lib/glimr/renderer/model.rb +103 -0
  42. data/lib/glimr/renderer/orthoprojection.rb +21 -0
  43. data/lib/glimr/renderer/raw.rb +34 -0
  44. data/lib/glimr/renderer/sceneobject.rb +279 -0
  45. data/lib/glimr/renderer/shader.rb +14 -0
  46. data/lib/glimr/renderer/texture.rb +280 -0
  47. data/lib/glimr/renderer/transform.rb +322 -0
  48. data/lib/glimr/renderer/viewport.rb +349 -0
  49. data/lib/glimr/renderer_core.rb +10 -0
  50. data/lib/glimr/util.rb +247 -0
  51. data/lib/glimr/widget.rb +87 -0
  52. data/lib/glimr/widgets.rb +37 -0
  53. data/lib/glimr/widgets/button.rb +277 -0
  54. data/lib/glimr/widgets/checkbox.rb +82 -0
  55. data/lib/glimr/widgets/container.rb +84 -0
  56. data/lib/glimr/widgets/image.rb +82 -0
  57. data/lib/glimr/widgets/label.rb +91 -0
  58. data/lib/glimr/widgets/layout.rb +227 -0
  59. data/lib/glimr/widgets/list.rb +28 -0
  60. data/lib/glimr/widgets/radiogroup.rb +118 -0
  61. data/lib/glimr/widgets/resizer.rb +31 -0
  62. data/lib/glimr/widgets/scrollable_container.rb +67 -0
  63. data/lib/glimr/widgets/scrollbar.rb +496 -0
  64. data/lib/glimr/widgets/stretchable_image.rb +135 -0
  65. data/lib/glimr/widgets/text_editor.rb +349 -0
  66. data/tests/assets/datatowers_crop.jpg +0 -0
  67. data/tests/assets/download_progress_meter.png +0 -0
  68. data/tests/assets/metalwing2.png +0 -0
  69. data/tests/assets/redhairgreeneyes3.jpg +0 -0
  70. data/tests/demo_apps/spinning_ruby.rb +37 -0
  71. data/tests/integration_tests/run_all.rb +8 -0
  72. data/tests/integration_tests/test_button.rb +22 -0
  73. data/tests/integration_tests/test_checkbox.rb +21 -0
  74. data/tests/integration_tests/test_container.rb +22 -0
  75. data/tests/integration_tests/test_label.rb +12 -0
  76. data/tests/integration_tests/test_layout.rb +43 -0
  77. data/tests/integration_tests/test_radiogroup.rb +16 -0
  78. data/tests/integration_tests/test_renderer.rb +44 -0
  79. data/tests/integration_tests/test_renderer2.rb +36 -0
  80. data/tests/integration_tests/test_scrollable_container.rb +34 -0
  81. data/tests/integration_tests/test_scrollbar.rb +20 -0
  82. data/tests/integration_tests/test_stretchable_image.rb +34 -0
  83. data/tests/integration_tests/test_text_input.rb +20 -0
  84. data/tests/integration_tests/test_zsort.rb +18 -0
  85. data/tests/unit_tests/test_button.rb +93 -0
  86. data/tests/unit_tests/test_checkbox.rb +35 -0
  87. data/tests/unit_tests/test_label.rb +36 -0
  88. data/tests/unit_tests/test_layout.rb +229 -0
  89. data/tests/unit_tests/test_widget.rb +3 -0
  90. metadata +139 -0
@@ -0,0 +1,35 @@
1
+ require 'glimr'
2
+ require 'test/unit'
3
+
4
+ class TestCheckbox < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @c = GlimR::Checkbox.new(:label => "Checkbox")
8
+ end
9
+
10
+ def test_label
11
+ assert_equal "Checkbox", @c.label
12
+ @c.label = "Foo"
13
+ assert_equal "Foo", @c.label
14
+ @c.label = "Bar"
15
+ assert_equal "Bar", @c.label
16
+ end
17
+
18
+ def test_change
19
+ state = @c.state
20
+ changed = false
21
+ assert_equal false, state
22
+ assert_equal false, changed
23
+ @c.on_change{|o,e|
24
+ changed = true
25
+ }
26
+ assert_equal false, @c.state
27
+ assert_equal false, changed
28
+ @c.multicast_event(GlimR::Event.new(:activate))
29
+ assert_equal true, @c.state
30
+ assert_equal true, changed
31
+ end
32
+
33
+
34
+ end
35
+
@@ -0,0 +1,36 @@
1
+ require 'glimr'
2
+ require 'test/unit'
3
+
4
+
5
+ class TestLabel < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @l = GlimR::Label.new(:text => "My Label")
9
+ end
10
+
11
+ def test_changing_label
12
+ assert_equal "My Label", @l.text
13
+ @l.text = "Your Label"
14
+ assert_equal "Your Label", @l.text
15
+ end
16
+
17
+ def test_dimensions_change
18
+ w,h = @l.width, @l.height
19
+
20
+ @l.text = "This is a really really long label"
21
+ w2,h2 = @l.width, @l.height
22
+ assert_equal h, h2
23
+ assert w2 > w
24
+
25
+ @l.text = "Short"
26
+ w2,h2 = @l.width, @l.height
27
+ assert_equal h, h2
28
+ assert w2 < w
29
+
30
+ @l.text = "My Label\nHas\nMany\nLines"
31
+ w3,h3 = @l.width, @l.height
32
+ assert_equal w, w3
33
+ assert h3 > h
34
+ end
35
+
36
+ end
@@ -0,0 +1,229 @@
1
+ require 'glimr'
2
+ require 'test/unit'
3
+
4
+ class LayoutTest < Test::Unit::TestCase
5
+ include GlimR
6
+
7
+ def test_create_layoutable
8
+ l = Widget.new(:width => 40, :height => 30)
9
+ assert_equal 40, l.width
10
+ assert_equal 30, l.height
11
+ assert_equal 0, l.margin.left
12
+ assert_equal 0, l.margin.top
13
+ assert_equal 0, l.margin.bottom
14
+ assert_equal 0, l.margin.right
15
+ assert_equal 0, l.padding.left
16
+ assert_equal 0, l.padding.top
17
+ assert_equal 0, l.padding.bottom
18
+ assert_equal 0, l.padding.right
19
+ l
20
+ end
21
+
22
+ def test_set_margin
23
+ l = test_create_layoutable
24
+ l.margin = {:left => 30, :top => 20}
25
+ assert_equal 30, l.margin.left
26
+ assert_equal 20, l.margin.top
27
+ assert_equal 0, l.margin.bottom
28
+ assert_equal 0, l.margin.right
29
+ l.margin = 10
30
+ assert_equal 10, l.margin.left
31
+ assert_equal 10, l.margin.right
32
+ assert_equal 10, l.margin.top
33
+ assert_equal 10, l.margin.bottom
34
+ m = l.margin
35
+ m.left = 20
36
+ l.margin = m
37
+ assert_equal 20, l.margin.left
38
+ assert_equal 10, l.margin.right
39
+ assert_equal 10, l.margin.top
40
+ assert_equal 10, l.margin.bottom
41
+ l.margin = {:left => 20, :right => 20}
42
+ assert_equal 20, l.margin.left
43
+ assert_equal 20, l.margin.right
44
+ assert_equal 10, l.margin.top
45
+ assert_equal 10, l.margin.bottom
46
+ l.margin = 0
47
+ assert_equal 0, l.margin.left
48
+ assert_equal 0, l.margin.right
49
+ assert_equal 0, l.margin.top
50
+ assert_equal 0, l.margin.bottom
51
+ end
52
+
53
+ def test_create_hlayout
54
+ lo = HLayout.new
55
+ assert_equal 0, lo.width
56
+ assert_equal 0, lo.height
57
+ l = test_create_layoutable
58
+ l2 = test_create_layoutable
59
+ lo.attach l
60
+ assert_equal l.width, lo.width
61
+ assert_equal l.height, lo.height
62
+ lo.padding = 2
63
+ assert_equal l.width + 4, lo.width
64
+ assert_equal l.height + 4, lo.height
65
+ lo.attach l2
66
+ assert_equal l.full_width * 2 + lo.item_spacing, lo.inner_width
67
+ assert_equal l.full_height, lo.inner_height
68
+ lo.item_spacing = 0
69
+ assert_equal l.full_width * 2 + lo.item_spacing, lo.inner_width
70
+ assert_equal l.full_height + 4, lo.height
71
+ l.margin = 10
72
+ assert_equal l.width * 2 + 24, lo.width
73
+ assert_equal l.height + 24, lo.height
74
+ end
75
+
76
+ def test_create_vlayout
77
+ lo = VLayout.new
78
+ assert_equal 0, lo.width
79
+ assert_equal 0, lo.height
80
+ l = test_create_layoutable
81
+ l2 = test_create_layoutable
82
+ lo.attach l
83
+ assert_equal l.width, lo.width
84
+ assert_equal l.height, lo.height
85
+ lo.padding = 2
86
+ assert_equal l.width + 4, lo.width
87
+ assert_equal l.height + 4, lo.height
88
+ lo << l2
89
+ assert_equal l.width + 4, lo.width
90
+ assert_equal l.height * 2 + 4 + lo.item_spacing, lo.height
91
+ lo.item_spacing = 0
92
+ assert_equal l.width + 4, lo.width
93
+ assert_equal l.height * 2 + 4 + lo.item_spacing, lo.height
94
+ l.margin = 10
95
+ assert_equal l.height * 2 + 24, lo.height
96
+ assert_equal l.width + 24, lo.width
97
+ end
98
+
99
+ def test_expand_layout
100
+ vl = VLayout.new(:item_spacing => 0)
101
+ hl = HLayout.new
102
+ hl.width = 100
103
+ hl.height = 100
104
+ #~ p 'vl << hl'
105
+ vl << hl
106
+ assert_equal 100, vl.width
107
+ assert_equal 100, vl.height
108
+ assert_equal 100, hl.width
109
+ assert_equal 100, hl.height
110
+ #~ p 'vl.min_width = 200'
111
+ vl.min_width = 200
112
+ assert_equal 200, vl.width
113
+ assert_equal 100, vl.height
114
+ #~ p 'vl.min_width = 100'
115
+ vl.min_width = 100
116
+ #~ p 'vl.min_height = 200'
117
+ vl.min_height = 200
118
+ assert_equal 100, vl.width
119
+ assert_equal 200, vl.height
120
+ #~ p 'vl.min_width = 200'
121
+ vl.min_width = 200
122
+ assert_equal 100, hl.width
123
+ assert_equal 100, hl.height
124
+ #~ p 'hl.expand_width = true'
125
+ hl.expand_width = true
126
+ assert_equal 200, vl.width
127
+ assert_equal 200, vl.height
128
+ assert_equal 200, hl.width
129
+ assert_equal 100, hl.height
130
+ #~ p 'hl.expand_height = true'
131
+ hl.expand_height = true
132
+ assert_equal 200, vl.width
133
+ assert_equal 200, vl.height
134
+ assert_equal 200, hl.width
135
+ assert_equal 200, hl.height
136
+ hl2 = HLayout.new(:width => 50, :height => 50, :fit_children => false)
137
+ #~ p 'vl << hl2'
138
+ vl << hl2
139
+ assert_equal 50, hl2.width
140
+ assert_equal 50, hl2.height
141
+ assert_equal 200, vl.width
142
+ assert_equal 200, vl.height
143
+ assert_equal 200, hl.width
144
+ assert_equal 150, hl.height
145
+ hl2.expand_width = true
146
+ assert_equal 200, hl2.width
147
+ assert_equal 50, hl2.height
148
+ assert_equal 200, vl.width
149
+ assert_equal 200, vl.height
150
+ assert_equal 200, hl.width
151
+ assert_equal 150, hl.height
152
+ vl.item_spacing = 2
153
+ assert_equal 200, hl2.width
154
+ assert_equal 50, hl2.height
155
+ assert_equal 200, vl.width
156
+ assert_equal 200, vl.height
157
+ assert_equal 200, hl.width
158
+ assert_equal 148, hl.height
159
+ hl3 = HLayout.new(:width => 250, :height => 50, :fit_children => false)
160
+ #~ p 'vl << hl3'
161
+ vl << hl3
162
+ assert_equal 250, hl3.width
163
+ assert_equal 50, hl3.height
164
+ assert_equal 250, vl.width
165
+ assert_equal 200, vl.height
166
+ assert_equal 250, hl2.width
167
+ assert_equal 50, hl2.height
168
+ assert_equal 250, hl.width
169
+ assert_equal 96, hl.height
170
+ hl4 = HLayout.new(:expand_height => true, :width => 20, :fit_children => false)
171
+ vl << hl4
172
+ assert_equal 250, hl3.width
173
+ assert_equal 50, hl3.height
174
+ assert_equal 250, hl2.width
175
+ assert_equal 50, hl2.height
176
+ assert_equal 250, vl.width
177
+ assert_equal 200, vl.height
178
+ assert_equal 250, hl.width
179
+ assert_equal 47, hl.height
180
+ assert_equal 20, hl4.width
181
+ assert_equal 47, hl4.height
182
+ end
183
+
184
+ def test_nested_expand
185
+ root = GlimR::HLayout.new(
186
+ :fit_children => false,
187
+ :width => 640, :height => 480)
188
+ vl = GlimR::VLayout.new(:expand_width => true, :expand_height => true)
189
+ hl = GlimR::HLayout.new(:expand_width => true, :expand_height => true)
190
+ exp_h = GlimR::Widget.new(:expand_width => true)
191
+ exp_v = GlimR::Widget.new(:expand_height => true)
192
+ hl << exp_h
193
+ vl << exp_v << hl
194
+ root << vl
195
+ assert_equal(640, root.width)
196
+ assert_equal(480, root.height)
197
+ assert_equal(640, vl.width)
198
+ assert_equal(480, vl.height)
199
+ assert_equal(640, hl.width)
200
+ assert_equal(239, hl.height)
201
+ assert_equal(640, exp_h.width)
202
+ assert_equal(239, exp_v.height)
203
+ end
204
+
205
+ def test_nested_constant_root
206
+ root = GlimR::Widget.new(
207
+ :fit_children => false,
208
+ :width => 640, :height => 480)
209
+ vl = GlimR::VLayout.new(:item_spacing => 0)
210
+ hl = GlimR::HLayout.new(:item_spacing => 0)
211
+ exp_h = GlimR::Widget.new(:expand_width => true)
212
+ exp_v = GlimR::Widget.new(:expand_height => true)
213
+ hl << exp_h
214
+ vl << exp_v << hl
215
+ root << vl
216
+ assert_equal(640, root.width)
217
+ assert_equal(480, root.height)
218
+ assert_equal(640, vl.width)
219
+ assert_equal(480, vl.height)
220
+ assert_equal(640, hl.width)
221
+ assert_equal(0, hl.height)
222
+ assert_equal(640, exp_h.width)
223
+ assert_equal(0, exp_h.height)
224
+ assert_equal(480, exp_v.height)
225
+ assert_equal(0, exp_v.width)
226
+ end
227
+
228
+ end
229
+
@@ -0,0 +1,3 @@
1
+ require 'glimr'
2
+ require 'test/unit'
3
+
metadata ADDED
@@ -0,0 +1,139 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.0
3
+ specification_version: 1
4
+ name: glimr
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.1.0
7
+ date: 2006-07-15 00:00:00 +03:00
8
+ summary: Ruby OpenGL GUI Widget Kit
9
+ require_paths:
10
+ - lib
11
+ email: ilmari.heikkinen@gmail.com
12
+ homepage: glimr.rubyforge.org
13
+ rubyforge_project: glimr
14
+ description:
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: false
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.8.1
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Ilmari Heikkinen
31
+ files:
32
+ - lib/glimr.rb
33
+ - lib/glimr/eventlistener.rb
34
+ - lib/glimr/widgets.rb
35
+ - lib/glimr/renderer.rb
36
+ - lib/glimr/renderer_core.rb
37
+ - lib/glimr/event.rb
38
+ - lib/glimr/widget.rb
39
+ - lib/glimr/configurable.rb
40
+ - lib/glimr/util.rb
41
+ - lib/glimr/layoutable.rb
42
+ - lib/glimr/renderer/viewport.rb
43
+ - lib/glimr/renderer/shader.rb
44
+ - lib/glimr/renderer/model.rb
45
+ - lib/glimr/renderer/texture.rb
46
+ - lib/glimr/renderer/geometry.rb
47
+ - lib/glimr/renderer/sceneobject.rb
48
+ - lib/glimr/renderer/raw.rb
49
+ - lib/glimr/renderer/camera.rb
50
+ - lib/glimr/renderer/glutwindow.rb
51
+ - lib/glimr/renderer/material.rb
52
+ - lib/glimr/renderer/orthoprojection.rb
53
+ - lib/glimr/renderer/light.rb
54
+ - lib/glimr/renderer/transform.rb
55
+ - lib/glimr/widgets/scrollable_container.rb
56
+ - lib/glimr/widgets/scrollbar.rb
57
+ - lib/glimr/widgets/checkbox.rb
58
+ - lib/glimr/widgets/list.rb
59
+ - lib/glimr/widgets/resizer.rb
60
+ - lib/glimr/widgets/stretchable_image.rb
61
+ - lib/glimr/widgets/button.rb
62
+ - lib/glimr/widgets/image.rb
63
+ - lib/glimr/widgets/label.rb
64
+ - lib/glimr/widgets/layout.rb
65
+ - lib/glimr/widgets/text_editor.rb
66
+ - lib/glimr/widgets/container.rb
67
+ - lib/glimr/widgets/radiogroup.rb
68
+ - lib/glimr/default_theme/scroll_hknob_up.png
69
+ - lib/glimr/default_theme/button_cover_down.png
70
+ - lib/glimr/default_theme/scroll_vknob_up.png
71
+ - lib/glimr/default_theme/button_focus.png
72
+ - lib/glimr/default_theme/radiobutton_checked_bg.png
73
+ - lib/glimr/default_theme/checkbox_checked_bg.png
74
+ - lib/glimr/default_theme/radiobutton_bg.png
75
+ - lib/glimr/default_theme/scroll_up_down.png
76
+ - lib/glimr/default_theme/scroll_right_up.png
77
+ - lib/glimr/default_theme/text_cursor_insert.png
78
+ - lib/glimr/default_theme/scroll_left_up.png
79
+ - lib/glimr/default_theme/scroll_down_down.png
80
+ - lib/glimr/default_theme/button_bg.png
81
+ - lib/glimr/default_theme/scroll_hknob_down.png
82
+ - lib/glimr/default_theme/scroll_left_down.png
83
+ - lib/glimr/default_theme/scroll_vknob_down.png
84
+ - lib/glimr/default_theme/resizer_up.png
85
+ - lib/glimr/default_theme/vscroller_bg.png
86
+ - lib/glimr/default_theme/scroll_right_down.png
87
+ - lib/glimr/default_theme/hscroller_bg.png
88
+ - lib/glimr/default_theme/text_cursor.png
89
+ - lib/glimr/default_theme/resizer_down.png
90
+ - lib/glimr/default_theme/checkbox_bg.png
91
+ - lib/glimr/default_theme/button_cover.png
92
+ - lib/glimr/default_theme/scroll_up_up.png
93
+ - lib/glimr/default_theme/button_bg_down.png
94
+ - lib/glimr/default_theme/scroll_down_up.png
95
+ - lib/glimr/default_theme/text_input_bg.png
96
+ - lib/glimr/default_theme/font.ttf
97
+ - tests/unit_tests
98
+ - tests/assets
99
+ - tests/integration_tests
100
+ - tests/demo_apps
101
+ - tests/unit_tests/test_checkbox.rb
102
+ - tests/unit_tests/test_button.rb
103
+ - tests/unit_tests/test_widget.rb
104
+ - tests/unit_tests/test_layout.rb
105
+ - tests/unit_tests/test_label.rb
106
+ - tests/assets/download_progress_meter.png
107
+ - tests/assets/metalwing2.png
108
+ - tests/assets/datatowers_crop.jpg
109
+ - tests/assets/redhairgreeneyes3.jpg
110
+ - tests/integration_tests/test_stretchable_image.rb
111
+ - tests/integration_tests/test_checkbox.rb
112
+ - tests/integration_tests/test_text_input.rb
113
+ - tests/integration_tests/test_container.rb
114
+ - tests/integration_tests/test_radiogroup.rb
115
+ - tests/integration_tests/test_renderer.rb
116
+ - tests/integration_tests/test_button.rb
117
+ - tests/integration_tests/test_scrollable_container.rb
118
+ - tests/integration_tests/test_renderer2.rb
119
+ - tests/integration_tests/run_all.rb
120
+ - tests/integration_tests/test_layout.rb
121
+ - tests/integration_tests/test_label.rb
122
+ - tests/integration_tests/test_scrollbar.rb
123
+ - tests/integration_tests/test_zsort.rb
124
+ - tests/demo_apps/spinning_ruby.rb
125
+ test_files: []
126
+
127
+ rdoc_options: []
128
+
129
+ extra_rdoc_files: []
130
+
131
+ executables: []
132
+
133
+ extensions: []
134
+
135
+ requirements:
136
+ - Ruby-OpenGL >= 0.32g
137
+ - Ruby/SDL >= 1.0.0
138
+ dependencies: []
139
+