Description:
fixed import error (thanks K.Siththa)
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r274:25b80877ebce - - 1 file changed: 2 inserted, 0 deleted

@@ -1,151 +1,153
1 require 'tmpdir'
1 require 'tmpdir'
2
2
3 class TestdataImporter
3 class TestdataImporter
4
4
5 attr :log_msg
5 attr :log_msg
6
6
7 def initialize(problem)
7 def initialize(problem)
8 @problem = problem
8 @problem = problem
9 end
9 end
10
10
11 def import_from_file(tempfile,
11 def import_from_file(tempfile,
12 time_limit,
12 time_limit,
13 memory_limit,
13 memory_limit,
14 import_to_db=false)
14 import_to_db=false)
15
15
16 dirname = extract(tempfile)
16 dirname = extract(tempfile)
17 return false if not dirname
17 return false if not dirname
18 if not import_to_db
18 if not import_to_db
19 @log_msg = GraderScript.call_import_problem(@problem.name,
19 @log_msg = GraderScript.call_import_problem(@problem.name,
20 dirname,
20 dirname,
21 time_limit,
21 time_limit,
22 memory_limit)
22 memory_limit)
23 else
23 else
24 # Import test data to test pairs.
24 # Import test data to test pairs.
25
25
26 @problem.test_pairs.clear
26 @problem.test_pairs.clear
27 if import_test_pairs(dirname)
27 if import_test_pairs(dirname)
28 test_pair_count = TestPair.count :conditions => "problem_id = #{@problem.id}"
28 test_pair_count = TestPair.count :conditions => "problem_id = #{@problem.id}"
29 @log_msg = "Importing test pair successful. (#{test_pair_count} test pairs imported)"
29 @log_msg = "Importing test pair successful. (#{test_pair_count} test pairs imported)"
30 else
30 else
31 @log_msg = "Importing test pair failed. (0 test pairs imported)"
31 @log_msg = "Importing test pair failed. (0 test pairs imported)"
32 end
32 end
33 end
33 end
34
34
35 @log_msg << import_problem_description(dirname)
35 @log_msg << import_problem_description(dirname)
36 @log_msg << import_problem_pdf(dirname)
36 @log_msg << import_problem_pdf(dirname)
37
37
38 return true
38 return true
39 end
39 end
40
40
41 protected
41 protected
42
42
43 def self.long_ext(filename)
43 def self.long_ext(filename)
44 i = filename.index('.')
44 i = filename.index('.')
45 len = filename.length
45 len = filename.length
46 return filename.slice(i..len)
46 return filename.slice(i..len)
47 end
47 end
48
48
49 def extract(tempfile)
49 def extract(tempfile)
50 testdata_filename = save_testdata_file(tempfile)
50 testdata_filename = save_testdata_file(tempfile)
51 ext = TestdataImporter.long_ext(tempfile.original_filename)
51 ext = TestdataImporter.long_ext(tempfile.original_filename)
52
52
53 extract_dir = File.join(GraderScript.raw_dir, @problem.name)
53 extract_dir = File.join(GraderScript.raw_dir, @problem.name)
54 begin
54 begin
55 Dir.mkdir extract_dir
55 Dir.mkdir extract_dir
56 rescue Errno::EEXIST
56 rescue Errno::EEXIST
57 end
57 end
58
58
59 if ext=='.tar.gz' or ext=='.tgz'
59 if ext=='.tar.gz' or ext=='.tgz'
60 cmd = "tar -zxvf #{testdata_filename} -C #{extract_dir}"
60 cmd = "tar -zxvf #{testdata_filename} -C #{extract_dir}"
61 elsif ext=='.tar'
61 elsif ext=='.tar'
62 cmd = "tar -xvf #{testdata_filename} -C #{extract_dir}"
62 cmd = "tar -xvf #{testdata_filename} -C #{extract_dir}"
63 elsif ext=='.zip'
63 elsif ext=='.zip'
64 cmd = "unzip -o #{testdata_filename} -d #{extract_dir}"
64 cmd = "unzip -o #{testdata_filename} -d #{extract_dir}"
65 else
65 else
66 return nil
66 return nil
67 end
67 end
68
68
69 system(cmd)
69 system(cmd)
70
70
71 files = Dir["#{extract_dir}/**/*1*.in"]
71 files = Dir["#{extract_dir}/**/*1*.in"]
72 return nil if files.length==0
72 return nil if files.length==0
73
73
74 File.delete(testdata_filename)
74 File.delete(testdata_filename)
75
75
76 return File.dirname(files[0])
76 return File.dirname(files[0])
77 end
77 end
78
78
79 def save_testdata_file(tempfile)
79 def save_testdata_file(tempfile)
80 ext = TestdataImporter.long_ext(tempfile.original_filename)
80 ext = TestdataImporter.long_ext(tempfile.original_filename)
81 testdata_filename = File.join(Dir.tmpdir,"#{@problem.name}#{ext}")
81 testdata_filename = File.join(Dir.tmpdir,"#{@problem.name}#{ext}")
82
82
83 return nil if tempfile==""
83 return nil if tempfile==""
84
84
85 if tempfile.instance_of?(Tempfile)
85 if tempfile.instance_of?(Tempfile)
86 tempfile.close
86 tempfile.close
87 FileUtils.move(tempfile.path,testdata_filename)
87 FileUtils.move(tempfile.path,testdata_filename)
88 else
88 else
89 File.open(testdata_filename, "wb") do |f|
89 File.open(testdata_filename, "wb") do |f|
90 f.write(tempfile.read)
90 f.write(tempfile.read)
91 end
91 end
92 end
92 end
93
93
94 return testdata_filename
94 return testdata_filename
95 end
95 end
96
96
97 def import_test_pairs(dirname)
97 def import_test_pairs(dirname)
98 test_num = 1
98 test_num = 1
99 while FileTest.exists? "#{dirname}/#{test_num}.in"
99 while FileTest.exists? "#{dirname}/#{test_num}.in"
100 in_filename = "#{dirname}/#{test_num}.in"
100 in_filename = "#{dirname}/#{test_num}.in"
101 sol_filename = "#{dirname}/#{test_num}.sol"
101 sol_filename = "#{dirname}/#{test_num}.sol"
102
102
103 break if not FileTest.exists? sol_filename
103 break if not FileTest.exists? sol_filename
104
104
105 test_pair = TestPair.new(:input => open(in_filename).read,
105 test_pair = TestPair.new(:input => open(in_filename).read,
106 :solution => open(sol_filename).read,
106 :solution => open(sol_filename).read,
107 :problem => @problem)
107 :problem => @problem)
108 break if not test_pair.save
108 break if not test_pair.save
109
109
110 test_num += 1
110 test_num += 1
111 end
111 end
112 return test_num > 1
112 return test_num > 1
113 end
113 end
114
114
115 def import_problem_description(dirname)
115 def import_problem_description(dirname)
116 html_files = Dir["#{dirname}/*.html"]
116 html_files = Dir["#{dirname}/*.html"]
117 markdown_files = Dir["#{dirname}/*.md"] + Dir["#{dirname}/*.markdown"]
117 markdown_files = Dir["#{dirname}/*.md"] + Dir["#{dirname}/*.markdown"]
118 if (html_files.length != 0) or (markdown_files.length != 0)
118 if (html_files.length != 0) or (markdown_files.length != 0)
119 description = @problem.description || Description.new
119 description = @problem.description || Description.new
120
120
121 if html_files.length != 0
121 if html_files.length != 0
122 filename = html_files[0]
122 filename = html_files[0]
123 description.markdowned = false
123 description.markdowned = false
124 else
124 else
125 filename = markdown_files[0]
125 filename = markdown_files[0]
126 description.markdowned = true
126 description.markdowned = true
127 end
127 end
128
128
129 description.body = open(filename).read
129 description.body = open(filename).read
130 description.save
130 description.save
131 @problem.description = description
131 @problem.description = description
132 @problem.save
132 @problem.save
133 return "\nProblem description imported from #{filename}."
133 return "\nProblem description imported from #{filename}."
134 else
134 else
135 return ''
135 return ''
136 end
136 end
137 end
137 end
138
138
139 def import_problem_pdf(dirname)
139 def import_problem_pdf(dirname)
140 pdf_files = Dir["#{dirname}/*.pdf"]
140 pdf_files = Dir["#{dirname}/*.pdf"]
141 if pdf_files.length != 0
141 if pdf_files.length != 0
142 filename = pdf_files[0]
142 filename = pdf_files[0]
143 out_filename = "#{Problem.download_file_basedir}/#{@problem.name}.pdf"
143 out_filename = "#{Problem.download_file_basedir}/#{@problem.name}.pdf"
144 File.rename(filename, out_filename)
144 File.rename(filename, out_filename)
145 @problem.description_filename = "#{@problem.name}.pdf"
145 @problem.description_filename = "#{@problem.name}.pdf"
146 @problem.save
146 @problem.save
147 return "\nProblem pdf imported from #{filename}."
147 return "\nProblem pdf imported from #{filename}."
148 + else
149 + return ""
148 end
150 end
149 end
151 end
150
152
151 end
153 end
You need to be logged in to leave comments. Login now