window_blessing 0.0.1 → 0.0.4

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 (39) hide show
  1. data/CHANGELOG.md +30 -0
  2. data/README.md +1 -1
  3. data/bin/buffered_screen_demo.rb +4 -4
  4. data/bin/color_picker_demo.rb +1 -0
  5. data/bin/windowed_screen_demo.rb +1 -1
  6. data/bin/xterm_screen_demo.rb +6 -4
  7. data/lib/window_blessing.rb +2 -2
  8. data/lib/window_blessing/buffer.rb +16 -6
  9. data/lib/window_blessing/buffered_screen.rb +2 -2
  10. data/lib/window_blessing/color.rb +1 -0
  11. data/lib/window_blessing/debug_tools/log_request_redraw_internal.rb +16 -0
  12. data/lib/window_blessing/event_manager.rb +11 -6
  13. data/lib/window_blessing/evented.rb +1 -1
  14. data/lib/window_blessing/evented_variable.rb +10 -1
  15. data/lib/window_blessing/tools.rb +11 -1
  16. data/lib/window_blessing/version.rb +1 -1
  17. data/lib/window_blessing/widgets/draggable_background.rb +1 -1
  18. data/lib/window_blessing/widgets/label.rb +1 -1
  19. data/lib/window_blessing/widgets/slider.rb +10 -2
  20. data/lib/window_blessing/widgets/text_field.rb +1 -1
  21. data/lib/window_blessing/window.rb +48 -45
  22. data/lib/window_blessing/window_redraw_areas.rb +23 -0
  23. data/lib/window_blessing/windowed_screen.rb +11 -13
  24. data/lib/window_blessing/xterm_event_parser.rb +68 -59
  25. data/lib/window_blessing/xterm_screen.rb +2 -2
  26. data/lib/window_blessing/xterm_state.rb +1 -1
  27. data/spec/buffer_spec.rb +56 -0
  28. data/spec/color_spec.rb +14 -0
  29. data/spec/event_manager_spec.rb +107 -0
  30. data/spec/event_queue_spec.rb +46 -0
  31. data/spec/evented_variable_spec.rb +43 -0
  32. data/spec/tools_spec.rb +18 -0
  33. data/spec/window_redraw_areas_spec.rb +79 -0
  34. data/spec/window_spec.rb +138 -3
  35. data/spec/xterm_event_parser_spec.rb +86 -0
  36. data/window_blessing.gemspec +4 -3
  37. metadata +20 -11
  38. data/bin/foiled_demo.rb +0 -27
  39. data/bin/text_editor_demo.rb +0 -292
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ module WindowBlessing
4
+ describe "EventQueue" do
5
+ include Tools
6
+
7
+ it "new" do
8
+ em = EventQueue.new
9
+ em.queue.should == []
10
+ end
11
+
12
+ it "<<" do
13
+ em = EventQueue.new
14
+ em << 1
15
+ em.queue.should == [1]
16
+ em << [2,3]
17
+ em.queue.should == [1,2,3]
18
+ end
19
+
20
+ it "clear" do
21
+ em = EventQueue.new
22
+ em << 1
23
+ em.clear
24
+ em.queue.should == []
25
+ end
26
+
27
+ it "clear" do
28
+ em = EventQueue.new
29
+ em.empty?.should == true
30
+ em << 1
31
+ em.empty?.should == false
32
+ em.clear
33
+ em.empty?.should == true
34
+ end
35
+
36
+ it "pop_all" do
37
+ em = EventQueue.new
38
+ em << 1
39
+ em << 2
40
+ a = em.pop_all
41
+ a.should == [1,2]
42
+ em.queue.should == []
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ module WindowBlessing
4
+ describe "EventedVariable" do
5
+ include Tools
6
+
7
+ it "get" do
8
+ e = EventedVariable.new 4
9
+ e.get.should == 4
10
+ end
11
+
12
+ it "set (no listeners)" do
13
+ e = EventedVariable.new 4
14
+ e.set(5).should == 4
15
+ e.get.should == 5
16
+ end
17
+
18
+ it "inspect" do
19
+ e = EventedVariable.new 4
20
+ (!!e.inspect["4"]).should == true
21
+ end
22
+
23
+ it "set (with listeners)" do
24
+ e = EventedVariable.new 4
25
+ handled = ""
26
+ e.on(:change) {handled+="c"}
27
+ e.on(:refresh) {handled+="r"}
28
+ e.set(5).should == 4
29
+ e.get.should == 5
30
+ handled.should == "rc"
31
+ end
32
+
33
+ it "refresh (with listeners)" do
34
+ e = EventedVariable.new 4
35
+ handled = ""
36
+ e.on(:change) {handled+="c"}
37
+ e.on(:refresh) {handled+="r"}
38
+ e.refresh(5).should == 4
39
+ e.get.should == 5
40
+ handled.should == "r"
41
+ end
42
+ end
43
+ end
@@ -138,5 +138,23 @@ describe "Tools" do
138
138
  gen_array2d(point(3,3), [1, 2]).should == [[1,2,1], [2,1,2], [1,2,1]]
