quincy 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ pkg
data/CHANGES ADDED
@@ -0,0 +1,17 @@
1
+ current
2
+ - Quincy::PCnet(nil) takes path from ENV
3
+ - rake test now runs tests with specrb
4
+
5
+ 0.3.3
6
+ - Pathname() -> Pathname.new() (ruby 1.8.4)
7
+ - raise an Exception if no path is given explicitly or via the
8
+ Environment
9
+
10
+ 0.3.1
11
+ - changed package generation script to use Hoe
12
+ - changed unit tests to use test/spec
13
+
14
+ 0.2.0
15
+ - Changed handling of Version Numbers (Quincy::VERSION::STRING)
16
+ - added "-V" switch
17
+
@@ -0,0 +1,3 @@
1
+ == 0.3.5 / 2007-09-12
2
+ * create History.txt
3
+ * switch to anyforge
@@ -0,0 +1,9 @@
1
+ CHANGES
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ bin/quincy
6
+ lib/quincy.rb
7
+ spec/sample/PATDAT00/0098.DAT
8
+ spec/sample/PATDAT10/1317.DAT
9
+ spec/test_quincy.rb
@@ -0,0 +1 @@
1
+ this is a small library to extract patient information from Frey Quincy PCNet
@@ -0,0 +1,13 @@
1
+ $LOAD_PATH.unshift './lib'
2
+
3
+ require 'bundler'
4
+ Bundler::GemHelper.install_tasks
5
+
6
+
7
+ require 'quincy'
8
+
9
+ require 'rspec/core/rake_task'
10
+ RSpec::Core::RakeTask.new
11
+
12
+ task :default => :spec
13
+
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'quincy'
5
+
6
+ USAGE = "usage: #{$0} PATNR"
7
+
8
+ quincy_path = nil # defaults to ENV["QUINCY"]
9
+
10
+ opts = OptionParser.new do |opts|
11
+ opts.on "-q", "--quincy-path PATHNAME",
12
+ "Location of PATDAT directory",
13
+ "Defaults to ENV[\"QUINCY\"]" do |arg|
14
+ quincy_path = arg
15
+ end
16
+ opts.on "-V","--version","Display version and exit" do
17
+ puts Quincy::VERSION
18
+ exit
19
+ end
20
+ opts.on_tail("-h","--help","Show this Message") do
21
+ puts opts
22
+ exit
23
+ end
24
+
25
+ opts.parse!
26
+ end
27
+
28
+ if ARGV.empty?
29
+ puts USAGE
30
+ exit
31
+ end
32
+
33
+ begin
34
+ ARGV.each { |i|
35
+ patnr = Integer(i)
36
+ pat = Quincy::PCnet.new(quincy_path).find(patnr)
37
+ puts pat if pat
38
+ }
39
+ rescue Exception => e
40
+ warn e.message
41
+ exit 1
42
+ end
43
+
@@ -0,0 +1,92 @@
1
+ #! /usr/bin/ruby
2
+
3
+ require 'pathname'
4
+ require 'iconv'
5
+
6
+ module Quincy
7
+ VERSION = "0.4.0"
8
+
9
+ # a Struct containing patient information
10
+ #
11
+ class Patient < Struct.new( :nr, :last_name, :first_name )
12
+ def to_s
13
+ "#{"%6d"%nr}: #{name}"
14
+ end
15
+
16
+ def name
17
+ [last_name, first_name].join(", ");
18
+ end
19
+ end
20
+
21
+ # Interface to Frey Quincy PCNet (http://www.frey.de/q_pcnet.htm).
22
+ #
23
+ # Extracts patient information by reading the folder containing
24
+ # the PATDATXX-subdirectories.
25
+ #
26
+ # Usage:
27
+ #
28
+ # # find the patient with the number 98
29
+ # patient = Quincy::PCnet.new("/example/QUINCY").find(98)
30
+ #
31
+ class PCnet
32
+ attr_reader :quincy_path
33
+
34
+ def initialize(path = nil)
35
+ path ||= ENV["QUINCY"]
36
+ @@blocksize = 1024
37
+
38
+ raise ArgumentError, "Quincy Path not set (use '-q' or ENV['QUINCY'])" unless path
39
+ @quincy_path = Pathname.new(path)
40
+ end
41
+
42
+ # returns the PATDAT-file for a given patient nr
43
+ #
44
+ # path = Quincy::PCnet.new("foo").path_for("98")
45
+ # #=> "foo/PATDAT00/0098.DAT"
46
+ #
47
+ def path_for(nr)
48
+ dat_nr = nr % 0xa00
49
+ dir_nr = dat_nr / 0x80
50
+ patdat_path = @quincy_path + "PATDAT#{"%02d" % dir_nr}" + "#{"%04d"% dat_nr}.DAT"
51
+ patdat_path.to_str
52
+ end
53
+
54
+ def find(nr)
55
+ filename = Pathname.new(path_for(nr))
56
+ return nil unless File.exists?(filename)
57
+
58
+ filename.open { |f|
59
+ while (record = f.read(@@blocksize,"rb"))
60
+ patient = read_record(record)
61
+ return patient if patient and patient.nr == nr
62
+ end
63
+ }
64
+ end
65
+
66
+ private
67
+
68
+ def read_record(record) #:nodoc:
69
+ return unless record[4] == 0xf6
70
+
71
+ read_str = lambda { |pattern| lambda { |chunk|
72
+ str = chunk.unpack(pattern).first.strip
73
+ Iconv.new("UTF-8","CP850").iconv(str)
74
+ }}
75
+
76
+ fields = {
77
+ :nr => lambda { |s| s.unpack("@10A5").first.to_i },
78
+ :last_name => read_str["@15A30"],
79
+ :first_name => read_str["@45A30"]
80
+ }
81
+
82
+ pat = Patient.new
83
+
84
+ fields.each { |k,v|
85
+ pat[k] = v.call(record)
86
+ }
87
+
88
+ pat
89
+ end
90
+ end
91
+ end
92
+
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require 'quincy'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = %q{quincy}
7
+ s.version = Quincy::VERSION
8
+
9
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
10
+ s.authors = ["Levin Alexander"]
11
+ s.description = %q{}
12
+ s.email = %q{mail@levinalex.net}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+
18
+ s.homepage = %q{http://github.com/levinalex/quincy}
19
+ s.rdoc_options = ["--charset=UTF-8"]
20
+ s.require_paths = ["lib"]
21
+ s.summary = %q{extract patient data from QuincyPCnet data files, <http://www.frey.de/q_pcnet.htm>}
22
+
23
+ s.add_dependency "rake"
24
+ s.add_development_dependency "rspec"
25
+ end
26
+
@@ -0,0 +1,70 @@
1
+ require 'quincy'
2
+
3
+ describe "With Patdat-Files in the current directory" do
4
+ before do
5
+ @q = Quincy::PCnet.new('.')
6
+ end
7
+
8
+ specify "file for patient 0 should be PATDAT00/0000.DAT" do
9
+ @q.path_for(0).should == "PATDAT00/0000.DAT"
10
+ end
11
+ specify "file for patient 98 should be PATDAT00/0098.DAT" do
12
+ @q.path_for(98).should == "PATDAT00/0098.DAT"
13
+ end
14
+ specify "file for patient 128 should be PATDAT00/0098.DAT" do
15
+ @q.path_for(128).should == "PATDAT01/0128.DAT"
16
+ end
17
+ specify "file for patient 19237 should be PATDAT10/1317.DAT" do
18
+ @q.path_for(19237).should == "PATDAT10/1317.DAT"
19
+ end
20
+ end
21
+
22
+ describe "generated path to the patdat files" do
23
+ specify "absolute pahs should be preserved" do
24
+ @q = Quincy::PCnet.new("/absolute/path")
25
+ @q.path_for(300).should == "/absolute/path/PATDAT02/0300.DAT"
26
+ end
27
+ end
28
+
29
+ describe "reading of patients" do
30
+ before do
31
+ @q = Quincy::PCnet.new( File.dirname(__FILE__) + "/sample")
32
+ end
33
+
34
+ specify "name of patient 98 should be Sierra, Rudolph" do
35
+ patient = @q.find(98)
36
+ patient.name.should == ("Sierra, Rudolph")
37
+ patient.nr.should be_equal(98)
38
+ end
39
+
40
+ specify "searching for nonexistent patient should return nil" do
41
+ @q.find(140898).should be_nil
42
+ @q.find(12345).should be_nil
43
+ end
44
+ end
45
+
46
+ describe "when ENV['QUINCY'] is set" do
47
+ before do
48
+ ENV["QUINCY"] = "/some/path"
49
+ end
50
+
51
+ specify "path should default to this value" do
52
+ Quincy::PCnet.new.quincy_path.to_s.should == "/some/path"
53
+ end
54
+
55
+ specify "Path should be taken from ENV even if Quincy is constructed with 'nil' as argument" do
56
+ Quincy::PCnet.new(nil).quincy_path.to_s.should == "/some/path"
57
+ end
58
+
59
+ end
60
+
61
+ describe "when ENV['QUINCY'] is not set" do
62
+ before do
63
+ ENV["QUINCY"] = nil
64
+ end
65
+
66
+ specify "PCnet should raise an error if it is constructed without an argument" do
67
+ lambda { @q = Quincy::PCnet.new() }.should raise_error(ArgumentError)
68
+ end
69
+ end
70
+
File without changes
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: quincy
3
+ version: !ruby/object:Gem::Version
4
+ hash: 15
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
11
+ platform: ruby
12
+ authors:
13
+ - Levin Alexander
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-06-30 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rake
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: rspec
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :development
47
+ version_requirements: *id002
48
+ description: ""
49
+ email: mail@levinalex.net
50
+ executables:
51
+ - quincy
52
+ extensions: []
53
+
54
+ extra_rdoc_files: []
55
+
56
+ files:
57
+ - .gitignore
58
+ - CHANGES
59
+ - History.txt
60
+ - Manifest.txt
61
+ - README.txt
62
+ - Rakefile
63
+ - bin/quincy
64
+ - lib/quincy.rb
65
+ - quincy.gemspec
66
+ - spec/quincy_spec.rb
67
+ - spec/sample/PATDAT00/0098.DAT
68
+ - spec/sample/PATDAT10/1317.DAT
69
+ homepage: http://github.com/levinalex/quincy
70
+ licenses: []
71
+
72
+ post_install_message:
73
+ rdoc_options:
74
+ - --charset=UTF-8
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ hash: 3
83
+ segments:
84
+ - 0
85
+ version: "0"
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ hash: 3
92
+ segments:
93
+ - 0
94
+ version: "0"
95
+ requirements: []
96
+
97
+ rubyforge_project:
98
+ rubygems_version: 1.8.5
99
+ signing_key:
100
+ specification_version: 3
101
+ summary: extract patient data from QuincyPCnet data files, <http://www.frey.de/q_pcnet.htm>
102
+ test_files:
103
+ - spec/quincy_spec.rb
104
+ - spec/sample/PATDAT00/0098.DAT
105
+ - spec/sample/PATDAT10/1317.DAT