shoes-core 4.0.0.pre7 → 4.0.0.pre8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/lib/shoes/arc.rb +10 -13
  3. data/lib/shoes/arrow.rb +1 -11
  4. data/lib/shoes/background.rb +0 -3
  5. data/lib/shoes/border.rb +0 -3
  6. data/lib/shoes/button.rb +4 -1
  7. data/lib/shoes/check_button.rb +0 -1
  8. data/lib/shoes/common/art_element.rb +21 -0
  9. data/lib/shoes/common/background_element.rb +10 -0
  10. data/lib/shoes/common/clickable.rb +2 -0
  11. data/lib/shoes/common/rotate.rb +1 -2
  12. data/lib/shoes/common/ui_element.rb +10 -1
  13. data/lib/shoes/core/version.rb +1 -1
  14. data/lib/shoes/download.rb +47 -29
  15. data/lib/shoes/dsl.rb +99 -40
  16. data/lib/shoes/font.rb +0 -4
  17. data/lib/shoes/http_request.rb +91 -0
  18. data/lib/shoes/image.rb +0 -1
  19. data/lib/shoes/input_box.rb +0 -1
  20. data/lib/shoes/internal_app.rb +1 -1
  21. data/lib/shoes/line.rb +25 -11
  22. data/lib/shoes/link.rb +10 -4
  23. data/lib/shoes/list_box.rb +0 -1
  24. data/lib/shoes/mock/app.rb +6 -0
  25. data/lib/shoes/mock/clickable.rb +3 -0
  26. data/lib/shoes/mock/font.rb +0 -4
  27. data/lib/shoes/oval.rb +3 -13
  28. data/lib/shoes/progress.rb +0 -1
  29. data/lib/shoes/rect.rb +1 -11
  30. data/lib/shoes/shape.rb +16 -8
  31. data/lib/shoes/slot.rb +2 -1
  32. data/lib/shoes/star.rb +8 -11
  33. data/lib/shoes/text_block.rb +0 -1
  34. data/lib/shoes/ui/picker.rb +29 -8
  35. data/lib/shoes/version.rb +1 -1
  36. metadata +8 -231
  37. data/Guardfile +0 -5
  38. data/Rakefile +0 -1
  39. data/bin/shoes-stub +0 -62
  40. data/ext/install/Rakefile +0 -39
  41. data/ext/install/shoes.bat +0 -17
  42. data/lib/rubygems_plugin.rb +0 -24
  43. data/shoes-core.gemspec +0 -22
  44. data/spec/shoes/animation_spec.rb +0 -71
  45. data/spec/shoes/app_spec.rb +0 -454
  46. data/spec/shoes/arc_spec.rb +0 -52
  47. data/spec/shoes/arrow_spec.rb +0 -28
  48. data/spec/shoes/background_spec.rb +0 -47
  49. data/spec/shoes/border_spec.rb +0 -46
  50. data/spec/shoes/builtin_methods_spec.rb +0 -122
  51. data/spec/shoes/button_spec.rb +0 -55
  52. data/spec/shoes/check_spec.rb +0 -36
  53. data/spec/shoes/color_spec.rb +0 -429
  54. data/spec/shoes/common/attachable_spec.rb +0 -32
  55. data/spec/shoes/common/inspect_spec.rb +0 -26
  56. data/spec/shoes/common/remove_spec.rb +0 -37
  57. data/spec/shoes/common/rotate_spec.rb +0 -13
  58. data/spec/shoes/common/style_normalizer_spec.rb +0 -28
  59. data/spec/shoes/common/style_spec.rb +0 -197
  60. data/spec/shoes/common/translate_spec.rb +0 -27
  61. data/spec/shoes/configuration_spec.rb +0 -51
  62. data/spec/shoes/constants_spec.rb +0 -39
  63. data/spec/shoes/dialog_spec.rb +0 -169
  64. data/spec/shoes/dimension_spec.rb +0 -451
  65. data/spec/shoes/dimensions_spec.rb +0 -868
  66. data/spec/shoes/download_spec.rb +0 -198
  67. data/spec/shoes/flow_spec.rb +0 -132
  68. data/spec/shoes/font_spec.rb +0 -36
  69. data/spec/shoes/framework_learning_spec.rb +0 -31
  70. data/spec/shoes/gradient_spec.rb +0 -31
  71. data/spec/shoes/helpers/fake_absolute_element.rb +0 -31
  72. data/spec/shoes/helpers/fake_element.rb +0 -25
  73. data/spec/shoes/helpers/inspect_helpers.rb +0 -5
  74. data/spec/shoes/helpers/sample17_helper.rb +0 -65
  75. data/spec/shoes/image_spec.rb +0 -69
  76. data/spec/shoes/images/shoe.jpg +0 -0
  77. data/spec/shoes/input_box_spec.rb +0 -80
  78. data/spec/shoes/integration_spec.rb +0 -19
  79. data/spec/shoes/internal_app_spec.rb +0 -148
  80. data/spec/shoes/keypress_spec.rb +0 -11
  81. data/spec/shoes/keyrelease_spec.rb +0 -11
  82. data/spec/shoes/line_spec.rb +0 -120
  83. data/spec/shoes/link_spec.rb +0 -149
  84. data/spec/shoes/list_box_spec.rb +0 -87
  85. data/spec/shoes/logger/ruby_spec.rb +0 -8
  86. data/spec/shoes/logger_spec.rb +0 -45
  87. data/spec/shoes/oval_spec.rb +0 -25
  88. data/spec/shoes/packager_spec.rb +0 -25
  89. data/spec/shoes/point_spec.rb +0 -99
  90. data/spec/shoes/progress_spec.rb +0 -54
  91. data/spec/shoes/radio_spec.rb +0 -32
  92. data/spec/shoes/rect_spec.rb +0 -40
  93. data/spec/shoes/renamed_delegate_spec.rb +0 -69
  94. data/spec/shoes/shape_spec.rb +0 -119
  95. data/spec/shoes/shared_examples/button.rb +0 -6
  96. data/spec/shoes/shared_examples/changeable.rb +0 -26
  97. data/spec/shoes/shared_examples/clickable.rb +0 -5
  98. data/spec/shoes/shared_examples/common_methods.rb +0 -35
  99. data/spec/shoes/shared_examples/dimensions.rb +0 -32
  100. data/spec/shoes/shared_examples/dsl.rb +0 -44
  101. data/spec/shoes/shared_examples/dsl/animate.rb +0 -29
  102. data/spec/shoes/shared_examples/dsl/arc.rb +0 -45
  103. data/spec/shoes/shared_examples/dsl/background.rb +0 -26
  104. data/spec/shoes/shared_examples/dsl/border.rb +0 -10
  105. data/spec/shoes/shared_examples/dsl/button.rb +0 -5
  106. data/spec/shoes/shared_examples/dsl/cap.rb +0 -6
  107. data/spec/shoes/shared_examples/dsl/check.rb +0 -11
  108. data/spec/shoes/shared_examples/dsl/edit_box.rb +0 -8
  109. data/spec/shoes/shared_examples/dsl/edit_line.rb +0 -8
  110. data/spec/shoes/shared_examples/dsl/editable_element.rb +0 -29
  111. data/spec/shoes/shared_examples/dsl/fill.rb +0 -27
  112. data/spec/shoes/shared_examples/dsl/flow.rb +0 -15
  113. data/spec/shoes/shared_examples/dsl/gradient.rb +0 -62
  114. data/spec/shoes/shared_examples/dsl/image.rb +0 -21
  115. data/spec/shoes/shared_examples/dsl/line.rb +0 -9
  116. data/spec/shoes/shared_examples/dsl/nofill.rb +0 -6
  117. data/spec/shoes/shared_examples/dsl/nostroke.rb +0 -6
  118. data/spec/shoes/shared_examples/dsl/oval.rb +0 -88
  119. data/spec/shoes/shared_examples/dsl/pattern.rb +0 -34
  120. data/spec/shoes/shared_examples/dsl/progress.rb +0 -7
  121. data/spec/shoes/shared_examples/dsl/rect.rb +0 -92
  122. data/spec/shoes/shared_examples/dsl/rgb.rb +0 -28
  123. data/spec/shoes/shared_examples/dsl/shape.rb +0 -61
  124. data/spec/shoes/shared_examples/dsl/star.rb +0 -110
  125. data/spec/shoes/shared_examples/dsl/stroke.rb +0 -30
  126. data/spec/shoes/shared_examples/dsl/strokewidth.rb +0 -19
  127. data/spec/shoes/shared_examples/dsl/style.rb +0 -32
  128. data/spec/shoes/shared_examples/dsl/text_elements.rb +0 -84
  129. data/spec/shoes/shared_examples/dsl/video.rb +0 -5
  130. data/spec/shoes/shared_examples/dsl_app_context.rb +0 -11
  131. data/spec/shoes/shared_examples/hover.rb +0 -78
  132. data/spec/shoes/shared_examples/parent.rb +0 -6
  133. data/spec/shoes/shared_examples/scroll.rb +0 -41
  134. data/spec/shoes/shared_examples/shared_element_method.rb +0 -60
  135. data/spec/shoes/shared_examples/slot.rb +0 -441
  136. data/spec/shoes/shared_examples/state.rb +0 -26
  137. data/spec/shoes/shared_examples/style.rb +0 -77
  138. data/spec/shoes/slot_spec.rb +0 -176
  139. data/spec/shoes/sound_spec.rb +0 -16
  140. data/spec/shoes/span_spec.rb +0 -112
  141. data/spec/shoes/spec_helper.rb +0 -24
  142. data/spec/shoes/stack_spec.rb +0 -79
  143. data/spec/shoes/star_spec.rb +0 -49
  144. data/spec/shoes/text_block_dimensions_spec.rb +0 -77
  145. data/spec/shoes/text_block_spec.rb +0 -314
  146. data/spec/shoes/text_spec.rb +0 -22
  147. data/spec/shoes/ui/picker_spec.rb +0 -69
  148. data/spec/shoes/url_spec.rb +0 -67
  149. data/spec/shoes/widget_spec.rb +0 -78
  150. data/spec/shoes_spec.rb +0 -41
  151. data/spec/spec_helper.rb +0 -27
