metamri 0.1.18 → 0.1.19

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.18
1
+ 0.1.19
data/bin/list_visit CHANGED
@@ -33,29 +33,42 @@
33
33
 
34
34
  $:.unshift File.join(File.dirname(__FILE__),'..','lib')
35
35
 
36
- require 'metamri'
37
36
  require 'pathname'
38
- require 'rdoc/usage'
39
- # require 'logger'
37
+ require 'logger'
38
+ require 'metamri'
40
39
 
41
- def list_visit(raw_directory)
40
+ def run!
41
+ options = parse_options
42
+
43
+ # Default to scanning the current directory if no argument was given.
44
+ raw_directory = ARGV[0] ||= Dir.pwd
45
+ raw_directory = File.expand_path(raw_directory)
46
+
47
+ list_visit raw_directory, options
48
+
49
+ end
50
+
51
+ def list_visit(raw_directory, options = {})
42
52
  unless $LOG
43
53
  $LOG = Logger.new(STDOUT)
44
- $LOG.level = Logger::INFO
54
+ $LOG.level = options[:verbose] ? Logger::DEBUG : Logger::INFO
45
55
  end
46
56
 
47
57
  # First try to lookup Visit and Datasets through active_resource
48
58
  # Then fall back to scanning them fresh using the metamri classes.
49
59
 
50
60
  begin
61
+ raise ScriptError, "Scaning filesystem directly..." if options[:force_scan]
62
+
51
63
  visit = VisitRawDataDirectoryResource.find(:first, :params => {:search => {:path => raw_directory}})
64
+
52
65
  raise IOError.new("Could not lookup visit using path.") unless visit
53
66
  raise IOError.new("Returned visit does not match path.") unless visit.path == raw_directory
54
- rescue IOError => e
67
+ rescue ScriptError, IOError => e
55
68
  puts e
56
69
  visit = VisitRawDataDirectory.new(raw_directory)
57
70
  begin
58
- visit.scan
71
+ visit.scan(options)
59
72
  rescue IndexError => e
60
73
  $LOG.error "Are you sure #{raw_directory} is a valid raw visit directory?"
61
74
  raise e
@@ -69,12 +82,29 @@ def list_visit(raw_directory)
69
82
 
70
83
  end
71
84
 
72
- if File.basename(__FILE__) == File.basename($PROGRAM_NAME)
73
- RDoc::usage() if (ARGV[0] == '-h')
85
+ def parse_options
86
+ options = Hash.new
87
+ parser = OptionParser.new do |opts|
88
+ opts.banner = "Usage: #{File.basename(__FILE__)} [options] [directory]"
74
89
 
75
- # Default to scanning the current directory if no argument was given.
76
- raw_directory = ARGV[0] ||= Dir.pwd
77
- raw_directory = File.expand_path(raw_directory)
90
+ opts.on('-s', '--scan', "Scan filesystem directly instead of checking database first.") do
91
+ options[:force_scan] = true
92
+ end
93
+
94
+ opts.on('-v', '--verbose', "Be wordy.") do
95
+ options[:verbose] = true
96
+ end
97
+
98
+ opts.on_tail('-h', '--help', "Show this message") { puts(parser); exit }
99
+ opts.on_tail("If no directory is given, default is the current directory.")
100
+ opts.on_tail("Example: #{File.basename(__FILE__)} pd006")
78
101
 
79
- list_visit(raw_directory)
102
+ end
103
+ parser.parse!(ARGV)
104
+
105
+ return options
106
+ end
107
+
108
+ if File.basename(__FILE__) == File.basename($PROGRAM_NAME)
109
+ run!
80
110
  end
@@ -92,6 +92,25 @@ class Pathname
92
92
  return
93
93
  end
94
94
 
95
+ def recursive_local_copy(ignore_patterns = [], &block)
96
+ tempdir = Dir.mktmpdir('local_orig')
97
+
98
+ entries.each do |leaf|
99
+ branch = self + leaf
100
+ next if branch.directory?
101
+ next if ignore_patterns.collect { |pat| leaf.to_s =~ pattern }
102
+ next if branch.should_be_skipped
103
+ lc = branch.local_copy(tempdir)
104
+ lc.chmod(0444 | 0200 | 0020 )
105
+ end
106
+
107
+ return tempdir
108
+ end
109
+
110
+ def should_be_skipped
111
+ self.to_s =~ /^\./ || self.symlink?
112
+ end
113
+
95
114
  =begin
96
115
  Creates a local, unzipped copy of a file for use in scanning.
97
116
  Will return a pathname to the local copy if called directly, or can also be
@@ -1,5 +1,3 @@
1
- require 'active_resource'
2
-
3
1
  class RawImageDatasetResource < ActiveResource::Base
4
2
  self.site = VisitRawDataDirectory::DATAPANDA_SERVER
5
3
  self.element_name = "image_dataset"
@@ -6,6 +6,7 @@ require 'tmpdir'
6
6
  require 'fileutils'
7
7
  require 'sqlite3'
8
8
  require 'logger'
9
+ require 'pp'
9
10
  require 'metamri/raw_image_file'
10
11
  require 'metamri/raw_image_dataset'
11
12
 
@@ -81,11 +82,20 @@ class VisitRawDataDirectory
81
82
  # pfiles are scanned and imported in addition to one and only one dicom file. After scanning
82
83
  # @datasets will hold an array of ImageDataset instances. Setting the rmr here can raise an
