win32-shortcut 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 +3 -0
- data/README +27 -35
- data/Rakefile +19 -13
- data/lib/win32/shortcut.rb +219 -219
- data/win32-shortcut.gemspec +16 -20
- metadata +26 -32
data/CHANGES
CHANGED
data/README
CHANGED
@@ -1,60 +1,52 @@
|
|
1
1
|
== Description
|
2
|
-
|
3
|
-
|
4
|
-
== Requirements
|
5
|
-
Ruby 1.8.2 or later.
|
6
|
-
The win32ole library (part of the Ruby standard library).
|
2
|
+
This is an interface for creating and/or modifying Windows shortcuts.
|
7
3
|
|
8
4
|
== Installation
|
9
|
-
|
10
|
-
rake install (non-gem) or rake install_gem (gem)
|
5
|
+
gem install win32-shortcut
|
11
6
|
|
12
7
|
== Synopsis
|
13
8
|
require 'win32/shortcut'
|
14
|
-
|
9
|
+
include Win32
|
15
10
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
11
|
+
Shortcut.new('c:/test.lnk') do |s|
|
12
|
+
s.description = 'test link'
|
13
|
+
s.path = 'c:/winnt/notepad.exe'
|
14
|
+
s.show_cmd = Shortcut::SHOWNORMAL
|
15
|
+
s.working_directory = 'C:/'
|
16
|
+
end
|
22
17
|
|
23
18
|
== Notes
|
24
|
-
|
25
|
-
is not distributed as part of the release, but is still retained in the
|
26
|
-
CVS repository under the 'ext' directory should anyone ever need it.
|
19
|
+
This code uses win32ole + wscript behind the scenes.
|
27
20
|
|
28
21
|
== Known Bugs
|
29
|
-
|
22
|
+
None known.
|
30
23
|
|
31
|
-
|
32
|
-
|
24
|
+
Please report any bugs on the project page at
|
25
|
+
https://github.com/djberg96/win32-shortcut
|
33
26
|
|
34
27
|
== Future Plans
|
35
|
-
|
28
|
+
None at this time.
|
36
29
|
|
37
|
-
|
38
|
-
a "Feature Request".
|
30
|
+
Ideas welcome. Please submit them on the project page.
|
39
31
|
|
40
32
|
== Copyright
|
41
|
-
|
33
|
+
(C) 2003-2012, Daniel J. Berger, All Rights Reserved
|
42
34
|
|
43
35
|
== License
|
44
|
-
|
36
|
+
Artistic 2.0
|
45
37
|
|
46
38
|
== Warranty
|
47
|
-
|
48
|
-
|
49
|
-
|
39
|
+
This package is provided "as is" and without any express or
|
40
|
+
implied warranties, including, without limitation, the implied
|
41
|
+
warranties of merchantability and fitness for a particular purpose.
|
50
42
|
|
51
43
|
== Acknowledgements
|
52
|
-
|
53
|
-
|
54
|
-
|
44
|
+
The original win32-shortcut package was largely based on Aldo Calpini's
|
45
|
+
Win32::Shortcut Perl module, and I copied some of the documentation as
|
46
|
+
well.
|
55
47
|
|
56
|
-
|
48
|
+
The current version (0.2.0 and later) is based on a patch by Jano Svitok.
|
57
49
|
|
58
|
-
==
|
59
|
-
|
60
|
-
|
50
|
+
== Authors
|
51
|
+
Daniel J. Berger
|
52
|
+
Park Heesob
|
data/Rakefile
CHANGED
@@ -1,21 +1,27 @@
|
|
1
1
|
require 'rake'
|
2
|
+
require 'rake/clean'
|
2
3
|
require 'rake/testtask'
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
CLEAN.include("**/*.gem")
|
6
|
+
|
7
|
+
namespace :gem do
|
8
|
+
desc "Create theh win32-shortcut gem"
|
9
|
+
task :create => [:clean] do
|
10
|
+
spec = eval(IO.read('win32-shortcut.gemspec'))
|
11
|
+
Gem::Builder.new(spec).build
|
12
|
+
end
|
10
13
|
|
11
|
-
desc "Install the win32-shortcut
|
12
|
-
task :
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
desc "Install the win32-shortcut gem"
|
15
|
+
task :install => [:create] do
|
16
|
+
ruby 'win32-shortcut.gemspec'
|
17
|
+
file = Dir["*.gem"].first
|
18
|
+
sh "gem install #{file}"
|
19
|
+
end
|
16
20
|
end
|
17
21
|
|
18
22
|
Rake::TestTask.new do |t|
|
19
|
-
|
20
|
-
|
23
|
+
t.warning = true
|
24
|
+
t.verbose = true
|
21
25
|
end
|
26
|
+
|
27
|
+
task :default => :test
|
data/lib/win32/shortcut.rb
CHANGED
@@ -2,225 +2,225 @@ require 'win32ole'
|
|
2
2
|
|
3
3
|
# The Win32 module serves as a namespace only.
|
4
4
|
module Win32
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
end
|
189
|
-
|
190
|
-
if style.is_a?(String)
|
191
|
-
case style.downcase
|
192
|
-
when 'normal'
|
193
|
-
style = SHOWNORMAL
|
194
|
-
when 'maximized'
|
195
|
-
style = SHOWMAXIMIZED
|
196
|
-
when 'minimized'
|
197
|
-
style = SHOWMINNOACTIVE
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
@link.WindowStyle = style
|
202
|
-
end
|
203
|
-
|
204
|
-
# Deprecated.
|
205
|
-
alias show_cmd= window_style=
|
206
|
-
|
207
|
-
# Returns directory in which the targeted program will be executed.
|
208
|
-
# Correspond to the "Start in" field of a Shortcut Properties Dialog Box.
|
209
|
-
#
|
210
|
-
def working_directory
|
211
|
-
@link.WorkingDirectory
|
212
|
-
end
|
213
|
-
|
214
|
-
# Sets the directory in which the targeted program will be executed.
|
215
|
-
#
|
216
|
-
def working_directory=(directory)
|
217
|
-
@link.WorkingDirectory = directory.tr('/', "\\")
|
5
|
+
# The Shortcut class encapsulates an MS Windows shortcut.
|
6
|
+
class Shortcut
|
7
|
+
# The version of this library
|
8
|
+
VERSION = '0.2.4'
|
9
|
+
|
10
|
+
# Activates and displays a window. If the window is minimized or maximized,
|
11
|
+
# the system restores it to its original size and position. An application
|
12
|
+
# should specify this flag when displaying the window for the first time.
|
13
|
+
#
|
14
|
+
SHOWNORMAL = 1
|
15
|
+
|
16
|
+
# Activates the window and displays it as a maximized window.
|
17
|
+
#
|
18
|
+
SHOWMAXIMIZED = 3
|
19
|
+
|
20
|
+
# Displays the window in its minimized state, leaving the currently active
|
21
|
+
# window as active.
|
22
|
+
#
|
23
|
+
SHOWMINNOACTIVE = 7
|
24
|
+
|
25
|
+
# Creates and returns a Shortcut object. In block form it yields +self+
|
26
|
+
# and automatically ensures that Shortcut#save is called at the end of
|
27
|
+
# the block. In non-block form it does not actually create the shortcut
|
28
|
+
# until the Shorcut#save method is called.
|
29
|
+
#
|
30
|
+
# Examples:
|
31
|
+
#
|
32
|
+
# # Create a shortcut called 'test' to a file in non-block form.
|
33
|
+
# s = Shortcut.new('test.lnk')
|
34
|
+
# s.target_path = 'C:/Documents and Settings/john/some_file.txt'
|
35
|
+
# s.save
|
36
|
+
#
|
37
|
+
# # Create a shortcut called 'test2' to a folder in block form.
|
38
|
+
# Shortcut.new('test2.lnk') do |sc|
|
39
|
+
# sc.target_path = 'C:/Documents and Settings/john/some_dir'
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
def initialize(file)
|
43
|
+
@file = file.tr('/', "\\")
|
44
|
+
@shell = WIN32OLE.new('WScript.Shell')
|
45
|
+
@link = @shell.CreateShortcut(@file)
|
46
|
+
|
47
|
+
if block_given?
|
48
|
+
begin
|
49
|
+
yield self
|
50
|
+
ensure
|
51
|
+
save
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Identical to Shortcut#new except that it will raise an ArgumentError
|
57
|
+
# unless the +file+ already exists.
|
58
|
+
#
|
59
|
+
def self.open(file)
|
60
|
+
raise ArgumentError, 'shortcut not found' unless File.exists?(file)
|
61
|
+
self.new(file)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns any arguments (i.e. command line options) for the shortcut.
|
65
|
+
#
|
66
|
+
def arguments
|
67
|
+
@link.Arguments
|
68
|
+
end
|
69
|
+
|
70
|
+
# Sets the arguments (i.e. command line options) for the shortcut.
|
71
|
+
#
|
72
|
+
def arguments=(args)
|
73
|
+
@link.Arguments = args
|
74
|
+
end
|
75
|
+
|
76
|
+
# Returns the description (i.e. comment) for the shortcut.
|
77
|
+
#
|
78
|
+
def description
|
79
|
+
@link.Description
|
80
|
+
end
|
81
|
+
|
82
|
+
# Sets the description for the shortcut.
|
83
|
+
#
|
84
|
+
def description=(desc)
|
85
|
+
@link.Description = desc
|
86
|
+
end
|
87
|
+
|
88
|
+
# Returns the file name of the shortcut.
|
89
|
+
#
|
90
|
+
def file
|
91
|
+
@file
|
92
|
+
end
|
93
|
+
|
94
|
+
# Returns the hotkey (i.e. shortcut key) associated to the shortcut, in
|
95
|
+
# the form of a 2-byte number of which the first byte identifies the
|
96
|
+
# modifiers (Ctrl, Alt, Shift) and the second is the ASCII code of
|
97
|
+
# the character key.
|
98
|
+
#
|
99
|
+
def hotkey
|
100
|
+
@link.HotKey
|
101
|
+
end
|
102
|
+
|
103
|
+
# Sets the hotkey for the shortcut.
|
104
|
+
#
|
105
|
+
def hotkey=(key)
|
106
|
+
@link.HotKey = key
|
107
|
+
end
|
108
|
+
|
109
|
+
# Returns the name of the file that contain the icon for the shortcut.
|
110
|
+
# In practice this is almost always blank. YMMV.
|
111
|
+
#
|
112
|
+
def icon_location
|
113
|
+
@link.IconLocation
|
114
|
+
end
|
115
|
+
|
116
|
+
# Sets the name of the icon file to be used for the shortcut.
|
117
|
+
#
|
118
|
+
def icon_location=(location)
|
119
|
+
@link.IconLocation = location.tr('/', "\\")
|
120
|
+
end
|
121
|
+
|
122
|
+
# Returns the target of the shortcut. This is, joined with arguments, the
|
123
|
+
# content of the "Target" field in a Shortcut Properties Dialog Box. The
|
124
|
+
# target name is returned in 8.3 format.
|
125
|
+
#
|
126
|
+
def path
|
127
|
+
@link.TargetPath
|
128
|
+
end
|
129
|
+
|
130
|
+
alias target_path path
|
131
|
+
|
132
|
+
# Sets the target of the shortcut.
|
133
|
+
#--
|
134
|
+
# Forward slashes are converted to backslashes to ensure folder
|
135
|
+
# shortcuts work properly.
|
136
|
+
#
|
137
|
+
def path=(link_path)
|
138
|
+
@link.TargetPath = link_path.tr('/', "\\")
|
139
|
+
end
|
140
|
+
|
141
|
+
alias target_path= path=
|
142
|
+
|
143
|
+
# Attempts to automatically resolve a shortcut and returns the resolved path,
|
144
|
+
# or raises an error. In case no resolution was made, the path is returned
|
145
|
+
# unchanged.
|
146
|
+
#
|
147
|
+
# Note that the path is automatically updated in the path attribute of the
|
148
|
+
# Shortcut object.
|
149
|
+
#
|
150
|
+
def resolve
|
151
|
+
@link.FullName
|
152
|
+
end
|
153
|
+
|
154
|
+
# Returns the type of window style used by a shortcut. The possible
|
155
|
+
# return values are 'normal', 'maximized', or 'minimized'.
|
156
|
+
#
|
157
|
+
def window_style
|
158
|
+
case @link.WindowStyle
|
159
|
+
when SHOWNORMAL
|
160
|
+
'normal'
|
161
|
+
when SHOWMAXIMIZED
|
162
|
+
'maximized'
|
163
|
+
when SHOWMINNOACTIVE
|
164
|
+
'minimized'
|
165
|
+
else
|
166
|
+
'unknown' # Should never reach here
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
# Deprecated.
|
171
|
+
alias show_cmd window_style
|
172
|
+
|
173
|
+
# Sets the window style to a shortcut. The +style+ can be one of the
|
174
|
+
# following three constants or equivalent string values:
|
175
|
+
#
|
176
|
+
# * SHOWNORMAL or 'normal'
|
177
|
+
# * SHOWMAXIMIZED or 'maximized'
|
178
|
+
# * SHOWMINNOACTIVE or 'minimized'
|
179
|
+
#
|
180
|
+
# Please see the documentation for those constants for further details.
|
181
|
+
#
|
182
|
+
def window_style=(style)
|
183
|
+
valid = [SHOWNORMAL, SHOWMAXIMIZED, SHOWMINNOACTIVE]
|
184
|
+
valid.concat(['normal', 'maximized', 'minimized'])
|
185
|
+
|
186
|
+
unless valid.include?(style)
|
187
|
+
raise ArgumentError, 'invalid style'
|
218
188
|
end
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
189
|
+
|
190
|
+
if style.is_a?(String)
|
191
|
+
case style.downcase
|
192
|
+
when 'normal'
|
193
|
+
style = SHOWNORMAL
|
194
|
+
when 'maximized'
|
195
|
+
style = SHOWMAXIMIZED
|
196
|
+
when 'minimized'
|
197
|
+
style = SHOWMINNOACTIVE
|
198
|
+
end
|
224
199
|
end
|
225
|
-
|
200
|
+
|
201
|
+
@link.WindowStyle = style
|
202
|
+
end
|
203
|
+
|
204
|
+
# Deprecated.
|
205
|
+
alias show_cmd= window_style=
|
206
|
+
|
207
|
+
# Returns directory in which the targeted program will be executed.
|
208
|
+
# Correspond to the "Start in" field of a Shortcut Properties Dialog Box.
|
209
|
+
#
|
210
|
+
def working_directory
|
211
|
+
@link.WorkingDirectory
|
212
|
+
end
|
213
|
+
|
214
|
+
# Sets the directory in which the targeted program will be executed.
|
215
|
+
#
|
216
|
+
def working_directory=(directory)
|
217
|
+
@link.WorkingDirectory = directory.tr('/', "\\")
|
218
|
+
end
|
219
|
+
|
220
|
+
# Saves (creates) the link object in the current directory.
|
221
|
+
#
|
222
|
+
def save
|
223
|
+
@link.Save
|
224
|
+
end
|
225
|
+
end
|
226
226
|
end
|
data/win32-shortcut.gemspec
CHANGED
@@ -1,25 +1,21 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
gem.has_rdoc = true
|
14
|
-
gem.files = Dir['**/*'].reject{ |f| f.include?('CVS') }
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = 'win32-shortcut'
|
5
|
+
spec.version = '0.2.4'
|
6
|
+
spec.author = 'Daniel J. Berger'
|
7
|
+
spec.license = 'Artistic 2.0'
|
8
|
+
spec.email = 'djberg96@gmail.com'
|
9
|
+
spec.homepage = 'http://www.rubyforge.org/projects/win32utils'
|
10
|
+
spec.summary = 'An interface for creating or modifying Windows shortcuts.'
|
11
|
+
spec.test_file = 'test/test_shortcut.rb'
|
12
|
+
spec.files = Dir['**/*'].reject{ |f| f.include?('git') }
|
15
13
|
|
16
|
-
|
17
|
-
|
14
|
+
spec.rubyforge_project = 'win32utils'
|
15
|
+
spec.extra_rdoc_files = ['README', 'CHANGES', 'MANIFEST']
|
18
16
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
spec.description = <<-EOF
|
18
|
+
The win32-shortcut library provides an interface for creating new
|
19
|
+
Windows shortcuts or querying information about existing shortcuts.
|
20
|
+
EOF
|
23
21
|
end
|
24
|
-
|
25
|
-
Gem::Builder.new(spec).build
|
metadata
CHANGED
@@ -1,29 +1,26 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: win32-shortcut
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.4
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
|
-
authors:
|
7
|
+
authors:
|
7
8
|
- Daniel J. Berger
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
|
12
|
-
date: 2009-08-06 00:00:00 -06:00
|
13
|
-
default_executable:
|
12
|
+
date: 2012-03-18 00:00:00.000000000 Z
|
14
13
|
dependencies: []
|
15
|
-
|
16
|
-
|
14
|
+
description: ! " The win32-shortcut library provides an interface for creating
|
15
|
+
new\n Windows shortcuts or querying information about existing shortcuts.\n"
|
17
16
|
email: djberg96@gmail.com
|
18
17
|
executables: []
|
19
|
-
|
20
18
|
extensions: []
|
21
|
-
|
22
|
-
extra_rdoc_files:
|
19
|
+
extra_rdoc_files:
|
23
20
|
- README
|
24
21
|
- CHANGES
|
25
22
|
- MANIFEST
|
26
|
-
files:
|
23
|
+
files:
|
27
24
|
- CHANGES
|
28
25
|
- examples/example_shortcut.rb
|
29
26
|
- lib/win32/shortcut.rb
|
@@ -32,33 +29,30 @@ files:
|
|
32
29
|
- README
|
33
30
|
- test/test_shortcut.rb
|
34
31
|
- win32-shortcut.gemspec
|
35
|
-
has_rdoc: true
|
36
32
|
homepage: http://www.rubyforge.org/projects/win32utils
|
37
|
-
licenses:
|
33
|
+
licenses:
|
38
34
|
- Artistic 2.0
|
39
35
|
post_install_message:
|
40
36
|
rdoc_options: []
|
41
|
-
|
42
|
-
require_paths:
|
37
|
+
require_paths:
|
43
38
|
- lib
|
44
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
39
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
46
|
+
none: false
|
47
|
+
requirements:
|
48
|
+
- - ! '>='
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
56
51
|
requirements: []
|
57
|
-
|
58
52
|
rubyforge_project: win32utils
|
59
|
-
rubygems_version: 1.
|
53
|
+
rubygems_version: 1.8.11
|
60
54
|
signing_key:
|
61
55
|
specification_version: 3
|
62
56
|
summary: An interface for creating or modifying Windows shortcuts.
|
63
|
-
test_files:
|
57
|
+
test_files:
|
64
58
|
- test/test_shortcut.rb
|