win 0.1.27 → 0.3.1

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/.document CHANGED
@@ -1,5 +1,5 @@
1
- README.rdoc
2
- lib/**/*.rb
3
- bin/*
4
- features/**/*.feature
5
- LICENSE
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore CHANGED
@@ -1,21 +1,21 @@
1
- ## MAC OS
2
- .DS_Store
3
-
4
- ## TEXTMATE
5
- *.tmproj
6
- tmtags
7
-
8
- ## EMACS
9
- *~
10
- \#*
11
- .\#*
12
-
13
- ## VIM
14
- *.swp
15
-
16
- ## PROJECT::GENERAL
17
- coverage
18
- rdoc
19
- pkg
20
-
21
- ## PROJECT::SPECIFIC
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE CHANGED
@@ -1,20 +1,20 @@
1
- Copyright (c) 2009 arvicco
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1
+ Copyright (c) 2009 arvicco
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc CHANGED
@@ -1,175 +1,175 @@
1
- = win
2
-
3
- by: Arvicco
4
- url: http://github.com/arvicco/win
5
-
6
- == DESCRIPTION
7
-
8
- A collection of Windows API functions predefined for you using FFI. In addition to
9
- straightforward (CamelCase) API wrappers, it also strives to provide more Ruby-like
10
- snake_case methods that take a minimum of arguments with sensible defaults and have
11
- sensible return values (false/true instead of 0/nonzero for test functions, etc).
12
-
13
- This is still work in progress, only a small portion of Windows API wrapped so far...
14
-
15
- == SUMMARY
16
-
17
- So you want to write a simple program that makes some Windows API function calls.
18
- You searched MSDN high and low and you know exactly what functions you need.
19
- You just want to put these function calls into your Ruby code without too much pain.
20
- You'd love this to be more or less natural extension of your Ruby code, preferably
21
- not turning your code base into an ugly spaghetty of CamelCase calls, String/Array
22
- pack/unpack gymnastics, buffer/pointer allocations, extracting return values
23
- from [in/out] parameters and checking return codes for 0.
24
-
25
- You have several options at this point. You can use 'win32-api' or 'ffi' libraries
26
- to connect your ruby code to Windows API and manually define wrapper methods for
27
- needed function calls. This is definitely a valid approach, even if it is a bit
28
- low-level one: you'll have to handle (somewhat) gory details of callback announcements,
29
- argument preparation, mimicking pointers with Strings, declaring pointers explicitly
30
- with FFI and other stuff (like manually assigning about a gazillion obscure Windows
31
- constants). As an example, consider the amount of code needed to complete a task as
32
- simple as getting unicode title text for the window that you already have handle for
33
- (using win32-api):
34
-
35
- api = Win32::API.new( 'GetWindowTextW', ['L', 'P', 'I'], 'L', 'user32' )
36
- buffer = "\x00" * 1024 # I just hope it will be enough...
37
- num_chars = api.call(window_handle, buffer, buffer.size)
38
- title = if num_chars == 0
39
- nil
40
- else
41
- buffer.force_encoding('utf-16LE').encode('utf-8').rstrip
42
- end
43
-
44
- This is how you achieve the same result with ffi:
45
-
46
- extend FFI::Library
47
- ffi_lib 'user32'
48
- ffi_convention :stdcall
49
- attach_function :GetWindowTextW, [ :long, :buffer_out, :int ], :long
50
- buffer = FFI::Buffer.new 1024
51
- buffer.put_string(0, "\x00" * 1024)
52
- num_chars = GetWindowTextW(window_handle, buffer, 1024)
53
- title = if num_chars == 0
54
- nil
55
- else
56
- buffer.get_bytes(0, num_chars).force_encoding('utf-16LE').encode('utf-8').rstrip
57
- end
58
-
59
- As an alternative, you can use 'windows-pr' (pure ruby) library that gives you lots of
60
- Windows functions pre-defined and sectioned into modules, declares Windows constants and
61
- adds some other niceties. Unfortunately this library works only with MRI (not JRuby or
62
- other Ruby implementations), and still lacks Ruby look-and-feel for declared functions.
63
- It helps you to cut some of the declaration slack though:
64
-
65
- title = if GetWindowTextW(window_handle, buffer ="\x00" * 1024 , buffer.size) == 0
66
- nil
67
- else
68
- buffer.force_encoding('utf-16LE').encode('utf-8').rstrip
69
- end
70
-
71
- But still, it seems like TOO MUCH code for something that should (ideally) look like this:
72
-
73
- title = window_text_w(window_handle)
74
-
75
- This is an idea behind this library - make Windows API functions easier to use and feel more
76
- natural inside Ruby code. Following the principle of least surprise, we define wrapper methods that:
77
- * Have meaningful Rubyesque names (iconic? and minimized? instead of IsIconic, etc)
78
- * Require minimum arguments with sensible defaults
79
- * Return appropriate values explicitly (several return values if necessary)
80
- * Have sensible returns (false/true instead of 0/nonzero for test functions, nil if find function fails, etc)
81
- * Accept blocks where callback is needed, provide default callback if no block given
82
- * Are partitioned into appropriate namespaces, so that you can load only the modules you really need
83
-
84
- Well, we even keep a backup solution for those diehard Win32 API longtimers who would rather
85
- allocate their buffer strings by hand and mess with obscure return codes. If you use original
86
- CamelCase method name instead of Rubyesque snake_case one, it will expect those standard
87
- parameters you know and love from MSDN, return your zeroes instead of nils and support no
88
- other enhancements.
89
-
90
- Related Windows API functions are grouped by topic and defined in separate namespaces (modules),
91
- that also contain related constants and convenience methods. For example, win/dde.rb file
92
- contains only functions related to DDE protocol such as DdeInitialize() as well as constants
93
- such as DMLERR_NO_ERROR, APPCLASS_STANDARD, etc. So if you need only DDE-related functions,
94
- there is no need to load all the other modules, clogging your namespaces - just require 'win/dde'
95
- and be done with it.
96
-
97
- And if you do not see your favorite Windows API functions among those already defined, it is
98
- quite easy to 'include Win::Library' into your module and define new ones with 'function' macro -
99
- it does a lot of heavy lifting for you and can be customized with options and code blocks to give
100
- you reusable API wrapper methods with the exact behavior you need.
101
-
102
- == REQUIREMENTS:
103
-
104
- Only works with Ruby 1.9 compatible implementations since it uses some of the most recent features
105
- (block arguments given to block, etc...).
106
-
107
- == FEATURES/PROBLEMS:
108
-
109
- This project is quite new, so it may be not suitable for production-quality systems yet.
110
- Contributors always welcome!
111
-
112
- == INSTALLATION
113
-
114
- $ gem install win
115
-
116
- == SYNOPSIS
117
- === Using pre-defined Windows API functions:
118
-
119
- require 'win/gui/window'
120
-
121
- class MyClass
122
- include Win::GUI::Window
123
-
124
- fg_window = foreground_window
125
- puts window_text(fg_window)
126
- show_window(fg_window) unless minimized?(fg_window)
127
- ...
128
- end
129
-
130
- === Defining your own Windows API functions:
131
-
132
- require 'win/library'
133
-
134
- module YourLibModule
135
- include Win::Library
136
-
137
- # Customizing method behavior: zeronil forces function to return nil instead of 0, rename renames method
138
- function :FindWindow, [:pointer, :pointer], :ulong, zeronil: true, rename: :my_find
139
-
140
- # Customizing even further: your own method extension in attached block
141
- function :GetWindowText, [ :ulong, :pointer, :int ], :int do |api, handle|
142
- buffer = FFI::MemoryPointer.new :char, 512
143
- buffer.put_string(0, "\x00" * 511)
144
- num_chars = api.call(handle, buffer, 512)
145
- num_chars == 0 ? nil : buffer.get_bytes(0, num_chars)
146
- end
147
-
148
- end
149
-
150
- include YourLibModule
151
-
152
- handle = my_find(nil, 'cmd') # find any shell window
153
- puts handle, window_text(handle) # print shell window handle and title
154
-
155
- == PRIOR ART:
156
-
157
- This library started as an extension of ideas and code described in excellent book
158
- "Scripted GUI Testing with Ruby" by Ian Dees. 'win32-api' and 'windows-pr' gems by
159
- Daniel J. Berger and Park Heesob provided both inspiration and an excellent source
160
- for code borrowing. 'ffi' gem serves as a solid basis for this library, allowing to
161
- use it for multiple Ruby implementations.
162
-
163
- == Note on Patches/Pull Requests
164
-
165
- * Fork the project.
166
- * Make your feature addition or bug fix.
167
- * Add tests for it. This is important so I don't break it in a
168
- future version unintentionally.
169
- * Commit, do not mess with rakefile, version, or history.
170
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
171
- * Send me a pull request. Bonus points for topic branches.
172
-
173
- == Copyright
174
-
175
- Copyright (c) 2010 arvicco. See LICENSE for details.
1
+ = win
2
+
3
+ by: Arvicco
4
+ url: http://github.com/arvicco/win
5
+
6
+ == DESCRIPTION
7
+
8
+ A collection of Windows API functions predefined for you using FFI. In addition to
9
+ straightforward (CamelCase) API wrappers, it also strives to provide more Ruby-like
10
+ snake_case methods that take a minimum of arguments with sensible defaults and have
11
+ sensible return values (false/true instead of 0/nonzero for test functions, etc).
12
+
13
+ This is still work in progress, only a small portion of Windows API wrapped so far...
14
+
15
+ == SUMMARY
16
+
17
+ So you want to write a simple program that makes some Windows API function calls.
18
+ You searched MSDN high and low and you know exactly what functions you need.
19
+ You just want to put these function calls into your Ruby code without too much pain.
20
+ You'd love this to be more or less natural extension of your Ruby code, preferably
21
+ not turning your code base into an ugly spaghetty of CamelCase calls, String/Array
22
+ pack/unpack gymnastics, buffer/pointer allocations, extracting return values
23
+ from [in/out] parameters and checking return codes for 0.
24
+
25
+ You have several options at this point. You can use 'win32-api' or 'ffi' libraries
26
+ to connect your ruby code to Windows API and manually define wrapper methods for
27
+ needed function calls. This is definitely a valid approach, even if it is a bit
28
+ low-level one: you'll have to handle (somewhat) gory details of callback announcements,
29
+ argument preparation, mimicking pointers with Strings, declaring pointers explicitly
30
+ with FFI and other stuff (like manually assigning about a gazillion obscure Windows
31
+ constants). As an example, consider the amount of code needed to complete a task as
32
+ simple as getting unicode title text for the window that you already have handle for
33
+ (using win32-api):
34
+
35
+ api = Win32::API.new( 'GetWindowTextW', ['L', 'P', 'I'], 'L', 'user32' )
36
+ buffer = "\x00" * 1024 # I just hope it will be enough...
37
+ num_chars = api.call(window_handle, buffer, buffer.size)
38
+ title = if num_chars == 0
39
+ nil
40
+ else
41
+ buffer.force_encoding('utf-16LE').encode('utf-8').rstrip
42
+ end
43
+
44
+ This is how you achieve the same result with ffi:
45
+
46
+ extend FFI::Library
47
+ ffi_lib 'user32'
48
+ ffi_convention :stdcall
49
+ attach_function :GetWindowTextW, [ :long, :buffer_out, :int ], :long
50
+ buffer = FFI::Buffer.new 1024
51
+ buffer.put_string(0, "\x00" * 1024)
52
+ num_chars = GetWindowTextW(window_handle, buffer, 1024)
53
+ title = if num_chars == 0
54
+ nil
55
+ else
56
+ buffer.get_bytes(0, num_chars).force_encoding('utf-16LE').encode('utf-8').rstrip
57
+ end
58
+
59
+ As an alternative, you can use 'windows-pr' (pure ruby) library that gives you lots of
60
+ Windows functions pre-defined and sectioned into modules, declares Windows constants and
61
+ adds some other niceties. Unfortunately this library works only with MRI (not JRuby or
62
+ other Ruby implementations), and still lacks Ruby look-and-feel for declared functions.
63
+ It helps you to cut some of the declaration slack though:
64
+
65
+ title = if GetWindowTextW(window_handle, buffer ="\x00" * 1024 , buffer.size) == 0
66
+ nil
67
+ else
68
+ buffer.force_encoding('utf-16LE').encode('utf-8').rstrip
69
+ end
70
+
71
+ But still, it seems like TOO MUCH code for something that should (ideally) look like this:
72
+
73
+ title = window_text_w(window_handle)
74
+
75
+ This is an idea behind this library - make Windows API functions easier to use and feel more
76
+ natural inside Ruby code. Following the principle of least surprise, we define wrapper methods that:
77
+ * Have meaningful Rubyesque names (iconic? and minimized? instead of IsIconic, etc)
78
+ * Require minimum arguments with sensible defaults
79
+ * Return appropriate values explicitly (several return values if necessary)
80
+ * Have sensible returns (false/true instead of 0/nonzero for test functions, nil if find function fails, etc)
81
+ * Accept blocks where callback is needed, provide default callback if no block given
82
+ * Are partitioned into appropriate namespaces, so that you can load only the modules you really need
83
+
84
+ Well, we even keep a backup solution for those diehard Win32 API longtimers who would rather
85
+ allocate their buffer strings by hand and mess with obscure return codes. If you use original
86
+ CamelCase method name instead of Rubyesque snake_case one, it will expect those standard
87
+ parameters you know and love from MSDN, return your zeroes instead of nils and support no
88
+ other enhancements.
89
+
90
+ Related Windows API functions are grouped by topic and defined in separate namespaces (modules),
91
+ that also contain related constants and convenience methods. For example, win/dde.rb file
92
+ contains only functions related to DDE protocol such as DdeInitialize() as well as constants
93
+ such as DMLERR_NO_ERROR, APPCLASS_STANDARD, etc. So if you need only DDE-related functions,
94
+ there is no need to load all the other modules, clogging your namespaces - just require 'win/dde'
95
+ and be done with it.
96
+
97
+ And if you do not see your favorite Windows API functions among those already defined, it is
98
+ quite easy to 'include Win::Library' into your module and define new ones with 'function' macro -
99
+ it does a lot of heavy lifting for you and can be customized with options and code blocks to give
100
+ you reusable API wrapper methods with the exact behavior you need.
101
+
102
+ == REQUIREMENTS:
103
+
104
+ Only works with Ruby 1.9 compatible implementations since it uses some of the most recent features
105
+ (block arguments given to block, etc...).
106
+
107
+ == FEATURES/PROBLEMS:
108
+
109
+ This project is quite new, so it may be not suitable for production-quality systems yet.
110
+ Contributors always welcome!
111
+
112
+ == INSTALLATION
113
+
114
+ $ gem install win
115
+
116
+ == SYNOPSIS
117
+ === Using pre-defined Windows API functions:
118
+
119
+ require 'win/gui/window'
120
+
121
+ class MyClass
122
+ include Win::GUI::Window
123
+
124
+ fg_window = foreground_window
125
+ puts window_text(fg_window)
126
+ show_window(fg_window) unless minimized?(fg_window)
127
+ ...
128
+ end
129
+
130
+ === Defining your own Windows API functions:
131
+
132
+ require 'win/library'
133
+
134
+ module YourLibModule
135
+ include Win::Library
136
+
137
+ # Customizing method behavior: zeronil forces function to return nil instead of 0, rename renames method
138
+ function :FindWindow, [:pointer, :pointer], :ulong, zeronil: true, rename: :my_find
139
+
140
+ # Customizing even further: your own method extension in attached block
141
+ function :GetWindowText, [ :ulong, :pointer, :int ], :int do |api, handle|
142
+ buffer = FFI::MemoryPointer.new :char, 512
143
+ buffer.put_string(0, "\x00" * 511)
144
+ num_chars = api.call(handle, buffer, 512)
145
+ num_chars == 0 ? nil : buffer.get_bytes(0, num_chars)
146
+ end
147
+
148
+ end
149
+
150
+ include YourLibModule
151
+
152
+ handle = my_find(nil, 'cmd') # find any shell window
153
+ puts handle, window_text(handle) # print shell window handle and title
154
+
155
+ == PRIOR ART:
156
+
157
+ This library started as an extension of ideas and code described in excellent book
158
+ "Scripted GUI Testing with Ruby" by Ian Dees. 'win32-api' and 'windows-pr' gems by
159
+ Daniel J. Berger and Park Heesob provided both inspiration and an excellent source
160
+ for code borrowing. 'ffi' gem serves as a solid basis for this library, allowing to
161
+ use it for multiple Ruby implementations.
162
+
163
+ == Note on Patches/Pull Requests
164
+
165
+ * Fork the project.
166
+ * Make your feature addition or bug fix.
167
+ * Add tests for it. This is important so I don't break it in a
168
+ future version unintentionally.
169
+ * Commit, do not mess with rakefile, version, or history.
170
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
171
+ * Send me a pull request. Bonus points for topic branches.
172
+
173
+ == Copyright
174
+
175
+ Copyright (c) 2010 arvicco. See LICENSE for details.
data/Rakefile CHANGED
@@ -1,58 +1,58 @@
1
- require 'rubygems'
2
- require 'rake'
3
-
4
- begin
5
- require 'jeweler'
6
- Jeweler::Tasks.new do |gem|
7
- gem.name = "win"
8
- gem.summary = %Q{Rubyesque interfaces and wrappers for Windows API functions pre-defined using FFI }
9
- gem.description = %Q{Rubyesque interfaces and wrappers for Windows API functions pre-defined using FFI }
10
- gem.email = "arvitallian@gmail.com"
11
- gem.homepage = "http://github.com/arvicco/win"
12
- gem.authors = ["arvicco"]
13
- gem.add_dependency "ffi", ">= 0.6.0"
14
- gem.add_development_dependency "rspec", ">= 1.2.9"
15
- gem.add_development_dependency "cucumber", ">= 0"
16
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
- end
18
- Jeweler::GemcutterTasks.new
19
- rescue LoadError
20
- puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
21
- end
22
-
23
- require 'spec/rake/spectask'
24
- Spec::Rake::SpecTask.new(:spec) do |spec|
25
- spec.libs << 'lib' << 'spec'
26
- spec.spec_files = FileList['spec/**/*_spec.rb']
27
- end
28
-
29
- Spec::Rake::SpecTask.new(:rcov) do |spec|
30
- spec.libs << 'lib' << 'spec'
31
- spec.pattern = 'spec/**/*_spec.rb'
32
- spec.rcov = true
33
- end
34
-
35
- task :spec => :check_dependencies
36
-
37
- begin
38
- require 'cucumber/rake/task'
39
- Cucumber::Rake::Task.new(:features)
40
-
41
- task :features => :check_dependencies
42
- rescue LoadError
43
- task :features do
44
- abort "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
45
- end
46
- end
47
-
48
- task :default => :spec
49
-
50
- require 'rake/rdoctask'
51
- Rake::RDocTask.new do |rdoc|
52
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
53
-
54
- rdoc.rdoc_dir = 'rdoc'
55
- rdoc.title = "win #{version}"
56
- rdoc.rdoc_files.include('README*')
57
- rdoc.rdoc_files.include('lib/**/*.rb')
58
- end
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "win"
8
+ gem.summary = %Q{Rubyesque interfaces and wrappers for Windows API functions pre-defined using FFI }
9
+ gem.description = %Q{Rubyesque interfaces and wrappers for Windows API functions pre-defined using FFI }
10
+ gem.email = "arvitallian@gmail.com"
11
+ gem.homepage = "http://github.com/arvicco/win"
12
+ gem.authors = ["arvicco"]
13
+ gem.add_dependency "ffi", ">= 0.6.0"
14
+ gem.add_development_dependency "rspec", ">= 1.2.9"
15
+ gem.add_development_dependency "cucumber", ">= 0"
16
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
21
+ end
22
+
23
+ require 'spec/rake/spectask'
24
+ Spec::Rake::SpecTask.new(:spec) do |spec|
25
+ spec.libs << 'lib' << 'spec'
26
+ spec.spec_files = FileList['spec/**/*_spec.rb']
27
+ end
28
+
29
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
30
+ spec.libs << 'lib' << 'spec'
31
+ spec.pattern = 'spec/**/*_spec.rb'
32
+ spec.rcov = true
33
+ end
34
+
35
+ task :spec => :check_dependencies
36
+
37
+ begin
38
+ require 'cucumber/rake/task'
39
+ Cucumber::Rake::Task.new(:features)
40
+
41
+ task :features => :check_dependencies
42
+ rescue LoadError
43
+ task :features do
44
+ abort "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
45
+ end
46
+ end
47
+
48
+ task :default => :spec
49
+
50
+ require 'rake/rdoctask'
51
+ Rake::RDocTask.new do |rdoc|
52
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
53
+
54
+ rdoc.rdoc_dir = 'rdoc'
55
+ rdoc.title = "win #{version}"
56
+ rdoc.rdoc_files.include('README*')
57
+ rdoc.rdoc_files.include('lib/**/*.rb')
58
+ end