Description:
removes imported testdata file after extracted
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r270:6fd950650700 - - 1 file changed: 2 inserted, 0 deleted

@@ -1,136 +1,138
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
36
37 return true
37 return true
38 end
38 end
39
39
40 protected
40 protected
41
41
42 def self.long_ext(filename)
42 def self.long_ext(filename)
43 i = filename.index('.')
43 i = filename.index('.')
44 len = filename.length
44 len = filename.length
45 return filename.slice(i..len)
45 return filename.slice(i..len)
46 end
46 end
47
47
48 def extract(tempfile)
48 def extract(tempfile)
49 testdata_filename = save_testdata_file(tempfile)
49 testdata_filename = save_testdata_file(tempfile)
50 ext = TestdataImporter.long_ext(tempfile.original_filename)
50 ext = TestdataImporter.long_ext(tempfile.original_filename)
51
51
52 extract_dir = File.join(GraderScript.raw_dir, @problem.name)
52 extract_dir = File.join(GraderScript.raw_dir, @problem.name)
53 begin
53 begin
54 Dir.mkdir extract_dir
54 Dir.mkdir extract_dir
55 rescue Errno::EEXIST
55 rescue Errno::EEXIST
56 end
56 end
57
57
58 if ext=='.tar.gz' or ext=='.tgz'
58 if ext=='.tar.gz' or ext=='.tgz'
59 cmd = "tar -zxvf #{testdata_filename} -C #{extract_dir}"
59 cmd = "tar -zxvf #{testdata_filename} -C #{extract_dir}"
60 elsif ext=='.tar'
60 elsif ext=='.tar'
61 cmd = "tar -xvf #{testdata_filename} -C #{extract_dir}"
61 cmd = "tar -xvf #{testdata_filename} -C #{extract_dir}"
62 elsif ext=='.zip'
62 elsif ext=='.zip'
63 cmd = "unzip -o #{testdata_filename} -d #{extract_dir}"
63 cmd = "unzip -o #{testdata_filename} -d #{extract_dir}"
64 else
64 else
65 return nil
65 return nil
66 end
66 end
67
67
68 system(cmd)
68 system(cmd)
69
69
70 files = Dir["#{extract_dir}/**/*1*.in"]
70 files = Dir["#{extract_dir}/**/*1*.in"]
71 return nil if files.length==0
71 return nil if files.length==0
72
72
73 + File.delete(testdata_filename)
74 +
73 return File.dirname(files[0])
75 return File.dirname(files[0])
74 end
76 end
75
77
76 def save_testdata_file(tempfile)
78 def save_testdata_file(tempfile)
77 ext = TestdataImporter.long_ext(tempfile.original_filename)
79 ext = TestdataImporter.long_ext(tempfile.original_filename)
78 testdata_filename = File.join(Dir.tmpdir,"#{@problem.name}#{ext}")
80 testdata_filename = File.join(Dir.tmpdir,"#{@problem.name}#{ext}")
79
81
80 return nil if tempfile==""
82 return nil if tempfile==""
81
83
82 if tempfile.instance_of?(Tempfile)
84 if tempfile.instance_of?(Tempfile)
83 tempfile.close
85 tempfile.close
84 FileUtils.move(tempfile.path,testdata_filename)
86 FileUtils.move(tempfile.path,testdata_filename)
85 else
87 else
86 File.open(testdata_filename, "wb") do |f|
88 File.open(testdata_filename, "wb") do |f|
87 f.write(tempfile.read)
89 f.write(tempfile.read)
88 end
90 end
89 end
91 end
90
92
91 return testdata_filename
93 return testdata_filename
92 end
94 end
93
95
94 def import_test_pairs(dirname)
96 def import_test_pairs(dirname)
95 test_num = 1
97 test_num = 1
96 while FileTest.exists? "#{dirname}/#{test_num}.in"
98 while FileTest.exists? "#{dirname}/#{test_num}.in"
97 in_filename = "#{dirname}/#{test_num}.in"
99 in_filename = "#{dirname}/#{test_num}.in"
98 sol_filename = "#{dirname}/#{test_num}.sol"
100 sol_filename = "#{dirname}/#{test_num}.sol"
99
101
100 break if not FileTest.exists? sol_filename
102 break if not FileTest.exists? sol_filename
101
103
102 test_pair = TestPair.new(:input => open(in_filename).read,
104 test_pair = TestPair.new(:input => open(in_filename).read,
103 :solution => open(sol_filename).read,
105 :solution => open(sol_filename).read,
104 :problem => @problem)
106 :problem => @problem)
105 break if not test_pair.save
107 break if not test_pair.save
106
108
107 test_num += 1
109 test_num += 1
108 end
110 end
109 return test_num > 1
111 return test_num > 1
110 end
112 end
111
113
112 def import_problem_description(dirname)
114 def import_problem_description(dirname)
113 html_files = Dir["#{dirname}/*.html"]
115 html_files = Dir["#{dirname}/*.html"]
114 markdown_files = Dir["#{dirname}/*.md"] + Dir["#{dirname}/*.markdown"]
116 markdown_files = Dir["#{dirname}/*.md"] + Dir["#{dirname}/*.markdown"]
115 if (html_files.length != 0) or (markdown_files.length != 0)
117 if (html_files.length != 0) or (markdown_files.length != 0)
116 description = @problem.description || Description.new
118 description = @problem.description || Description.new
117
119
118 if html_files.length != 0
120 if html_files.length != 0
119 filename = html_files[0]
121 filename = html_files[0]
120 description.markdowned = false
122 description.markdowned = false
121 else
123 else
122 filename = markdown_files[0]
124 filename = markdown_files[0]
123 description.markdowned = true
125 description.markdowned = true
124 end
126 end
125
127
126 description.body = open(filename).read
128 description.body = open(filename).read
127 description.save
129 description.save
128 @problem.description = description
130 @problem.description = description
129 @problem.save
131 @problem.save
130 return "\nProblem description imported from #{filename}."
132 return "\nProblem description imported from #{filename}."
131 else
133 else
132 return ''
134 return ''
133 end
135 end
134 end
136 end
135
137
136 end
138 end
You need to be logged in to leave comments. Login now