data/lib/shoes/font.rb CHANGED
@@ -26,10 +26,6 @@ class Shoes
26
26
  name
27
27
  end
28
28
 
29
- def initial_fonts
30
- Shoes.backend::Font.initial_fonts
31
- end
32
-
33
29
  private
34
30
 
35
31
  def font_name(path)
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+ require 'net/http'
5
+
6
+ # Wrapper for Net::HTTP to provide us to the functionality that we need which
7
+ # isn't easily available from any particular gem out there :(
8
+ #
9
+ # Specific things this class does that we need include:
10
+ #
11
+ # 1) Reading in chunks to trigger progress
12
+ # 2) Allow for graceful redirection
13
+ #
14
+ # Most of the gems out there do 2) but not 1), or do both but are untested on
15
+ # JRuby.
16
+ #
17
+ class Shoes
18
+ class HttpRequest
19
+ def initialize(started_proc = nil, redirects_left = 5)
20
+ @started_proc = started_proc
21
+ @redirects_left = redirects_left
22
+ end
23
+
24
+ def read_chunks(url, meth, body, headers = {}, &blk)
25
+ uri = URI(url)
26
+ Net::HTTP.start(uri.host, uri.port, use_ssl: needs_ssl?(uri)) do |http|
27
+ request = build_request(uri, meth, body, headers)
28
+
29
+ http.request(request) do |response|
30
+ case response
31
+ when Net::HTTPSuccess
32
+ handle_success(response, &blk)
33
+ when Net::HTTPRedirection
34
+ handle_redirect(response, headers, &blk)
35
+ else
36
+ handle_error(response)
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def build_request(uri, meth, body, headers)
45
+ klass = Net::HTTP.const_get(meth.downcase.capitalize)
46
+ klass.new(uri).tap do |request|
47
+ request.body = body
48
+ headers.each do |(key, value)|
49
+ request[key] = value
50
+ end
51
+ end
52
+ end
53
+
54
+ def handle_redirect(response, headers, &blk)
55
+ raise "Exhausted trying to redirect... See ya'" if @redirects_left <= 0
56
+
57
+ next_uri = URI(response["Location"])
58
+
59
+ if schemes_mismatch?(response.uri, next_uri) &&
60
+ !allowed_scheme_change?(response.uri, next_uri)
61
+ raise "Disallowed redirection from '#{response.uri.scheme}' to '#{next_uri.scheme}'"
62
+ end
63
+
64
+ @redirects_left -= 1
65
+ read_chunks(next_uri, "GET", nil, headers, &blk)
66
+ end
67
+
68
+ def handle_success(response)
69
+ @started_proc&.call(response)
70
+ response.read_body do |chunk|
71
+ yield chunk
72
+ end
73
+ end
74
+
75
+ def handle_error(response)
76
+ raise "#{response.code} #{response.message}"
77
+ end
78
+
79
+ def schemes_mismatch?(original_uri, new_uri)
80
+ original_uri.scheme != new_uri.scheme
81
+ end
82
+
83
+ def allowed_scheme_change?(original_uri, new_uri)
84
+ original_uri.scheme == "http" && new_uri.scheme == "https"
85
+ end
86
+
87
+ def needs_ssl?(uri)
88
+ uri.scheme == "https"
89
+ end
90
+ end
91
+ end
data/lib/shoes/image.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  class Shoes
2
2
  class Image
