win 0.0.4 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,68 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+ require 'win/dde'
3
+
4
+ module WinDDETest
5
+ include WinTest
6
+ include Win::DDE
7
+
8
+ def dde_cmd
9
+ APPCLASS_STANDARD
10
+ end
11
+
12
+ def dde_callback
13
+ ->{}
14
+ end
15
+
16
+ describe Win::DDE, ' contains a set of pre-defined Windows API functions' do
17
+ describe 'register_clipboard_format' do
18
+ spec{ use{ RegisterClipboardFormat(format_name = "XlTable") }}
19
+ spec{ use{ register_clipboard_format(format_name = "XlTable") }}
20
+
21
+ it 'returns format id (int) if successfully registered format' do
22
+ id = register_clipboard_format("XlTable")
23
+ id.should_not == 0
24
+ id.should_not == nil
25
+ end
26
+
27
+ it 'returns same format id for already registered format' do
28
+ id1 = register_clipboard_format("XlTable")
29
+ id2 = register_clipboard_format("XlTable")
30
+ id1.should == id2
31
+ end
32
+
33
+ it 'returns nil if not able to register format' do
34
+ register_clipboard_format("").should == nil
35
+ end
36
+ end
37
+
38
+ describe 'dde_initialize' do
39
+ spec{ use{ status = DdeInitialize( id = [0].pack('L'), dde_callback, dde_cmd, unused = 0)}}
40
+ spec{ use{ id, status = dde_initialize( id = 0, dde_cmd) do|*args| end }}
41
+
42
+ it 'returns integer id and 0 if initialization successful' do
43
+ id, status = dde_initialize(APPCLASS_STANDARD) {|*args| }
44
+ id.should be_an Integer
45
+ id.should_not == 0
46
+ status.should == DMLERR_NO_ERROR
47
+ end
48
+
49
+ it 'returns error status if initialization unsuccessful' do
50
+ id, status = dde_initialize(1, APPCLASS_STANDARD) {|*args| }
51
+ status.should == DMLERR_INVALIDPARAMETER
52
+ id.should == nil
53
+ end
54
+
55
+ it 'is able to reinitialize with correct id' do
56
+ id, status = dde_initialize(APPCLASS_STANDARD) {|*args| }
57
+ new_id, status = dde_initialize(id, APPCLASS_STANDARD) {|*args| }
58
+ status.should == DMLERR_NO_ERROR
59
+ new_id.should == id
60
+ end
61
+
62
+ it 'returns nil if not able to initialize' do
63
+ pending
64
+ register_clipboard_format("").should == nil
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,181 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+ require 'win/window'
3
+ require 'win/window/extra'
4
+
5
+ module WinWindowTest
6
+ include WinTest
7
+ include Win::Window
8
+
9
+ describe Win::Window, ' extra convenience/service methods' do
10
+ describe '#keystroke' do
11
+ spec{ use{ keystroke( vkey = 30, vkey = 30) }}
12
+ # this service method emulates combinations of (any amount of) keys pressed one after another (Ctrl+Alt+P) and then released
13
+ # vkey (int) - Specifies a virtual-key code. The code must be a value in the range 1 to 254. For a complete list, see msdn:Virtual Key Codes.
14
+
15
+ it 'emulates combinations of keys pressed (Ctrl+Alt+P+M, etc)' do
16
+ test_app do |app|
17
+ keystroke(VK_CONTROL, 'A'.ord)
18
+ keystroke(VK_SPACE)
19
+ app.textarea.text.should == ' '
20
+ 2.times {keystroke(VK_CONTROL, 'Z'.ord)} # dirty hack!
21
+ end
22
+ end
23
+ end
24
+
25
+ describe '#type_in' do
26
+ spec{ use{ type_in(message = '') }}
27
+ # this service method types text message into window holding the focus
28
+
29
+ it 'types text message into window holding the focus' do
30
+ test_app do |app|
31
+ text = '123 456'
32
+ type_in(text)
33
+ app.textarea.text.should =~ Regexp.new(text)
34
+ 7.times {keystroke(VK_CONTROL, 'Z'.ord)} # dirty hack!
35
+ end
36
+ end
37
+ end
38
+
39
+ describe 'dialog' do
40
+ spec{ use{ dialog( title ='Dialog Title', timeout_sec = 0.001, &any_block) }}
41
+ # me od finds top-level dialog window by title and yields found dialog window to block if given
42
+
43
+ it 'finds top-level dialog window by title' do
44
+ pending 'Some problems (?with timeouts?) leave window open ~half of the runs'
45
+ test_app do |app|
46
+ keystroke(VK_ALT, 'F'.ord, 'A'.ord)
47
+ @found = false
48
+ dialog('Save As', 0.5) do |dialog_window|
49
+ @found = true
50
+ keystroke(VK_ESCAPE)
51
+ dialog_window
52
+ end
53
+ @found.should == true
54
+ end
55
+ end
56
+ it 'yields found dialog window to a given block'
57
+ end
58
+
59
+ end
60
+
61
+ describe Win::Window::Window, ' wrapper class for window handle' do
62
+ before(:each) { @app = launch_test_app }
63
+ after(:each){ close_test_app }
64
+
65
+ context 'creating' do
66
+ it 'can be wrapped around any existing window' do
67
+ any_handle = find_window(nil, nil)
68
+ use{ Window.new any_handle }
69
+ end
70
+
71
+ it 'can be wrapped around specific window' do
72
+ use{ Window.new @app.handle }
73
+ end
74
+ end
75
+
76
+ context 'manipulating' do
77
+
78
+ it 'has handle property equal to underlying window handle' do
79
+ any_handle = find_window(nil, nil)
80
+ any = Window.new any_handle
81
+ any.handle.should == any_handle
82
+ end
83
+
84
+ it 'has text property equal to underlying window text(title)' do
85
+ @app.text.should == TEST_WIN_TITLE
86
+ end
87
+
88
+ it 'closes when asked nicely' do
89
+ @app.close
90
+ sleep TEST_SLEEP_DELAY # needed to ensure window had enough time to close down
91
+ find_window(nil, TEST_WIN_TITLE).should == nil #!!!!
92
+ end
93
+
94
+ it 'waits f0r window to disappear (NB: this happens before handle is released!)' do
95
+ start = Time.now
96
+ @app.close
97
+ @app.wait_for_close
98
+ (Time.now - start).should be <= Win::Window::CLOSE_TIMEOUT
99
+ window_visible?(@app.handle).should be false
100
+ end
101
+ end
102
+
103
+ context '.top_level class method' do
104
+ it 'finds any top-level window (title = nil) and wraps it in a Window object' do
105
+ use { @win = Window.top_level(title = nil, timeout_sec = 3) }
106
+ Window.should === @win
107
+ end
108
+
109
+ it 'finds top-level window by title and wraps it in a Window object' do
110
+ win = Window.top_level( TEST_WIN_TITLE, 1)
111
+ win.handle.should == @app.handle
112
+ end
113
+ end
114
+
115
+ context '#child' do
116
+ spec { use { @control = @app.child(title_class_id = nil) }}
117
+
118
+ it 'finds any child window(control) if given nil' do
119
+ @app.child(nil).should_not == nil
120
+ end
121
+
122
+ it 'finds child window(control) by class' do
123
+ @app.child(TEST_TEXTAREA_CLASS).should_not == nil
124
+ end
125
+
126
+ it 'finds child window(control) by name' do
127
+ pending 'Need to find control with short name'
128
+ @app.child(TEST_TEXTAREA_TEXT).should_not == nil
129
+ end
130
+
131
+ it 'finds child window(control) by control ID' do
132
+ pending 'Need to find some control ID'
133
+ @app.child(TEST_TEXTAREA_ID).should_not == nil
134
+ end
135
+
136
+ it 'raises error if wrong control is given' do
137
+ expect { @app.child('Impossible Control')}.to raise_error "Control 'Impossible Control' not found"
138
+ end
139
+ it 'substitutes & for _ when searching by title ("&Yes" type controls)'
140
+
141
+ end
142
+
143
+ context '#children' do
144
+ spec { use { children = @app.children }}
145
+
146
+ it 'returns an array' do
147
+ @app.children.should be_a_kind_of(Array)
148
+ end
149
+
150
+ it 'returns an array of all child windows to the given window ' do
151
+ children = @app.children
152
+ children.should be_a_kind_of Array
153
+ children.should_not be_empty
154
+ children.should have(2).elements
155
+ children.each{|child| child?(@app.handle, child.handle).should == true }
156
+ get_class_name(children.last.handle).should == TEST_TEXTAREA_CLASS
157
+ end
158
+
159
+ # it 'finds child window(control) by name' do
160
+ # pending 'Need to find control with short name'
161
+ # @app.child(TEST_TEXTAREA_TEXT).should_not == nil
162
+ # end
163
+ #
164
+ # it 'finds child window(control) by control ID' do
165
+ # pending 'Need to find some control ID'
166
+ # @app.child(TEST_TEXTAREA_ID).should_not == nil
167
+ # end
168
+ #
169
+ # it 'raises error if wrong control is given' do
170
+ # expect { @app.child('Impossible Control')}.to raise_error "Control 'Impossible Control' not found"
171
+ # end
172
+ # it 'substitutes & for _ when searching by title ("&Yes" type controls)'
173
+
174
+ end
175
+
176
+ context '#click' do
177
+ it 'emulates clicking of the control identified by id'
178
+ end
179
+ end
180
+
181
+ end
@@ -9,7 +9,11 @@ module WinWindowTest
9
9
  def launch_test_app
