rtp-connect 1.0 → 1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.rdoc +11 -0
- data/README.rdoc +8 -7
- data/lib/rtp-connect.rb +4 -1
- data/lib/rtp-connect/control_point.rb +76 -82
- data/lib/rtp-connect/extended_field.rb +43 -18
- data/lib/rtp-connect/field.rb +88 -108
- data/lib/rtp-connect/methods.rb +1 -1
- data/lib/rtp-connect/plan.rb +62 -65
- data/lib/rtp-connect/prescription.rb +52 -36
- data/lib/rtp-connect/record.rb +9 -4
- data/lib/rtp-connect/ruby_extensions.rb +1 -1
- data/lib/rtp-connect/site_setup.rb +53 -38
- data/lib/rtp-connect/version.rb +1 -1
- metadata +4 -4
data/lib/rtp-connect/methods.rb
CHANGED
@@ -19,7 +19,7 @@ module RTP
|
|
19
19
|
raise ArgumentError, "Invalid line encountered; No comma present in the string: #{line}" unless last_comma_pos
|
20
20
|
string_to_check = line[0..last_comma_pos]
|
21
21
|
string_remaining = line[(last_comma_pos+1)..-1]
|
22
|
-
raise ArgumentError, "Invalid line encountered; Valid checksum missing at end of string: #{string_remaining}" unless string_remaining.length
|
22
|
+
raise ArgumentError, "Invalid line encountered; Valid checksum missing at end of string: #{string_remaining}" unless string_remaining.length >= 3
|
23
23
|
checksum_extracted = string_remaining.value.to_i
|
24
24
|
checksum_computed = string_to_check.checksum
|
25
25
|
raise ArgumentError, "Invalid line encountered: Specified checskum #{checksum_extracted} deviates from the computed checksum #{checksum_computed}." if checksum_extracted != checksum_computed
|
data/lib/rtp-connect/plan.rb
CHANGED
@@ -71,9 +71,8 @@ module RTP
|
|
71
71
|
# * <tt>string</tt> -- A string containing a plan definition record.
|
72
72
|
#
|
73
73
|
def self.load(string)
|
74
|
-
raise ArgumentError, "Invalid argument 'string'. Expected String, got #{string.class}." unless string.is_a?(String)
|
75
74
|
# Get the quote-less values:
|
76
|
-
values = string.values
|
75
|
+
values = string.to_s.values
|
77
76
|
raise ArgumentError, "Invalid argument 'string': Expected exactly 28 elements, got #{values.length}." unless values.length == 28
|
78
77
|
rtp = self.new
|
79
78
|
# Assign the values to attributes:
|
@@ -116,10 +115,7 @@ module RTP
|
|
116
115
|
# * <tt>string</tt> -- An RTPConnect ascii string.
|
117
116
|
#
|
118
117
|
def self.parse(string)
|
119
|
-
|
120
|
-
raise ArgumentError, "Invalid argument 'string': String too short to contain valid RTP data (length: #{string.length})." if string.length < 10
|
121
|
-
#lines = string.lines
|
122
|
-
lines = string.split("\r\n")
|
118
|
+
lines = string.to_s.split("\r\n")
|
123
119
|
# Create the Plan object:
|
124
120
|
line = lines.first
|
125
121
|
RTP::verify(line)
|
@@ -185,11 +181,20 @@ module RTP
|
|
185
181
|
@keyword = 'PLAN_DEF'
|
186
182
|
end
|
187
183
|
|
184
|
+
# Returns true if the argument is an instance with attributes equal to self.
|
185
|
+
#
|
186
|
+
def ==(other)
|
187
|
+
if other.respond_to?(:to_plan)
|
188
|
+
other.send(:state) == state
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
alias_method :eql?, :==
|
193
|
+
|
188
194
|
# Adds a prescription site record to this instance.
|
189
195
|
#
|
190
196
|
def add_prescription(child)
|
191
|
-
|
192
|
-
@prescriptions << child
|
197
|
+
@prescriptions << child.to_prescription
|
193
198
|
end
|
194
199
|
|
195
200
|
# Returns the a properly sorted array of the child records of this instance.
|
@@ -198,6 +203,12 @@ module RTP
|
|
198
203
|
return [@prescriptions, @dose_trackings].flatten.compact
|
199
204
|
end
|
200
205
|
|
206
|
+
# Generates a Fixnum hash value for this instance.
|
207
|
+
#
|
208
|
+
def hash
|
209
|
+
state.hash
|
210
|
+
end
|
211
|
+
|
201
212
|
# Returns the values of this instance in an array.
|
202
213
|
# The values does not include the CRC.
|
203
214
|
#
|
@@ -233,17 +244,25 @@ module RTP
|
|
233
244
|
]
|
234
245
|
end
|
235
246
|
|
247
|
+
# Returns self.
|
248
|
+
#
|
249
|
+
def to_plan
|
250
|
+
self
|
251
|
+
end
|
252
|
+
|
236
253
|
# Writes the Plan object + any hiearchy of child objects,
|
237
254
|
# to a properly formatted RTPConnect ascii string.
|
238
255
|
#
|
239
|
-
def
|
256
|
+
def to_s
|
240
257
|
str = encode #.force_encoding('utf-8')
|
241
258
|
children.each do |child|
|
242
|
-
str += child.
|
259
|
+
str += child.to_s #.force_encoding('utf-8')
|
243
260
|
end
|
244
261
|
return str
|
245
262
|
end
|
246
263
|
|
264
|
+
alias :to_str :to_s
|
265
|
+
|
247
266
|
# Writes the Plan object, along with its hiearchy of child objects,
|
248
267
|
# to a properly formatted RTPConnect ascii file.
|
249
268
|
#
|
@@ -253,198 +272,172 @@ module RTP
|
|
253
272
|
#
|
254
273
|
def write(file)
|
255
274
|
f = open_file(file)
|
256
|
-
f.write(
|
275
|
+
f.write(to_s)
|
257
276
|
f.close
|
258
277
|
end
|
259
278
|
|
260
279
|
# Sets the keyword attribute.
|
261
280
|
#
|
262
281
|
def keyword=(value)
|
263
|
-
|
264
|
-
raise ArgumentError, "Invalid keyword. Expected 'PLAN_DEF', got #{value}." unless value
|
282
|
+
value = value.to_s.upcase
|
283
|
+
raise ArgumentError, "Invalid keyword. Expected 'PLAN_DEF', got #{value}." unless value == "PLAN_DEF"
|
265
284
|
@keyword = value
|
266
285
|
end
|
267
286
|
|
268
287
|
# Sets the patient_id attribute.
|
269
288
|
#
|
270
289
|
def patient_id=(value)
|
271
|
-
|
272
|
-
@patient_id = value
|
290
|
+
@patient_id = value && value.to_s
|
273
291
|
end
|
274
292
|
|
275
293
|
# Sets the patient_last_name attribute.
|
276
294
|
#
|
277
295
|
def patient_last_name=(value)
|
278
|
-
|
279
|
-
@patient_last_name = value
|
296
|
+
@patient_last_name = value && value.to_s
|
280
297
|
end
|
281
298
|
|
282
299
|
# Sets the patient_first_name attribute.
|
283
300
|
#
|
284
301
|
def patient_first_name=(value)
|
285
|
-
|
286
|
-
@patient_first_name = value
|
302
|
+
@patient_first_name = value && value.to_s
|
287
303
|
end
|
288
304
|
|
289
305
|
# Sets the patient_middle_initial attribute.
|
290
306
|
#
|
291
307
|
def patient_middle_initial=(value)
|
292
|
-
|
293
|
-
@patient_middle_initial = value
|
308
|
+
@patient_middle_initial = value && value.to_s
|
294
309
|
end
|
295
310
|
|
296
311
|
# Sets the plan_id attribute.
|
297
312
|
#
|
298
313
|
def plan_id=(value)
|
299
|
-
|
300
|
-
@plan_id = value
|
314
|
+
@plan_id = value && value.to_s
|
301
315
|
end
|
302
316
|
|
303
317
|
# Sets the plan_date attribute.
|
304
318
|
#
|
305
319
|
def plan_date=(value)
|
306
|
-
|
307
|
-
@plan_date = value
|
320
|
+
@plan_date = value && value.to_s
|
308
321
|
end
|
309
322
|
|
310
323
|
# Sets the plan_time attribute.
|
311
324
|
#
|
312
325
|
def plan_time=(value)
|
313
|
-
|
314
|
-
@plan_time = value
|
326
|
+
@plan_time = value && value.to_s
|
315
327
|
end
|
316
328
|
|
317
329
|
# Sets the course_id attribute.
|
318
330
|
#
|
319
331
|
def course_id=(value)
|
320
|
-
|
321
|
-
@course_id = value
|
332
|
+
@course_id = value && value.to_s
|
322
333
|
end
|
323
334
|
|
324
335
|
# Sets the diagnosis attribute.
|
325
336
|
#
|
326
337
|
def diagnosis=(value)
|
327
|
-
|
328
|
-
@diagnosis = value
|
338
|
+
@diagnosis = value && value.to_s
|
329
339
|
end
|
330
340
|
|
331
341
|
# Sets the md_last_name attribute.
|
332
342
|
#
|
333
343
|
def md_last_name=(value)
|
334
|
-
|
335
|
-
@md_last_name = value
|
344
|
+
@md_last_name = value && value.to_s
|
336
345
|
end
|
337
346
|
|
338
347
|
# Sets the md_first_name attribute.
|
339
348
|
#
|
340
349
|
def md_first_name=(value)
|
341
|
-
|
342
|
-
@md_first_name = value
|
350
|
+
@md_first_name = value && value.to_s
|
343
351
|
end
|
344
352
|
|
345
353
|
# Sets the md_middle_initial attribute.
|
346
354
|
#
|
347
355
|
def md_middle_initial=(value)
|
348
|
-
|
349
|
-
@md_middle_initial = value
|
356
|
+
@md_middle_initial = value && value.to_s
|
350
357
|
end
|
351
358
|
|
352
359
|
# Sets the md_approve_last_name attribute.
|
353
360
|
#
|
354
361
|
def md_approve_last_name=(value)
|
355
|
-
|
356
|
-
@md_approve_last_name = value
|
362
|
+
@md_approve_last_name = value && value.to_s
|
357
363
|
end
|
358
364
|
|
359
365
|
# Sets the md_approve_first_name attribute.
|
360
366
|
#
|
361
367
|
def md_approve_first_name=(value)
|
362
|
-
|
363
|
-
@md_approve_first_name = value
|
368
|
+
@md_approve_first_name = value && value.to_s
|
364
369
|
end
|
365
370
|
|
366
371
|
# Sets the md_approve_middle_initial attribute.
|
367
372
|
#
|
368
373
|
def md_approve_middle_initial=(value)
|
369
|
-
|
370
|
-
@md_approve_middle_initial = value
|
374
|
+
@md_approve_middle_initial = value && value.to_s
|
371
375
|
end
|
372
376
|
|
373
377
|
# Sets the phy_approve_last_name attribute.
|
374
378
|
#
|
375
379
|
def phy_approve_last_name=(value)
|
376
|
-
|
377
|
-
@phy_approve_last_name = value
|
380
|
+
@phy_approve_last_name = value && value.to_s
|
378
381
|
end
|
379
382
|
|
380
383
|
# Sets the phy_approve_first_name attribute.
|
381
384
|
#
|
382
385
|
def phy_approve_first_name=(value)
|
383
|
-
|
384
|
-
@phy_approve_first_name = value
|
386
|
+
@phy_approve_first_name = value && value.to_s
|
385
387
|
end
|
386
388
|
|
387
389
|
# Sets the phy_approve_middle_initial attribute.
|
388
390
|
#
|
389
391
|
def phy_approve_middle_initial=(value)
|
390
|
-
|
391
|
-
@phy_approve_middle_initial = value
|
392
|
+
@phy_approve_middle_initial = value && value.to_s
|
392
393
|
end
|
393
394
|
|
394
395
|
# Sets the author_last_name attribute.
|
395
396
|
#
|
396
397
|
def author_last_name=(value)
|
397
|
-
|
398
|
-
@author_last_name = value
|
398
|
+
@author_last_name = value && value.to_s
|
399
399
|
end
|
400
400
|
|
401
401
|
# Sets the author_first_name attribute.
|
402
402
|
#
|
403
403
|
def author_first_name=(value)
|
404
|
-
|
405
|
-
@author_first_name = value
|
404
|
+
@author_first_name = value && value.to_s
|
406
405
|
end
|
407
406
|
|
408
407
|
# Sets the author_middle_initial attribute.
|
409
408
|
#
|
410
409
|
def author_middle_initial=(value)
|
411
|
-
|
412
|
-
@author_middle_initial = value
|
410
|
+
@author_middle_initial = value && value.to_s
|
413
411
|
end
|
414
412
|
|
415
413
|
# Sets the rtp_mfg attribute.
|
416
414
|
#
|
417
415
|
def rtp_mfg=(value)
|
418
|
-
|
419
|
-
@rtp_mfg = value
|
416
|
+
@rtp_mfg = value && value.to_s
|
420
417
|
end
|
421
418
|
|
422
419
|
# Sets the rtp_model attribute.
|
423
420
|
#
|
424
421
|
def rtp_model=(value)
|
425
|
-
|
426
|
-
@rtp_model = value
|
422
|
+
@rtp_model = value && value.to_s
|
427
423
|
end
|
428
424
|
|
429
425
|
# Sets the rtp_version attribute.
|
430
426
|
#
|
431
427
|
def rtp_version=(value)
|
432
|
-
|
433
|
-
@rtp_version = value
|
428
|
+
@rtp_version = value && value.to_s
|
434
429
|
end
|
435
430
|
|
436
431
|
# Sets the rtp_if_protocol attribute.
|
437
432
|
#
|
438
433
|
def rtp_if_protocol=(value)
|
439
|
-
|
440
|
-
@rtp_if_protocol = value
|
434
|
+
@rtp_if_protocol = value && value.to_s
|
441
435
|
end
|
442
436
|
|
443
437
|
# Sets the rtp_if_version attribute.
|
444
438
|
#
|
445
439
|
def rtp_if_version=(value)
|
446
|
-
|
447
|
-
@rtp_if_version = value
|
440
|
+
@rtp_if_version = value && value.to_s
|
448
441
|
end
|
449
442
|
|
450
443
|
|
@@ -529,6 +522,10 @@ module RTP
|
|
529
522
|
@current_parent = s
|
530
523
|
end
|
531
524
|
|
525
|
+
# Returns the attributes of this instance in an array (for comparison purposes).
|
526
|
+
#
|
527
|
+
alias_method :state, :values
|
528
|
+
|
532
529
|
# Creates a treatment field record from the given string.
|
533
530
|
#
|
534
531
|
# === Parameters
|
@@ -35,10 +35,8 @@ module RTP
|
|
35
35
|
# * <tt>parent</tt> -- A Record which is used to determine the proper parent of this instance.
|
36
36
|
#
|
37
37
|
def self.load(string, parent)
|
38
|
-
raise ArgumentError, "Invalid argument 'string'. Expected String, got #{string.class}." unless string.is_a?(String)
|
39
|
-
raise ArgumentError, "Invalid argument 'parent'. Expected RTP::Record, got #{parent.class}." unless parent.is_a?(RTP::Record)
|
40
38
|
# Get the quote-less values:
|
41
|
-
values = string.values
|
39
|
+
values = string.to_s.values
|
42
40
|
raise ArgumentError, "Invalid argument 'string': Expected exactly 13 elements, got #{values.length}." unless values.length == 13
|
43
41
|
p = self.new(parent)
|
44
42
|
# Assign the values to attributes:
|
@@ -65,28 +63,35 @@ module RTP
|
|
65
63
|
# * <tt>parent</tt> -- A Record which is used to determine the proper parent of this instance.
|
66
64
|
#
|
67
65
|
def initialize(parent)
|
68
|
-
raise ArgumentError, "Invalid argument 'parent'. Expected RTP::Record, got #{parent.class}." unless parent.is_a?(RTP::Record)
|
69
66
|
# Child objects:
|
70
67
|
@site_setup = nil
|
71
68
|
@fields = Array.new
|
72
|
-
# Parent relation:
|
73
|
-
@parent = get_parent(parent, Plan)
|
69
|
+
# Parent relation (may get more than one type of record here):
|
70
|
+
@parent = get_parent(parent.to_record, Plan)
|
74
71
|
@parent.add_prescription(self)
|
75
72
|
@keyword = 'RX_DEF'
|
76
73
|
end
|
77
74
|
|
75
|
+
# Returns true if the argument is an instance with attributes equal to self.
|
76
|
+
#
|
77
|
+
def ==(other)
|
78
|
+
if other.respond_to?(:to_prescription)
|
79
|
+
other.send(:state) == state
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
alias_method :eql?, :==
|
84
|
+
|
78
85
|
# Adds a treatment Field record to this instance.
|
79
86
|
#
|
80
87
|
def add_field(child)
|
81
|
-
|
82
|
-
@fields << child
|
88
|
+
@fields << child.to_field
|
83
89
|
end
|
84
90
|
|
85
91
|
# Connects a Site setup record to this instance.
|
86
92
|
#
|
87
93
|
def add_site_setup(child)
|
88
|
-
|
89
|
-
@site_setup = child
|
94
|
+
@site_setup = child.to_site_setup
|
90
95
|
end
|
91
96
|
|
92
97
|
# Returns the a properly sorted array of the child records of this instance.
|
@@ -95,6 +100,12 @@ module RTP
|
|
95
100
|
return [@site_setup, @fields].flatten.compact
|
96
101
|
end
|
97
102
|
|
103
|
+
# Generates a Fixnum hash value for this instance.
|
104
|
+
#
|
105
|
+
def hash
|
106
|
+
state.hash
|
107
|
+
end
|
108
|
+
|
98
109
|
# Returns the values of this instance in an array.
|
99
110
|
# The values does not include the CRC.
|
100
111
|
#
|
@@ -115,104 +126,109 @@ module RTP
|
|
115
126
|
]
|
116
127
|
end
|
117
128
|
|
129
|
+
# Returns self.
|
130
|
+
#
|
131
|
+
def to_prescription
|
132
|
+
self
|
133
|
+
end
|
134
|
+
|
118
135
|
# Writes the Prescription object + any hiearchy of child objects,
|
119
136
|
# to a properly formatted RTPConnect ascii string.
|
120
137
|
#
|
121
|
-
def
|
138
|
+
def to_s
|
122
139
|
str = encode
|
123
140
|
if children
|
124
141
|
children.each do |child|
|
125
|
-
str += child.
|
142
|
+
str += child.to_s
|
126
143
|
end
|
127
144
|
end
|
128
145
|
return str
|
129
146
|
end
|
130
147
|
|
148
|
+
alias :to_str :to_s
|
149
|
+
|
131
150
|
# Sets the keyword attribute.
|
132
151
|
#
|
133
152
|
def keyword=(value)
|
134
|
-
|
135
|
-
raise ArgumentError, "Invalid keyword. Expected 'RX_DEF', got #{value}." unless value
|
153
|
+
value = value.to_s.upcase
|
154
|
+
raise ArgumentError, "Invalid keyword. Expected 'RX_DEF', got #{value}." unless value == "RX_DEF"
|
136
155
|
@keyword = value
|
137
156
|
end
|
138
157
|
|
139
158
|
# Sets the course_id attribute.
|
140
159
|
#
|
141
160
|
def course_id=(value)
|
142
|
-
|
143
|
-
@course_id = value
|
161
|
+
@course_id = value && value.to_s
|
144
162
|
end
|
145
163
|
|
146
164
|
# Sets the rx_site_name attribute.
|
147
165
|
#
|
148
166
|
def rx_site_name=(value)
|
149
|
-
|
150
|
-
@rx_site_name = value
|
167
|
+
@rx_site_name = value && value.to_s
|
151
168
|
end
|
152
169
|
|
153
170
|
# Sets the technique attribute.
|
154
171
|
#
|
155
172
|
def technique=(value)
|
156
|
-
|
157
|
-
@technique = value
|
173
|
+
@technique = value && value.to_s
|
158
174
|
end
|
159
175
|
|
160
176
|
# Sets the modality attribute.
|
161
177
|
#
|
162
178
|
def modality=(value)
|
163
|
-
|
164
|
-
@modality = value
|
179
|
+
@modality = value && value.to_s
|
165
180
|
end
|
166
181
|
|
167
182
|
# Sets the dose_spec attribute.
|
168
183
|
#
|
169
184
|
def dose_spec=(value)
|
170
|
-
|
171
|
-
@dose_spec = value
|
185
|
+
@dose_spec = value && value.to_s
|
172
186
|
end
|
173
187
|
|
174
188
|
# Sets the rx_depth attribute.
|
175
189
|
#
|
176
190
|
def rx_depth=(value)
|
177
|
-
|
178
|
-
@rx_depth = value
|
191
|
+
@rx_depth = value && value.to_s
|
179
192
|
end
|
180
193
|
|
181
194
|
# Sets the dose_ttl attribute.
|
182
195
|
#
|
183
196
|
def dose_ttl=(value)
|
184
|
-
|
185
|
-
@dose_ttl = value
|
197
|
+
@dose_ttl = value && value.to_s
|
186
198
|
end
|
187
199
|
|
188
200
|
# Sets the dose_tx attribute.
|
189
201
|
#
|
190
202
|
def dose_tx=(value)
|
191
|
-
|
192
|
-
@dose_tx = value
|
203
|
+
@dose_tx = value && value.to_s
|
193
204
|
end
|
194
205
|
|
195
206
|
# Sets the pattern attribute.
|
196
207
|
#
|
197
208
|
def pattern=(value)
|
198
|
-
|
199
|
-
@pattern = value
|
209
|
+
@pattern = value && value.to_s
|
200
210
|
end
|
201
211
|
|
202
212
|
# Sets the rx_note attribute.
|
203
213
|
#
|
204
214
|
def rx_note=(value)
|
205
|
-
|
206
|
-
@rx_note = value
|
215
|
+
@rx_note = value && value.to_s
|
207
216
|
end
|
208
217
|
|
209
218
|
# Sets the number_of_fields attribute.
|
210
219
|
#
|
211
220
|
def number_of_fields=(value)
|
212
|
-
|
213
|
-
@number_of_fields = value
|
221
|
+
@number_of_fields = value && value.to_s
|
214
222
|
end
|
215
223
|
|
224
|
+
|
225
|
+
private
|
226
|
+
|
227
|
+
|
228
|
+
# Returns the attributes of this instance in an array (for comparison purposes).
|
229
|
+
#
|
230
|
+
alias_method :state, :values
|
231
|
+
|
216
232
|
end
|
217
233
|
|
218
234
|
end
|