shoes-dsl 4.0.0.pre2

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.
Files changed (209) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +84 -0
  3. data/Gemfile +24 -0
  4. data/Guardfile +11 -0
  5. data/LICENSE +31 -0
  6. data/README.md +201 -0
  7. data/ext/install/Rakefile +29 -0
  8. data/ext/install/shoes.bat +9 -0
  9. data/fonts/Coolvetica.ttf +0 -0
  10. data/fonts/Lacuna.ttf +0 -0
  11. data/lib/shoes/animation.rb +56 -0
  12. data/lib/shoes/app.rb +131 -0
  13. data/lib/shoes/arc.rb +25 -0
  14. data/lib/shoes/background.rb +24 -0
  15. data/lib/shoes/border.rb +24 -0
  16. data/lib/shoes/builtin_methods.rb +77 -0
  17. data/lib/shoes/button.rb +30 -0
  18. data/lib/shoes/check_button.rb +44 -0
  19. data/lib/shoes/color.rb +385 -0
  20. data/lib/shoes/common/background_element.rb +9 -0
  21. data/lib/shoes/common/changeable.rb +34 -0
  22. data/lib/shoes/common/clickable.rb +24 -0
  23. data/lib/shoes/common/inspect.rb +14 -0
  24. data/lib/shoes/common/positioning.rb +30 -0
  25. data/lib/shoes/common/registration.rb +33 -0
  26. data/lib/shoes/common/remove.rb +10 -0
  27. data/lib/shoes/common/state.rb +18 -0
  28. data/lib/shoes/common/style.rb +152 -0
  29. data/lib/shoes/common/style_normalizer.rb +16 -0
  30. data/lib/shoes/common/ui_element.rb +11 -0
  31. data/lib/shoes/common/visibility.rb +40 -0
  32. data/lib/shoes/configuration.rb +96 -0
  33. data/lib/shoes/dialog.rb +27 -0
  34. data/lib/shoes/dimension.rb +239 -0
  35. data/lib/shoes/dimensions.rb +209 -0
  36. data/lib/shoes/download.rb +121 -0
  37. data/lib/shoes/dsl.rb +591 -0
  38. data/lib/shoes/font.rb +49 -0
  39. data/lib/shoes/gradient.rb +31 -0
  40. data/lib/shoes/image.rb +29 -0
  41. data/lib/shoes/image_pattern.rb +12 -0
  42. data/lib/shoes/input_box.rb +60 -0
  43. data/lib/shoes/internal_app.rb +219 -0
  44. data/lib/shoes/key_event.rb +17 -0
  45. data/lib/shoes/line.rb +87 -0
  46. data/lib/shoes/link.rb +59 -0
  47. data/lib/shoes/link_hover.rb +5 -0
  48. data/lib/shoes/list_box.rb +50 -0
  49. data/lib/shoes/logger.rb +66 -0
  50. data/lib/shoes/logger/ruby.rb +18 -0
  51. data/lib/shoes/mock.rb +31 -0
  52. data/lib/shoes/mock/animation.rb +8 -0
  53. data/lib/shoes/mock/app.rb +47 -0
  54. data/lib/shoes/mock/arc.rb +9 -0
  55. data/lib/shoes/mock/background.rb +10 -0
  56. data/lib/shoes/mock/border.rb +7 -0
  57. data/lib/shoes/mock/button.rb +10 -0
  58. data/lib/shoes/mock/check.rb +25 -0
  59. data/lib/shoes/mock/clickable.rb +8 -0
  60. data/lib/shoes/mock/common_methods.rb +12 -0
  61. data/lib/shoes/mock/dialog.rb +13 -0
  62. data/lib/shoes/mock/download.rb +18 -0
  63. data/lib/shoes/mock/font.rb +17 -0
  64. data/lib/shoes/mock/image.rb +13 -0
  65. data/lib/shoes/mock/image_pattern.rb +9 -0
  66. data/lib/shoes/mock/input_box.rb +30 -0
  67. data/lib/shoes/mock/keypress.rb +10 -0
  68. data/lib/shoes/mock/keyrelease.rb +10 -0
  69. data/lib/shoes/mock/line.rb +14 -0
  70. data/lib/shoes/mock/link.rb +12 -0
  71. data/lib/shoes/mock/list_box.rb +19 -0
  72. data/lib/shoes/mock/oval.rb +12 -0
  73. data/lib/shoes/mock/progress.rb +10 -0
  74. data/lib/shoes/mock/radio.rb +27 -0
  75. data/lib/shoes/mock/rect.rb +14 -0
  76. data/lib/shoes/mock/shape.rb +20 -0
  77. data/lib/shoes/mock/slot.rb +16 -0
  78. data/lib/shoes/mock/sound.rb +8 -0
  79. data/lib/shoes/mock/star.rb +14 -0
  80. data/lib/shoes/mock/text_block.rb +36 -0
  81. data/lib/shoes/mock/timer.rb +8 -0
  82. data/lib/shoes/not_implemented_error.rb +4 -0
  83. data/lib/shoes/oval.rb +20 -0
  84. data/lib/shoes/point.rb +54 -0
  85. data/lib/shoes/progress.rb +25 -0
  86. data/lib/shoes/radio.rb +16 -0
  87. data/lib/shoes/rect.rb +21 -0
  88. data/lib/shoes/renamed_delegate.rb +15 -0
  89. data/lib/shoes/shape.rb +158 -0
  90. data/lib/shoes/slot.rb +271 -0
  91. data/lib/shoes/slot_contents.rb +50 -0
  92. data/lib/shoes/sound.rb +18 -0
  93. data/lib/shoes/span.rb +16 -0
  94. data/lib/shoes/star.rb +45 -0
  95. data/lib/shoes/text.rb +24 -0
  96. data/lib/shoes/text_block.rb +143 -0
  97. data/lib/shoes/text_block_dimensions.rb +52 -0
  98. data/lib/shoes/timer.rb +12 -0
  99. data/lib/shoes/url.rb +44 -0
  100. data/lib/shoes/version.rb +3 -0
  101. data/lib/shoes/widget.rb +69 -0
  102. data/manifests/common.rb +34 -0
  103. data/manifests/shoes-dsl.rb +34 -0
  104. data/shoes-dsl.gemspec +19 -0
  105. data/spec/code_coverage.rb +14 -0
  106. data/spec/shoes/animation_spec.rb +65 -0
  107. data/spec/shoes/app_spec.rb +484 -0
  108. data/spec/shoes/arc_spec.rb +51 -0
  109. data/spec/shoes/background_spec.rb +53 -0
  110. data/spec/shoes/border_spec.rb +47 -0
  111. data/spec/shoes/builtin_methods_spec.rb +110 -0
  112. data/spec/shoes/button_spec.rb +44 -0
  113. data/spec/shoes/check_spec.rb +35 -0
  114. data/spec/shoes/cli_spec.rb +15 -0
  115. data/spec/shoes/color_spec.rb +408 -0
  116. data/spec/shoes/common/inspect_spec.rb +26 -0
  117. data/spec/shoes/common/remove_spec.rb +38 -0
  118. data/spec/shoes/common/style_normalizer_spec.rb +28 -0
  119. data/spec/shoes/common/style_spec.rb +147 -0
  120. data/spec/shoes/configuration_spec.rb +36 -0
  121. data/spec/shoes/constants_spec.rb +38 -0
  122. data/spec/shoes/dialog_spec.rb +163 -0
  123. data/spec/shoes/dimension_spec.rb +407 -0
  124. data/spec/shoes/dimensions_spec.rb +837 -0
  125. data/spec/shoes/download_spec.rb +142 -0
  126. data/spec/shoes/flow_spec.rb +133 -0
  127. data/spec/shoes/font_spec.rb +37 -0
  128. data/spec/shoes/framework_learning_spec.rb +30 -0
  129. data/spec/shoes/gradient_spec.rb +32 -0
  130. data/spec/shoes/helpers/fake_element.rb +17 -0
  131. data/spec/shoes/helpers/inspect_helpers.rb +5 -0
  132. data/spec/shoes/helpers/sample17_helper.rb +66 -0
  133. data/spec/shoes/image_spec.rb +49 -0
  134. data/spec/shoes/images/shoe.jpg +0 -0
  135. data/spec/shoes/input_box_spec.rb +80 -0
  136. data/spec/shoes/integration_spec.rb +20 -0
  137. data/spec/shoes/internal_app_spec.rb +141 -0
  138. data/spec/shoes/keypress_spec.rb +11 -0
  139. data/spec/shoes/keyrelease_spec.rb +12 -0
  140. data/spec/shoes/line_spec.rb +49 -0
  141. data/spec/shoes/link_spec.rb +105 -0
  142. data/spec/shoes/list_box_spec.rb +74 -0
  143. data/spec/shoes/logger/ruby_spec.rb +8 -0
  144. data/spec/shoes/logger_spec.rb +45 -0
  145. data/spec/shoes/oval_spec.rb +24 -0
  146. data/spec/shoes/point_spec.rb +71 -0
  147. data/spec/shoes/progress_spec.rb +54 -0
  148. data/spec/shoes/radio_spec.rb +32 -0
  149. data/spec/shoes/rect_spec.rb +39 -0
  150. data/spec/shoes/renamed_delegate_spec.rb +70 -0
  151. data/spec/shoes/shape_spec.rb +95 -0
  152. data/spec/shoes/shared_examples/button.rb +6 -0
  153. data/spec/shoes/shared_examples/changeable.rb +26 -0
  154. data/spec/shoes/shared_examples/clickable.rb +5 -0
  155. data/spec/shoes/shared_examples/common_methods.rb +35 -0
  156. data/spec/shoes/shared_examples/dimensions.rb +32 -0
  157. data/spec/shoes/shared_examples/dsl.rb +44 -0
  158. data/spec/shoes/shared_examples/dsl/animate.rb +29 -0
  159. data/spec/shoes/shared_examples/dsl/arc.rb +45 -0
  160. data/spec/shoes/shared_examples/dsl/background.rb +26 -0
  161. data/spec/shoes/shared_examples/dsl/border.rb +10 -0
  162. data/spec/shoes/shared_examples/dsl/button.rb +5 -0
  163. data/spec/shoes/shared_examples/dsl/cap.rb +6 -0
  164. data/spec/shoes/shared_examples/dsl/check.rb +11 -0
  165. data/spec/shoes/shared_examples/dsl/edit_box.rb +8 -0
  166. data/spec/shoes/shared_examples/dsl/edit_line.rb +8 -0
  167. data/spec/shoes/shared_examples/dsl/editable_element.rb +29 -0
  168. data/spec/shoes/shared_examples/dsl/fill.rb +27 -0
  169. data/spec/shoes/shared_examples/dsl/flow.rb +15 -0
  170. data/spec/shoes/shared_examples/dsl/gradient.rb +62 -0
  171. data/spec/shoes/shared_examples/dsl/image.rb +21 -0
  172. data/spec/shoes/shared_examples/dsl/line.rb +9 -0
  173. data/spec/shoes/shared_examples/dsl/nofill.rb +6 -0
  174. data/spec/shoes/shared_examples/dsl/nostroke.rb +6 -0
  175. data/spec/shoes/shared_examples/dsl/oval.rb +88 -0
  176. data/spec/shoes/shared_examples/dsl/pattern.rb +34 -0
  177. data/spec/shoes/shared_examples/dsl/progress.rb +7 -0
  178. data/spec/shoes/shared_examples/dsl/rect.rb +92 -0
  179. data/spec/shoes/shared_examples/dsl/rgb.rb +26 -0
  180. data/spec/shoes/shared_examples/dsl/shape.rb +21 -0
  181. data/spec/shoes/shared_examples/dsl/star.rb +48 -0
  182. data/spec/shoes/shared_examples/dsl/stroke.rb +30 -0
  183. data/spec/shoes/shared_examples/dsl/strokewidth.rb +19 -0
  184. data/spec/shoes/shared_examples/dsl/style.rb +32 -0
  185. data/spec/shoes/shared_examples/dsl/text_elements.rb +81 -0
  186. data/spec/shoes/shared_examples/dsl/video.rb +5 -0
  187. data/spec/shoes/shared_examples/dsl_app_context.rb +8 -0
  188. data/spec/shoes/shared_examples/hover_leave.rb +11 -0
  189. data/spec/shoes/shared_examples/parent.rb +6 -0
  190. data/spec/shoes/shared_examples/scroll.rb +41 -0
  191. data/spec/shoes/shared_examples/shared_element_method.rb +60 -0
  192. data/spec/shoes/shared_examples/slot.rb +331 -0
  193. data/spec/shoes/shared_examples/state.rb +19 -0
  194. data/spec/shoes/shared_examples/style.rb +82 -0
  195. data/spec/shoes/slot_spec.rb +130 -0
  196. data/spec/shoes/sound_spec.rb +15 -0
  197. data/spec/shoes/span_spec.rb +112 -0
  198. data/spec/shoes/spec_helper.rb +24 -0
  199. data/spec/shoes/stack_spec.rb +79 -0
  200. data/spec/shoes/star_spec.rb +31 -0
  201. data/spec/shoes/text_block_dimensions_spec.rb +75 -0
  202. data/spec/shoes/text_block_spec.rb +270 -0
  203. data/spec/shoes/url_spec.rb +68 -0
  204. data/spec/shoes/widget_spec.rb +70 -0
  205. data/spec/shoes_spec.rb +44 -0
  206. data/spec/spec_helper.rb +18 -0
  207. data/static/Shoes.icns +0 -0
  208. data/static/shoes-icon.png +0 -0
  209. metadata +354 -0
