windows-api 0.2.3 → 0.2.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.
data/CHANGES CHANGED
@@ -1,3 +1,14 @@
1
+ = 0.2.4 - 18-Jul-2008
2
+ * Eliminated unnecessary LoadLibrary() attempts for functions that explicitly
3
+ end with an 'A' or 'W', and all MSVCRT functions, since they have no 'A'
4
+ or 'W' equivalent.
5
+ * Replaced all of the attr_reader's with a delegation scheme using Forwardable.
6
+ All Win32::API functions now delegate to the internally stored Win32::API
7
+ object instead of reimplementing them. This change also fixed a bug where
8
+ the effective_function_name method did not work properly.
9
+ * Added more tests, and fixed one assertion that was wrong (the prototype).
10
+ * Some documentation additions.
11
+
1
12
  = 0.2.3 - 26-Apr-2008
2
13
  * Improved API.auto_constant and API.auto_method handling for functions that
3
14
  start with a lower case character or an underscore.
@@ -19,4 +30,4 @@
19
30
  * Fixed a void parameter bug.
20
31
 
21
32
  = 0.1.0 - 24-May-2007
22
- * Initial release
33
+ * Initial release
data/MANIFEST CHANGED
@@ -4,4 +4,4 @@
4
4
  * Rakefile
5
5
  * windows-api.gemspec
6
6
  * lib/windows/api.rb
7
- * test/tc_windows_api.rb
7
+ * test/test_windows_api.rb
data/Rakefile CHANGED
@@ -20,8 +20,6 @@ task :install_gem do
20
20
  end
21
21
 
22
22
  Rake::TestTask.new do |test|
23
- test.libs << 'lib'
24
23
  test.warning = true
25
24
  test.verbose = true
26
- test.test_files = FileList['test/tc*']
27
25
  end
data/lib/windows/api.rb CHANGED
@@ -1,8 +1,11 @@
1
1
  require 'win32/api'
2
2
  require 'rbconfig'
3
+ require 'forwardable'
3
4
  include Config
4
5
 
6
+ # The Windows module serves as a namespace only
5
7
  module Windows
8
+
6
9
  # With Microsoft Visual C++ 8 and later users should use the associated
7
10
  # DLL instead of msvcrt directly, if possible.
8
11
  if CONFIG['host_os'].split('_')[1]
@@ -17,13 +20,23 @@ module Windows
17
20
  MSVCRT_DLL = 'msvcrt'
18
21
  end
19
22
 
23
+ # Wrapper around the Win32::API class
20
24
  class API
21
- VERSION = '0.2.3'
25
+ extend Forwardable
26
+
27
+ # The version of this library
28
+ VERSION = '0.2.4'
22
29
 
30
+ # Error typically raised if any of the Windows::API methods fail
23
31
  class Error < RuntimeError; end
32
+
33
+ # The methods from Win32::API are delegated to the appropriate object
34
+ def_delegators(:@api, :function_name, :dll_name, :prototype)
35
+ def_delegators(:@api, :return_type, :effective_function_name)
24
36
 
25
37
  private
26
38
 