3
3
  include Common::UIElement
4
- include Common::Style
5
4
  include Common::Clickable
6
5
  include Common::Hover
7
6
 
@@ -1,7 +1,6 @@
1
1
  class Shoes
2
2
  class InputBox
3
3
  include Common::UIElement
4
- include Common::Style
5
4
  include Common::Changeable
6
5
  include Common::State
7
6
 
@@ -7,8 +7,8 @@ class Shoes
7
7
  # and providing the bulk of the functionality, leaving the App a relatively
8
8
  # blank slate for users to bend to their will.
9
9
  class InternalApp
10
- include Common::Style
11
10
  include Common::Clickable
11
+ include Common::Style
12
12
  include DimensionsDelegations
13
13
 
14
14
  extend Forwardable
data/lib/shoes/line.rb CHANGED
@@ -2,26 +2,40 @@ require 'matrix'
2
2
 
3
3
  class Shoes
4
4
  class Line
5
- include Common::UIElement
6
- include Common::Clickable
7
- include Common::Hover
8
- include Common::Stroke
9
- include Common::Style
10
- include Common::Translate
5
+ include Common::ArtElement
11
6
 
12
7
  attr_reader :point_a, :point_b
13
8
 
14
9
  style_with :angle, :art_styles, :dimensions, :x2, :y2
