sys-admin 1.7.4 → 1.8.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,263 @@
1
+ ###############################################################################
2
+ # sys_admin_unix_rspec.rb
3
+ #
4
+ # Test suite for the Unix version of sys-admin. This test should be run
5
+ # via the 'rake spec' task.
6
+ ###############################################################################
7
+ require 'spec_helper'
8
+
9
+ RSpec.describe Sys::Admin, :unix do
10
+ let(:user) { 'nobody' }
11
+ let(:user_id) { 0 }
12
+ let(:group) { 'sys' }
13
+ let(:group_id) { 3 }
14
+
15
+ context "singleton methods" do
16
+ describe "get_login" do
17
+ example "get_login basic functionality" do
18
+ expect(described_class).to respond_to(:get_login)
19
+ expect{ described_class.get_login }.not_to raise_error
20
+ end
21
+
22
+ example "get_login returns a string" do
23
+ expect(described_class.get_login).to be_kind_of(String)
24
+ expect(described_class.get_login.length).to be > 0
25
+ end
26
+ end
27
+
28
+ describe "get_user" do
29
+ example "get_user basic functionality" do
30
+ expect(described_class).to respond_to(:get_user)
31
+ expect{ described_class.get_user(user) }.not_to raise_error
32
+ expect{ described_class.get_user(user_id) }.not_to raise_error
33
+ end
34
+
35
+ example "get_user with a string argument works as expected" do
36
+ expect(described_class.get_user(user)).to be_kind_of(Sys::Admin::User)
37
+ end
38
+
39
+ example "get_user with an integer argument works as expected" do
40
+ expect(described_class.get_user(user_id)).to be_kind_of(Sys::Admin::User)
41
+ end
42
+
43
+ example "get_user requires at least one argument" do
44
+ expect{ described_class.get_user }.to raise_error(ArgumentError)
45
+ end
46
+
47
+ example "get_user requires a string or integer argument" do
48
+ expect{ described_class.get_user([]) }.to raise_error(TypeError)
49
+ end
50
+
51
+ example "get_user raises an Error if the user cannot be found" do
52
+ expect{ described_class.get_user('foofoofoo') }.to raise_error(Sys::Admin::Error)
53
+ end
54
+ end
55
+
56
+ describe "users" do
57
+ example "users basic functionality" do
58
+ expect(described_class).to respond_to(:users)
59
+ expect{ described_class.users }.not_to raise_error
60
+ end
61
+
62
+ example "users returns an array of User objects" do
63
+ users = described_class.users
64
+ expect(users).to be_kind_of(Array)
65
+ expect(users).to all(be_kind_of(Sys::Admin::User))
66
+ end
67
+
68
+ example "users accepts an optional lastlog argument on darwin", :darwin => true do
69
+ users = described_class.users(:lastlog => false)
70
+ expect(users).to be_kind_of(Array)
71
+ expect(users).to all(be_kind_of(Sys::Admin::User))
72
+ expect(users.first.login_time).to be_nil
73
+ end
74
+ end
75
+
76
+ describe "get_group" do
77
+ example "get_group basic functionality" do
78
+ expect(described_class).to respond_to(:get_group)
79
+ expect{ described_class.get_group(group) }.not_to raise_error
80
+ expect{ described_class.get_group(group_id) }.not_to raise_error
81
+ end
82
+
83
+ example "get_group accepts a string argument" do
84
+ expect(described_class.get_group(group)).to be_kind_of(Sys::Admin::Group)
85
+ end
86
+
87
+ example "get_group accepts an integer argument" do
88
+ expect(described_class.get_group(group_id)).to be_kind_of(Sys::Admin::Group)
89
+ end
90
+
91
+ example "get_group requires one argument only" do
92
+ expect{ described_class.get_group }.to raise_error(ArgumentError)
93
+ expect{ described_class.get_group(group_id, group_id) }.to raise_error(ArgumentError)
94
+ end
95
+
96
+ example "get_group raises a TypeError if an invalid type is passed" do
97
+ expect{ described_class.get_group([]) }.to raise_error(TypeError)
98
+ end
99
+
100
+ example "get_group raises an Error if the group cannot be found" do
101
+ expect{ described_class.get_group('foofoofoo') }.to raise_error(Sys::Admin::Error)
102
+ end
103
+ end
104
+
105
+ describe "groups" do
106
+ example "groups basic functionality" do
107
+ expect(described_class).to respond_to(:groups)
108
+ expect{ described_class.groups }.not_to raise_error
109
+ end
110
+
111
+ example "groups returns an array of Group objects" do
112
+ groups = described_class.groups
113
+ expect(groups).to be_kind_of(Array)
114
+ expect(groups).to all(be_kind_of(Sys::Admin::Group))
115
+ end
116
+
117
+ example "groups method does not accept any arguments" do
118
+ expect{ described_class.groups(group_id) }.to raise_error(ArgumentError)
119
+ end
120
+ end
121
+ end
122
+
123
+ context "instance methods" do
124
+ describe "User instance methods" do
125
+ example "user.name behaves as expected" do
126
+ user = described_class.get_user(user_id)
127
+ expect(user).to respond_to(:name)
128
+ expect(user.name).to be_kind_of(String)
129
+ end
130
+
131
+ example "user.passwd behaves as expected" do
132
+ user = described_class.get_user(user_id)
133
+ expect(user).to respond_to(:passwd)
134
+ expect(user.passwd).to be_kind_of(String)
135
+ end
136
+
137
+ example "user.uid behaves as expected" do
138
+ user = described_class.get_user(user_id)
139
+ expect(user).to respond_to(:uid)
140
+ expect(user.uid).to be_kind_of(Integer)
141
+ end
142
+
143
+ example "user.gid behaves as expected" do
144
+ user = described_class.get_user(user_id)
145
+ expect(user).to respond_to(:gid)
146
+ expect(user.gid).to be_kind_of(Integer)
147
+ end
148
+
149
+ example "user.dir behaves as expected" do
150
+ user = described_class.get_user(user_id)
151
+ expect(user).to respond_to(:dir)
152
+ expect(user.dir).to be_kind_of(String)
153
+ end
154
+
155
+ example "user.shell behaves as expected" do
156
+ user = described_class.get_user(user_id)
157
+ expect(user).to respond_to(:shell)
158
+ expect(user.shell).to be_kind_of(String)
159
+ end
160
+
161
+ example "user.gecos behaves as expected" do
162
+ user = described_class.get_user(user_id)
163
+ expect(user).to respond_to(:gecos)
164
+ expect(user.gecos).to be_kind_of(String).or be_nil
165
+ end
166
+
167
+ example "user.quota behaves as expected" do
168
+ user = described_class.get_user(user_id)
169
+ expect(user).to respond_to(:quota)
170
+ expect(user.quota).to be_kind_of(Integer).or be_nil
171
+ end
172
+
173
+ example "user.age behaves as expected" do
174
+ user = described_class.get_user(user_id)
175
+ expect(user).to respond_to(:age)
176
+ expect(user.age).to be_kind_of(Integer).or be_nil
177
+ end
178
+
179
+ example "user.access behaves as expected" do
180
+ user = described_class.get_user(user_id)
181
+ expect(user).to respond_to(:access_class)
182
+ expect(user.access_class).to be_kind_of(String).or be_nil
183
+ end
184
+
185
+ example "user.comment behaves as expected" do
186
+ user = described_class.get_user(user_id)
187
+ expect(user).to respond_to(:comment)
188
+ expect(user.comment).to be_kind_of(String).or be_nil
189
+ end
190
+
191
+ example "user.expire behaves as expected" do
192
+ user = described_class.get_user(user_id)
193
+ expect(user).to respond_to(:expire)
194
+ expect(user.expire).to be_kind_of(Time).or be_nil
195
+ end
196
+
197
+ example "user.change behaves as expected" do
198
+ user = described_class.get_user(user_id)
199
+ expect(user).to respond_to(:change)
200
+ expect(user.change).to be_kind_of(Time).or be_nil
201
+ end
202
+
203
+ example "user.login_time behaves as expected" do
204
+ user = described_class.get_user(user_id)
205
+ expect(user).to respond_to(:login_time)
206
+ expect(user.login_time).to be_kind_of(Time).or be_nil
207
+ end
208
+
209
+ example "user.login_device behaves as expected" do
210
+ user = described_class.get_user(user_id)
211
+ expect(user).to respond_to(:login_device)
212
+ expect(user.login_device).to be_kind_of(String).or be_nil
213
+ end
214
+
215
+ example "user.login_host behaves as expected" do
216
+ user = described_class.get_user(user_id)
217
+ expect(user).to respond_to(:login_host)
218
+ expect(user.login_host).to be_kind_of(String).or be_nil
219
+ end
220
+
221
+ example "user.groups behaves as expected" do
222
+ user = described_class.get_user(user_id)
223
+ expect(user).to respond_to(:groups)
224
+ expect(user.groups).to be_kind_of(Array)
225
+ end
226
+ end
227
+
228
+ describe "Group instance methods" do
229
+ example "group.name behaves as expected" do
230
+ group = described_class.get_group(group_id)
231
+ expect(group).to respond_to(:name)
232
+ expect(group.name).to be_kind_of(String)
233
+ end
234
+
235
+ example "group.gid behaves as expected" do
236
+ group = described_class.get_group(group_id)
237
+ expect(group).to respond_to(:gid)
238
+ expect(group.gid).to be_kind_of(Integer)
239
+ end
240
+
241
+ example "group.members behaves as expected" do
242
+ group = described_class.get_group(group_id)
243
+ expect(group).to respond_to(:members)
244
+ expect(group.members).to be_kind_of(Array)
245
+ end
246
+
247
+ example "group.passwd behaves as expected" do
248
+ group = described_class.get_group(group_id)
249
+ expect(group).to respond_to(:passwd)
250
+ expect(group.passwd).to be_kind_of(String)
251
+ end
252
+ end
253
+ end
254
+
255
+ context "ffi functions" do
256
+ example "ffi functions are private" do
257
+ methods = described_class.methods(false).map(&:to_s)
258
+ expect(methods).not_to include('getlogin')
259
+ expect(methods).not_to include('getlogin_r')
260
+ expect(methods).not_to include('strerror')
261
+ end
262
+ end
263
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Sys::Admin do
4
+ example "version is set to expected value" do
5
+ expect(described_class::VERSION).to eq('1.8.1')
6
+ end
7
+
8
+ example "version constant is frozen" do
9
+ expect(described_class::VERSION).to be_frozen
10
+ end
11
+ end
@@ -0,0 +1,347 @@
1
+ ###############################################################################
2
+ # sys_admin_windows_spec.rb
3
+ #
4
+ # Test suite for the MS Windows version of sys-admin. Note that some of the
5
+ # are ordered. That way I can add test users before configuring or deleting
6
+ # them.
7
+ #
8
+ # It is assumed that these specs will be run via the 'rake spec' task.
9
+ ###############################################################################
10
+ require 'spec_helper'
11
+
12
+ RSpec.describe Sys::Admin, :windows do
13
+ let(:host) { Socket.gethostname }
14
+ let(:elevated) { Win32::Security.elevated_security? }
15
+
16
+ before do
17
+ @user = Sys::Admin::User.new
18
+ @user_name = 'Guest'
19
+ @user_id = 501 # best guess, may fail
20
+ @group = Sys::Admin::Group.new
21
+ @group_name = 'Guests'
22
+ @group_id = 546 # best guess, may fail
23
+ end
24
+
25
+ describe "add, configure and delete user", :order => :defined do
26
+ before(:all) do
27
+ @local_user = "foo"
28
+ end
29
+
30
+ example "add user" do
31
+ skip "requires elevated privileges" unless elevated
32
+ expect(described_class).to respond_to(:add_user)
33
+ expect{ described_class.add_user(:name => @local_user, :password => 'a1b2c3D4') }.not_to raise_error
34
+ expect{ described_class.get_user(@local_user) }.not_to raise_error
35
+ end
36
+
37
+ example "configure user" do
38
+ skip "requires elevated privileges" unless elevated
39
+ expect(described_class).to respond_to(:configure_user)
40
+ expect{
41
+ described_class.configure_user(
42
+ :name => @local_user,
43
+ :description => 'delete me',
44
+ :fullname => 'fubar',
45
+ :password => 'd1c2b3A4'
46
+ )
47
+ }.not_to raise_error
48
+ expect(described_class.get_user(@local_user).description).to eq('delete me')
49
+ end
50
+
51
+ example "delete user" do
52
+ skip "requires elevated privileges" unless elevated
53
+ expect(described_class).to respond_to(:delete_user)
54
+ expect{ described_class.delete_user(@local_user) }.not_to raise_error
55
+ expect{ described_class.get_user(@local_user) }.to raise_error(Sys::Admin::Error)
56
+ end
57
+ end
58
+
59
+ describe "add, configure and delete group", :order => :defined do
60
+ before(:all) do
61
+ @local_user = "foo"
62
+ @local_group = "bar"
63
+ described_class.add_user(:name => @local_user)
64
+ end
65
+
66
+ after(:all) do
67
+ described_class.delete_user(@local_user)
68
+ end
69
+
70
+ example "add group" do
71
+ skip "requires elevated privileges" unless elevated
72
+ expect(described_class).to respond_to(:add_group)
73
+ expect{ described_class.add_group(:name => @local_group) }.not_to raise_error
74
+ end
75
+
76
+ example "configure group" do
77
+ skip "requires elevated privileges" unless elevated
78
+ expect(described_class).to respond_to(:configure_group)
79
+ expect{ described_class.configure_group(:name => @local_group, :description => 'delete me') }.not_to raise_error
80
+ end
81
+
82
+ example "add group member" do
83
+ skip "requires elevated privileges" unless elevated
84
+ expect(described_class).to respond_to(:add_group_member)
85
+ expect{ described_class.add_group_member(@local_user, @local_group) }.not_to raise_error
86
+ expect(described_class.get_group(@local_group, :localaccount => true).members).to include(@local_user)
87
+ end
88
+
89
+ example "remove group member" do
90
+ skip "requires elevated privileges" unless elevated
91
+ expect(described_class).to respond_to(:remove_group_member)
92
+ expect{ described_class.remove_group_member(@local_user, @local_group) }.not_to raise_error
93
+ end
94
+
95
+ example "delete group" do
96
+ skip "requires elevated privileges" unless elevated
97
+ expect(described_class).to respond_to(:delete_group)
98
+ expect{ described_class.delete_group(@local_group) }.not_to raise_error
99
+ end
100
+ end
101
+
102
+ context "singleton methods" do
103
+ describe "get_login" do
104
+ example "get_login basic functionality" do
105
+ expect(described_class).to respond_to(:get_login)
106
+ expect{ described_class.get_login }.not_to raise_error
107
+ end
108
+
109
+ example "get_login returns a string" do
110
+ expect( described_class.get_login).to be_kind_of(String)
111
+ expect(described_class.get_login.size).to be > 0
112
+ end
113
+
114
+ example "get_login does not accept any arguments" do
115
+ expect{ described_class.get_login('foo') }.to raise_error(ArgumentError)
116
+ end
117
+ end
118
+
119
+ describe "get_user" do
120
+ example "get_user basic functionality" do
121
+ expect(described_class).to respond_to(:get_user)
122
+ end
123
+
124
+ example "get_user with string argument works as expected" do
125
+ expect{ described_class.get_user(@user_name, :localaccount => true) }.not_to raise_error
126
+ expect( described_class.get_user(@user_name, :localaccount => true)).to be_kind_of(Sys::Admin::User)
127
+ end
128
+
129
+ example "get user with integer argument works as expected" do
130
+ expect{ described_class.get_user(@user_id, :localaccount => true) }.not_to raise_error
131
+ expect( described_class.get_user(@user_id, :localaccount => true)).to be_kind_of(Sys::Admin::User)
132
+ end
133
+
134
+ example "get_user method by string accepts a hash of options" do
135
+ options = {:host => host, :localaccount => true}
136
+ expect{ described_class.get_user(@user_name, options) }.not_to raise_error
137
+ expect( described_class.get_user(@user_name, options)).to be_kind_of(Sys::Admin::User)
138
+ end
139
+
140
+ example "get_user method by uid accepts a hash of options" do
141
+ options = {:host => host, :localaccount => true}
142
+ expect{ described_class.get_user(@user_id, options) }.not_to raise_error
143
+ expect( described_class.get_user(@user_id, options)).to be_kind_of(Sys::Admin::User)
144
+ end
145
+
146
+ example "get_user method requires an argument" do
147
+ expect{ described_class.get_user }.to raise_error(ArgumentError)
148
+ end
149
+ end
150
+
151
+ describe "users" do
152
+ example "users method basic functionality" do
153
+ expect(described_class).to respond_to(:users)
154
+ expect{ described_class.users(:localaccount => true) }.not_to raise_error
155
+ end
156
+
157
+ example "users method returns an array of User objects" do
158
+ users = described_class.users(:localaccount => true)
159
+ expect(users).to be_kind_of(Array)
160
+ expect(users).to all(be_kind_of(Sys::Admin::User))
161
+ end
162
+ end
163
+
164
+ describe "get_group" do
165
+ example "get_group basic functionality" do
166
+ expect(described_class).to respond_to(:get_group)
167
+ end
168
+
169
+ example "get_group method returns expected results with a string argument" do
170
+ expect{ described_class.get_group(@group_name, :localaccount => true) }.not_to raise_error
171
+ expect(described_class.get_group(@group_name, :localaccount => true)).to be_kind_of(Sys::Admin::Group)
172
+ end
173
+
174
+ example "get_group method returns expected results with an integer argument" do
175
+ expect{ described_class.get_group(@group_id, :localaccount => true) }.not_to raise_error
176
+ expect(described_class.get_group(@group_id, :localaccount => true)).to be_kind_of(Sys::Admin::Group)
177
+ end
178
+
179
+ example "get_group method accepts a hash of options" do
180
+ options = {:host => host, :localaccount => true}
181
+ expect{ described_class.get_group(@group_name, options) }.not_to raise_error
182
+ expect(described_class.get_group(@group_name, options)).to be_kind_of(Sys::Admin::Group)
183
+ end
184
+
185
+ example "get_group method requires an argument" do
186
+ expect{ described_class.get_group }.to raise_error(ArgumentError)
187
+ end
188
+ end
189
+
190
+ describe "groups" do
191
+ example "groups method basic functionality" do
192
+ expect(described_class).to respond_to(:groups)
193
+ expect{ described_class.groups(:localaccount => true) }.not_to raise_error
194
+ end
195
+
196
+ example "groups method returns an array of Group objects" do
197
+ groups = described_class.groups(:localaccount => true)
198
+ expect(groups).to be_kind_of(Array)
199
+ expect(groups).to all(be_kind_of(Sys::Admin::Group))
200
+ end
201
+ end
202
+ end
203
+
204
+ context "User class" do
205
+ example "caption accessor for User class" do
206
+ expect(@user).to respond_to(:caption)
207
+ expect(@user).to respond_to(:caption=)
208
+ end
209
+
210
+ example "description accessor for User class" do
211
+ expect(@user).to respond_to(:description)
212
+ expect(@user).to respond_to(:description=)
213
+ end
214
+
215
+ example "domain accessor for User class" do
216
+ expect(@user).to respond_to(:domain)
217
+ expect(@user).to respond_to(:domain=)
218
+ end
219
+
220
+ example "password accessor for User class" do
221
+ expect(@user).to respond_to(:password)
222
+ expect(@user).to respond_to(:password=)
223
+ end
224
+
225
+ example "full_name accessor for User class" do
226
+ expect(@user).to respond_to(:full_name)
227
+ expect(@user).to respond_to(:full_name=)
228
+ end
229
+
230
+ example "name accessor for User class" do
231
+ expect(@user).to respond_to(:name)
232
+ expect(@user).to respond_to(:name=)
233
+ end
234
+
235
+ example "sid accessor for User class" do
236
+ expect(@user).to respond_to(:sid)
237
+ expect(@user).to respond_to(:sid=)
238
+ end
239
+
240
+ example "status accessor for User class" do
241
+ expect(@user).to respond_to(:status)
242
+ expect(@user).to respond_to(:status=)
243
+ end
244
+
245
+ example "disabled accessor for User class" do
246
+ expect(@user).to respond_to(:disabled?)
247
+ expect(@user).to respond_to(:disabled=)
248
+ end
249
+
250
+ example "local accessor for User class" do
251
+ expect(@user).to respond_to(:local?)
252
+ expect(@user).to respond_to(:local=)
253
+ end
254
+
255
+ example "lockout accessor for User class" do
256
+ expect(@user).to respond_to(:lockout?)
257
+ expect(@user).to respond_to(:lockout=)
258
+ end
259
+
260
+ example "password_changeable accessor for User class" do
261
+ expect(@user).to respond_to(:password_changeable?)
262
+ expect(@user).to respond_to(:password_changeable=)
263
+ end
264
+
265
+ example "password_expires accessor for User class" do
266
+ expect(@user).to respond_to(:password_expires?)
267
+ expect(@user).to respond_to(:password_expires=)
268
+ end
269
+
270
+ example "password_required accessor for User class" do
271
+ expect(@user).to respond_to(:password_required?)
272
+ expect(@user).to respond_to(:password_required=)
273
+ end
274
+
275
+ example "account_type accessor for User class" do
276
+ expect(@user).to respond_to(:account_type)
277
+ expect(@user).to respond_to(:account_type=)
278
+ end
279
+
280
+ example "uid accessor for User class" do
281
+ expect(@user).to respond_to(:uid)
282
+ expect(@user).to respond_to(:uid=)
283
+ end
284
+
285
+ example "dir accessor for User class" do
286
+ expect(@user).to respond_to(:dir)
287
+ expect(@user).to respond_to(:dir=)
288
+ end
289
+
290
+ example "dir method returns either a string or nil" do
291
+ expect{ @user = described_class.get_user(@user_name, :localaccount => true) }.not_to raise_error
292
+ expect(@user.dir).to be_kind_of(String).or be_kind_of(NilClass)
293
+ end
294
+ end
295
+
296
+ context "Group class" do
297
+ example "caption accessor for Group class" do
298
+ expect(@group).to respond_to(:caption)
299
+ expect(@group).to respond_to(:caption=)
300
+ end
301
+
302
+ example "description accessor for Group class" do
303
+ expect(@group).to respond_to(:description)
304
+ expect(@group).to respond_to(:description=)
305
+ end
306
+
307
+ example "domain accessor for Group class" do
308
+ expect(@group).to respond_to(:domain)
309
+ expect(@group).to respond_to(:domain=)
310
+ end
311
+
312
+ example "install_date accessor for Group class" do
313
+ expect(@group).to respond_to(:install_date)
314
+ expect(@group).to respond_to(:install_date=)
315
+ end
316
+
317
+ example "name accessor for Group class" do
318
+ expect(@group).to respond_to(:name)
319
+ expect(@group).to respond_to(:name)
320
+ end
321
+
322
+ example "gid accessor for Group class" do
323
+ expect(@group).to respond_to(:gid)
324
+ expect(@group).to respond_to(:gid=)
325
+ end
326
+
327
+ example "status accessor for Group class" do
328
+ expect(@group).to respond_to(:status)
329
+ expect(@group).to respond_to(:status=)
330
+ end
331
+
332
+ example "sid accessor for Group class" do
333
+ expect(@group).to respond_to(:sid)
334
+ expect(@group).to respond_to(:sid=)
335
+ end
336
+
337
+ example "sid_type accessor for Group class" do
338
+ expect(@group).to respond_to(:sid_type)
339
+ expect(@group).to respond_to(:sid_type=)
340
+ end
341
+
342
+ example "local accessor for Group class" do
343
+ expect(@group).to respond_to(:local?)
344
+ expect(@group).to respond_to(:local=)
345
+ end
346
+ end
347
+ end
data/sys-admin.gemspec CHANGED
@@ -3,27 +3,32 @@ require 'rubygems'
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = 'sys-admin'
6
- spec.version = '1.7.4'
6
+ spec.version = '1.8.1'
7
7
  spec.author = 'Daniel J. Berger'