10
10
  system TEST_APP_START
11
11
  sleep TEST_SLEEP_DELAY until (handle = find_window(nil, TEST_WIN_TITLE))
12
+
12
13
  @launched_test_app = Window.new handle
14
+ # app = "Test app" #need to get rid of Window for JRuby
15
+ # class << app; self; end.send( :define_method, :handle, &lambda {handle})
16
+ # @launched_test_app = app
13
17
  end
14
18
 
15
19
  def close_test_app(app = @launched_test_app)
@@ -30,7 +34,29 @@ module WinWindowTest
30
34
 
31
35
  yield app
32
36
  close_test_app
33
- end
37
+ end
38
+
39
+ def commands_should_show_window *cmds, tests
40
+ cmds.each do |cmd|
41
+ test_app do |app|
42
+ show_window(app.handle, cmd)
43
+ tests.each{|test, result| send(test.to_sym, app.handle).should == result}
44
+
45
+ hide_window(app.handle) # hiding window first
46
+ show_window(app.handle, cmd)
47
+ tests.each{|test, result| send(test.to_sym, app.handle).should == result}
48
+
49
+ show_window(app.handle, SW_MAXIMIZE) # now maximizing window
50
+ show_window(app.handle, cmd)
51
+ tests.each{|test, result| send(test.to_sym, app.handle).should == result}
52
+
53
+ show_window(app.handle, SW_MINIMIZE) # now minimizing window
54
+ show_window(app.handle, cmd)
55
+ tests.each{|test, result| send(test.to_sym, app.handle).should == result}
56
+ end
57
+ end
58
+ end
59
+
34
60
 
