WatersOfOblivion-heychell7 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,4 @@
1
+ == 0.0.1 2009-06-23
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
data/Manifest.txt ADDED
@@ -0,0 +1,12 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.rdoc
4
+ Rakefile
5
+ lib/heychell7.rb
6
+ script/console
7
+ script/destroy
8
+ script/generate
9
+ spec/heychell7_spec.rb
10
+ spec/spec.opts
11
+ spec/spec_helper.rb
12
+ tasks/rspec.rake
data/README.rdoc ADDED
@@ -0,0 +1,48 @@
1
+ = Heychell7
2
+
3
+ * http://github.com/WatersOfOblivion/heychell7
4
+
5
+ == DESCRIPTION:
6
+
7
+ Ruby library for processing HL7
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * None, yet.
12
+
13
+ == SYNOPSIS:
14
+
15
+ # TODO
16
+
17
+ == REQUIREMENTS:
18
+
19
+ * None, yet
20
+
21
+ == INSTALL:
22
+
23
+ * sudo gem install WatersOfOblivion-heychell7
24
+
25
+ == LICENSE:
26
+
27
+ (The MIT License)
28
+
29
+ Copyright (c) 2009 Jonathan Bryant
30
+
31
+ Permission is hereby granted, free of charge, to any person obtaining
32
+ a copy of this software and associated documentation files (the
33
+ 'Software'), to deal in the Software without restriction, including
34
+ without limitation the rights to use, copy, modify, merge, publish,
35
+ distribute, sublicense, and/or sell copies of the Software, and to
36
+ permit persons to whom the Software is furnished to do so, subject to
37
+ the following conditions:
38
+
39
+ The above copyright notice and this permission notice shall be
40
+ included in all copies or substantial portions of the Software.
41
+
42
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
43
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
44
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
45
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
46
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
47
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
48
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,27 @@
1
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
2
+ %w[rake rake/clean fileutils newgem rubigen].each { |f| require f }
3
+ require File.dirname(__FILE__) + '/lib/heychell7'
4
+
5
+ # Generate all the Rake tasks
6
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
7
+ $hoe = Hoe.new('heychell7', Heychell7::VERSION) do |p|
8
+ p.developer('Jonathan Bryant', 'jonathan@watersofoblivion.com')
9
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
10
+ # p.extra_deps = [
11
+ # ['activesupport','>= 2.0.2'],
12
+ # ]
13
+ p.extra_dev_deps = [
14
+ ['newgem', ">= #{::Newgem::VERSION}"]
15
+ ]
16
+
17
+ p.clean_globs |= %w[**/.DS_Store tmp *.log]
18
+ path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
19
+ p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
20
+ p.rsync_args = '-av --delete --ignore-errors'
21
+ end
22
+
23
+ require 'newgem/tasks' # load /tasks/*.rake
24
+ Dir['tasks/**/*.rake'].each { |t| load t }
25
+
26
+ # TODO - want other tests/tasks run by default? Add them to the list
27
+ task :default => :spec
data/lib/heychell7.rb ADDED
@@ -0,0 +1,452 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ module Heychell7
5
+ VERSION = '0.0.1'
6
+
7
+ class << self
8
+ def message &block
9
+ Message.instance_eval &block
10
+ end
11
+ end
12
+
13
+ class Parser
14
+ def initialize
15
+ @buffer = ""
16
+ @segments = []
17
+ @fields = []
18
+ @items = []
19
+ @stack = []
20
+ end
21
+
22
+ def parse str
23
+ @buffer += str.to_s
24
+ parse_re = /\n|\||\^|^\x0b|\x1c\r$/
25
+ while @buffer =~ parse_re do
26
+ case $&
27
+ when "\n" then emit_segment $`
28
+ when "|" then emit_field $`
29
+ when "^" then emit_item $`
30
+ when "\x0b" then emit_start
31
+ when "\x1c\r" then emit_end $`
32
+ else emit_error
33
+ end
34
+
35
+ @buffer = $'
36
+ end
37
+
38
+ reduce Segment, Message
39
+ @stack.pop
40
+ end
41
+
42
+ def parse_string str
43
+ parse "\x0b#{str}\x1c\r" unless str =~ /^\x0b.*\x1c\r$/
44
+ end
45
+
46
+ def parse_file filename
47
+ parse_string File.open(filename, "r").read
48
+ end
49
+
50
+ private
51
+
52
+ def emit_segment data
53
+ emit_field data
54
+ reduce Field, Segment
55
+ end
56
+
57
+ def emit_field data
58
+ emit_item data
59
+ reduce Item, Field
60
+ end
61
+
62
+ def emit_item data
63
+ @stack.push Item.new(data)
64
+ end
65
+
66
+ def emit_start
67
+ @items, @fields, @segments = [], [], []
68
+ @stack = []
69
+ end
70
+
71
+ def emit_end data
72
+ emit_segment data unless data.empty?
73
+ end
74
+
75
+ def emit_error
76
+ puts "Error! Unexpected #{$&}"
77
+ end
78
+
79
+ def reduce source, target
80
+ tmp = []
81
+ target = target.new
82
+ while @stack.last.is_a? source
83
+ tmp << @stack.pop
84
+ end
85
+ tmp.reverse.each { |src| target << src }
86
+ @stack.push target
87
+ end
88
+ end
89
+
90
+ class Message
91
+ attr_accessor :segments
92
+
93
+ def initialize segments = []
94
+ @segments = segments
95
+ end
96
+
97
+ def << segment
98
+ @segments << segment
99
+ end
100
+
101
+ def to_hl7
102
+ @segments.map { |seg| seg.to_hl7 }.join("\n") + "\n"
103
+ end
104
+
105
+ def to_mllp
106
+ "\x0b#{self.to_hl7}\x1c\r"
107
+ end
108
+ end
109
+
110
+ class Segment
111
+ attr_accessor :fields
112
+
113
+ def initialize fields = []
114
+ @fields = fields
115
+ end
116
+
117
+ def << field
118
+ @fields << field
119
+ end
120
+
121
+ def to_hl7
122
+ @fields.map { |field| field.to_hl7 }.join("|")
123
+ end
124
+ end
125
+
126
+ class Field
127
+ attr_accessor :items
128
+
129
+ def initialize items = []
130
+ @items = items
131
+ end
132
+
133
+ def << item
134
+ @items << item
135
+ end
136
+
137
+ def to_hl7
138
+ @items.map { |item| item.to_hl7 }.join("^")
139
+ end
140
+ end
141
+
142
+ class Item
143
+ attr_accessor :data
144
+
145
+ def initialize data = nil
146
+ @data = data
147
+ end
148
+
149
+ def to_hl7
150
+ @data
151
+ end
152
+ end
153
+
154
+ =begin
155
+ message do
156
+ segment :evn do
157
+ field :type_code
158
+ field :recorded_date
159
+ field :planned_date
160
+ field :reason_code
161
+ field :operator_id
162
+ field :event_occurred
163
+ field :event_facility
164
+ end
165
+
166
+ segment :msn do
167
+ field :ack_code
168
+ field :control_id
169
+ field :text
170
+ field :expected_seq
171
+ field :delayed_ack_type
172
+ field :error_cond
173
+ end
174
+
175
+ segment :msh do
176
+ field :enc_chars
177
+ field :sending_app
178
+ field :sending_facility
179
+ field :recv_app
180
+ field :recv_facility
181
+ field :time
182
+ field :security
183
+ field :message_type
184
+ field :message_control_id
185
+ field :processing_id
186
+ field :version_id
187
+ field :seq
188
+ field :continue_ptr
189
+ field :accept_ack_type
190
+ field :app_ack_type
191
+ field :country_code
192
+ field :charset
193
+ end
194
+
195
+ segment :nte do
196
+ field :set_id
197
+ field :source
198
+ field :comment
199
+ field :comment_type
200
+ end
201
+
202
+ segment :obr do
203
+ field :set_id
204
+ field :placer_order_number
205
+ field :filler_order_number
206
+ field :universal_service_id
207
+ field :priority
208
+ field :requested_date
209
+ field :observation_date
210
+ field :observation_end_date
211
+ field :collection_volume
212
+ field :colletor_identifier
213
+ field :specimen_action_code
214
+ field :danger_code
215
+ field :relevant_clinical_info
216
+ field :specimen_received_date
217
+ field :speciment_source
218
+ field :ordering_provider
219
+ field :order_callback_phone_number
220
+ field :placer_field_1
221
+ field :placer_field_2
222
+ field :filer_field_1
223
+ field :filer_field_2
224
+ field :results_status_change_date
225
+ field :charge_to_practice
226
+ field :parent_result
227
+ field :quantity_timing
228
+ field :result_copies_to
229
+ field :parent
230
+ field :transport_mode
231
+ field :reason_for_study
232
+ field :principal_result_interpreter
233
+ field :assistant_result_interpreter
234
+ field :technician
235
+ field :transcriptionist
236
+ field :scheduled_date
237
+ field :number_of_sample_containers
238
+ field :transport_logistics_of_sample
239
+ field :collectors_comment
240
+ field :transport_arrangement_responsibility
241
+ field :transport_arranged
242
+ field :escort_required
243
+ field :planned_patient_transport_comment
244
+ field :procedure_code
245
+ field :procedure_code_modified
246
+ field :placer_supplemental_service_info
247
+ field :filler_supplemental_service_info
248
+ field :medically_necessary_dup_procedure_reason
249
+ field :result_handling
250
+ end
251
+
252
+ segment :obx do
253
+ field :set_id
254
+ field :value_type
255
+ field :observation_id
256
+ field :observation_sub_id
257
+ field :observation_value
258
+ field :units
259
+ field :reference_range
260
+ field :abnormal_flags
261
+ field :probability
262
+ field :nature_of_abnormal_test
263
+ field :observation_result_status
264
+ field :effective_date_of_reference_range
265
+ field :user_defined_access_checks
266
+ field :observation_date
267
+ field :producer_id
268
+ field :responsible_observer
269
+ field :observation_method
270
+ field :equiptment_instance_id
271
+ field :analysis_date
272
+ end
273
+
274
+ segment :oru do
275
+ # ???
276
+ end
277
+
278
+ segment :pid do
279
+ field :set_id
280
+ field :patient_id
281
+ field :patient_id_list
282
+ field :alt_patient_id
283
+ field :patient_name
284
+ field :mother_maiden_name
285
+ field :patient_dob
286
+ field :admin_sex
287
+ field :patient_alias
288
+ field :race
289
+ field :address
290
+ field :country_code
291
+ field :phone_home
292
+ field :phone_business
293
+ field :primary_language
294
+ field :marital_status
295
+ field :religion
296
+ field :account_number
297
+ field :social_security_num
298
+ field :mothers_id
299
+ field :ethnic_group
300
+ field :birthplace
301
+ field :multi_birth
302
+ field :birth_order
303
+ field :citizenship
304
+ field :vet_status
305
+ field :nationality
306
+ field :death_date
307
+ field :death_indicator
308
+ field :id_unknown_indicator
309
+ field :id_readablity_code
310
+ field :last_update_date
311
+ field :last_update_facility
312
+ field :species_code
313
+ field :breed_code
314
+ field :strain
315
+ field :production_class_code
316
+ field :tribal_citizenship
317
+ end
318
+
319
+ segment :pv1 do
320
+ field :set_id
321
+ field :patient_class
322
+ field :assigned_location
323
+ field :admission_type
324
+ field :preadmit_number
325
+ field :prior_location
326
+ field :attending_doctor
327
+ field :referring_doctor
328
+ field :consulting_doctor
329
+ field :hospital_service
330
+ field :temporary_location
331
+ field :preadmit_indicator
332
+ field :readmit_indicator
333
+ field :admit_source
334
+ field :ambulatory_status
335
+ field :vip_indicator
336
+ field :admitting_doctor
337
+ field :patient_type
338
+ field :visit_number
339
+ field :financial_class
340
+ field :charge_price_indicator
341
+ field :courtesy_code
342
+ field :credit_rating
343
+ field :contract_code
344
+ field :contract_effective_date
345
+ field :contract_amount
346
+ field :contract_period
347
+ field :interest_code
348
+ field :transfer_bad_debt_code
349
+ field :transfer_bad_debt_date
350
+ field :bad_debt_agency_code
351
+ field :bad_debt_transfer_amount
352
+ field :bad_debt_recovery_amount
353
+ field :delete_account_indicator
354
+ field :delete_account_date
355
+ field :diet_type
356
+ field :servicing_facility
357
+ field :bed_status
358
+ field :account_status
359
+ field :pending_location
360
+ field :prior_temporary_location
361
+ field :admit_date
362
+ field :discharge_date
363
+ field :current_patient_balance
364
+ field :total_charges
365
+ field :total_adjustments
366
+ field :total_payments
367
+ field :alternative_visit_id
368
+ field :visit_indicator
369
+ field :other_healthcare_provider
370
+ end
371
+
372
+ segment :pv2 do
373
+ field :prior_pending_location
374
+ field :accomodation_code
375
+ field :admin_reason
376
+ field :transfer_reason
377
+ field :patient_valuables
378
+ field :patient_valuables_location
379
+ field :visit_user_code
380
+ field :expected_admit_date
381
+ field :expected_discharge_date
382
+ field :estimated_inpatient_stay_length
383
+ field :actual_inpatient_stay_length
384
+ field :visit_description
385
+ field :referral_source_code
386
+ field :previous_service_date
387
+ field :employment_illness_related_indicator
388
+ field :purge_status_code
389
+ field :purge_status_date
390
+ field :special_program_code
391
+ field :retention_indicator
392
+ field :expected_number_of_insurance_plans
393
+ field :visit_publicity_code
394
+ field :visit_protection_indicator
395
+ field :clinic_organization_name
396
+ field :patient_status_code
397
+ field :visit_priority_code
398
+ field :previous_treatment_date
399
+ field :expected_discharge_disposition
400
+ field :signature_on_file
401
+ field :first_similar_illness_date
402
+ field :patient_charge_adjustment_code
403
+ field :recurring_service_code
404
+ field :billing_media_code
405
+ field :expected_surgery_date
406
+ field :military_partnership_code
407
+ field :military_non_availibility_code
408
+ field :newborn_baby_indicator
409
+ field :baby_detained_indicator
410
+ field :mode_of_arrival_code
411
+ field :recreational_drug_use_code
412
+ field :precaution_code
413
+ field :patient_condition_code
414
+ field :living_will_code
415
+ field :organ_donor_code
416
+ field :advance_directive_code
417
+ field :patient_status_effective_date
418
+ field :expected_loa_return_date
419
+ field :expected_preadmission_testing_date
420
+ field :notify_clergy_code
421
+ end
422
+
423
+ segment :qrd do
424
+ field :query_date
425
+ field :query_format_code
426
+ field :query_priority
427
+ field :query_id
428
+ field :deferred_response_type
429
+ field :deferred_response_date
430
+ field :quantity_limited_request
431
+ field :who_subject_filter
432
+ field :what_subject_filter
433
+ field :what_department_code
434
+ field :what_data_code
435
+ field :query_results_level
436
+ end
437
+
438
+ segment :qrf do
439
+ field :where_subject_filter
440
+ field :when_start_date
441
+ field :when_end_date
442
+ field :what_user_qualifier
443
+ field :other_qry_subject_filter
444
+ field :which_date_qualifier
445
+ field :which_date_status_qualifier
446
+ field :date_selection_qualifier
447
+ field :when_timing_qualifier
448
+ field :search_confidence_threshold
449
+ end
450
+ end
451
+ =end
452
+ end
data/script/console ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/heychell7.rb'}"
9
+ puts "Loading heychell7 gem"
10
+ exec "#{irb} #{libs} --simple-prompt"
data/script/destroy ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
data/script/generate ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ # Time to add your specs!
4
+ # http://rspec.info/
5
+ describe "Place your specs here" do
6
+
7
+ it "find this spec in spec directory" do
8
+ # violated "Be sure to write your specs"
9
+ end
10
+
11
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,10 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
10
+ require 'heychell7'
data/tasks/rspec.rake ADDED
@@ -0,0 +1,21 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run the specs under spec/models"
18
+ Spec::Rake::SpecTask.new do |t|
19
+ t.spec_opts = ['--options', "spec/spec.opts"]
20
+ t.spec_files = FileList['spec/**/*_spec.rb']
21
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: WatersOfOblivion-heychell7
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jonathan Bryant
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-06-24 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: newgem
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.4.1
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: hoe
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.8.0
34
+ version:
35
+ description: Ruby library for processing HL7
36
+ email:
37
+ - jonathan@watersofoblivion.com
38
+ executables: []
39
+
40
+ extensions: []
41
+
42
+ extra_rdoc_files:
43
+ - History.txt
44
+ - Manifest.txt
45
+ - README.rdoc
46
+ files:
47
+ - History.txt
48
+ - Manifest.txt
49
+ - README.rdoc
50
+ - Rakefile
51
+ - lib/heychell7.rb
52
+ - script/console
53
+ - script/destroy
54
+ - script/generate
55
+ - spec/heychell7_spec.rb
56
+ - spec/spec.opts
57
+ - spec/spec_helper.rb
58
+ - tasks/rspec.rake
59
+ has_rdoc: true
60
+ homepage: http://github.com/WatersOfOblivion/heychell7
61
+ post_install_message:
62
+ rdoc_options:
63
+ - --main
64
+ - README.rdoc
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: "0"
72
+ version:
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: "0"
78
+ version:
79
+ requirements: []
80
+
81
+ rubyforge_project: heychell7
82
+ rubygems_version: 1.2.0
83
+ signing_key:
84
+ specification_version: 2
85
+ summary: Ruby library for processing HL7
86
+ test_files: []
87
+