@@ -0,0 +1,59 @@
1
+ class Shoes
2
+ class Link < Span
3
+
4
+ include Common::Style
5
+
6
+ attr_reader :app, :parent, :gui, :blk
7
+ style_with :common_styles, :text_block_styles
8
+ STYLES = { underline: true, stroke: ::Shoes::COLORS[:blue], fill: nil }
9
+
10
+ def initialize(app, parent, texts, styles = {}, blk = nil)
11
+ @app = app
12
+ @parent = parent
13
+ style_init styles
14
+ @gui = Shoes.backend_for self
15
+
16
+ setup_click blk
17
+ super texts, @style
18
+ end
19
+
20
+ # Doesn't use Common::Clickable because of URL flavor option clicks
21
+ def setup_click(blk)
22
+ if blk.nil?
23
+ if @style[:click].respond_to? :call
24
+ blk = @style[:click]
25
+ else
26
+ # Slightly awkward, but we need App, not InternalApp, to call visit
27
+ blk = Proc.new { app.app.visit @style[:click] }
28
+ end
29
+ end
30
+
31
+ click &blk
32
+ end
33
+
34
+ def click(&blk)
35
+ @gui.click blk if blk
36
+ @blk = blk
37
+ end
38
+
39
+ def pass_coordinates?
40
+ false
41
+ end
42
+
43
+ def in_bounds?(x, y)
44
+ @gui.in_bounds?(x, y)
45
+ end
46
+
47
+ def remove
48
+ @gui.remove
49
+ end
50
+
51
+ def hidden?
52
+ @text_block.hidden?
53
+ end
54
+
55
+ def visible?
56
+ @text_block.visible?
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,5 @@
1
+ class Shoes
2
+ class LinkHover
3
+ # Just a placeholder for now until we get this implemented
4
+ end
5
+ end
@@ -0,0 +1,50 @@
1
+ class Shoes
2
+ class ListBox
3
+ include Common::UIElement
4
+ include Common::Style
5
+ include Common::Changeable
6
+
7
+ attr_reader :app, :parent, :dimensions, :gui
8
+ style_with :change, :choose, :common_styles, :dimensions, :items, :state, :text
9
+ STYLES = {width: 200, height: 20, items: [""]}
10
+
11
+ def initialize(app, parent, styles = {}, blk = nil)
12
+ @app = app
13
+ @parent = parent
14
+ style_init styles
15
+ @dimensions = Dimensions.new parent, @style
16
+ @parent.add_child self
17
+ @gui = Shoes.configuration.backend_for self, @parent.gui
18
+ change &blk if blk
19
+
20
+ choose @style[:choose]
21
+ end
22
+
23
+ def items=(values)
24
+ style(items: values)
25
+ @gui.update_items values
26
+ end
27
+
28
+ def text
29
+ @gui.text
30
+ end
31
+
32
+ def choose(item_or_hash = nil)
33
+ case item_or_hash
34
+ when String
35
+ style(choose: item_or_hash)
36
+ @gui.choose item_or_hash
37
+ when Hash
38
+ style(choose: item_or_hash[:item])
39
+ @gui.choose item_or_hash[:item]
40
+ end
41
+ end
42
+
43
+ alias_method :choose=, :choose
44
+
45
+ def state=(value)
46
+ style(state: value)
47
+ @gui.enabled value.nil?
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,66 @@
1
+ class Shoes
2
+ module Logger
3
+ class << self
4
+
5
+ def register(name, obj)
6
+ @loggers ||= { }
7
+ @loggers[name] = obj
8
+ end
9
+
10
+ def unregister(name)
11
+ @loggers.delete(name)
12
+ end
13
+
14
+ def get(name)
15
+ @loggers && @loggers[name]
16
+ end
17
+ end
18
+
19
+ def self.setup
20
+ Shoes.app do
21
+ def update
22
+ if @hash != Shoes::LOG.hash
23
+ @hash = Shoes::LOG.hash
24
+ @log.clear do
25
+ Shoes::LOG.each_with_index do |(typ, msg), index|
26
+ stack do
27
+ background "#f1f5e1" if index % 2 == 0
28
+ background rgb(220, 220, 220) if index % 2 != 0
29
+ para typ, :stroke => blue
30
+ flow do
31
+ stack :margin => 4 do
32
+ s = msg.to_s
33
+ para s, :margin => 4, :margin_top => 0
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ stack do
43
+ flow do
44
+ background black
45
+ stack do
46
+ tagline "Shoes Console", stroke: white
47
+ end
48
+ button "Clear", margin: 6, width: 80, height: 40, right: 10 do
49
+ Shoes::LOG.clear
50
+ end
51
+ end
52
+ @log, @hash = stack, nil
53
+ update
54
+
55
+ every(0.2) do
56
+ update
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ Dir[File.join(File.dirname(__FILE__), "logger", "*.rb")].each { |logger|
65
+ require logger
66
+ }
@@ -0,0 +1,18 @@
1
+ require 'delegate'
2
+
3
+ class Shoes
4
+ module Logger
5
+ class Ruby < SimpleDelegator
6
+ def initialize(device=STDERR)
7
+ require 'logger'
8
+ logger = ::Logger.new(device)
9
+ logger.formatter = proc do |severity, datetime, progname, message|
10
+ "%s: %s\n" % [severity, message]
11
+ end
12
+ super(logger)
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ Shoes::Logger.register(:ruby, Shoes::Logger::Ruby)
@@ -0,0 +1,31 @@
1
+ require 'shoes/mock/common_methods'
2
+ require 'shoes/mock/clickable'
3
+
4
+ require 'shoes/mock/animation'
5
+ require 'shoes/mock/app'
6
+ require 'shoes/mock/arc'
7
+ require 'shoes/mock/background'
8
+ require 'shoes/mock/border'
9
+ require 'shoes/mock/button'
10
+ require 'shoes/mock/check'
11
+ require 'shoes/mock/download'
12
+ require 'shoes/mock/font'
13
+ require 'shoes/mock/image'
14
+ require 'shoes/mock/image_pattern'
15
+ require 'shoes/mock/input_box'
16
+ require 'shoes/mock/keypress'
17
+ require 'shoes/mock/keyrelease'
18
+ require 'shoes/mock/line'
19
+ require 'shoes/mock/link'
20
+ require 'shoes/mock/list_box'
21
+ require 'shoes/mock/oval'
22
+ require 'shoes/mock/progress'
23
+ require 'shoes/mock/radio'
24
+ require 'shoes/mock/rect'
25
+ require 'shoes/mock/star'
26
+ require 'shoes/mock/shape'
27
+ require 'shoes/mock/slot'
28
+ require 'shoes/mock/sound'
29
+ require 'shoes/mock/text_block'
30
+ require 'shoes/mock/dialog'
31
+ require 'shoes/mock/timer'
@@ -0,0 +1,8 @@
1
+ class Shoes
2
+ module Mock
3
+ class Animation
4
+ def initialize(*opts)
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,47 @@
1
+ class Shoes
2
+ module Mock
3
+ class App
4
+
5
+ attr_accessor :fullscreen
6
+ def initialize(dsl)
7
+ @dsl = dsl
8
+ @started = false
9
+ end
10
+
11
+ # suboptimal but good enough for now... calling the DSL lets the methods
12
+ # play ping pong calling each other... will think of something.
13
+ def width
14
+ @dsl.opts[:width]
15
+ end
16
+
17
+ def height
18
+ @dsl.opts[:height]
19
+ end
20
+
21
+ def open
22
+ @started = true
23
+ self.fullscreen = true if @dsl.start_as_fullscreen?
24
+ end
25
+
26
+ def quit
27
+ end
28
+
29
+ def started?
30
+ @started
31
+ end
32
+
33
+ def flush
34
+ end
35
+
36
+ def clipboard
37
+ end
38
+
39
+ def clipboard=(text)
40
+ end
41
+
42
+ def gutter
43
+ 16
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,9 @@
1
+ class Shoes
2
+ module Mock
3
+ class Arc
4
+ include Shoes::Mock::Clickable
5
+ def initialize(dsl, app, opts = {})
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ class Shoes
2
+ module Mock
3
+ class Background
4
+ include Shoes::Mock::CommonMethods
5
+
6
+ def background=(*opts)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ class Shoes
2
+ module Mock
3
+ class Border
4
+ include Shoes::Mock::CommonMethods
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ class Shoes
2
+ module Mock
3
+ class Button
4
+ include Shoes::Mock::CommonMethods
5
+ include Shoes::Mock::Clickable
6
+ def enabled(value)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,25 @@
1
+ class Shoes
2
+ module Mock
3
+ class Check
4
+ include Shoes::Mock::CommonMethods
5
+ include Shoes::Mock::Clickable
6
+
7
+ def initialize(*opts)
8
+ end
9
+
10
+ def checked?
11
+ false
12
+ end
13
+
14
+ def checked=(*opts)
15
+ end
16
+
17
+ def focus
18
+ end
19
+
20
+ def enabled(value)
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,8 @@
1
+ class Shoes
2
+ module Mock
3
+ module Clickable
4
+ def click(blk)
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ class Shoes
2
+ module Mock
3
+ module CommonMethods
4
+ def initialize(dsl, *args)
5
+ @dsl = dsl
6
+ end
7
+
8
+ def update_position
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ class Shoes
2
+ module Mock
3
+ class Dialog
4
+ def alert(*args)
5
+ nil
6
+ end
7
+
8
+ def confirm(msg = '')
9
+ true
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ class Shoes
2
+ module Mock
3
+ class Download
4
+
5
+ def initialize(*_)
6
+ end
7
+
8
+ def eval_block(*_)
9
+ end
10
+
11
+ attr_accessor :busy
12
+
13
+ def busy?
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ class Shoes
2
+ module Mock
3
+ module Font
4
+
5
+ class << self
6
+ def add_font(path)
7
+ Shoes::Font.add_font_to_fonts path
8
+ end
9
+
10
+ def initial_fonts
11
+ []
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ class Shoes
2
+ module Mock
3
+ class Image
4
+ include Shoes::Mock::CommonMethods
5
+ include Shoes::Mock::Clickable
6
+
7
+ attr_accessor :left, :top
8
+
9
+ def update_image
10
+ end
11
+ end
12
+ end
13
+ end