35
61
  describe Win::Window, ' defines a set user32 API functions related to Window manipulation' do
36
62
  describe '#window?' do
@@ -57,7 +83,7 @@ module WinWindowTest
57
83
  window?(@ta_handle).should == false
58
84
  end
59
85
  end
60
-
86
+
61
87
  describe '#window_visible?' do
62
88
  spec{ use{ IsWindowVisible(any_handle) }}
63
89
  spec{ use{ is_window_visible(any_handle) }}
@@ -105,7 +131,7 @@ module WinWindowTest
105
131
  iconic?(app.handle).should == false
106
132
  minimized?(app.handle).should == false
107
133
  show_window(app.handle, SW_MINIMIZE)
108
- iconic?(app.handle).should == true
134
+ iconic?(app.handle).should == true # !
109
135
  minimized?(app.handle).should == true
110
136
  end
111
137
  end
@@ -271,9 +297,9 @@ module WinWindowTest
271
297
  it 'returns correct window class name' do
272
298
  test_app do |app|
273
299
  get_class_name(app.handle).should == TEST_WIN_CLASS
274
- get_class_name_w(app.handle).should == TEST_WIN_CLASS
300
+ get_class_name_w(app.handle).should == TEST_WIN_CLASS #!!!! nil?
301
+ class_name_w(app.handle).should == TEST_WIN_CLASS #!!!!!!! nil?
275
302
  class_name(app.handle).should == TEST_WIN_CLASS
