rslp 0.0.1 → 0.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ef8e7db15adf1f9e15979f07caecad8051e01084a4aeb215351adfcc97eb7335
4
- data.tar.gz: 208805a618c7b3b278513fd7bb8fa7945e3b3b61ef4f8696eeb565eb1008c04f
3
+ metadata.gz: 6d18a5f649a8f64234f0ca36681d7700bc82c6f92d6f92fb7de5a15a3e0c9a75
4
+ data.tar.gz: 445016807c2bb1f53192df312f86e8da65948e2c5f634f16cb5fd91fcd49df10
5
5
  SHA512:
6
- metadata.gz: dd5c483bb96f5866adcf971a86551f441a3ed2046fc1a7b245ccfbda979cbccd5bee7525deafdf98a5244c8c7f3c20012b0c1a99f1aa339ee756d1749f91675d
7
- data.tar.gz: 1c4293e328733ecc6dbbfcf92574ac8c671fe7f31eb1458643c03b8975125ce57ef967543fcb53a92677e8c0001103644b47036e1fb47d98faef53d76eeb5897
6
+ metadata.gz: c2150dfc89eae6d2a403151bcc6d4e1e683733225702cbd7e51cb2f6fc7d90e1e3b25504b2536d14a03fa629acb1fa4a8a093e6c45d72964feec43eac367fa94
7
+ data.tar.gz: 5051e0ec6e22438ada2b92729c64465b307201d0baf60a996627cf429efa2fbdb246ce602eeb627a29db60362bbd65944195d7ef46a7ef89880b052770572cbc
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGES.md CHANGED
@@ -1,2 +1,18 @@
1
+ ## 0.1.0 - 19-Oct-2022
2
+ * Updated the constructor, now uses keyword arguments.
3
+ * Constructor now accepts a hostname, or a comma separate lists of hosts.
4
+ * Added the set_app_property_file singleton method.
5
+ * Changed the deregister method to return the url.
6
+ * Minor refactoring of callback procs.
7
+
8
+ ## 0.0.2 - 12-Oct-2022
9
+ * Fixed the parse_service_url singleton method. The underlying SLPSrvURL
10
+ struct is now a managed struct.
11
+ * Added some nicer method aliases to the SLPSrvURL struct.
12
+ * Refactored the underlying C function wrappers to return an SLPError enum
13
+ to more closely align with the API.
14
+ * Any internal function failures now raise an OpenSLP::SLP::Error instead
15
+ of a SystemCallError. The error message has also been improved.
16
+
1
17
  ## 0.0.1 - 2-Jul-2021
2
18
  * Initial release
data/Gemfile CHANGED
@@ -1,3 +1,2 @@
1
- source 'https://rubygems.org' do
2
- gemspec
3
- end
1
+ source 'https://rubygems.org'
2
+ gemspec
data/README.md CHANGED
@@ -4,14 +4,18 @@ A Ruby wrapper for OpenSLP using FFI.
4
4
  ## Installation
5
5
  `gem install rslp`
6
6
 
7
+ ## Adding the trusted cert
8
+ `gem cert --add <(curl -Ls https://raw.githubusercontent.com/djberg96/rslp/main/certs/djberg96_pub.pem)`
9
+
7
10
  ## Synopsis
8
11
  ```ruby
9
12
  require 'rslp'
10
13
 
14
+ # See docs for more methods
11
15
  OpenSLP::SLP.new do |slp|
12
- # See docs for more methods
13
- p slp.find_services
16
+ p slp.find_services('myservice:myorg')
14
17
  p slp.find_scopes
18
+ p slp.find_service_types
15
19
  end
16
20
  ```
17
21
 
@@ -25,18 +29,19 @@ None at this time.
25
29
 
26
30
  ## Maintenance
27
31
  Please contact me about taking over maintenance of this library if you are
28
- interested. I'm not actually using it myself, and have no real plans to update
29
- it.
32
+ interested. I'm not actually using it myself, so maintenance and releases
33
+ will be sporadic at best.
30
34
 
31
35
  Why then? I originally wrote most of this when I thought we might need it