139
139
  gen_array2d(point(4,4), [1, 2, 3]).should == [[1, 2, 3, 1], [2, 3, 1, 2], [3, 1, 2, 3], [1,2,3,1]]
140
140
  end
141
+
142
+ it "clone_value" do
143
+ clone_value(0.5).should == 0.5
144
+ clone_value(nil).should == nil
145
+ clone_value(100).should == 100
146
+ v2 = clone_value v1 = {foo: "bar"}
147
+ v1[:foo] = "baz"
148
+ v1[:foo].should_not == v2[:foo]
149
+ end
150
+
151
+ it "range_length" do
152
+ range_length(0..-1).should == nil
153
+ range_length(-1..0).should == nil
154
+ range_length(-2..-1).should == 2
155
+ range_length(0..2).should == 3
156
+ range_length(1..2).should == 2
157
+ range_length(1...2).should == 1
158
+ end
141
159
  end
142
160
  end
@@ -0,0 +1,79 @@
1
+ require 'spec_helper'
2
+
3
+ module WindowBlessing
4
+ describe "WindowRedrawAreas" do
5
+ include Tools
6
+
7
+ it "basic init" do
8
+ wra = WindowRedrawAreas.new
9
+ wra.areas.should == []
10
+ wra << rect(5,5,10,10)
11
+ wra.areas.should == [rect(5,5,10,10)]
12
+ end
13
+
14
+ it "two non overlapping areas" do
15
+ wra = WindowRedrawAreas.new
16
+ wra << rect(5,5,10,10)
17
+ wra << rect(50,5,10,10)
18
+ wra.areas.should == [rect(5,5,10,10),rect(50,5,10,10)]
19
+ end
20
+
21
+ it "two overlapping areas" do
22
+ wra = WindowRedrawAreas.new
23
+ wra << rect(5,5,10,10)
24
+ wra << rect(10,5,10,10)
25
+ wra.areas.should == [rect(5,5,15,10)]
26
+ end
27
+
28
+ it "three areas collaps to one" do
29
+ wra = WindowRedrawAreas.new
30
+ wra << rect(0,0,2,10)
31
+ wra << rect(2,5,5,5)
32
+ wra.areas.should == [rect(0,0,2,10),rect(2,5,5,5)]
33
+ wra << rect(0,9,3,1)
34
+ wra.areas.should == [rect(0,0,7,10)]
35
+ end
36
+
37
+ it "tl overlap" do
38
+ wra = WindowRedrawAreas.new
39
+ wra << rect(5,5,10,10)
40
+ wra << rect(0,0,10,10)
41
+ wra.areas.should == [rect(0,0,15,15)]
42
+ end
43
+
44
+ it "tr overlap" do
45
+ wra = WindowRedrawAreas.new
46
+ wra << rect(5,5,10,10)
47
+ wra << rect(10,0,10,10)
48
+ wra.areas.should == [rect(5,0,15,15)]
49
+ end
50
+
51
+ it "bl overlap" do
52
+ wra = WindowRedrawAreas.new
53
+ wra << rect(5,5,10,10)
54
+ wra << rect(0,10,10,10)
55
+ wra.areas.should == [rect(0,5,15,15)]
56
+ end
57
+
58
+ it "br overlap" do
59
+ wra = WindowRedrawAreas.new
60
+ wra << rect(5,5,10,10)
61
+ wra << rect(10,10,10,10)
62
+ wra.areas.should == [rect(5,5,15,15)]
63
+ end
64
+
65
+ it "just barely no overlap" do
66
+ wra = WindowRedrawAreas.new
67
+ wra << rect(5,5,5,10)
68
+ wra << rect(10,5,5,10)
69
+ wra.areas.should == [rect(5,5,5,10),rect(10,5,5,10)]
70
+ end
71
+
72
+ it "just barely overlap" do
73
+ wra = WindowRedrawAreas.new
74
+ wra << rect(5,5,5,10)
75
+ wra << rect(9,5,5,10)
76
+ wra.areas.should == [rect(5,5,9,10)]
77
+ end
78
+ end
79
+ end
@@ -25,7 +25,7 @@ describe "Window" do
25
25
  w = window rect(0,0,4,4)