276
- class_name_w(app.handle).should == TEST_WIN_CLASS
277
303
  end
278
304
  end
279
305
  end
@@ -313,5 +339,206 @@ module WinWindowTest
313
339
  end
314
340
  end
315
341
 
342
+ describe '#show_window ', 'LI', 'I' do
343
+ spec{ use{ was_visible = show_window(handle = any_handle, cmd = SW_SHOWNA) }}
344
+
345
+ it 'was_visible = hide_window(handle = any_handle) # derived method (not a separate API function)' do
346
+ test_app do |app|
347
+ use{ @was_visible = hide_window(app.handle) }
348
+ @was_visible.should == true
349
+ visible?(app.handle).should == false
350
+ hide_window(app.handle).should == false
351
+ visible?(app.handle).should == false
352
+ end
353
+ end
354
+
355
+ it 'returns true if the window was PREVIOUSLY visible, false otherwise' do
356
+ test_app do |app|
357
+ show_window(app.handle, SW_HIDE).should == true
358
+ show_window(app.handle, SW_HIDE).should == false
359
+ end
360
+ end
361
+
362
+ it 'hides window with SW_HIDE command ' do
363
+ test_app do |app|
364
+ show_window(app.handle, SW_HIDE)
365
+ visible?(app.handle).should == false
366
+ end
367
+ end
368
+
369
+ it 'shows hidden window with SW_SHOW command' do
370
+ test_app do |app|
371
+ hide_window(app.handle)
372
+ show_window(app.handle, SW_SHOW)
373
+ visible?(app.handle).should == true
374
+ end
375
+ end
376
+
377
+ it 'SW_MAXIMIZE, SW_SHOWMAXIMIZED maximize window and activate it' do
378
+ commands_should_show_window SW_MAXIMIZE, SW_SHOWMAXIMIZED,
379
+ :minimized? => false, :maximized? => true, :visible? => true, :foreground? => true
380
+ end
381
+
382
+ it 'SW_MINIMIZE minimizes window and activates the next top-level window in the Z order' do
383
+ commands_should_show_window SW_MINIMIZE,
384
+ :minimized? => true, :maximized? => false, :visible? => true, :foreground? => false
385
+ end
386
+
387
+ it 'SW_SHOWMINNOACTIVE, SW_SHOWMINIMIZED displays the window as a minimized foreground window' do
388
+ commands_should_show_window SW_SHOWMINNOACTIVE, SW_SHOWMINIMIZED, #!
389
+ :minimized? => true, :maximized? => false, :visible? => true, :foreground? => true
390
+ end
391
+
392
+ it 'SW_SHOWNORMAL, SW_RESTORE, SW_SHOWNOACTIVATE activate/display a window(if min/maximized it is restored' do
393
+ commands_should_show_window SW_SHOWNORMAL, SW_RESTORE, SW_SHOWNOACTIVATE,
394
+ :minimized? => false, :maximized? => false, :visible? => true, :foreground? => true
395
+ end
396
+
397
+ it 'SW_SHOWNA displays the window in its current size and position (similar to SW_SHOW, but window is not activated)'
398
+ it 'SW_SHOWDEFAULT sets the show state based on the SW_ value specified in the STARTUPINFO structure passed to the CreateProcess function by the program that started the application'
399
+ it 'SW_FORCEMINIMIZE minimizes a window, even if the thread that owns the window is not responding - only Win2000/XP'
400
+ end
401
+
402
+ describe '#enum_windows' do
403
+ before(:all){@app = launch_test_app}
404
+ after(:all){close_test_app}
405
+
406
+ spec{ use{ handles = enum_windows(value = 13) }}
407
+ spec{ use{ enum_windows do |handle, message|
408
+ end }}
409
+
410
+ it 'iterates through all the top-level windows, passing each top level window handle and value to a given block' do
411
+ enum_windows(13) do |handle, message|
412
+ handle.should be_an Integer
413
+ handle.should be > 0
414
+ message.should == 13
415
+ end
416
+ end
417
+
418
+ it 'returns an array of top-level window handles if block is not given' do
419
+ enum = enum_windows(13)
420
+ enum.should be_a_kind_of Array
421
+ enum.should_not be_empty
422
+ enum.should have_at_least(50).elements # typical number of top windows in WinXP system?
423
+ enum.each do |handle|
424
+ handle.should be_an Integer
425
+ handle.should be > 0
426
+ end
427
+ enum.any?{|handle| handle == @app.handle}.should == true
428
+ end
429
+
430
+ it 'returned array that contains handle of launched test app' do
431
+ enum = enum_windows(13)
432
+ enum.any?{|handle| handle == @app.handle}.should == true
433
+ end
434
+
435
+ it 'defaults message to 0 if it is omitted from method call' do
436
+ enum_windows do |handle, message|
437
+ message.should == 0
438
+ end
439
+ end
440
+ end
441
+
442
+ describe '#enum_child_windows' do
443
+ before(:all){@app = launch_test_app}
444
+ after(:all){close_test_app}
445
+
446
+ spec{ use{ enum_child_windows(parent = any_handle, value = 13) }}
447
+
448
+ it 'return an array of child window handles if block is not given' do
449
+ enum = enum_child_windows(@app.handle, 13)
450
+ enum.should be_a_kind_of Array
451
+ enum.should have(2).elements
452
+ class_name(enum.first).should == TEST_STATUSBAR_CLASS
453
+ class_name(enum.last).should == TEST_TEXTAREA_CLASS
454
+ end
455
+
456
+ it 'loops through all children of given window, passing each found window handle and a message to a given block' do
457
+ enum = []
458
+ enum_child_windows(@app.handle, 13) do |handle, message|
459
+ enum << handle
460
+ message.should == 13
461
+ end
462
+ enum.should have(2).elements
463
+ class_name(enum.first).should == TEST_STATUSBAR_CLASS
464
+ class_name(enum.last).should == TEST_TEXTAREA_CLASS
465
+ end
466
+
467
+ it 'breaks loop if given block returns false' do
468
+ enum = []
469
+ enum_child_windows(@app.handle) do |handle, message|
470
+ enum << handle
471
+ false
472
+ end
473
+ enum.should have(1).element
474
+ class_name(enum.first).should == TEST_STATUSBAR_CLASS
475
+ end
476
+
477
+ it 'defaults message to 0 if it is omitted from method call' do
478
+ enum_child_windows(@app.handle) do |handle, message|
479
+ message.should == 0
480
+ end
481
+ end
482
+ end
483
+
484
+ describe '#keydb_event' do
485
+ spec{ use{ keybd_event(vkey = 0, bscan = 0, flags = 0, extra_info = 0) }}
486
+
487
+ it 'synthesizes a numeric keystrokes, emulating keyboard driver' do
488
+ test_app do |app|
489
+ text = '123 456'
490
+ text.upcase.each_byte do |b| # upcase needed since user32 keybd_event expects upper case chars
491
+ keybd_event(b.ord, 0, KEYEVENTF_KEYDOWN, 0)
492
+ sleep TEST_KEY_DELAY
493
+ keybd_event(b.ord, 0, KEYEVENTF_KEYUP, 0)
494
+ sleep TEST_KEY_DELAY
495
+ end
496
+ app.textarea.text.should =~ Regexp.new(text)
497
+ 7.times {keystroke(VK_CONTROL, 'Z'.ord)} # dirty hack!
498
+ end
499
+ end
500
+ end
501
+
502
+ describe '#post_message' do
503
+ spec{ use{ success = post_message(handle = 0, msg = 0, w_param = 0, l_param = 0) }}
504
+ # handle (L) - Handle to the window whose window procedure will receive the message.
505
+ # If this parameter is HWND_BROADCAST, the message is sent to all top-level windows in the system, including disabled or
506
+ # invisible unowned windows, overlapped windows, and pop-up windows; but the message is not sent to child windows.
507
+ # msg (L) - Specifies the message to be posted.
508
+ # w_param (L) - Specifies additional message-specific information.
509
+ # l_param (L) - Specifies additional message-specific information.
510
+ # returns (L) - Nonzero if success, zero if function failed. To get extended error information, call GetLastError.
511
+
512
+ it 'places (posts) a message in the message queue associated with the thread that created the specified window'
513
+ it 'returns without waiting for the thread to process the message'
514
+ end
515
+
516
+ describe '#send_message' do
517
+ spec{ use{ success = send_message(handle = 0, msg = 0, w_param = 1024, l_param = "\x0"*1024) }}
518
+ # handle (L) - Handle to the window whose window procedure is to receive the message. The following values have special meanings.
519
+ # HWND_BROADCAST - The message is posted to all top-level windows in the system, including disabled or invisible unowned windows,
520
+ # overlapped windows, and pop-up windows. The message is not posted to child windows.
521
+ # NULL - The function behaves like a call to PostThreadMessage with the dwThreadId parameter set to the identifier of the current thread.
522
+ # msg (L) - Specifies the message to be posted.
523
+ # w_param (L) - Specifies additional message-specific information.
524
+ # l_param (L) - Specifies additional message-specific information.
525
+ # return (L) - Nonzero if success, zero if function failed. To get extended error information, call GetLastError.
526
+
527
+ it 'sends the specified message to a window or windows'
528
+ it 'calls the window procedure and does not return until the window procedure has processed the message'
529
+ end
530
+
531
+ describe '#get_dlg_item' do
532
+ spec{ use{ control_handle = get_dlg_item(handle = 0, item_id = 1) }}
533
+ # handle (L) - Handle of the dialog box that contains the control.
534
+ # item_id (I) - Specifies the identifier of the control to be retrieved.
535
+ # Returns (L) - handle of the specified control if success or nil for invalid dialog box handle or a nonexistent control.
536
+ # To get extended error information, call GetLastError.
537
+ # You can use the GetDlgItem function with any parent-child window pair, not just with dialog boxes. As long as the handle
538
+ # parameter specifies a parent window and the child window has a unique id (as specified by the hMenu parameter in the
539
+ # CreateWindow or CreateWindowEx function that created the child window), GetDlgItem returns a valid handle to the child window.
540
+
541
+ it 'returns handle to correctly specified control'
542
+ end
316
543
  end