32
36
  for a project at work. That never materialized, but I hated to let it go to
33
- waste, so I've published what I completed.
37
+ waste, so I've published what I completed and may occasionally tinker with
38
+ it from time to time.
34
39
 
35
40
  ## License
36
41
  Apache-2.0
37
42
 
38
43
  ## Copyright
39
- (C) 2003-2021 Daniel J. Berger, All Rights Reserved
44
+ (C) 2003-2022 Daniel J. Berger, All Rights Reserved
40
45
 
41
46
  ## Warranty
42
47
  This package is provided "as is" and without any express or
data/lib/rslp.rb CHANGED
@@ -11,7 +11,10 @@ module OpenSLP
11
11
  extend OpenSLP::Functions
12
12
 
13
13
  # The version of the rslp library.
14
- VERSION = '0.0.1'.freeze
14
+ VERSION = '0.1.0'.freeze
15
+
16
+ # Internal error raised whenever an openslp function fails.
17
+ class Error < StandardError; end
15
18
 
16
19
  # The language tag for requests.
17
20
  attr_reader :lang
@@ -27,34 +30,51 @@ module OpenSLP
27
30
  # machine's locale.
28
31
  #
29
32
  # The +async+ argument may be set to true or false and establishes whether
30
- # the underlying handle is set to handl asynchronous operations or not. By
33
+ # the underlying handle is set to handle asynchronous operations or not. By
31
34
  # default this value is false.
32
35
  #
36
+ # The +host+ argument, if present, will associate the Host/IP with the OpenSLP
37
+ # handle. This is the Hostname/IP address of the Service Agent / Directory Agent
38
+ # from # which service is requested. For multicast, use a comma separated list of
39
+ # Hostnames/IP addresses.
40
+ #
33
41
  # If a block is given, then the object itself is yielded to the block, and
34
42
  # it is automatically closed at the end of the block.
35
43
  #
36
44
  # Examples:
37
45
  #
38
- # OpenSLP::SLP.new('en-us') do |slp|
46
+ # # Block form
47
+ # OpenSLP::SLP.new(lang: 'en-us', async: false, host: 'localhost') do |slp|
39
48
  # # ... do stuff
40
49
  # end
41
50
  #
42
- # slp = OpenSLP::SLP.new('en-us')
51
+ # # Non-block form
52
+ # slp = OpenSLP::SLP.new(lang: 'en-us')
43
53
  # # Do stuff
44
54
  # slp.close
45
55
  #
46
- def initialize(lang = '', async = false)
56
+ def initialize(lang: '', async: false, host: nil)
47
57
  @lang = lang
48
58
  @async = async
59
+ @host = host
49
60
 
50
61
  ptr = FFI::MemoryPointer.new(:ulong)
51
62
 
52
- if SLPOpen(lang, async, ptr) != SLP_OK
53
- raise SystemCallError.new('SLPOpen', FFI.errno)
54
- end
63
+ result = SLPOpen(lang, async, ptr)
64
+ raise Error, "SLPOpen(): #{result}" if result != :SLP_OK
55
65
 
56
66
  @handle = ptr.read_ulong
57
67
 
68
+ if @host
69
+ if @host.split(',').size > 1
70
+ result = SLPAssociateIFList(@handle, @host)
71
+ raise Error, "SLPAssociateIFList(): #{result}" if result != :SLP_OK
72
+ else
73
+ result = SLPAssociateIP(@handle, @host)
74
+ raise Error, "SLPAssociateIP(): #{result}" if result != :SLP_OK
75
+ end
76
+ end
77
+
58
78
  if block_given?
59
79
  begin
60
80
  yield self
@@ -88,7 +108,7 @@ module OpenSLP
88
108
  options[:attributes] ||= ""
89
109
  options[:fresh] ||= true
90
110
 
91
- options[:callback] ||= Proc.new{ |hslp, err, cookie| }
111
+ options[:callback] ||= Proc.new{ |_hslp, err, _cookie| }
92
112
 
93
113
  if options[:attributes] && options[:attributes] != ""
94
114
  attributes = options[:attributes].map{ |k,v| "(#{k}=#{v})" }.join(',')