26
26
  c = window rect(1,1,1,2)
27
27
  c.buffer.contents = "*\n*"
28
- c.clean
28
+ c.clear_redraw_areas
29
29
  w.add_child c
30
30
  w.draw
31
31
  w.buffer.to_s.should == " \n * \n * \n "
@@ -44,8 +44,8 @@ describe "Window" do
44
44
  w = window rect(0,0,4,4)
45
45
  (c1=w.add_child(window(rect(1,1,2,2)))).buffer.fill :string=>"*"
46
46
  (c2=w.add_child(window(rect(2,0,2,2)))).buffer.fill :string=>"@"
47
- c1.clean
48
- c2.clean
47
+ c1.clear_redraw_areas
48
+ c2.clear_redraw_areas
49
49
  w.draw
50
50
  w.buffer.to_s.should == " @@\n *@@\n ** \n "
51
51
  end
@@ -57,5 +57,140 @@ describe "Window" do
57
57
  w.each_child.collect{|a|a}.should == [c1,c2]
58
58
  w.each_child_with_index.collect{|a,i|[a,i]}.should == [[c1,0],[c2,1]]
59
59
  end
60
+
61
+ it "route_poiner_event" do
62
+ w1 = window rect(0,0,10,10)
63
+ w2 = window rect(2,0,4,4)
64
+ w1.add_child w2
65
+ handled = ""
66
+ w1.on(:pointer) {handled+="w1"}
67
+ w2.on(:pointer) {handled+="w2"}
68
+ w1.route_pointer_event type: :pointer, loc: point()
69
+ handled.should == "w1"
70
+
71
+ handled=""
72
+ w1.route_pointer_event type: :pointer, loc: point(2,0)
73
+ handled.should == "w1"
74
+
75
+ handled=""
76
+ w1.route_pointer_event type: [:pointer, :button_up], loc: point(2,0)
77
+ handled.should == "w1"
78
+
79
+ handled=""
80
+ w1.route_pointer_event type: :pointer, loc: point(2,0)
81
+ handled.should == "w2"
82
+ end
83
+
84
+ it "blur and focus" do
85
+ w1 = window rect(0,0,10,10)
86
+ w2 = window rect(2,0,4,4)
87
+ w3 = window rect(0,2,4,4)
88
+ w4 = window rect(0,2,4,4)
89
+ w1.add_child w2
90
+ w2.add_child w4
91
+ w1.add_child w3
92
+
93
+ handled = ""
94
+ w1.on(:focus) {handled+="w1f"}
95
+ w1.on(:blur) {handled+="w1b"}
96
+ w2.on(:focus) {handled+="w2f"}
97
+ w2.on(:blur) {handled+="w2b"}
98
+ w3.on(:focus) {handled+="w3f"}
99
+ w3.on(:blur) {handled+="w3b"}
100
+ w4.on(:focus) {handled+="w4f"}
101
+ w4.on(:blur) {handled+="w4b"}
102
+
103
+ w1.focus
104
+ handled.should == "w1f"
105
+
106
+ handled = ""
107
+ w4.focus
108
+ handled.should == "w2fw4f"
109
+
110
+ handled = ""
111
+ w3.focus
112
+ handled.should == "w4bw2bw3f"
113
+ end
114
+
115
+ it "move and redraw" do
116
+ w1 = window rect(0,0,10,10)
117
+ w2 = window rect(2,0,4,4)
118
+ w1.add_child w2
119
+ w1.draw
120
+
121
+ w1.redraw_requested?.should == false
122
+ w2.redraw_requested?.should == false
123
+
124
+ w2.area = rect(0,0,4,4)
125
+ w1.redraw_requested?.should == true
126
+ w2.redraw_requested?.should == false
127
+ end
128
+
129
+ it "resize smaller and redraw" do
130
+ w1 = window rect(0,0,10,10)
131
+ w2 = window rect(2,0,4,4)
132
+ w1.add_child w2
133
+ w1.draw
134
+
135
+ w1.redraw_requested?.should == false
136
+ w2.redraw_requested?.should == false
137
+
138
+ w2.area = rect(2,0,4,3)
139
+ w1.redraw_requested?.should == true
140
+ w2.redraw_requested?.should == false
141
+ end
142
+
143
+ it "resize larger and redraw" do
144
+ w1 = window rect(0,0,10,10)
145
+ w2 = window rect(2,0,4,4)
146
+ w1.add_child w2
147
+ w1.draw
148
+
149
+ w1.redraw_requested?.should == false
150
+ w2.redraw_requested?.should == false
151
+
152
+ w2.area = rect(2,0,4,5)
153
+ w1.redraw_requested?.should == true
154
+ w2.redraw_requested?.should == true
155
+ end
156
+
157
+ it "redirect_keyboard_event" do
158
+ w1 = window rect(0,0,10,10)
159
+ w2 = window rect(2,0,4,4)
160
+ w1.add_child w2
161
+
162
+ handled = ""
163
+ w1.on(:key_press) {handled+="w1kp"}
164
+ w2.on(:key_press) {handled+="w2kp"}
165
+
166
+ w1.route_keyboard_event type: :key_press
167
+ handled.should == "w1kp"
168
+
169
+ handled = ""
170
+ w2.focus
171
+ w1.route_keyboard_event type: :key_press
172
+ handled.should == "w2kpw1kp"
173
+ end
174
+
175
+ it "path & parent_path" do
176
+ w1 = window rect(0,0,10,10)
177
+ w2 = window rect(2,0,4,4)
178
+ w1.add_child w2
179
+ w1.name = "foo"
180
+ w2.name = "bar"
181
+
182
+ w2.path.should == "WindowBlessing::Window(0,0,10,10):foo,WindowBlessing::Window(2,0,4,4):bar"
183
+ w2.parent_path.should == "WindowBlessing::Window(0,0,10,10):foo"
184
+ end
185
+
186
+ it "move_onscreen" do
187
+ w1 = window rect(0,0,10,10)
188
+ w2 = window rect(8,0,4,4)
189
+ w1.add_child w2
190
+
191
+ w2.move_onscreen
192
+ w2.area.should == rect(6,0,4,4)
193
+
194
+ end
60
195
  end