317
544
  end
data/win.gemspec CHANGED
@@ -5,12 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{win}
8
- s.version = "0.0.4"
8
+ s.version = "0.0.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["arvicco"]
12
- s.date = %q{2010-02-11}
13
- s.description = %q{A collection of Windows functions predefined for you using FFI}
12
+ s.date = %q{2010-02-14}
13
+ s.description = %q{A collection of pre-defined Windows API functions with Rubyesque interfaces}
14
14
  s.email = %q{arvitallian@gmail.com}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
@@ -26,14 +26,18 @@ Gem::Specification.new do |s|
26
26
  "features/step_definitions/win_steps.rb",
27
27
  "features/support/env.rb",
28
28
  "features/win.feature",
29
+ "lib/win/dde.rb",
29
30
  "lib/win/extensions.rb",
30
31
  "lib/win/library.rb",
31
32
  "lib/win/window.rb",
33
+ "lib/win/window/extra.rb",
32
34
  "spec/spec.opts",
33
35
  "spec/spec_helper.rb",
34
36
  "spec/test_apps/locknote/LockNote.exe",
37
+ "spec/win/dde_spec.rb",
35
38
  "spec/win/extensions_spec.rb",
36
39
  "spec/win/library_spec.rb",
40
+ "spec/win/window/extra_spec.rb",
37
41
  "spec/win/window_spec.rb",