15
10
  STYLES = { angle: 0, fill: Shoes::COLORS[:black] }.freeze
16
11
 
17
- def create_dimensions(point_a, point_b)
18
- @point_a = point_a
19
- @point_b = point_b
12
+ def create_dimensions(x1, y1, x2, y2)
13
+ x1, y1, x2, y2 = default_coordinates(x1, y1, x2, y2)
14
+
15
+ @point_a = Shoes::Point.new(x1, y1)
16
+ @point_b = Shoes::Point.new(x2, y2)
20
17
 
21
18
  enclosing_box_of_line
22
19
 
23
- style[:x2] = point_b.x
24
- style[:y2] = point_b.y
20
+ style[:x2] = @point_b.x
21
+ style[:y2] = @point_b.y
22
+ end
23
+
24
+ def default_coordinates(x1, y1, x2, y2)
25
+ x1 ||= @style[:left] || 0
26
+ y1 ||= @style[:top] || 0
27
+
28
+ x2 ||= @style[:right]
29
+ if x2
30
+ # With 3 arguments, draws horizontal line, so fallback to y1
31
+ y2 ||= @style[:bottom] || y1
32
+ else
33
+ # If didn't get needed arguments, set start to end which draws nothing
34
+ x2 = x1
35
+ y2 = y1
36
+ end
37
+
38
+ [x1, y1, x2, y2]
25
39
  end