83
84
  # exception if no valid rmr is found in the datasets, be prepared to catch it.
84
- def scan
85
+ #
86
+ # Run a scan with the following options:
87
+ # - :ignore_patterns - An array of Regular Expressions that will be used to skip heavy directories.
88
+ def scan(options = {})
85
89
  flash "Scanning visit raw data directory #{@visit_directory}" if $LOG.level <= Logger::INFO
90
+ default_options = {:ignore_patterns => []}
91
+ options = default_options.merge(options)
92
+ puts "Ignoring directories matching: #{options[:ignore_patterns].join(", ")}" unless options[:ignore_patterns].empty?
93
+
86
94
  d = Pathname.new(@visit_directory)
87
95
  d.each_subdirectory do |dd|
88
- begin
96
+ begin
97
+ matches = options[:ignore_patterns].collect {|pat| dd.to_s =~ pat ? dd : nil }.compact
98
+ next unless matches.empty?
89
99
  dd.each_pfile { |pf| @datasets << import_dataset(pf, dd) }
90
100
  dd.first_dicom { |fd| @datasets << import_dataset(fd, dd) }
91
101
  rescue Exception => e
@@ -1,6 +1,4 @@
1
1
  $:.unshift File.dirname(__FILE__)
2
-
3
- require 'active_resource'
4
2
  require 'raw_image_dataset_resource'
5
3
 
6
4
  class VisitRawDataDirectoryResource < ActiveResource::Base
data/lib/metamri.rb CHANGED
@@ -1,5 +1,12 @@
1
1
  $: << File.dirname(__FILE__)
2
2
 
3
+ begin
4
+ require 'rubygems'
5
+ gem 'activeresource', '<= 2.3.8'
6
+ require 'active_resource'
7
+ end
8
+
9
+
3
10
  require 'metamri/core_additions'
4
11
  require 'metamri/raw_image_file'
5
12
  require 'metamri/raw_image_dataset'
data/metamri.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{metamri}
8
- s.version = "0.1.18"
8
+ s.version = "0.1.19"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Kristopher J. Kosmatka"]
12
- s.date = %q{2010-06-04}
12
+ s.date = %q{2010-07-09}
13
13
  s.description = %q{Extraction of MRI metadata and insertion into compatible sqlite3 databases.}
14
14
  s.email = %q{kk4@medicine.wisc.edu}
15
15
  s.executables = ["import_study.rb", "import_visit.rb", "import_respiratory_files.rb", "list_visit", "convert_visit.rb"]
@@ -50,7 +50,7 @@ Gem::Specification.new do |s|
50
50
  s.homepage = %q{http://github.com/brainmap/metamri}
51
51
  s.rdoc_options = ["--charset=UTF-8"]
52
52
  s.require_paths = ["lib"]
53
- s.rubygems_version = %q{1.3.6}
53
+ s.rubygems_version = %q{1.3.7}
54
54
  s.summary = %q{MRI metadata}
55
55
  s.test_files = [
56
56
  "test/nifti_builder_spec.rb",
@@ -65,7 +65,7 @@ Gem::Specification.new do |s|
65
65
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
66
66
  s.specification_version = 3
67
67
 
68
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
68
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
69
69
  s.add_runtime_dependency(%q<sqlite3-ruby>, [">= 0"])
70
70
  s.add_runtime_dependency(%q<dicom>, [">= 0"])
71
71
  s.add_development_dependency(%q<rspec>, [">= 0"])
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metamri
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 61
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 1
8
- - 18
9
- version: 0.1.18
9
+ - 19
10
+ version: 0.1.19
10
11
  platform: ruby
11
12
  authors:
12
13
  - Kristopher J. Kosmatka
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-06-04 00:00:00 -05:00
18
+ date: 2010-07-09 00:00:00 -05:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: sqlite3-ruby
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 3
27
30
  segments:
28
31
  - 0
29
32
  version: "0"
@@ -33,9 +36,11 @@ dependencies:
33
36
  name: dicom
34
37
  prerelease: false
35
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
36
40
  requirements:
37
41
  - - ">="
38
42
  - !ruby/object:Gem::Version
43
+ hash: 3
39
44
  segments:
40
45
  - 0
41
46
  version: "0"
@@ -45,9 +50,11 @@ dependencies:
45
50
  name: rspec
46
51
  prerelease: false
47
52
  requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
48
54
  requirements:
49
55
  - - ">="
50
56
  - !ruby/object:Gem::Version
57
+ hash: 3
51
58
  segments:
52
59
  - 0
53
60
  version: "0"
@@ -105,23 +112,27 @@ rdoc_options:
105
112
  require_paths:
106
113
  - lib
107
114
  required_ruby_version: !ruby/object:Gem::Requirement
115
+ none: false
108
116
  requirements:
109
117
  - - ">="
110
118
  - !ruby/object:Gem::Version
119
+ hash: 3
111
120
  segments:
112
121
  - 0
113
122
  version: "0"
114
123
  required_rubygems_version: !ruby/object:Gem::Requirement
124
+ none: false
115
125
  requirements:
116
126
  - - ">="
117
127
  - !ruby/object:Gem::Version
128
+ hash: 3
118
129
  segments:
119
130
  - 0
120
131
  version: "0"
121
132
  requirements: []
122
133
 
123
134
  rubyforge_project:
124
- rubygems_version: 1.3.6
135
+ rubygems_version: 1.3.7
125
136
  signing_key:
126
137
  specification_version: 3
127
138
  summary: MRI metadata