@@ -96,20 +116,24 @@ module OpenSLP
96
116
  attributes = ""
97
117
  end
98
118
 
99
- cookie = FFI::MemoryPointer.new(:void)
100
-
101
- result = SLPReg(
102
- @handle,
103
- options[:url],
104
- options[:lifetime],
105
- nil,
106
- attributes,
107
- options[:fresh],
108
- options[:callback],
109
- cookie
110
- )
111
-
112
- raise SystemCallError.new('SLPReg', result) if result != SLP_OK
119
+ begin
120
+ cookie = FFI::MemoryPointer.new(:void)
121
+
122
+ result = SLPReg(
123
+ @handle,
124
+ options[:url],
125
+ options[:lifetime],
126
+ nil,
127
+ attributes,
128
+ options[:fresh],
129
+ options[:callback],
130
+ cookie
131
+ )
132
+
133
+ raise Error, "SLPReg(): #{result}" if result != :SLP_OK
134
+ ensure
135
+ cookie.free unless cookie.null?
136
+ end
113
137
 
114
138
  options[:url]
115
139
  end
@@ -118,13 +142,17 @@ module OpenSLP
118
142
  # is registered and all language locales.
119
143
  #
120
144
  def deregister(url)
121
- callback = Proc.new{ |hslp, err, cookie| }
122
- cookie = FFI::MemoryPointer.new(:void)
145
+ callback = Proc.new{ |_hslp, err, _cookie| }
123
146
 
124
- result = SLPDereg(@handle, url, callback, cookie)
125
- raise SystemCallError.new('SLPDereg', result) if result != SLP_OK
147
+ begin
148
+ cookie = FFI::MemoryPointer.new(:void)
149
+ result = SLPDereg(@handle, url, callback, cookie)
150
+ raise Error, "SLPDereg(): #{result}" if result != :SLP_OK
151
+ ensure
152
+ cookie.free unless cookie.null?
153
+ end
126
154
 
127
- true
155
+ url
128
156
  end
129
157
 
130
158
  # Deletes specified attributes from a registered service. The attributes
@@ -135,10 +163,14 @@ module OpenSLP
135
163
  #
136
164
  def delete_service_attributes(url, attributes)
137
165
  callback = Proc.new{ |hslp, err, cookie| }
138
- cookie = FFI::MemoryPointer.new(:void)
139
166
 
140
- result = SLPDelAttrs(@handle, url, attributes, callback, cookie)
141
- raise SystemCallError.new('SLPDelAttrs', result) if result != SLP_OK
167
+ begin
168
+ cookie = FFI::MemoryPointer.new(:void)
169
+ result = SLPDelAttrs(@handle, url, attributes, callback, cookie)
170
+ raise Error, "SLPDelAttrs(): #{result}" if result != :SLP_OK
171
+ ensure
172
+ cookie.free unless cookie.null?
173
+ end
142
174
 
143
175
  attributes
144
176
  end
@@ -150,16 +182,13 @@ module OpenSLP
150
182
  begin
151
183
  pptr = FFI::MemoryPointer.new(:pointer, 128)
152
184
 
153
- rv = SLPFindScopes(@handle, pptr)
154
-
155
- if rv != SLP_OK
156
- raise SystemCallError.new('SLPFindScopes', rv)
157
- end
185
+ result = SLPFindScopes(@handle, pptr)
186
+ raise Error, "SLPFindScopes(): #{result}" if result != :SLP_OK
158
187
 
159
188
  arr = pptr.read_array_of_string
160
189
  ensure
161
190
  SLPFree(pptr.read_pointer)
162
- pptr.free
191
+ pptr.free unless pptr.null?
163
192
  end
164
193
 
165
194
  arr
@@ -177,24 +206,27 @@ module OpenSLP
177
206
  # form of an LDAP search filter. The default is an empty string, which
178
207
  # will gather all services of the requested type.
179
208
  #
209
+ # The result is an array of hashes, with the URL as the key and its lifetime
210
+ # as the value.
211
+ #
180
212
  def find_services(type, scope = '', filter = '')