26
40
 
27
41
  # Check out http://math.stackexchange.com/questions/60070/checking-whether-a-point-lies-on-a-wide-line-segment
data/lib/shoes/link.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  class Shoes
2
2
  class Link < Span
3
- include Common::Style
4
3
  include Common::Fill
5
- include Common::Stroke
6
4
  include Common::Hover
5
+ include Common::Stroke
6
+ include Common::Style
7
7
 
8
8
  attr_reader :app, :gui, :blk
9
9
  style_with :common_styles, :text_block_styles
@@ -14,12 +14,12 @@ class Shoes
14
14
  style_init styles
15
15
  @gui = Shoes.backend_for self
16
16
 
17
- setup_click blk
17
+ register_click blk
18
18
  super texts, @style
19
19
  end
20
20
 
21
21
  # Doesn't use Common::Clickable because of URL flavor option clicks
22
- def setup_click(blk)
22
+ def register_click(blk)
23
23
  if blk.nil?
24
24
  blk = if @style[:click].respond_to? :call
25
25
  @style[:click]
@@ -35,6 +35,12 @@ class Shoes
35
35
  def click(&blk)
36
36
  @gui.click blk if blk
37
37
  @blk = blk
38
+ self
39
+ end
40
+
41
+ def release(&blk)
42
+ @gui.release blk if blk
43
+ self
38
44
  end
39
45
 
40
46
  def pass_coordinates?
@@ -26,7 +26,6 @@ class Shoes
26
26
 
27
27
  class ListBox
28
28
  include Common::UIElement
29
- include Common::Style
30
29
  include Common::Changeable
31
30
  include Common::State
32
31
 
@@ -44,6 +44,12 @@ class Shoes
44
44
 
45
45
  def wait_until_closed
46
46
  end
47
+
48
+ def click(_blk)
49
+ end
50
+
51
+ def release(_blk)
52
+ end
47
53
  end
48
54
  end
49
55
  end
@@ -3,6 +3,9 @@ class Shoes
3
3
  module Clickable
4
4
  def click(_blk)
5
5
  end
6
+
7
+ def release(_blk)
8
+ end
6
9
  end
7
10
  end
8
11
  end
@@ -5,10 +5,6 @@ class Shoes
5
5
  def add_font(path)
6
6
  Shoes::Font.add_font_to_fonts path
7
7
  end
8
-
9
- def initial_fonts
10
- []
11
- end
12
8
  end
13
9
  end
14
10
  end
data/lib/shoes/oval.rb CHANGED
@@ -1,27 +1,17 @@
1
1
  class Shoes
2
2
  class Oval
3
- include Common::UIElement
4
- include Common::Clickable
5
- include Common::Fill
6
- include Common::Hover
7
- include Common::Stroke
8
- include Common::Style
9
- include Common::Translate
3
+ include Common::ArtElement
10
4
 
11
5
  style_with :art_styles, :center, :common_styles, :dimensions, :radius
12
6
  STYLES = { fill: Shoes::COLORS[:black] }.freeze
13
7
 
14
8
  def create_dimensions(left, top, width, height)
15
- left ||= @style[:left]
16
- top ||= @style[:top]
9
+ left ||= @style[:left] || 0
10
+ top ||= @style[:top] || 0
17
11
  width ||= @style[:diameter] || @style[:width] || (@style[:radius] || 0) * 2
18
12
  height ||= @style[:height] || width
19
13
 