38
42
  "win.gemspec"
39
43
  ]
@@ -41,11 +45,13 @@ Gem::Specification.new do |s|
41
45
  s.rdoc_options = ["--charset=UTF-8"]
42
46
  s.require_paths = ["lib"]
43
47
  s.rubygems_version = %q{1.3.5}
44
- s.summary = %q{A collection of Windows functions predefined for you using FFI}
48
+ s.summary = %q{A collection of pre-defined Windows API functions with Rubyesque interfaces}
45
49
  s.test_files = [
46
50
  "spec/spec_helper.rb",
51
+ "spec/win/dde_spec.rb",
47
52
  "spec/win/extensions_spec.rb",
48
53
  "spec/win/library_spec.rb",
54
+ "spec/win/window/extra_spec.rb",
49
55
  "spec/win/window_spec.rb"
50
56
  ]
51
57
 
@@ -54,13 +60,16 @@ Gem::Specification.new do |s|
54
60
  s.specification_version = 3
55
61
 
56
62
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
63
+ s.add_runtime_dependency(%q<ffi>, [">= 0.6.0"])
57
64
  s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
58
65
  s.add_development_dependency(%q<cucumber>, [">= 0"])
59
66
  else
67
+ s.add_dependency(%q<ffi>, [">= 0.6.0"])
60
68
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
61
69
  s.add_dependency(%q<cucumber>, [">= 0"])