181
213
  arr = []
182
214
 
183
- callback = Proc.new{ |hslp, url, life, err, cook|
215
+ callback = Proc.new{ |_hslp, url, lifetime, err, _cookie|
184
216
  if err == SLP_OK
185
- arr << {url => life}
217
+ arr << {url => lifetime}
186
218
  true
187
219
  else
188
220
  false
189
221
  end
190
222
  }
191
223
 
192
- cookie = FFI::MemoryPointer.new(:void)
193
-
194
- rv = SLPFindSrvs(@handle, type, scope, filter, callback, cookie)
195
-
196
- if rv != SLP_OK
197
- raise SystemCallError.new('SLPFindSrvs', rv)
224
+ begin
225
+ cookie = FFI::MemoryPointer.new(:void)
226
+ result = SLPFindSrvs(@handle, type, scope, filter, callback, cookie)
227
+ raise Error, "SLPFindSrvs(): #{result}" if result != :SLP_OK
228
+ ensure
229
+ cookie.free unless cookie.null?
198
230
  end
199
231
 
200
232
  arr
@@ -214,7 +246,7 @@ module OpenSLP
214
246
  def find_service_types(auth = '*', scope = '')
215
247
  arr = []
216
248
 
217
- callback = Proc.new{ |hslp, types, err, cookie|
249
+ callback = Proc.new{ |_hslp, types, err, _cookie|
218
250
  if err == SLP_OK
219
251
  arr << types
220
252
  true
@@ -223,12 +255,12 @@ module OpenSLP
223
255
  end
224
256
  }
225
257
 
226
- cookie = FFI::MemoryPointer.new(:void)
227
-
228
- rv = SLPFindSrvTypes(@handle, auth, scope, callback, cookie)
229
-
230
- if rv != SLP_OK
231
- raise SystemCallError.new('SLPFindSrvs', rv)
258
+ begin
259
+ cookie = FFI::MemoryPointer.new(:void)
260
+ result = SLPFindSrvTypes(@handle, auth, scope, callback, cookie)
261
+ raise Error, "SLPFindSrvTypes(): #{result}" if result != :SLP_OK
262
+ ensure
263
+ cookie.free unless cookie.null?
232
264
  end
233
265
 
234
266
  arr
@@ -242,7 +274,7 @@ module OpenSLP
242
274
  def find_service_attributes(url, attrs = '', scope = '')
243
275
  arr = []
244
276
 
245
- callback = Proc.new{ |hslp, attrlist, err, cookie|
277
+ callback = Proc.new{ |_hslp, attrlist, err, _cookie|
246
278
  if err == SLP_OK
247
279
  arr << attrlist
248
280
  true
@@ -251,12 +283,12 @@ module OpenSLP
251
283
  end
252
284
  }
253
285
 
254
- cookie = FFI::MemoryPointer.new(:void)
255
-
256
- rv = SLPFindAttrs(@handle, url, scope, attrs, callback, cookie)
257
-
258
- if rv != SLP_OK
259
- raise SystemCallError.new('SLPFindSrvs', rv)
286
+ begin
287
+ cookie = FFI::MemoryPointer.new(:void)
288
+ result = SLPFindAttrs(@handle, url, scope, attrs, callback, cookie)
289
+ raise Error, "SLPFindAttrs(): #{result}" if result != :SLP_OK
290
+ ensure
291
+ cookie.free unless cookie.null?
260
292
  end
261
293
 
262
294
  arr
@@ -292,14 +324,13 @@ module OpenSLP
292
324
  begin
293
325
  pptr = FFI::MemoryPointer.new(SLPSrvURL)
294
326
 
295
- if SLPParseSrvURL(url, pptr) != SLP_OK
296
- raise SystemCallError.new('SLPParseSrvURL', FFI.errno)
297
- end
327
+ result = SLPParseSrvURL(url, pptr)
328
+ raise Error, "SLPParseSrvURL(): #{result}" if result != :SLP_OK
298
329
 
299
330
  ptr = pptr.read_pointer
300
331
  struct = SLPSrvURL.new(ptr)
301
332
  ensure
302
- SLPFree(ptr)
333
+ pptr.free unless pptr.null?
303
334
  end
304
335
 
305
336
  struct
@@ -312,9 +343,8 @@ module OpenSLP
312
343
  begin
313
344
  pptr = FFI::MemoryPointer.new(:pointer)
314
345
 
315
- if SLPEscape(string, pptr, istag) != SLP_OK
316
- raise SystemCallError.new('SLPEscape', FFI.errno)
317
- end
346
+ result = SLPEscape(string, pptr, istag)
347
+ raise Error, "SLPEscape(): #{result}" if result != :SLP_OK
318
348
 
319
349
  str = pptr.read_pointer.read_string
320
350
  ensure
@@ -331,9 +361,8 @@ module OpenSLP
331
361
  begin
332
362
  pptr = FFI::MemoryPointer.new(:pointer)
333
363
 
334
- if SLPUnescape(string, pptr, istag) != SLP_OK
335
- raise SystemCallError.new('SLPEscape', FFI.errno)
336
- end
364
+ result = SLPUnescape(string, pptr, istag)
365
+ raise Error, "SLPUnescape(): #{result}" if result != :SLP_OK
337
366
 
338
367
  str = pptr.read_pointer.read_string
339
368
  ensure
@@ -342,5 +371,17 @@ module OpenSLP
342
371
 
343
372
  str
344
373
  end
374
+
375
+ # Set the application-specific configuration file full path name.
376
+ #
377
+ # The contents of this property file will override the contents of the
378
+ # default or global UA configuration file (usually /etc/slp.conf or
379
+ # C:\windows\slp.conf).
380
+ #
381
+ def self.set_app_property_file(path)
382
+ result = SLPSetAppPropertyFile(string)
383
+ raise Error, "SLPSetAppPropertyFile(): #{result}" if result != :SLP_OK
384
+ path
385
+ end
345
386
  end
346
387
  end
data/lib/slp/functions.rb CHANGED
@@ -19,6 +19,29 @@ module OpenSLP
19
19
  end
20
20
  end
21
21
 
22
+ SLPError = enum(
23
+ :SLP_LAST_CALL, 1,
24
+ :SLP_OK, 0,
25
+ :SLP_LANGUAGE_NOT_SUPPORTED, -1,
26
+ :SLP_PARSE_ERROR, -2,
27
+ :SLP_INVALID_REGISTRATION, -3,
28
+ :SLP_SCOPE_NOT_SUPPORTED, -4,
29
+ :SLP_AUTHENTICATION_ABSENT, -6,
30
+ :SLP_AUTHENTICATION_FAILED, -7,
31
+ :SLP_INVALID_UPDATE, -13,
32
+ :SLP_REFRESH_REJECTED, -15,
33
+ :SLP_NOT_IMPLEMENTED, -17,
34
+ :SLP_BUFFER_OVERFLOW, -18,
35
+ :SLP_NETWORK_TIMED_OUT, -19,
36
+ :SLP_NETWORK_INIT_FAILED, -20,
37
+ :SLP_MEMORY_ALLOC_FAILED, -21,
38
+ :SLP_PARAMETER_BAD, -22,
39
+ :SLP_NETWORK_ERROR, -23,
40
+ :SLP_INTERNAL_SYSTEM_ERROR, -24,
41
+ :SLP_HANDLE_IN_USE, -25,
42
+ :SLP_TYPE_ERROR, -26
43
+ )
44
+
22
45
  typedef :ulong, :handle
23
46
 
24
47
  callback :SLPSrvURLCallback, [:handle, :string, :ushort, :int, :pointer], :bool
@@ -26,29 +49,35 @@ module OpenSLP
26
49
  callback :SLPAttrCallback, [:handle, :string, :int, :pointer], :bool
27
50
  callback :SLPRegReportCallback, [:handle, :int, :pointer], :void
28
51
 
52
+ attach_function :SLPAssociateIFList, [:handle, :string], SLPError
53
+ attach_function :SLPAssociateIP, [:handle, :string], SLPError
29
54
  attach_function :SLPClose, [:handle], :void
30
- attach_function :SLPEscape, [:string, :pointer, :bool], :int
31
- attach_function :SLPDelAttrs, [:handle, :string, :string, :SLPRegReportCallback, :pointer], :int
32
- attach_function :SLPDereg, [:handle, :string, :SLPRegReportCallback, :pointer], :int
55
+ attach_function :SLPDelAttrs, [:handle, :string, :string, :SLPRegReportCallback, :pointer], SLPError
56
+ attach_function :SLPDereg, [:handle, :string, :SLPRegReportCallback, :pointer], SLPError
57
+ attach_function :SLPEscape, [:string, :pointer, :bool], SLPError
33
58
 
34
59
  attach_function :SLPFindAttrs,
35
- [:handle, :string, :string, :string, :SLPAttrCallback, :pointer], :int
60
+ [:handle, :string, :string, :string, :SLPAttrCallback, :pointer], SLPError
36
61
 
37
- attach_function :SLPFindScopes, [:handle, :pointer], :int
62
+ attach_function :SLPFindScopes, [:handle, :pointer], SLPError
38
63
 
39
64
  attach_function :SLPFindSrvs,
40
- [:handle, :string, :string, :string, :SLPSrvURLCallback, :pointer], :int
65
+ [:handle, :string, :string, :string, :SLPSrvURLCallback, :pointer], SLPError
41
66
 
42
67
  attach_function :SLPFindSrvTypes,
43
- [:handle, :string, :string, :SLPSrvTypeCallback, :pointer], :int
68
+ [:handle, :string, :string, :SLPSrvTypeCallback, :pointer], SLPError
44
69
 
45
70
  attach_function :SLPFree, [:pointer], :void
46
71
  attach_function :SLPGetProperty, [:string], :string
47
72
  attach_function :SLPGetRefreshInterval, [], :uint
48
- attach_function :SLPOpen, [:string, :bool, :pointer], :handle
49
- attach_function :SLPParseSrvURL, [:string, :pointer], :int
50
- attach_function :SLPReg, [:handle, :string, :ushort, :string, :string, :bool, :SLPRegReportCallback, :pointer], :int
73
+ attach_function :SLPOpen, [:string, :bool, :pointer], SLPError
74
+ attach_function :SLPParseSrvURL, [:string, :pointer], SLPError
75
+
76
+ attach_function :SLPReg,
77
+ [:handle, :string, :ushort, :string, :string, :bool, :SLPRegReportCallback, :pointer], SLPError
78
+
79
+ attach_function :SLPSetAppPropertyFile, [:string], SLPError
51
80
  attach_function :SLPSetProperty, [:string, :string], :void
52
- attach_function :SLPUnescape, [:string, :pointer, :bool], :int
81
+ attach_function :SLPUnescape, [:string, :pointer, :bool], SLPError
53
82
  end
54
83
  end
data/lib/slp/structs.rb CHANGED
@@ -1,8 +1,10 @@
1
- require 'ffi'
1
+ require_relative 'functions'
2
2
 
3
3
  module OpenSLP
4
4
  module Structs
5
- class SLPSrvURL < FFI::Struct
5
+ class SLPSrvURL < FFI::ManagedStruct
6
+ extend OpenSLP::Functions
7
+
6
8
  layout(
7
9
  :s_pcSrvType, :string,
8
10
  :s_pcHost, :string,
@@ -10,6 +12,30 @@ module OpenSLP
10
12
  :s_pcNetFamily, :string,
11
13
  :s_pcSrvPart, :string
12
14
  )
15
+
16
+ def self.release(pointer)
17
+ SLPFree(pointer) unless pointer.null?
18
+ end
19
+
20
+ def service_type
21
+ self[:s_pcSrvType]
22
+ end
23
+
24
+ def host
25
+ self[:s_pcHost]
26
+ end
27
+
28
+ def port
29
+ self[:s_iPort]
30
+ end
31
+
32
+ def net_family
33
+ self[:s_pcNetFamily]
34
+ end
35
+
36
+ def url_remainder
37
+ self[:s_pcSrvPart]
38
+ end
13
39
  end
14
40
  end
15
41
  end
data/rslp.gemspec CHANGED
@@ -3,7 +3,7 @@ require 'rbconfig'
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = 'rslp'
6
- spec.version = '0.0.1'
6
+ spec.version = '0.1.0'
7
7
  spec.license = 'Apache-2.0'
8
8
  spec.author = 'Daniel J. Berger'
9
9
  spec.email = 'djberg96@gmail.com'
@@ -21,12 +21,13 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency('rspec', "~> 3.9")
22
22
 
23
23
  spec.metadata = {
24
- 'homepage_uri' => 'https://github.com/djberg96/rslp',
25
- 'bug_tracker_uri' => 'https://github.com/djberg96/rslp/issues',
26
- 'changelog_uri' => 'https://github.com/djberg96/rslp/blob/main/CHANGES.md',
27
- 'documentation_uri' => 'https://github.com/djberg96/rslp/wiki',
28
- 'source_code_uri' => 'https://github.com/djberg96/rslp',
29
- 'wiki_uri' => 'https://github.com/djberg96/rslp/wiki'
24
+ 'homepage_uri' => 'https://github.com/djberg96/rslp',
25
+ 'bug_tracker_uri' => 'https://github.com/djberg96/rslp/issues',
26
+ 'changelog_uri' => 'https://github.com/djberg96/rslp/blob/main/CHANGES.md',
27
+ 'documentation_uri' => 'https://github.com/djberg96/rslp/wiki',
28
+ 'source_code_uri' => 'https://github.com/djberg96/rslp',
29
+ 'wiki_uri' => 'https://github.com/djberg96/rslp/wiki',
30
+ 'rubygems_mfa_required' => 'true'
30
31
  }
31
32
 
32
33
  spec.description = <<-EOF
data/spec/rslp_spec.rb CHANGED
@@ -6,25 +6,25 @@
6
6
  require 'rspec'
7
7
  require 'rslp'
8
8
 
9
- describe OpenSLP::SLP do
9
+ RSpec.describe OpenSLP::SLP do
10
10
  before do
11
11
  @lang = 'en-us'
12
- @slp = OpenSLP::SLP.new(@lang, false)
12
+ @slp = described_class.new(lang: @lang, async: false, host: 'localhost')
13
13
  end
14
14
 
15
15
  context "version" do
16
16
  example "version is set to the expected value" do
17
- expect(OpenSLP::SLP::VERSION).to eq('0.0.1')
17
+ expect(described_class::VERSION).to eq('0.1.0')
18
18
  end
19
19
  end
20
20
 
21
21
  context "constructor" do
22
22
  example "defaults to an empty string if no lang is provided" do
23
- expect(OpenSLP::SLP.new.lang).to eq('')
23
+ expect(described_class.new.lang).to eq('')
24
24
  end
25
25
 
26
26
  example "defaults to a false async value if no value is provided" do
27
- expect(OpenSLP::SLP.new.async).to be false
27
+ expect(described_class.new.async).to be false
28
28
  end
29
29
 
30
30
  example "sets attributes to expected values" do
@@ -33,38 +33,81 @@ describe OpenSLP::SLP do
33
33
  end
34
34
  end
35
35
 
36
- context "singleton methods" do
37
- example "defines a refresh_interval method" do
38
- expect(OpenSLP::SLP).to respond_to(:refresh_interval)
39
- end
36
+ describe "singleton methods" do
37
+ context "refresh_interval" do
38
+ example "defines a refresh_interval method" do
39
+ expect(described_class).to respond_to(:refresh_interval)
40
+ end
40
41
 
41
- example "returns the expected value for refresh_interval" do
42
- expect(OpenSLP::SLP.refresh_interval).to eq(0)
42
+ example "returns the expected value for refresh_interval" do
43
+ expect(described_class.refresh_interval).to eq(0)
44
+ end
43
45
  end
44
46
 
45
47
  example "defines a get_property method" do
46
- expect(OpenSLP::SLP).to respond_to(:get_property)
48
+ expect(described_class).to respond_to(:get_property)
47
49
  end
48
50
 
49
51
  example "defines a set_property method" do
50
- expect(OpenSLP::SLP).to respond_to(:set_property)
52
+ expect(described_class).to respond_to(:set_property)
51
53
  end
52
54
 
53
- example "defines a parse_service_url method" do
54
- expect(OpenSLP::SLP).to respond_to(:parse_service_url)
55
- end
55
+ context "parse_service_url" do
56
+ let(:valid_url) { "service:test.openslp://192.168.100.1:3003,en,65535" }
57
+
58
+ before do
59
+ @struct = described_class.parse_service_url(valid_url)
60
+ end
61
+
62
+ example "defines a parse_service_url method" do
63
+ expect(described_class).to respond_to(:parse_service_url)
64
+ end
65
+
66
+ example "does not raise an error if the url is valid" do
67
+ expect{ described_class.parse_service_url(valid_url) }.not_to raise_error
68
+ end
69
+
70
+ example "returns a struct with the expected service type" do
71
+ expect(@struct.service_type).to eq("service:test.openslp")
72
+ end
56
73
 
57
- example "defines a escape_reserved method" do
58
- expect(OpenSLP::SLP).to respond_to(:escape_reserved)
74
+ example "returns a struct with the expected host" do
75
+ expect(@struct.host).to eq("192.168.100.1")
76
+ end
77
+
78
+ example "returns a struct with the expected port" do
79
+ expect(@struct.port).to eq(3003)
80
+ end
81
+
82
+ example "returns a struct with the expected net family" do
83
+ expect(@struct.net_family).to eq("")
84
+ end
85
+
86
+ example "returns a struct with the expected url remainder" do
87
+ expect(@struct.url_remainder).to eq("")
88
+ end
59
89
  end
60
90
 
61
- example "returns the expected value for the escape_reserved method" do
62
- expected = "\\2Ctag-example\\2C"
63
- expect(OpenSLP::SLP.escape_reserved(",tag-example,")).to eq(expected)
91
+ context "escape_reserved" do
92
+ example "defines a escape_reserved method" do
93
+ expect(described_class).to respond_to(:escape_reserved)
94
+ end
95
+
96
+ example "returns the expected value for the escape_reserved method" do
97
+ expected = "\\2Ctag-example\\2C"
98
+ expect(described_class.escape_reserved(",tag-example,")).to eq(expected)
99
+ end
64
100
  end
65
101
 
66
- example "defines a unescape_reserved method" do
67
- expect(OpenSLP::SLP).to respond_to(:unescape_reserved)
102
+ context "unescape_reserved" do
103
+ example "defines a unescape_reserved method" do
104
+ expect(described_class).to respond_to(:unescape_reserved)
105
+ end
106
+
107
+ example "returns the expected value for the unescape_reserved method" do
108
+ expected = ",tag-example,"
109
+ expect(described_class.unescape_reserved("\\2Ctag-example\\2C")).to eq(expected)
110
+ end
68
111
  end
69
112
  end
70
113
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rslp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel J. Berger
@@ -35,7 +35,7 @@ cert_chain:
35
35
  ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
36
36
  WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
37
37
  -----END CERTIFICATE-----
38
- date: 2021-07-02 00:00:00.000000000 Z
38
+ date: 2022-10-20 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: ffi
@@ -115,6 +115,7 @@ metadata:
115
115
  documentation_uri: https://github.com/djberg96/rslp/wiki
116
116
  source_code_uri: https://github.com/djberg96/rslp
117
117
  wiki_uri: https://github.com/djberg96/rslp/wiki
118
+ rubygems_mfa_required: 'true'
118
119
  post_install_message:
119
120
  rdoc_options: []
120
121
  require_paths:
@@ -130,7 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
131
  - !ruby/object:Gem::Version
131
132
  version: '0'
132
133
  requirements: []
133
- rubygems_version: 3.2.15
134
+ rubygems_version: 3.3.7
134
135
  signing_key:
135
136
  specification_version: 4
136
137
  summary: Interface for the OpenSLP library
metadata.gz.sig CHANGED
Binary file