8
8
  spec.license = 'Apache-2.0'
9
9
  spec.email = 'djberg96@gmail.com'
10
10
  spec.homepage = 'http://www.github.com/djberg96/sys-admin'
11
11
  spec.summary = 'A unified, cross platform replacement for the "etc" library.'
12
- spec.test_file = 'test/test_sys_admin.rb'
12
+ spec.test_files = Dir['spec/*.rb']
13
13
  spec.files = Dir['**/*'].reject{ |f| f.include?('git') }
14
14
  spec.cert_chain = ['certs/djberg96_pub.pem']
15
15
 
16
16
  spec.extra_rdoc_files = Dir['*.rdoc']
17
17
 
18
- spec.add_dependency('ffi', '>= 1.1.0')
18
+ spec.add_dependency('ffi', '~> 1.1')
19
19
 
20
- spec.add_development_dependency('test-unit', '>= 2.5.0')
20
+ if Gem.win_platform?
21
+ spec.platform = Gem::Platform.new(['universal', 'mingw32'])
22
+ spec.add_dependency('win32-security', '~> 0.5')
23
+ end
24
+
25
+ spec.add_development_dependency('rspec', '~> 3.9')
21
26
  spec.add_development_dependency('rake')
22
27
 
23
28
  spec.metadata = {
24
29
  'homepage_uri' => 'https://github.com/djberg96/sys-admin',
25
30
  'bug_tracker_uri' => 'https://github.com/djberg96/sys-admin/issues',
26
- 'changelog_uri' => 'https://github.com/djberg96/sys-admin/blob/ffi/CHANGES',
31
+ 'changelog_uri' => 'https://github.com/djberg96/sys-admin/blob/main/CHANGES.md',
27
32
  'documentation_uri' => 'https://github.com/djberg96/sys-admin/wiki',
28
33
  'source_code_uri' => 'https://github.com/djberg96/sys-admin',
29
34
  'wiki_uri' => 'https://github.com/djberg96/sys-admin/wiki'
data.tar.gz.sig CHANGED
Binary file