20
14
  @dimensions = AbsoluteDimensions.new left, top, width, height, @style
21
15
  end
22
-
23
- def needs_rotate?
24
- rotate && rotate.nonzero?
25
- end
26
16
  end
27
17
  end
@@ -1,7 +1,6 @@
1
1
  class Shoes
2
2
  class Progress
3
3
  include Common::UIElement
4
- include Common::Style
5
4
 
6
5
  style_with :common_styles, :dimensions, :fraction
7
6
  STYLES = { fraction: 0.0 }.freeze
data/lib/shoes/rect.rb CHANGED
@@ -1,12 +1,6 @@
1
1
  class Shoes
2
2
  class Rect
3
- include Common::UIElement
4
- include Common::Fill
5
- include Common::Stroke
6
- include Common::Clickable
7
- include Common::Hover
8
- include Common::Style
9
- include Common::Translate
3
+ include Common::ArtElement
10
4
 
11
5
  style_with :angle, :art_styles, :curve, :common_styles, :dimensions
12
6
  STYLES = { angle: 0, curve: 0, fill: Shoes::COLORS[:black] }.freeze
@@ -19,9 +13,5 @@ class Shoes
19
13
 
20
14
  @dimensions = AbsoluteDimensions.new left, top, width, height, @style
21
15
  end
22
-
23
- def needs_rotate?
24
- rotate && rotate.nonzero?
25
- end
26
16
  end
27
17
  end
data/lib/shoes/shape.rb CHANGED
@@ -1,11 +1,6 @@
1
1
  class Shoes
2
2
  class Shape
3
- include Common::UIElement
4
- include Common::Clickable
5
- include Common::Fill
6
- include Common::Stroke
7
- include Common::Style
8
- include Common::Translate
3
+ include Common::ArtElement
9
4
 
10
5
  attr_reader :blk, :x, :y, :left_bound, :top_bound, :right_bound, :bottom_bound
11
6
 
@@ -13,8 +8,11 @@ class Shoes
13
8
 
14
9
  STYLES = { fill: Shoes::COLORS[:black] }.freeze
15
10
 
16
- def create_dimensions
17
- @dimensions = AbsoluteDimensions.new @style
11
+ def create_dimensions(left, top)
12
+ left ||= @style[:left] || 0
13
+ top ||= @style[:top] || 0
14
+
15
+ @dimensions = AbsoluteDimensions.new left, top
18
16
  end
19
17
 
20
18
  def handle_block(blk)
@@ -40,6 +38,16 @@ class Shoes
40
38
  @app.height
41
39
  end
42
40
 
41
+ def element_width
42
+ return super unless @right_bound && @left_bound
43
+ @right_bound - @left_bound
44
+ end
45
+
46
+ def element_height
47
+ return super unless @bottom_bound && @top_bound
48
+ @bottom_bound - @top_bound
49
+ end
50
+
43
51
  def fixed_height?
44
52
  false
45
53
  end
data/lib/shoes/slot.rb CHANGED
@@ -3,7 +3,6 @@ class Shoes
3
3
  include Common::UIElement
4
4
  include Common::Clickable
5
5
  include Common::Hover
6
- include Common::Style
7
6
 
8
7
  # We need that offset because otherwise element overlap e.g. occupy
9
8
  # the same pixel - this way they start right next to each other
@@ -194,6 +193,8 @@ class Shoes
194
193
 
195
194
  update_current_position(current_position, element)
196
195
  rescue => e
196
+ raise e if ENV['SHOES_ENV'] == 'test'
197
+
197
198
  puts "SWALLOWED POSITIONING EXCEPTION ON #{element} - go take care of it: " + e.to_s
198
199
  puts e.backtrace.join("\n\t")
199
200
  puts 'Unfortunately we have to swallow it or risk SWT hanging.'
data/lib/shoes/star.rb CHANGED
@@ -1,21 +1,18 @@
1
1
  class Shoes
2
2
  class Star