62
70
  end
63
71
  else
72
+ s.add_dependency(%q<ffi>, [">= 0.6.0"])
64
73
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
65
74
  s.add_dependency(%q<cucumber>, [">= 0"])
66
75
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: win
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - arvicco
@@ -9,9 +9,19 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-11 00:00:00 +03:00
12
+ date: 2010-02-14 00:00:00 +03:00
13
13
  default_executable:
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: ffi
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.6.0
24
+ version:
15
25
  - !ruby/object:Gem::Dependency
16
26
  name: rspec
17
27
  type: :development
@@ -32,7 +42,7 @@ dependencies:
32
42
  - !ruby/object:Gem::Version
33
43
  version: "0"
34
44
  version:
35
- description: A collection of Windows functions predefined for you using FFI
45
+ description: A collection of pre-defined Windows API functions with Rubyesque interfaces
36
46
  email: arvitallian@gmail.com
37
47
  executables: []
38
48
 
@@ -51,14 +61,18 @@ files:
51
61
  - features/step_definitions/win_steps.rb
52
62
  - features/support/env.rb
53
63
  - features/win.feature
64
+ - lib/win/dde.rb
54
65
  - lib/win/extensions.rb
55
66
  - lib/win/library.rb
56
67
  - lib/win/window.rb
68
+ - lib/win/window/extra.rb
57
69
  - spec/spec.opts
58
70
  - spec/spec_helper.rb
59
71
  - spec/test_apps/locknote/LockNote.exe
72
+ - spec/win/dde_spec.rb
60
73
  - spec/win/extensions_spec.rb
61
74
  - spec/win/library_spec.rb
75
+ - spec/win/window/extra_spec.rb
62
76
  - spec/win/window_spec.rb
63
77
  - win.gemspec
64
78
  has_rdoc: true
@@ -88,9 +102,11 @@ rubyforge_project:
88
102
  rubygems_version: 1.3.5
89
103
  signing_key:
90
104
  specification_version: 3
91
- summary: A collection of Windows functions predefined for you using FFI
105
+ summary: A collection of pre-defined Windows API functions with Rubyesque interfaces
92
106
  test_files:
93
107
  - spec/spec_helper.rb
108
+ - spec/win/dde_spec.rb
94
109
  - spec/win/extensions_spec.rb
95
110
  - spec/win/library_spec.rb
111
+ - spec/win/window/extra_spec.rb
96
112
  - spec/win/window_spec.rb