sys-admin 1.7.4 → 1.8.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.
@@ -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