3
- include Common::UIElement
4
- include Common::Clickable
5
- include Common::Fill
6
- include Common::Hover
7
- include Common::Stroke
8
- include Common::Style
9
- include Common::Translate
3
+ include Common::ArtElement
10
4
 
11
5
  style_with :angle, :art_styles, :common_styles, :dimensions, :inner, :outer, :points
12
6
  STYLES = { angle: 0, fill: Shoes::COLORS[:black] }.freeze
13
7
 
8
+ # Don't use param defaults as DSL explicit passes nil for missing params
14
9
  def create_dimensions(left, top, points, outer, inner)
15
- # Don't use param defaults as DSL explicit passes nil for missing params
16
- points ||= 10
17
- outer ||= 100.0
18
- inner ||= 50.0
10
+ left ||= @style[:left] || 0
11
+ top ||= @style[:top] || 0
12
+
13
+ points ||= @style[:points] || 10
14
+ outer ||= @style[:outer] || 100.0
15
+ inner ||= @style[:inner] || 50.0
19
16
 
20
17
  # Careful not to turn Fixnum to Float, lest Dimensions make you relative!
21
18
  width = outer * 2
@@ -7,7 +7,6 @@ class Shoes
7
7
  include Common::Clickable
8
8
  include Common::Hover
9
9
  include Common::LinkFinder
10
- include Common::Style
11
10
  include Common::Translate
12
11
  include TextBlockDimensionsDelegations
13
12
 
@@ -1,7 +1,19 @@
1
+ #
2
+ # This class is used for interactively (if necessary) picking the Shoes
3
+ # backend that the user will run their Shoes app with.
4
+ #
5
+ # This interacts with backend gems via the following contract:
6
+ #
7
+ # * Backend provides file "shoes/#{backend_name}/generate_backend.rb"
8
+ # * Requiring that file defines a module Shoes::SelectedBackend
9
+ # * Shoes::SelectedBackend should implement the following class methods:
10
+ # * generate(path) - passed bin path, generates shell command to start
11
+ # Shoes on given backend
12
+ # * validate() - checks whether this backend is valid to run (i.e. right
13
+ # ruby platform) and exits if not.
14
+ #
1
15
  class Shoes
2
16
  module UI
3
- # This class is used for interactively (if necessary) picking the Shoes
4
- # backend that the user will run their Shoes app with.
5
17
  class Picker
6
18
  def initialize(input = STDIN, output = STDOUT)
7
19
  @input = input
@@ -10,8 +22,11 @@ class Shoes
10
22
 
11
23
  def run(bin_dir, desired_backend = nil)
12
24
  bundle
13
- generator_file = select_generator(desired_backend)
14
- write_backend(generator_file, bin_dir)
25
+
26
+ require_generator(desired_backend)
27
+ validate_generator
28
+
29
+ write_backend(bin_dir)
15
30
  end
16
31
 
17
32
  # Only bundle if we find a local Gemfile. This allows us to work properly
@@ -78,13 +93,19 @@ class Shoes
78
93
  "shoes-#{match.tr('/', '-')}"
79
94
  end
80
95
 
81
- def write_backend(generator_file, bin_dir)
96
+ def require_generator(desired_backend)
97
+ generator_file = select_generator(desired_backend)
82
98
  require generator_file
99
+ end
100
+
101
+ def validate_generator
102
+ Shoes::SelectedBackend.validate
103
+ end
83
104
 
105
+ def write_backend(bin_dir)
84
106
  File.open(File.expand_path(File.join(bin_dir, "shoes-backend")), "w") do |file|
85
- # Contract with backends is to define generate_backend method that we
86
- # can call. Bit ugly, open to better options for that interchange.
87
- file.write(generate_backend(ENV["SHOES_PICKER_BIN_DIR"] || bin_dir))
107
+ dest_dir = ENV["SHOES_PICKER_BIN_DIR"] || bin_dir
108
+ file.write(Shoes::SelectedBackend.generate(dest_dir))
88
109
  end
89
110
  end
90
111
  end