61
196
  end
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ module WindowBlessing
4
+ describe "XtermEventParser" do
5
+ include Tools
6
+
7
+ def parse(str)
8
+ events = XtermEventParser.new.parse(str).events
9
+ events.length.should == 1
10
+ events[0]
11
+ end
12
+
13
+ it "blur and focus" do
14
+ {:type=>:blur, :raw=>"\e[O"}.should == parse("\e[O")
15
+ {:type=>:focus, :raw=>"\e[I"}.should == parse("\e[I")
16
+ end
17
+
18
+ it "escape, tab, enter/return" do
19
+ {:type=>[:key_press, :escape], :key=>:escape, :raw=>"\e"}.should == parse("\e")
20
+ {:type=>[:key_press, :enter], :key=>:enter, :raw=>"\r"}.should == parse("\r")
21
+ {:type=>[:key_press, :tab], :key=>:tab, :raw=>"\t"}.should == parse("\t")
22
+ {:type=>[:key_press, :reverse_tab], :key=>:reverse_tab, :raw=>"\e[Z"}.should == parse("\e[Z")
23
+ end
24
+
25
+ it "arrow keys" do
26
+ {:type=>[:key_press, :down], :key=>:down, :alt=>true, :raw=>"\e\e[B"}.should == parse("\e\e[B")
27
+ {:type=>[:key_press, :down], :key=>:down, :raw=>"\e[B"}.should == parse("\e[B")
28
+ {:type=>[:key_press, :down], :key=>:down, :shift=>true, :alt=>true, :raw=>"\e[1;10B"}.should == parse("\e[1;10B")
29
+ {:type=>[:key_press, :down], :key=>:down, :shift=>true, :raw=>"\e[1;2B"}.should == parse("\e[1;2B")
30
+ {:type=>[:key_press, :left], :key=>:left, :alt=>true, :raw=>"\e\e[D"}.should == parse("\e\e[D")
31
+ {:type=>[:key_press, :left], :key=>:left, :raw=>"\e[D"}.should == parse("\e[D")
32
+ {:type=>[:key_press, :left], :key=>:left, :shift=>true, :alt=>true, :raw=>"\e[1;10D"}.should == parse("\e[1;10D")
33
+ {:type=>[:key_press, :left], :key=>:left, :shift=>true, :raw=>"\e[1;2D"}.should == parse("\e[1;2D")
34
+ {:type=>[:key_press, :right], :key=>:right, :alt=>true, :raw=>"\e\e[C"}.should == parse("\e\e[C")
35
+ {:type=>[:key_press, :right], :key=>:right, :raw=>"\e[C"}.should == parse("\e[C")
36
+ {:type=>[:key_press, :right], :key=>:right, :shift=>true, :alt=>true, :raw=>"\e[1;10C"}.should == parse("\e[1;10C")
37
+ {:type=>[:key_press, :right], :key=>:right, :shift=>true, :raw=>"\e[1;2C"}.should == parse("\e[1;2C")
38
+ {:type=>[:key_press, :up], :key=>:up, :alt=>true, :raw=>"\e\e[A"}.should == parse("\e\e[A")
39
+ {:type=>[:key_press, :up], :key=>:up, :raw=>"\e[A"}.should == parse("\e[A")
40
+ {:type=>[:key_press, :up], :key=>:up, :shift=>true, :alt=>true, :raw=>"\e[1;10A"}.should == parse("\e[1;10A")
41
+ {:type=>[:key_press, :up], :key=>:up, :shift=>true, :raw=>"\e[1;2A"}.should == parse("\e[1;2A")
42
+ end
43
+
44
+ it "control-a" do
45
+ {:type=>:key_press, :key=>:a, :control=>true, :raw=>"\x01"}.should == parse("\x01")
46
+ end
47
+
48
+ it "size" do
49
+ {:type=>:xterm_state, :state_type=>:size, :state=>point(99,68), :raw=>"\e[8;68;99t"}.should == parse("\e[8;68;99t")
50
+ end
51
+
52
+ it "f-keys" do
53
+ {:type=>[:key_press, :f1], :key=>:f1, :raw=>"\eOP"}.should == parse("\eOP")
54
+ {:type=>[:key_press, :f1], :key=>:f1, :shift=>true, :raw=>"\e[1;2P"}.should == parse("\e[1;2P")
55
+ {:type=>[:key_press, :f2], :key=>:f2, :raw=>"\eOQ"}.should == parse("\eOQ")
56
+ {:type=>[:key_press, :f2], :key=>:f2, :shift=>true, :raw=>"\e[1;2Q"}.should == parse("\e[1;2Q")
57
+ {:type=>[:key_press, :f3], :key=>:f3, :raw=>"\eOR"}.should == parse("\eOR")
58
+ {:type=>[:key_press, :f3], :key=>:f3, :shift=>true, :raw=>"\e[1;2R"}.should == parse("\e[1;2R")
59
+ {:type=>[:key_press, :f4], :key=>:f4, :raw=>"\eOS"}.should == parse("\eOS")
60
+ {:type=>[:key_press, :f4], :key=>:f4, :shift=>true, :raw=>"\e[1;2S"}.should == parse("\e[1;2S")
61
+ {:type=>[:key_press, :f5], :key=>:f5, :shift=>false, :raw=>"\e[15~"}.should == parse("\e[15~")
62
+ {:type=>[:key_press, :f5], :key=>:f5, :shift=>true, :raw=>"\e[15;2~"}.should == parse("\e[15;2~")
63
+ {:type=>[:key_press, :f6], :key=>:f6, :shift=>false, :raw=>"\e[17~"}.should == parse("\e[17~")
64
+ {:type=>[:key_press, :f6], :key=>:f6, :shift=>true, :raw=>"\e[17;2~"}.should == parse("\e[17;2~")
65
+ {:type=>[:key_press, :f7], :key=>:f7, :shift=>false, :raw=>"\e[18~"}.should == parse("\e[18~")
66
+ {:type=>[:key_press, :f7], :key=>:f7, :shift=>true, :raw=>"\e[18;2~"}.should == parse("\e[18;2~")
67
+ {:type=>[:key_press, :f8], :key=>:f8, :shift=>false, :raw=>"\e[19~"}.should == parse("\e[19~")
68
+ {:type=>[:key_press, :f8], :key=>:f8, :shift=>true, :raw=>"\e[19;2~"}.should == parse("\e[19;2~")
69
+ {:type=>[:key_press, :f9], :key=>:f9, :shift=>false, :raw=>"\e[20~"}.should == parse("\e[20~")
70
+ {:type=>[:key_press, :f9], :key=>:f9, :shift=>true, :raw=>"\e[20;2~"}.should == parse("\e[20;2~")
71
+ {:type=>[:key_press, :f10], :key=>:f10, :shift=>false, :raw=>"\e[21~"}.should == parse("\e[21~")
72
+ {:type=>[:key_press, :f10], :key=>:f10, :shift=>true, :raw=>"\e[21;2~"}.should == parse("\e[21;2~")
73
+ end
74
+
75
+ it "mouse" do
76
+ {:type=>[:pointer, :button_down, 1], :button=>[:button_down, 1], :state=>32, :loc=>point(23,51), :shift=>false, :alt=>false, :control=>false, :raw=>"\e[M 8T"}.should == parse("\e[M 8T")
77
+ {:type=>[:pointer, :button_up], :button=>:button_up, :state=>35, :loc=>point(33,50), :shift=>false, :alt=>false, :control=>false, :raw=>"\e[M#BS"}.should == parse("\e[M#BS")
78
+ {:type=>[:pointer, :button_down, 1], :button=>[:button_down, 1], :state=>36, :loc=>point(22,31), :shift=>true, :alt=>false, :control=>false, :raw=>"\e[M$7@"}.should == parse("\e[M$7@")
79
+ {:type=>[:pointer, :button_up], :button=>:button_up, :state=>39, :loc=>point(22,31), :shift=>true, :alt=>false, :control=>false, :raw=>"\e[M'7@"}.should == parse("\e[M'7@")
80
+ {:type=>[:pointer, :drag], :button=>:drag, :state=>64, :loc=>point(24,51), :shift=>false, :alt=>false, :control=>false, :raw=>"\e[M@9T"}.should == parse("\e[M@9T")
81
+ {:type=>[:pointer, :drag], :button=>:drag, :state=>68, :loc=>point(34,30), :shift=>true, :alt=>false, :control=>false, :raw=>"\e[MDC?"}.should == parse("\e[MDC?")
82
+ {:type=>[:pointer, :wheel_down], :button=>:wheel_down, :state=>96, :loc=>point(28,44), :shift=>false, :alt=>false, :control=>false, :raw=>"\e[M`=M"}.should == parse("\e[M`=M")
83
+ {:type=>[:pointer, :wheel_up], :button=>:wheel_up, :state=>97, :loc=>point(28,44), :shift=>false, :alt=>false, :control=>false, :raw=>"\e[Ma=M"}.should == parse("\e[Ma=M")
84
+ end
85
+ end
86
+ end
@@ -8,8 +8,8 @@ Gem::Specification.new do |gem|
8
8
  gem.version = WindowBlessing::VERSION
9
9
  gem.authors = ["Shane Brinkman-Davis"]
10
10
  gem.email = ["shanebdavis@gmail.com"]
11
- gem.description = "Forget Curses! Try Blessings instead! WindowBlessing is an evented windowing framework for terminal apps."
12
- gem.summary = ""
11
+ gem.description = "Forget curses. Try blessings. WindowBlessing is an evented, windowing framework for terminal apps."
12
+ gem.summary = "Evented windowing framework for terminal apps."
13
13
  gem.homepage = "https://github.com/shanebdavis/window_blessing"
14
14
 
15
15
  gem.files = `git ls-files`.split($/)
@@ -18,7 +18,8 @@ Gem::Specification.new do |gem|
18
18
  gem.require_paths = ["lib"]
19
19
 
20
20
  gem.add_dependency 'babel_bridge', ">= 0.5.3"
21
- gem.add_dependency 'gui_geometry', ">= 0.2.2"
21
+ gem.add_dependency 'gui_geometry', ">= 0.3.1"
22
+
22
23
  gem.add_development_dependency 'rake'
23
24
  gem.add_development_dependency 'rspec'
24
25
  gem.add_development_dependency 'guard-rspec'