39
+ # Verbose data types that can be used instead of single letters
27
40
  DATA_TYPES = {
28
41
  'ATOM' => 'I',
29
42
  'BOOL' => 'B',
@@ -275,11 +288,7 @@ module Windows
275
288
  @auto_unicode = bool
276
289
  end
277
290
 
278
- attr_reader :function_name
279
- attr_reader :dll_name
280
- attr_reader :prototype
281
- attr_reader :return_type
282
-
291
+
283
292
  # call-seq:
284
293
  # API.new(func, proto='V', rtype='L', dll='kernel32')
285
294
  #
@@ -335,20 +344,24 @@ module Windows
335
344
  api_w = nil
336
345
 
337
346
  # If the auto_unicode option is set, and the func is not already
338
- # an explicit ANSI or Unicode function name, generate Win32::API
347
+ # an explicit ANSI or Wide function name, generate Win32::API
339
348
  # objects for those functions as well. Ignore errors because not
340
- # all functions have explicit ANSI or Unicode equivalents.
349
+ # all functions have explicit ANSI or Wide character implementations.
350
+ #
351
+ # This entire bit of logic is skipped if the DLL is msvcrt, since
352
+ # msvcrt functions never have explicit ANSI or Wide character
353
+ # versions.
341
354
  #
342
- if Windows::API.auto_unicode
355
+ if Windows::API.auto_unicode && dll.downcase != 'msvcrt'
343
356
  begin
344
- if func[-1].chr != 'A'
357
+ unless ['A', 'W'].include?(func[-1].chr)
345
358
  api_a = Win32::API.new("#{func}A", proto, rtype, dll)
346
359
  end
347
360
  rescue RuntimeError
348
361
  end
349
-
362
+
350
363
  begin
351
- if func[-1].chr != 'W'
364
+ unless ['W', 'A'].include?(func[-1].chr)
352
365
  api_w = Win32::API.new("#{func}W", proto, rtype, dll)
353
366
  end
354
367
  rescue RuntimeError
@@ -478,7 +491,7 @@ module Windows
478
491
  def call(*args)
479
492
  @api.call(*args)
480
493
  end
481
-
494
+
482
495
  private
483
496
 
484
497
  # Get a module's namespace. This is basically the equivalent of
@@ -1,5 +1,5 @@
1
1
  ############################################################################
2
- # tc_windows_api.rb
2
+ # test_windows_api.rb
3
3
  #
4
4
  # Test case for the Windows::API class. You should run this as Rake task,
5
5
  # i.e. 'rake test', instead of running it directly.
@@ -36,11 +36,11 @@ module Windows
36
36
  API.auto_namespace = 'Windows::Baz'
37
37
  API.auto_constant = true
38
38
  API.auto_method = true
39
- API.auto_unicode = false
40
39
 
41
- API.new('strstr', 'PP', 'P', 'msvcrt')
42
- API.new('_umask', 'I', 'I', 'msvcrt')
43
- API.new('waveOutGetNumDevs', 'V', 'I', 'winmm')
40
+ $strstr = API.new('strstr', 'PP', 'P', 'msvcrt')
41
+ $umask = API.new('_umask', 'I', 'I', 'msvcrt')
42
+ $wave = API.new('waveOutGetNumDevs', 'V', 'I', 'winmm')
43
+ $read = API.new('ReadDirectoryChangesW', 'LPLILPPP', 'B') # No ANSI equivalent
44
44
  end
45
45
  end
46
46
 
@@ -55,7 +55,7 @@ class TC_Windows_API < Test::Unit::TestCase
55
55
  end
56
56
 
57
57
  def test_version
58
- assert_equal('0.2.3', API::VERSION)
58
+ assert_equal('0.2.4', API::VERSION)
59
59
  end
60
60
 
61
61
  def test_full_data_types
@@ -75,6 +75,12 @@ class TC_Windows_API < Test::Unit::TestCase
75
75
  assert_not_nil(Windows::Baz::WaveOutGetNumDevs)
76
76
  end
77
77
 
78
+ def test_explicit_wide_function_only
79
+ assert_not_nil(Windows::Baz::ReadDirectoryChangesW)
80
+ assert_equal(false, Windows::Baz.constants.include?('ReadDirectoryChanges'))
81
+ assert_equal(false, Windows::Baz.constants.include?('ReadDirectoryChangesA'))
82
+ end
83
+
78
84
  def test_lower_case_auto_methods
79
85
  assert_respond_to(self, :strstr)
80
86
  assert_respond_to(self, :umask)
@@ -126,13 +132,21 @@ class TC_Windows_API < Test::Unit::TestCase
126
132
 
127
133
  def test_prototype
128
134
  assert_respond_to($test_method, :prototype)
129
- assert_equal('PP', $test_method.prototype)
135
+ assert_equal(['P', 'P'], $test_method.prototype)
130
136
  end
131
137
 
132
138
  def test_return_type
133
139
  assert_respond_to($test_method, :return_type)
134
140
  assert_equal('L', $test_method.return_type)
135
141
  end
142
+
143
+ def test_effective_function_name
144
+ assert_respond_to($test_method, :effective_function_name)
145
+ assert_equal('GetCurrentDirectoryA', $test_method.effective_function_name)
146
+ assert_equal('strstr', $strstr.effective_function_name)
147
+ assert_equal('waveOutGetNumDevs', $wave.effective_function_name)
148
+ assert_equal('ReadDirectoryChangesW', $read.effective_function_name)
149
+ end
136
150
 
137
151
  def teardown
138
152
  @buf = nil
data/windows-api.gemspec CHANGED
@@ -2,7 +2,7 @@ require "rubygems"
2
2
 
3
3
  spec = Gem::Specification.new do |gem|
4
4
  gem.name = "windows-api"
5
- gem.version = "0.2.3"
5
+ gem.version = "0.2.4"
6
6
  gem.author = "Daniel J. Berger"
7
7
  gem.email = "djberg96@gmail.com"
8
8
  gem.homepage = "http://www.rubyforge.org/projects/win32utils"
@@ -10,7 +10,7 @@ spec = Gem::Specification.new do |gem|
10
10
  gem.platform = Gem::Platform::RUBY
11
11
  gem.summary = "An easier way to create methods using Win32API"
12
12
  gem.description = "An easier way to create methods using Win32API"
13
- gem.test_file = "test/tc_windows_api.rb"
13
+ gem.test_file = "test/test_windows_api.rb"
14
14
  gem.has_rdoc = true
15
15
  gem.files = Dir["lib/windows/*.rb"] + Dir["test/*"] + Dir["[A-Z]*"]
16
16
  gem.files.reject! { |fn| fn.include? "CVS" }
@@ -0,0 +1,25 @@
1
+ require "rubygems"
2
+
3
+ spec = Gem::Specification.new do |gem|
4
+ gem.name = "windows-api"
5
+ gem.version = "0.2.4"
6
+ gem.author = "Daniel J. Berger"
7
+ gem.email = "djberg96@gmail.com"
8
+ gem.homepage = "http://www.rubyforge.org/projects/win32utils"
9
+ gem.rubyforge_project = "win32utils"
10
+ gem.platform = Gem::Platform::RUBY
11
+ gem.summary = "An easier way to create methods using Win32API"
12
+ gem.description = "An easier way to create methods using Win32API"
13
+ gem.test_file = "test/tc_windows_api.rb"
14
+ gem.has_rdoc = true
15
+ gem.files = Dir["lib/windows/*.rb"] + Dir["test/*"] + Dir["[A-Z]*"]
16
+ gem.files.reject! { |fn| fn.include? "CVS" }
17
+ gem.require_path = "lib"
18
+ gem.extra_rdoc_files = ["README", "CHANGES", "MANIFEST"]
19
+ gem.add_dependency("win32-api", ">= 1.0.5")
20
+ end
21
+
22
+ if $0 == __FILE__
23
+ Gem.manage_gems
24
+ Gem::Builder.new(spec).build
25
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: windows-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel J. Berger
@@ -9,11 +9,12 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-04-26 00:00:00 -06:00
12
+ date: 2008-07-19 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: win32-api
17
+ type: :runtime
17
18
  version_requirement:
18
19
  version_requirements: !ruby/object:Gem::Requirement
19
20
  requirements:
@@ -34,7 +35,7 @@ extra_rdoc_files:
34
35
  files:
35
36
  - lib/windows/api.rb
36
37
  - test/CVS
37
- - test/tc_windows_api.rb
38
+ - test/test_windows_api.rb
38
39
  - CHANGES
39
40
  - CVS
40
41
  - lib
@@ -43,6 +44,7 @@ files:
43
44
  - README
44
45
  - test
45
46
  - windows-api.gemspec
47
+ - windows-api.gemspec~
46
48
  has_rdoc: true
47
49
  homepage: http://www.rubyforge.org/projects/win32utils
48
50
  post_install_message:
@@ -65,9 +67,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
67
  requirements: []
66
68
 
67
69
  rubyforge_project: win32utils
68
- rubygems_version: 1.1.1
70
+ rubygems_version: 1.2.0
69
71
  signing_key:
70
72
  specification_version: 2
71
73
  summary: An easier way to create methods using Win32API
72
74
  test_files:
73
- - test/tc_windows_api.rb
75
+ - test/test_windows_api.rb